diff --git a/.DS_Store b/.DS_Store index 038f9bfe..00ea943a 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/osinaweb/.DS_Store b/osinaweb/.DS_Store index b49c21f9..498e1706 100644 Binary files a/osinaweb/.DS_Store and b/osinaweb/.DS_Store differ diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index eff56d1e..506d9c6c 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 1341a2a4..3506914b 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 f49ad8cd..668ae231 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/__pycache__/routing.cpython-310.pyc b/osinaweb/osichat/__pycache__/routing.cpython-310.pyc index 7f4adc47..3b7f743f 100644 Binary files a/osinaweb/osichat/__pycache__/routing.cpython-310.pyc and b/osinaweb/osichat/__pycache__/routing.cpython-310.pyc differ diff --git a/osinaweb/osichat/api/__pycache__/serializers.cpython-310.pyc b/osinaweb/osichat/api/__pycache__/serializers.cpython-310.pyc index e1fe162b..79855e4b 100644 Binary files a/osinaweb/osichat/api/__pycache__/serializers.cpython-310.pyc and b/osinaweb/osichat/api/__pycache__/serializers.cpython-310.pyc differ diff --git a/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc b/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc index e320b8ea..1d422820 100644 Binary files a/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc and b/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc differ diff --git a/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc b/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc index f1f4fab6..c17663a0 100644 Binary files a/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc and b/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/osichat/api/serializers.py b/osinaweb/osichat/api/serializers.py index 80c5651a..fcc331ad 100644 --- a/osinaweb/osichat/api/serializers.py +++ b/osinaweb/osichat/api/serializers.py @@ -8,6 +8,13 @@ class VisitorSerializer(serializers.ModelSerializer): fields = '__all__' +class VisitorLogSerializer(serializers.ModelSerializer): + class Meta: + model = VisitorLog + fields = '__all__' + + + class ChatRoomGuestSerializer(serializers.ModelSerializer): visitor = VisitorSerializer() class Meta: @@ -25,4 +32,6 @@ class ChatRoomSerializer(serializers.ModelSerializer): chatroomguest = ChatRoomGuestSerializer() class Meta: model = ChatRoom - fields = '__all__' \ No newline at end of file + fields = '__all__' + + diff --git a/osinaweb/osichat/api/views.py b/osinaweb/osichat/api/views.py index 12527c47..3e257736 100644 --- a/osinaweb/osichat/api/views.py +++ b/osinaweb/osichat/api/views.py @@ -2,11 +2,12 @@ from osinacore.api.utils import * from osichat.models import * from rest_framework.decorators import api_view from .serializers import * - +from django.shortcuts import get_object_or_404 @api_view(['GET']) def get_chat_rooms(request): chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent')).order_by('-last_update', '-date_created') chat_rooms_serializer = ChatRoomSerializer(chat_rooms, many=True) return successRes(chat_rooms_serializer.data) - \ No newline at end of file + + diff --git a/osinaweb/osichat/consumers.py b/osinaweb/osichat/consumers.py index f95e9dc2..dbe27dfa 100644 --- a/osinaweb/osichat/consumers.py +++ b/osinaweb/osichat/consumers.py @@ -188,10 +188,10 @@ class Osichat(WebsocketConsumer): if self.client_type == 'mobile_admin': visitors_data = [] for visitor in visitors: - visitor_dict = model_to_dict(visitor) - visitor_dict['is_online'] = visitor.is_online - visitor_dict['duration'] = visitor.total_duration - visitor_dict['flag'] = visitor.flag_image_url + 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 visitor_logs = VisitorLog.objects.filter(visitor=visitor) @@ -201,8 +201,8 @@ class Osichat(WebsocketConsumer): log_data['log_duration'] = log.log_duration visitor_logs_data.append(log_data) - visitor_dict['visitor_logs'] = visitor_logs_data - visitors_data.append(visitor_dict) + visitor_data['visitor_logs'] = visitor_logs_data + visitors_data.append(visitor_data) self.send(text_data=json.dumps({ 'event_type': 'get_visitors', @@ -253,6 +253,55 @@ 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.visitor = get_object_or_404(Visitor, id=self.visitor_id) + async_to_sync(self.channel_layer.group_add)( + self.group_name, self.channel_name + ) + self.accept() + + def disconnect(self, close_code): + async_to_sync(self.channel_layer.group_discard)( + self.group_name, self.channel_name + ) + + def receive(self, text_data): + data = json.loads(text_data) + event_type = data.get('event_type') + + if event_type == 'set_client_type': + self.client_type = data.get('client_type') + event = { + 'type': 'get_visitor_handler', + } + + async_to_sync(self.channel_layer.group_send)( + self.group_name, event + ) + + def get_visitor_handler(self, event): + if self.client_type == 'mobile_admin': + visitor_data = model_to_dict(self.visitor) + visitor_data['online'] = self.visitor.is_online + visitor_data['flag'] = self.visitor.flag_image_url + visitor_logs = VisitorLog.objects.filter(visitor=self.visitor) + visitor_logs_data = [] + for log in visitor_logs: + log_data = model_to_dict(log) + log_data['log_duration'] = log.log_duration + visitor_logs_data.append(log_data) + visitor_data['visitor_logs'] = visitor_logs_data + + self.send(text_data=json.dumps({ + 'event_type': 'get_visitor', + 'visitor_data': visitor_data, + }, cls=DjangoJSONEncoder)) + + + diff --git a/osinaweb/osichat/models.py b/osinaweb/osichat/models.py index ec3683a0..c1ecdf74 100644 --- a/osinaweb/osichat/models.py +++ b/osinaweb/osichat/models.py @@ -5,7 +5,7 @@ import os from channels.layers import get_channel_layer from asgiref.sync import async_to_sync from fcm_django.models import FCMDevice -from firebase_admin.messaging import Message, Notification as NotificationFB +from firebase_admin.messaging import Message,AndroidConfig,APNSConfig,APNSPayload,ApsAlert,Aps,AndroidNotification, Notification as NotificationFB from django.utils.safestring import mark_safe @@ -14,20 +14,43 @@ def send_notification(notification): 'title': notification.title, 'body': mark_safe(notification.message), } + + android_config = AndroidConfig( + notification=AndroidNotification( + title=notification_data['title'], + body=notification_data['body'], + sound='default' + ) + ) + + apns_config = APNSConfig( + payload= APNSPayload( + aps=Aps( + alert=ApsAlert( + title=notification_data['title'], + body=notification_data['body'], + ), + sound='default', + ) + ) + ) + if notification.image: FCMDevice.objects.send_message( Message(notification=NotificationFB( title=notification_data['title'], body=notification_data['body'], image= notification.image, - ), data={"image": notification.image}) + ), data={"image": notification.image},android=android_config,apns=apns_config) ) else: FCMDevice.objects.send_message( Message(notification=NotificationFB( title=notification_data['title'], body=notification_data['body'], - )) + ), + android=android_config, + apns=apns_config) ) # Create your models here. diff --git a/osinaweb/osichat/routing.py b/osinaweb/osichat/routing.py index dbac54b8..98c64466 100644 --- a/osinaweb/osichat/routing.py +++ b/osinaweb/osichat/routing.py @@ -6,5 +6,6 @@ websocket_urlpatterns = [ path("ws/osichat/", Osichat.as_asgi()), path("ws/osichat//", OsitcomChatRoom.as_asgi()), path("ws/osichat-admin///", OsitcomChatRoom.as_asgi()), + path("ws/visitors/osichat-admin//", OsichatVisitor.as_asgi()), ] \ No newline at end of file diff --git a/osinaweb/osinacore/.DS_Store b/osinaweb/osinacore/.DS_Store index 56ec9411..db6bd212 100644 Binary files a/osinaweb/osinacore/.DS_Store and b/osinaweb/osinacore/.DS_Store differ