diff --git a/api/serializers.py b/api/serializers.py index 22c12d9..3975105 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -2,6 +2,7 @@ from django.contrib.auth.models import User from rest_framework import serializers from rest_framework.validators import UniqueTogetherValidator from standards.models import Standards +from chat.models import ChatRoom, ChatMessage class StandardsSerializer(serializers.ModelSerializer): @@ -16,4 +17,38 @@ class StandardsSerializer(serializers.ModelSerializer): return standard.created_standard_by.first_name + " " + standard.created_standard_by.first_name def getFormatedLastModified(self, standard): - return standard.last_modified_on.strftime("%d.%m.%Y %H:%M") \ No newline at end of file + return standard.last_modified_on.strftime("%d.%m.%Y %H:%M") + + +class ChatRoomSerializer(serializers.ModelSerializer): + + class Meta: + model = ChatRoom + fields = ["id", "roomname", "roomname_channel"] + +class ChatMessageSerializer(serializers.ModelSerializer): + sendtime = serializers.SerializerMethodField('getFormatedMessageTimeStarted') + + class Meta: + model = ChatMessage + fields = ["author", "content", "sendtime"] + + +class ChatRoomFullSerializer(serializers.ModelSerializer): + + chatroom_createddate = serializers.SerializerMethodField('getFormatedChatStarted') + #messages = ChatMessageSerializer(many=True) + + class Meta: + model = ChatRoom + fields = ["id", "roomname", "roomname_channel", "chatroom_createddate", "chatmembers", "chatmember_single","messages", "creator"] + depth = 2 + + def getFormatedChatStarted(self, chatroom): + return chatroom.chatroom_createddate.strftime("%d.%m.%Y %H:%M") + + + + + + \ No newline at end of file diff --git a/api/urls.py b/api/urls.py index e95f90b..987d2ed 100644 --- a/api/urls.py +++ b/api/urls.py @@ -1,11 +1,14 @@ from django.urls import path -from .views import HelloView +from .views import GetUserId from . import views app_name = 'api' urlpatterns = [ - path('helloview/', HelloView.as_view(), name='api-helloview'), + path('getuserid/', GetUserId.as_view(), name='api-getuserid'), path('getstandards/', views.getStandardList, name='api-getstandards'), path('getsinglestandard/', views.getSingleStandard, name='api-getsinglestandards'), - + path('logout/', views.logoutByToken, name='api-logout'), + path('getchatrooms/', views.getchatrooms, name='api-getchatrooms'), + path('getsinglechat/', views.getsinglechat, name='api-getsinglechat'), + path('chatnewmessage/', views.savenewchatmessage, name='api-savechatmessage'), ] \ No newline at end of file diff --git a/api/views.py b/api/views.py index 2b8176e..d20dbdd 100644 --- a/api/views.py +++ b/api/views.py @@ -4,40 +4,18 @@ from rest_framework.permissions import IsAuthenticated # <-- Here import json from standards.models import Standards from rest_framework import serializers -from .serializers import StandardsSerializer +from .serializers import StandardsSerializer, ChatRoomSerializer, ChatRoomFullSerializer from rest_framework.decorators import api_view, permission_classes from rest_framework import status from rest_framework.authentication import SessionAuthentication, BasicAuthentication, TokenAuthentication from rest_framework.decorators import authentication_classes +from chat.models import ChatRoom, ChatMessage -class HelloView(APIView): +class GetUserId(APIView): permission_classes = (IsAuthenticated,) # <-- And here def post(self, request): - content = {'message': 'Hello, World!'} - return Response(content) - -''' -class GiveMeStandards(APIView): - - - def post(self, request): - standards = Standards.objects.filter(agency=request.user.profile.agency) - - content = {} - i = 0 - for s in standards: - content.update({i : s.name.encode("utf-8")}) - i += 1 - - content = {'standards': content} - return Response(content) - - - def post(self, request): - ser = StandardsSerializer(data=Standards.objects.filter(agency=self.request.user.profile.agency)) - return Response(ser) -''' + return Response({"userid" : self.request.user.pk}) @api_view(['POST', ]) @permission_classes((IsAuthenticated,)) @@ -51,4 +29,45 @@ def getStandardList(request): def getSingleStandard(request, pk): standard = Standards.objects.get(pk=int(pk)) ser = StandardsSerializer(standard, many=False) - return Response(ser.data, status=status.HTTP_200_OK) \ No newline at end of file + return Response(ser.data, status=status.HTTP_200_OK) + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def logoutByToken(request): + print(request) + request.user.auth_token.delete() + return Response(status=status.HTTP_200_OK) + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def getchatrooms(request): + chatrooms = ChatRoom.objects.filter(creator=request.user) | ChatRoom.objects.filter(chatmember_single=request.user) + chatrooms_ser = ChatRoomSerializer(chatrooms, many=True) + return Response(chatrooms_ser.data, status=status.HTTP_200_OK) + + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def getsinglechat(request, pk): + chatroom = ChatRoom.objects.get(pk=pk) + if chatroom.creator == request.user or chatroom.chatmember_single == request.user or (request.user in chatroom.chatmembers.all()): + chatroom_ser = ChatRoomFullSerializer(chatroom, many=False) + return Response(chatroom_ser.data, status=status.HTTP_200_OK) + else: + return Response(status=status.HTTP_403_FORBIDDEN) + + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def savenewchatmessage(request): + room = ChatRoom.objects.get(pk=request.POST["room"]) + if(request.user == room.creator or request.user == room.chatmember_single): + newmessage = ChatMessage(room=room, author=request.user, content=request.POST["message"]) + newmessage.save() + room.messages.add(newmessage) + room.save() + return Response(status=status.HTTP_200_OK) + else: + return Response(status=status.HTTP_403_FORBIDDEN) + + diff --git a/chat/models.py b/chat/models.py index dd56b89..9aa1a9d 100644 --- a/chat/models.py +++ b/chat/models.py @@ -53,4 +53,6 @@ class ChatRoom(models.Model): def __str__(self): return f'{self.roomname}' + + diff --git a/chat/templates/chat/chat_content.html b/chat/templates/chat/chat_content.html index 5fc8e9b..86752e4 100644 --- a/chat/templates/chat/chat_content.html +++ b/chat/templates/chat/chat_content.html @@ -119,7 +119,9 @@ $(document).ready(function(){ chatwebsocket = new WebSocket(ws_string+window.location.host+"/ws/chat/{{roomdata.creator.pk}}/{{roomdata.chatmember_single.pk}}/") } - chatwebsocket.onmessage = function(e) { + chatwebsocket.onmessage = function(e) { + + datainfo = e["data"].split("__"); if(datainfo[0] == "starttyping") { diff --git a/chat/templates/chat/chatmanagement.html b/chat/templates/chat/chatmanagement.html index 0bed342..b992f9c 100644 --- a/chat/templates/chat/chatmanagement.html +++ b/chat/templates/chat/chatmanagement.html @@ -136,8 +136,7 @@ action : "getloggedusers" }, success: function( data ) - { - console.log(data); + { counter = 0; $( ".status-circle" ).each(function( index ) { if(data["user_online_final"].indexOf($(this)[0]["id"].split("_")[2]) !== -1){ diff --git a/digitaleagentur/__pycache__/settings.cpython-38.pyc b/digitaleagentur/__pycache__/settings.cpython-38.pyc index 12b8c9e..bf25b8b 100644 Binary files a/digitaleagentur/__pycache__/settings.cpython-38.pyc and b/digitaleagentur/__pycache__/settings.cpython-38.pyc differ diff --git a/digitaleagentur/settings.py b/digitaleagentur/settings.py index 45dae74..a2beca9 100644 --- a/digitaleagentur/settings.py +++ b/digitaleagentur/settings.py @@ -14,6 +14,7 @@ from datetime import datetime, timedelta # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + ############################################## DEV ##################################### BASE_URL = "https://dev01.digitale-agentur.com/" CRONAPIKEY = "gCddsaz6NOnE9QbXZM5LasdEk122D" diff --git a/users/mainwebsocket.py b/users/mainwebsocket.py index bc91490..113ecc2 100644 --- a/users/mainwebsocket.py +++ b/users/mainwebsocket.py @@ -6,9 +6,12 @@ from channels_presence.decorators import touch_presence, remove_presence from channels_presence.models import Presence import channels from django.contrib.auth.models import User +from rest_framework.authtoken.models import Token + class UsersConsumer(WebsocketConsumer): + appconnect = False ''' CONNECT A WEBSOCKET @@ -18,16 +21,33 @@ class UsersConsumer(WebsocketConsumer): ''' - def connect(self): - super().connect() - loggeduser = self.scope["user"] + def connect(self): + super().connect() + pathcheck = self.scope["path"].split("/") + loggeduser = "" + # CHECK IF SOCKET COMES FROM APP OR FROM WEB + #APP + if(len(pathcheck) == 7 and len(pathcheck[5]) > 0): + loggeduser = User.objects.get(pk=Token.objects.get(key=pathcheck[5]).user_id) + self.appconnect = True + else: + loggeduser = self.scope["user"] + Presence.objects.touch(self.channel_name) - Room.objects.add("agency_" + str(loggeduser.profile.agency.pk), self.channel_name, self.scope["user"]) + Room.objects.add("agency_" + str(loggeduser.profile.agency.pk), self.channel_name, loggeduser) def disconnect(self, close_code): - loggeduser = self.scope["user"] - Room.objects.remove("agency_" + str(loggeduser.profile.agency.pk), self.channel_name) - Presence.objects.touch(self.channel_name) + if(not self.appconnect): + loggeduser = self.scope["user"] + Room.objects.remove("agency_" + str(loggeduser.profile.agency.pk), self.channel_name) + Presence.objects.touch(self.channel_name) + else: + pathcheck = self.scope["path"].split("/") + loggeduser = User.objects.get(pk=Token.objects.get(key=pathcheck[5]).user_id) + loggeduser = self.scope["user"] + Room.objects.remove("agency_" + str(loggeduser.profile.agency.pk), self.channel_name) + Presence.objects.touch(self.channel_name) + ''' def receive(self, text_data): @@ -58,7 +78,7 @@ class UsersConsumer(WebsocketConsumer): self.send("presence_update") -class UsersChat(UsersConsumer): +class UsersChat(WebsocketConsumer): ''' @@ -69,17 +89,29 @@ class UsersChat(UsersConsumer): ''' - def connect(self): + def connect(self): super().connect() - loggeduser = self.scope["user"] - roomname = "privatechat_" + str(self.scope["url_route"]["kwargs"]["creator"]) + "_" + str(self.scope["url_route"]["kwargs"]["single"]) - Room.objects.add(roomname, self.channel_name, self.scope["user"]) + pathcheck = self.scope["path"].split("/") + loggeduser = "" + # CHECK IF SOCKET COMES FROM APP OR FROM WEB + #APP + if(len(pathcheck) == 7 and len(pathcheck[5]) > 0): + loggeduser = User.objects.get(pk=Token.objects.get(key=pathcheck[5]).user_id) + self.appconnect = True + print("APP CONNECTED IN USERS CHAT") + else: + loggeduser = self.scope["user"] + + roomname = "privatechat_" + str(self.scope["url_route"]["kwargs"]["creator"]) + "_" + str(self.scope["url_route"]["kwargs"]["single"]) + Room.objects.add(roomname, self.channel_name, loggeduser) + def disconnect(self, close_code): Room.objects.remove("", self.channel_name) # WEBSOCKET-DATA-CONTENT - def receive(self, text_data=None, bytes_data=None): + + def receive(self, text_data=None, bytes_data=None): datainfo = text_data.split("__") typinguserid = datainfo[1] if datainfo[0] == 'starttyping': @@ -101,4 +133,16 @@ class UsersChat(UsersConsumer): self.send("stoptyping") def reloadmessages(self, event): - self.send("reloadmessages") \ No newline at end of file + self.send("reloadmessages") + + # UPDATET STANDARD + def update_standard(self, event): + self.send("standard_update") + + # NEW AGENCY NEWS + def agency_newnews(self, event): + self.send("Neue Agenturnews!") + + # SOMETHING IN PRESENCE CHANGED + def update_presence_live(self, event): + self.send("presence_update") \ No newline at end of file diff --git a/users/routing.py b/users/routing.py index 522be67..4b0701b 100644 --- a/users/routing.py +++ b/users/routing.py @@ -3,6 +3,7 @@ from django.urls import re_path from . import mainwebsocket websocket_urlpatterns = [ - re_path(r'ws/chat/(?P\w+)/(?P\w+)/$', mainwebsocket.UsersChat), - re_path('ws/', mainwebsocket.UsersConsumer), + re_path(r'ws/chat/(?P\w+)/(?P\w+)/$', mainwebsocket.UsersChat, name="ws-chat"), + re_path(r'ws/appchat/(?P\w+)/(?P\w+)/(?P\w+)/$', mainwebsocket.UsersChat, name="ws-appchat"), + re_path(r'ws/', mainwebsocket.UsersConsumer, name="ws-default"), ] \ No newline at end of file