[docs]classSignageConsumer(JsonWebsocketConsumer):defconnect(self)->None: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]ifnotself.user.is_authenticatedandremote_addrnotinsettings.INTERNAL_IPS:self.connected=Falseself.close()returnself.display_name=self.scope["url_route"]["kwargs"].get("display_name","")try:self.sign_obj=Sign.objects.get(display=self.display_name)exceptSign.DoesNotExist:self.connected=Falseself.close()returnself.connected=Trueself.accept()self.sign_obj.latest_heartbeat_time=timezone.localtime()self.sign_obj.save(update_fields=["latest_heartbeat_time"])defreceive_json(self,content)->None:# pylint: disable=arguments-differifnotself.connected:returnifself.sign_objisnotNone:self.sign_obj.refresh_from_db()self.sign_obj.latest_heartbeat_time=timezone.localtime()self.sign_obj.save(update_fields=["latest_heartbeat_time"])ifcontent.get("type")=="heartbeat":self.send_json({"type":"heartbeat-response"})returndefdisconnect(self,code:int)->None:# We want to check because the connection may have been rejected at the start# and later on we assume it was not.ifnotself.connected:returnself.connected=Falseifself.sign_objisnotNone:self.sign_obj.refresh_from_db()self.sign_obj.latest_heartbeat_time=Noneself.sign_obj.save(update_fields=["latest_heartbeat_time"])