[docs]classBusConsumer(JsonWebsocketConsumer):groups=["bus"]defconnect(self):self.user=self.scope["user"]headers=dict(self.scope["headers"])remote_addr=headers[b"x-real-ip"].decode()ifb"x-real-ip"inheaderselseself.scope["client"][0]if(notself.user.is_authenticatedorself.user.is_restricted)andremote_addrnotinsettings.INTERNAL_IPS:self.connected=Falseself.close()returnself.connected=Truedata=self._serialize(user=self.user)self.accept()self.send_json(data)defreceive_json(self,content):# pylint: disable=arguments-differifnotself.connected:returnifcontent.get("type")=="keepalive":self.send_json({"type":"keepalive-response"})returnifself.userisnotNoneandself.user.is_authenticatedandself.user.is_bus_admin:try:ifself.within_time_range(content["time"]):ifcontent.get("announcement")orcontent.get("announcement")=="":ifcontent["announcement"].strip()=="":content["announcement"]=""announcement=BusAnnouncement.object()announcement.message=content["announcement"]announcement.save()else:route=Route.objects.get(id=content["id"])route.status=content["status"]ifcontent["time"]=="afternoon"androute.status=="a":route.space=content["space"]else:route.space=""route.save()data=self._serialize()async_to_sync(self.channel_layer.group_send)("bus",{"type":"bus.update","data":data})exceptExceptionase:logger.error(e)self.send_json({"error":"An error occurred."})else:self.send_json({"error":"User does not have permissions."})defbus_update(self,event):ifnotself.connected:returnself.send_json(event["data"])def_serialize(self,user=None):all_routes=Route.objects.all()data={}route_list=[]forrouteinall_routes:serialized={"id":route.id,"bus_number":route.bus_number,"space":route.space,"route_name":route.route_name,"status":route.status,}route_list.append(serialized)ifuseranduserinroute.user_set.all():data["userRouteId"]=route.iddata["userRouteName"]=route.route_namedata["allRoutes"]=route_listdata["announcement"]=str(BusAnnouncement.object().message)returndatadefwithin_time_range(self,time):now_hour=timezone.localtime().hourwithin_morning=now_hour<settings.BUS_PAGE_CHANGEOVER_HOURandtime=="morning"within_afternoon=now_hour>=settings.BUS_PAGE_CHANGEOVER_HOURandtime=="afternoon"returnwithin_morningorwithin_afternoon