import json from channels.generic.websocket import AsyncWebsocketConsumer from django.contrib.auth.models import AnonymousUser from submissions.signals import STAFF_GROUP_NAME class SubmissionsConsumer(AsyncWebsocketConsumer): async def connect(self): self.user = self.scope["user"] if isinstance(self.user, AnonymousUser): await self.close() return self.group_names = [f"submissions_user_{self.user.id}"] if self.user.is_staff: self.group_names.append(STAFF_GROUP_NAME) for group_name in self.group_names: await self.channel_layer.group_add(group_name, self.channel_name) await self.accept() async def disconnect(self, close_code): # closed before joining (anonymous) for group_name in getattr(self, "group_names", []): await self.channel_layer.group_discard(group_name, self.channel_name) async def submission_updated(self, event): submission_data = event["submission"] await self.send(text_data=json.dumps(submission_data)) async def submission_file_updated(self, event): file_data = event["file"] await self.send(text_data=json.dumps(file_data)) async def submission_crop_updated(self, event): crop_data = event["crop"] await self.send(text_data=json.dumps(crop_data)) async def submission_crop_deleted(self, event): await self.send(text_data=json.dumps({"deleted_crop": event["crop"]})) async def scope_updated(self, event): await self.send(text_data=json.dumps({"scope": event["scope"]}))