diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 526c883c..28399a1e 100644 Binary files a/osinaweb/db.sqlite3 and b/osinaweb/db.sqlite3 differ diff --git a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc index 2e59f5e2..f47bb1bd 100644 Binary files a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc and b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc differ diff --git a/osinaweb/osichat/__pycache__/models.cpython-310.pyc b/osinaweb/osichat/__pycache__/models.cpython-310.pyc index a66f184e..dbe685a0 100644 Binary files a/osinaweb/osichat/__pycache__/models.cpython-310.pyc and b/osinaweb/osichat/__pycache__/models.cpython-310.pyc differ diff --git a/osinaweb/osichat/consumers.py b/osinaweb/osichat/consumers.py index dbe27dfa..3ed6da57 100644 --- a/osinaweb/osichat/consumers.py +++ b/osinaweb/osichat/consumers.py @@ -256,7 +256,7 @@ class Osichat(WebsocketConsumer): class OsichatVisitor(WebsocketConsumer): def connect(self): self.visitor_id = self.scope['url_route']['kwargs']['visitor_id'] - self.group_name = str(self.visitor_id) + self.group_name = 'V' + str(self.visitor_id) self.visitor = get_object_or_404(Visitor, id=self.visitor_id) async_to_sync(self.channel_layer.group_add)( self.group_name, self.channel_name @@ -300,6 +300,24 @@ class OsichatVisitor(WebsocketConsumer): 'visitor_data': visitor_data, }, cls=DjangoJSONEncoder)) + def new_visitor_update_handler(self, event): + visitor = self.visitor + latest_log = VisitorLog.objects.filter(visitor=self.visitor).last() + if self.client_type == 'mobile_admin': + visitor_data = model_to_dict(visitor) + visitor_data['is_online'] = visitor.is_online + visitor_data['duration'] = visitor.total_duration + visitor_data['flag'] = visitor.flag_image_url + if latest_log: + latest_log_data = model_to_dict(latest_log) + latest_log_data['log_duration'] = latest_log.log_duration + visitor_data['latest_log'] = latest_log_data + self.send(text_data=json.dumps({ + 'event_type': 'new_visitor_update', + 'visitor_data': visitor_data, + 'action': event['action'], + }, cls=DjangoJSONEncoder)) + diff --git a/osinaweb/osichat/models.py b/osinaweb/osichat/models.py index b629a37e..1904b11a 100644 --- a/osinaweb/osichat/models.py +++ b/osinaweb/osichat/models.py @@ -124,16 +124,6 @@ class Visitor(models.Model): else: return f"{int(minutes):02}:{int(seconds):02}" - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - channel_layer = get_channel_layer() - event = { - 'type': 'new_visitor_update_handler', - 'visitor_id': self.id, - 'action': 'new_visitor' - } - async_to_sync(channel_layer.group_send)("osichat", event) - @@ -173,14 +163,25 @@ class VisitorLog(models.Model): 'action': action } async_to_sync(channel_layer.group_send)("osichat", event) - if is_first_log: - self.send_visitor_notification() - else: - last_log = self.visitor.visitorlog_set.exclude(id=self.id).order_by('-visit_date').first() - if last_log: - time_difference = self.visit_date - last_log.visit_date - if time_difference > timedelta(minutes=5): - self.send_visitor_notification(is_repeat=True) + group_name = f"V{self.visitor.id}" + async_to_sync(channel_layer.group_send)(group_name, event) + if not self.left_date: + if is_first_log: + self.send_visitor_notification() + else: + last_log = self.visitor.visitorlog_set.exclude(id=self.id).order_by('-visit_date').first() + if last_log: + last_visit_date = last_log.visit_date + current_visit_date = self.visit_date + if timezone.is_naive(last_visit_date): + last_visit_date = timezone.make_aware(last_visit_date) + if timezone.is_naive(current_visit_date): + current_visit_date = timezone.make_aware(current_visit_date) + + time_difference = current_visit_date - last_visit_date + + if time_difference > timedelta(minutes=5): + self.send_visitor_notification(is_repeat=True) def send_visitor_notification(self, is_repeat=False): if is_repeat: