emile 7 months ago
parent 24d4d50753
commit 1028b6c1e1

BIN
.DS_Store vendored

Binary file not shown.

BIN
osinaweb/.DS_Store vendored

Binary file not shown.

Binary file not shown.

@ -59,6 +59,7 @@ class OsitcomVisitor(WebsocketConsumer):
class Osichat(WebsocketConsumer):
def connect(self):
self.user = self.scope["user"]
async_to_sync(self.channel_layer.group_add)(
'osichat', self.channel_name
)
@ -75,7 +76,6 @@ class Osichat(WebsocketConsumer):
if event_type == 'set_client_type':
self.client_type = data.get('client_type')
self.user_id = data.get('user_id')
event = {
'type': 'get_chats_handler',
}
@ -112,10 +112,8 @@ class Osichat(WebsocketConsumer):
default=F('last_update'),
output_field=DateTimeField(),)).filter(chatroomguest__isnull=False).order_by('-order_key')
user = get_object_or_404(User, id=self.user_id)
for room in chat_rooms:
room.number_of_unread = room.unread_messages(user)
room.number_of_unread = room.unread_messages(self.user)
context = {
'chat_rooms': chat_rooms,
}
@ -125,7 +123,7 @@ class Osichat(WebsocketConsumer):
for chat_room in chat_rooms:
last_message = ChatMessage.objects.filter(room=chat_room).last()
room_data = model_to_dict(chat_room)
room_data['number_of_unread'] = chat_room.unread_messages(user)
room_data['number_of_unread'] = chat_room.unread_messages(self.user)
if last_message:
room_data['last_message'] = model_to_dict(last_message)
else:
@ -158,8 +156,7 @@ class Osichat(WebsocketConsumer):
def new_chat_update_handler(self, event):
chat_room = get_object_or_404(ChatRoom, id=event['chatroom_id'])
user = get_object_or_404(User, id=self.user_id)
number_of_unread = ChatMessage.objects.filter(room=chat_room).exclude(member=user).exclude(chatmessageseen__member=user).count()
number_of_unread = ChatMessage.objects.filter(room=chat_room).exclude(member=self.user).exclude(chatmessageseen__member=self.user).count()
last_message = ChatMessage.objects.filter(room=chat_room).last()
context = {
@ -189,40 +186,38 @@ class Osichat(WebsocketConsumer):
def get_dms_handler(self, event):
if self.scope["user"].is_authenticated:
chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent'),order_key=Case(
chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent'),order_key=Case(
When(last_update__isnull=True, then=F('date_created')),
default=F('last_update'),
output_field=DateTimeField(),)).filter(chatroomguest__isnull=True, chatmember__member=self.scope["user"]).order_by('-order_key')
else:
chat_rooms = None
output_field=DateTimeField(),)).filter(chatroomguest__isnull=True, chatmember__member=self.user).order_by('-order_key')
context = {
'chat_rooms': chat_rooms,
}
if self.client_type == 'mobile_admin':
chat_rooms_data = []
for chat_room in chat_rooms:
last_message = ChatMessage.objects.filter(room=chat_room).last()
chat_room_data = {
'id': chat_room.id,
'name': chat_room.name,
'last_update': chat_room.last_updated,
'date_created': chat_room.date_created,
'unread_messages': chat_room.unread_messages(self.scope["user"]),
'last_message': model_to_dict(last_message) if last_message else None
}
members = chat_room.chatmember_set.all()
member_data = []
for member in members:
member_data.append({
'id': member.member.id,
'first_name': member.member.first_name,
'last_name': member.member.last_name,
'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None
})
chat_room_data['members'] = member_data
chat_rooms_data.append(chat_room_data)
if chat_rooms:
for chat_room in chat_rooms:
last_message = ChatMessage.objects.filter(room=chat_room).last()
chat_room_data = {
'id': chat_room.id,
'name': chat_room.name,
'last_update': chat_room.last_updated,
'date_created': chat_room.date_created,
'unread_messages': chat_room.unread_messages(self.user),
'last_message': model_to_dict(last_message) if last_message else None
}
members = chat_room.chatmember_set.all()
member_data = []
for member in members:
member_data.append({
'id': member.member.id,
'first_name': member.member.first_name,
'last_name': member.member.last_name,
'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None
})
chat_room_data['members'] = member_data
chat_rooms_data.append(chat_room_data)
self.send(text_data=json.dumps({
'event_type': 'get_dms',

@ -1,5 +1,4 @@
{% load static %}
<p id="userId" class="hidden">{{request.user.id}}</p>
<div id="osichatWidget" class="hidden fixed bg-black bg-opacity-50 inset-0 z-50 h-[100vh]">
<div
class="w-[950px] min-h-[500px] h-[80%] bg-white rounded-md border border-gray-200 shadow-xl z-20 right-9 bottom-24 grid grid-cols-3 fixed">

@ -6,25 +6,56 @@ It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
"""
import os
import jwt
from django.core.asgi import get_asgi_application
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import AnonymousUser
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator
from channels.routing import ProtocolTypeRouter
from osinaweb.routing import websocket_urlpatterns
from django.core.exceptions import ObjectDoesNotExist
from urllib.parse import parse_qs
from osinacore.api.utils import *
from channels.db import database_sync_to_async
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'osinaweb.settings')
django_asgi_app = get_asgi_application()
class JWTAuthMiddleware:
"""Middleware to extract JWT token from the URL query parameters and set the user in the scope."""
def __init__(self, inner):
self.inner = inner
async def __call__(self, scope, receive, send):
# Extract the token from the URL query parameters
query_string = scope['query_string'].decode() # Decode the query string
query_params = parse_qs(query_string) # Parse the query string
token = query_params.get('token', [None])[0]
if token:
try:
token_data = verify(token)
user = await database_sync_to_async(User.objects.get)(id=token_data['userid'])
scope['user'] = user
except (jwt.ExpiredSignatureError, jwt.DecodeError, ObjectDoesNotExist):
scope['user'] = AnonymousUser() # Set user to AnonymousUser if there's an error
else:
# No JWT token provided, fallback to default authentication
return await AuthMiddlewareStack(self.inner)(scope, receive, send)
return await self.inner(scope, receive, send)
application = ProtocolTypeRouter({
"http": django_asgi_app,
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(URLRouter(websocket_urlpatterns))
"websocket": AllowedHostsOriginValidator(
JWTAuthMiddleware(
AuthMiddlewareStack(URLRouter(websocket_urlpatterns))
)
),
})

Binary file not shown.

Binary file not shown.

@ -1,7 +1,6 @@
let admin_chat_ws_scheme = window.location.protocol === "https:" ? "wss" : "ws";
let protocol = window.location.protocol === "https:" ? "https" : "http";
let admin_chat_domain = "osina.ositcom.com";
let userId = document.getElementById('userId').textContent.trim();
let osichatadminroomSocket = null;
let currentChatId = null;
let whereAmI = null;
@ -39,7 +38,6 @@ function initializeOsichat(){
osichatroomsSocket.send(JSON.stringify({
'event_type': 'set_client_type',
'client_type': 'website_admin',
'user_id': userId,
'whereAmI': whereAmI === 'Visitors' ? 'Visitors' : 'Chats' // Default to 'Chats' if not 'Visitors'
}));
};

Loading…
Cancel
Save