from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils.functional import LazyObject
from common.decorators import on_transaction_commit
from common.utils import get_logger
from common.utils.connection import RedisPubSub
from ..const import TaskNameType
from ..models import Task, Session
from ..utils import DBPortManager
db_port_manager: DBPortManager
logger = get_logger(__file__)
class ComponentEventChan(LazyObject):
def _setup(self):
self._wrapped = RedisPubSub('fm.component_event_chan')
component_event_chan = ComponentEventChan()
@receiver(post_save, sender=Task)
@on_transaction_commit
def on_task_created(sender, instance: Task, created, **kwargs):
if not created and instance.is_finished:
# 当组件完成 task 时,修改 session 的 lock 状态
session_id = instance.args
name = instance.name
if name == TaskNameType.lock_session:
Session.lock_session(session_id)
elif name == TaskNameType.unlock_session:
Session.unlock_session(session_id)
logger.debug(f"signal task post save: {instance.name}, "
f"session: {session_id}, "
f"is_finished: {instance.is_finished}")
return
event = {
"type": instance.name,
"payload": {
"id": str(instance.id),
},
}
component_event_chan.publish(event)