diff --git a/chat/forms.py b/chat/forms.py
new file mode 100644
index 0000000..b555a86
--- /dev/null
+++ b/chat/forms.py
@@ -0,0 +1,39 @@
+from django import forms
+from .models import ChatRoom
+from users.models import UserFullName
+
+
+class ChatUpdateChatRoom(forms.ModelForm):
+
+ class Meta:
+ model = ChatRoom
+ labels = {
+ "roomname" : "Raumname",
+ "chatmembers" : "Mitglieder",
+ "chatmembers_admin" : "Verwalter",
+ }
+
+ fields = ['roomname', 'chatmembers', 'chatmembers_admin']
+
+ def __init__(self, *args, **kwargs):
+ print(kwargs)
+ super(ChatUpdateChatRoom, self).__init__(*args, **kwargs)
+ self.fields['chatmembers'] = forms.MultipleChoiceField(required=True, label="Mitglieder", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=kwargs["instance"].creator.profile.agency.pk).exclude(pk=kwargs["instance"].creator.pk)], widget=forms.CheckboxSelectMultiple())
+ self.fields['chatmembers_admin'] = forms.MultipleChoiceField(required=False, label="Raumverwalter", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=kwargs["instance"].creator.profile.agency.pk).exclude(pk=kwargs["instance"].creator.pk)], widget=forms.CheckboxSelectMultiple())
+
+class ChatAddChatRoom(forms.ModelForm):
+
+ class Meta:
+ model = ChatRoom
+ labels = {
+ "roomname" : "Raumname",
+ "chatmembers" : "Mitglieder",
+ "chatmembers_admin" : "Verwalter",
+ }
+
+ fields = ['roomname', 'chatmembers', 'chatmembers_admin']
+
+ def __init__(self, *args, **kwargs):
+ super(ChatAddChatRoom, self).__init__(*args, **kwargs)
+ self.fields['chatmembers'] = forms.MultipleChoiceField(required=True, label="Mitglieder", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=kwargs["instance"].profile.agency.pk).exclude(pk=kwargs["instance"].pk)], widget=forms.CheckboxSelectMultiple())
+ self.fields['chatmembers_admin'] = forms.MultipleChoiceField(required=False, label="Raumverwalter", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=kwargs["instance"].profile.agency.pk).exclude(pk=kwargs["instance"].pk)], widget=forms.CheckboxSelectMultiple())
diff --git a/chat/models.py b/chat/models.py
index 9aa1a9d..45b6f8a 100644
--- a/chat/models.py
+++ b/chat/models.py
@@ -3,7 +3,7 @@ from django.contrib.auth.models import User
from users.models import Agency
from django.urls import reverse
from django.utils import timezone
-
+from django_cryptography.fields import encrypt
'''
@@ -13,7 +13,7 @@ MODEL ChatMessage
'''
class ChatMessage(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
- content = models.CharField(max_length=5000, blank=False, default="")
+ content = encrypt(models.CharField(max_length=5000, blank=False, default=""))
sendtime = models.DateTimeField(default=timezone.now, blank=True)
room = models.ForeignKey("ChatRoom", on_delete=models.CASCADE)
'''
@@ -24,7 +24,7 @@ Model ChatRoom
class ChatRoom(models.Model):
- creator = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
+ creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
'''
chatroomtype
@@ -34,9 +34,11 @@ class ChatRoom(models.Model):
'''
chatroomtype = models.IntegerField(default=0)
roomname = models.CharField(max_length=200, blank=False, default="")
+ grouproomname = models.CharField(max_length=200, blank=False, default="")
# This field is for random-String Django Channels
roomname_channel = models.CharField(max_length=200, blank=False)
chatmembers = models.ManyToManyField(User, blank=True, related_name='users_in_chatroom')
+ chatmembers_admin = models.ManyToManyField(User, blank=True, related_name='adminusers_in_chatroom')
chatroom_createddate = models.DateTimeField(blank=True)
chatmember_single = models.ForeignKey(User, related_name='singleuserchat', on_delete=models.CASCADE, null=True, blank=True)
'''
@@ -53,6 +55,8 @@ class ChatRoom(models.Model):
def __str__(self):
return f'{self.roomname}'
+ def get_absolute_url(self):
+ return reverse('chat-update', kwargs={'pk':self.pk})
diff --git a/chat/templates/chat/chat_content.html b/chat/templates/chat/chat_content.html
index 766d0d1..e13144d 100644
--- a/chat/templates/chat/chat_content.html
+++ b/chat/templates/chat/chat_content.html
@@ -32,11 +32,11 @@
{% endif %}
{% if message.author == request.user %}
-
+
-
{{message.sendtime|date:"H:i"}}
+
{{message.sendtime|date:"H:i"}}
{{message.content}}
@@ -44,7 +44,7 @@
{% else %}
-
+
@@ -102,7 +102,8 @@ $(document).ready(function(){
chatwebsocket.onmessage = function(e) {
- datainfo = e["data"].split("__");
+ datainfo = e["data"].split("__");
+
if(datainfo[0] == "starttyping")
{
typingname = (datainfo[1].split("_"))[1];
@@ -136,7 +137,11 @@ $(document).ready(function(){
}
});
}
- };
+ console.log(datainfo)
+ if(datainfo[0] == "delete_message"){
+ $("#usermessage_" + datainfo[1]).remove();
+ }
+ }
chatwebsocket.onclose = function(e) {
console.error('Chat socket closed unexpectedly');
@@ -179,8 +184,22 @@ $(document).ready(function(){
});
}
}
+function deleteOwnMessage(id){
-
+ $.ajax(
+ {
+ type: "GET",
+ url: "{% url 'chat:chat-ajax' %}",
+ data : {
+ action : "delmessage",
+ messageid : id
+ },
+ success: function( data )
+ {
+ chatwebsocket.send("delmessage__" + id + "__privatechat_{{roomdata.creator.pk}}_{{roomdata.chatmember_single.pk}}");
+ }
+ });
+}
$(document).on('keypress',function(e) {
if(e.which == 13) {
if($("#message").val().length > 0 && sending){
diff --git a/chat/templates/chat/chat_content_basechat.html b/chat/templates/chat/chat_content_basechat.html
index db01b59..096ae0e 100644
--- a/chat/templates/chat/chat_content_basechat.html
+++ b/chat/templates/chat/chat_content_basechat.html
@@ -69,11 +69,11 @@
{% endif %}
{% if message.author == request.user %}
-
+
-
{{message.sendtime|date:"H:i"}}
+
{{message.sendtime|date:"H:i"}}
{{message.content}}
@@ -81,7 +81,7 @@
{% else %}
-
+
@@ -180,6 +180,10 @@ $(document).ready(function(){
}
});
}
+
+ if(datainfo[0] == "delete_message"){
+ $("#usermessage_" + datainfo[1]).remove();
+ }
};
chatwebsocket.onclose = function(e) {
@@ -224,6 +228,22 @@ $(document).ready(function(){
}
}
+function deleteOwnMessage(id){
+
+ $.ajax(
+ {
+ type: "GET",
+ url: "{% url 'chat:chat-ajax' %}",
+ data : {
+ action : "delmessage",
+ messageid : id
+ },
+ success: function( data )
+ {
+ chatwebsocket.send("delmessage__" + id + "__privatechat_{{roomdata.creator.pk}}_{{roomdata.chatmember_single.pk}}");
+ }
+ });
+}
$(document).on('keypress',function(e) {
if(e.which == 13) {
diff --git a/chat/templates/chat/chat_content_groupchat.html b/chat/templates/chat/chat_content_groupchat.html
new file mode 100644
index 0000000..3498e22
--- /dev/null
+++ b/chat/templates/chat/chat_content_groupchat.html
@@ -0,0 +1,253 @@
+{% load counter_tag %}
+
{{roomdata.roomname}}
+ {% if user in roomdata.chatmembers_admin.all or user == roomdata.creator %}
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
+ Unterhaltung gestartet am {{roomdata.chatroom_createddate}}
+
+
+
+
+ {% for message in roomdata.messages.all %}
+
+ {% if forloop.counter0 == 0 %}
+ {% setMessageDayInfo message %}
+ {% else %}
+ {% getMessageDayInfo message as newday %}
+ {% if newday == True %}
+
+
+
+ {{message.sendtime|date:"d.m.Y"}}
+
+
+ {% endif %}
+ {% endif %}
+
+ {% if message.author == request.user %}
+
+
+
+
+
{{message.sendtime|date:"H:i"}}
+
+
+
+ {{message.content}}
+
+
+
+ {% else %}
+
+
+
+
+
{{message.author.first_name}} {{message.author.last_name}}, {{message.sendtime|date:"H:i"}}
+
+
+ {{message.content}}
+
+
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+
+ Jemand tippt...
+
+
+
+
+
+
+
+
+
+
+{% if user in roomdata.chatmembers_admin.all or user == roomdata.creator %}
+
+
+
+
+
+ Möchten Sie wirklich den Chatraum {{roomdata.roomname}} löschen? Alle Nachrichten werden entfernt!
+
+
+
+
+
+
+{% endif %}
diff --git a/chat/templates/chat/chat_othermessage.html b/chat/templates/chat/chat_othermessage.html
index ce535cb..cfc2bdf 100644
--- a/chat/templates/chat/chat_othermessage.html
+++ b/chat/templates/chat/chat_othermessage.html
@@ -1,4 +1,4 @@
-
+
diff --git a/chat/templates/chat/chat_ownmessage.html b/chat/templates/chat/chat_ownmessage.html
index ab3083d..bf01cd9 100644
--- a/chat/templates/chat/chat_ownmessage.html
+++ b/chat/templates/chat/chat_ownmessage.html
@@ -1,11 +1,11 @@
-
+
-
{{newmessage.sendtime|date:"H:i"}}
+
{{newmessage.sendtime|date:"H:i"}}
- {{newmessage.content}}
+ {{newmessage.content}}
-
\ No newline at end of file
+
diff --git a/chat/templates/chat/chatmanagement.html b/chat/templates/chat/chatmanagement.html
index 4d9547c..14671d2 100644
--- a/chat/templates/chat/chatmanagement.html
+++ b/chat/templates/chat/chatmanagement.html
@@ -53,23 +53,22 @@
min-height: 600px;
overflow-y: auto;
}
-
-
-
Chat
+ ACHTUNG! Der Chat befindet sich im Beta-Stadium! Bitte vermeiden Sie es daher, persönliche oder intime Informationen zu verschicken, bis alle Funktionen ausreichend erprobt sind. Vielen Dank!
-
Mitarbeiter und Räume
+
Mitarbeiter
+
{% for user in usersofagency %}
-
+
@@ -90,6 +89,29 @@
+ {% endfor %}
+
+
Chaträume
+
+
+
+ {% for chatroom in chatrooms %}
+ {% if user in chatroom.chatmembers.all or user in chatroom.chatmembers_admin.all or user == chatroom.creator and chatroom.chatroomtype == 1 %}
+
+
+
+
{{chatroom.roomname}}
+
+ {% for member in chatroom.chatmembers.all %}
+ {{member.first_name}} {{member.last_name}}{% if forloop.counter < chatroom.chatmembers.all|length %}, {% endif %}
+ {% endfor %}
+
+
+
+
+
+
+ {% endif %}
{% endfor %}
@@ -112,24 +134,48 @@
)
$(".hoverchatcard").click(function(){
+ clickedroomtype = $(this)[0]["id"].split("_")[0];
+ clickedroomid = $(this)[0]["id"].split("_")[1];
- $.ajax(
- {
- type: "GET",
- url: "{% url 'chat:chat-ajax' %}",
- data : {
- action : "startnewchat_user_user",
- new_chat_userid : $(this)[0]["id"].split("_")[1],
- is_basechat : 0
- },
- success: function( data )
- {
- if(creator_id != false && chatmember_id != false){
- chatwebsocket.close();
- }
- $("#mainchatcontent").html(data);
- }
- });
+ if (clickedroomtype == "userchat"){
+ $.ajax(
+ {
+ type: "GET",
+ url: "{% url 'chat:chat-ajax' %}",
+ data : {
+ action : "startnewchat_user_user",
+ new_chat_userid : $(this)[0]["id"].split("_")[1],
+ is_basechat : 0
+ },
+ success: function( data )
+ {
+ if(creator_id != false && chatmember_id != false){
+ chatwebsocket.close();
+ }
+ $("#mainchatcontent").html(data);
+ }
+ });
+ }
+ //Open Groupchat
+ else{
+ $.ajax(
+ {
+ type: "GET",
+ url: "{% url 'chat:chat-ajax' %}",
+ data : {
+ action : "startnewchat_groupchat",
+ groupchatid : clickedroomid,
+ is_basechat : 0
+ },
+ success: function( data )
+ {
+ if(creator_id != false && chatmember_id != false){
+ chatwebsocket.close();
+ }
+ $("#mainchatcontent").html(data);
+ }
+ });
+ }
});
function updatePresenceLive() {
diff --git a/chat/templates/chat/chatmanagement_addgc.html b/chat/templates/chat/chatmanagement_addgc.html
new file mode 100644
index 0000000..b68825e
--- /dev/null
+++ b/chat/templates/chat/chatmanagement_addgc.html
@@ -0,0 +1,48 @@
+{% extends "users/base.html" %}
+{% load crispy_forms_tags %}
+{% block content %}
+{% if request.user.profile.agency.module_chat %}
+
+
+{% else %}
+
Das Module Chat wurde in ihrer Agentur deaktiviert.
+{% endif %}
+{% endblock content %}
+
+
diff --git a/chat/urls.py b/chat/urls.py
index 37f28d5..d20f00f 100644
--- a/chat/urls.py
+++ b/chat/urls.py
@@ -4,8 +4,11 @@ from . import views
app_name = 'chat'
urlpatterns = [
path('managemenet/', views.chatmanagement, name='chat-management'),
+ path('addgc/', views.ChatAddGroupChat, name='chat-addgroup'),
+ path('addgc/update/
', views.ChatUpdateGroupChat.as_view(), name='chat-update'),
path('ajaxchat', views.chatajaxmain, name="chat-ajax"),
path('ajaxchat/getloggedusers', views.getloggedusers, name="chtaajax-getloggedusers"),
path('ajaxchat/getloggedusersdata', views.getloggedusersdata, name="chtaajax-getloggedusers-data")
+
]
\ No newline at end of file
diff --git a/chat/views.py b/chat/views.py
index 84dbcc6..e1bfa22 100644
--- a/chat/views.py
+++ b/chat/views.py
@@ -1,4 +1,4 @@
-from django.shortcuts import render
+from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from channels_presence.models import Presence
from django.http import HttpResponseRedirect,HttpResponse, JsonResponse
@@ -8,6 +8,11 @@ from channels_presence.models import Presence
import channels.layers
from django.utils import timezone
from .models import ChatRoom, ChatMessage
+from .forms import ChatAddChatRoom, ChatUpdateChatRoom
+from django.contrib import messages
+from django.views.generic import UpdateView
+from django.urls import reverse_lazy
+from django.contrib.auth.mixins import LoginRequiredMixin
# Create your views here.
@login_required
@@ -18,13 +23,51 @@ def chatmanagement(request):
context = {
'active_link' : 'chat',
"usersofagency" : User.objects.filter(profile__agency=request.user.profile.agency).exclude(pk=request.user.pk).order_by("last_name"),
- "onlineusers" : users_online.get_users()
+ "onlineusers" : users_online.get_users(),
+ "chatrooms" : ChatRoom.objects.all()
}
return render(request, 'chat/chatmanagement.html', context)
+@login_required
+def ChatAddGroupChat(request):
+ if request.method == "POST":
+ form = ChatAddChatRoom(request.POST, instance=request.user)
+ if(form.is_valid()):
+ newchatroom = ChatRoom(creator=request.user, chatroomtype=1, roomname=form.cleaned_data["roomname"], roomname_channel="groupchat", chatroom_createddate=timezone.now(), viewstatus=0)
+ newchatroom.save()
+ newchatroom.chatmembers.set(form.cleaned_data["chatmembers"])
+ newchatroom.chatmembers_admin.set(form.cleaned_data["chatmembers_admin"])
+ newchatroom.save()
+ messages.success(request, f'Raum angelegt!')
+ else:
+ messages.success(request, f'Raum konnte nicht angelegt werden!')
+ return redirect('chat:chat-management')
+ else:
+ context = {
+ 'active_link' : 'chat',
+ "form" : ChatAddChatRoom(instance=request.user)
+ }
+ return render(request, 'chat/chatmanagement_addgc.html', context)
+
+class ChatUpdateGroupChat(LoginRequiredMixin, UpdateView):
+ model = ChatRoom
+ template_name = 'chat/chatmanagement_addgc.html'
+ success_url = reverse_lazy('chat:chat-management')
+ form_class = ChatUpdateChatRoom
+
+ def form_valid(self, form):
+ # Send message to the site
+ messages.success(self.request, f'Chatraum aktualisiert!')
+ return super().form_valid(form)
+
+ def get_context_data(self, **kwargs):
+ context = super(ChatUpdateGroupChat, self).get_context_data(**kwargs)
+ context['active_link'] = 'chat'
+ print(context)
+ return context
@login_required
def getloggedusers(request):
@@ -81,7 +124,7 @@ def chatajaxmain(request):
singleuser = User.objects.get(pk=singleuserid)
# NO PRIVATE CHAT THERE, CREATE ONE!
if(len(getroom) == 0):
- newchatroom = ChatRoom(creator=request.user, chatroomtype=0, roomname="Gespräch mit " + singleuser.first_name + " " + singleuser.last_name, roomname_channel="privatechat_" + str(request.user.pk) + "_" + singleuserid, chatmember_single=singleuser, chatroom_createddate=timezone.now(), viewstatus=0)
+ newchatroom = ChatRoom(creator=request.user, chatroomtype=0, roomname=singleuser.first_name + " " + singleuser.last_name, roomname_channel="privatechat_" + str(request.user.pk) + "_" + singleuserid, chatmember_single=singleuser, chatroom_createddate=timezone.now(), viewstatus=0)
newchatroom.save()
context = {
"roomdata" : newchatroom
@@ -94,9 +137,39 @@ def chatajaxmain(request):
return render(request, "chat/chat_content_basechat.html", context)
else:
return render(request, "chat/chat_content.html", context)
+ # NACHRICHT LÖSCHEN
+ elif request.GET["action"] == "delmessage":
+ message_to_del = ChatMessage.objects.get(pk=request.GET["messageid"])
+ if(message_to_del.author == request.user):
+ message_to_del.delete()
+ return JsonResponse({"status" : "OK"})
+ else:
+ return JsonResponse({"status" : "FORBIDDEN"})
+ # GRUPPENCHAT LÖSCHEN
+ elif request.GET["action"] == "remove_chatroom":
+ chatroom = ChatRoom.objects.get(pk=request.GET["groupchatid"])
+ if(request.user == chatroom.creator or request.user in chatroom.chatmembers_admin.all()):
+ chatroom.delete()
+ messages.success(request, f'Raum gelöscht!')
+ return JsonResponse({"status" : "RELOAD"})
+ else:
+ messages.success(request, f'Das dürfen Sie nicht!')
+ return JsonResponse({"status" : "RELOAD"})
+ # GRUPPENCHAT ÖFFNEN
+ elif request.GET["action"] == "startnewchat_groupchat":
+
+ chatroom = ChatRoom.objects.get(pk=request.GET["groupchatid"])
+
+ if(request.user == chatroom.creator or request.user in chatroom.chatmembers.all() or request.user in chatroom.chatmembers_admin.all()):
+ context = {
+ "roomdata" : chatroom
+ }
+ return render(request, "chat/chat_content_groupchat.html", context)
+ else:
+ JsonResponse({"status" : "Error on CHATAJAXMAIN"})
elif request.GET["action"] == "addnewmessage":
room = ChatRoom.objects.get(pk=request.GET["room"])
- if(request.user == room.creator or request.user == room.chatmember_single):
+ if(request.user == room.creator or request.user == room.chatmember_single or request.user in room.chatmembers.all() or request.user in room.chatmembers_admin.all()):
newmessage = ChatMessage(room=room, author=request.user, content=request.GET["message"])
newmessage.save()
@@ -118,12 +191,3 @@ def chatajaxmain(request):
return JsonResponse({"status" : "Error on CHATAJAXMAIN"})
-
-'''
-author = models.ForeignKey(User, on_delete=models.CASCADE)
- content = models.CharField(max_length=5000, blank=False, default="")
- sendtime = models.DateField(default=timezone.now, blank=True)
- room = models.ForeignKey("ChatRoom", on_delete=models.CASCADE)
-
-
-'''
\ No newline at end of file
diff --git a/users/admin.py b/users/admin.py
index a024516..b0c9f2e 100644
--- a/users/admin.py
+++ b/users/admin.py
@@ -7,6 +7,7 @@ from message.models import Message
from cloud.models import DataFile
from organizer.models import AGContacts
from timemanagement.models import Workday, Breaks, AbsenceReason, FreeDays, Absence
+from chat.models import ChatRoom
admin.site.register(StandardComments)
admin.site.register(StandardCommentRate)
@@ -28,3 +29,4 @@ admin.site.register(AbsenceReason)
admin.site.register(Absence)
admin.site.register(FreeDays)
admin.site.register(UserYearAbsenceInfo)
+admin.site.register(ChatRoom)
diff --git a/users/mainwebsocket.py b/users/mainwebsocket.py
index 53f3817..e379abc 100644
--- a/users/mainwebsocket.py
+++ b/users/mainwebsocket.py
@@ -8,7 +8,6 @@ import channels
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
-
class UsersConsumer(WebsocketConsumer):
appconnect = False
@@ -63,7 +62,7 @@ class UsersConsumer(WebsocketConsumer):
# WEBSOCKET-DATA-CONTENT
def receive(self, text_data=None, bytes_data=None):
if text_data == '"heartbeat"':
- Presence.objects.touch(self.channel_name)
+ Presence.objects.touch(self.channel_name)
# UPDATET STANDARD
def update_standard(self, event):
@@ -103,11 +102,7 @@ class UsersChat(WebsocketConsumer):
loggeduser = self.scope["user"]
roomname = "privatechat_" + str(self.scope["url_route"]["kwargs"]["creator"]) + "_" + str(self.scope["url_route"]["kwargs"]["single"])
- # TODO: Hier das doppelte Problem lösen mit den Channels...Datenbank dazuziehen!!!
- print(roomname)
- print(loggeduser.pk)
channel_layer = channels.layers.get_channel_layer()
- print(channel_layer)
Room.objects.add(roomname, self.channel_name, loggeduser)
def disconnect(self, close_code):
@@ -126,10 +121,12 @@ class UsersChat(WebsocketConsumer):
elif datainfo[0] == 'stoptyping':
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'stop_typing'})
- elif datainfo[0] == 'load':
+ elif datainfo[0] == 'load':
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'reloadmessages'})
-
+ elif datainfo[0] == 'delmessage':
+ channel_layer = channels.layers.get_channel_layer()
+ async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'delmessage', 'messageid' : datainfo[1] })
def start_typing(self, event):
useristyping = User.objects.get(pk=event["typingname"])
@@ -151,4 +148,76 @@ class UsersChat(WebsocketConsumer):
# SOMETHING IN PRESENCE CHANGED
def update_presence_live(self, event):
- self.send("presence_update")
\ No newline at end of file
+ self.send("presence_update")
+
+ def delmessage(self, event):
+ self.send("delete_message__" + event["messageid"])
+
+
+class GroupChat(WebsocketConsumer):
+
+ 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"]
+
+ roomname = "groupchat_" + str(self.scope["url_route"]["kwargs"]["chatid"])
+ channel_layer = channels.layers.get_channel_layer()
+ Room.objects.add(roomname, self.channel_name, loggeduser)
+
+ def disconnect(self, close_code):
+ Presence.objects.touch(self.channel_name)
+ Room.objects.remove("", self.channel_name)
+
+ # WEBSOCKET-DATA-CONTENT
+ def receive(self, text_data=None, bytes_data=None):
+ datainfo = text_data.split("__")
+ typinguserid = datainfo[1]
+
+ print(datainfo[2])
+
+ if datainfo[0] == 'starttyping':
+ channel_layer = channels.layers.get_channel_layer()
+ async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'start_typing', 'typingname' : typinguserid})
+ elif datainfo[0] == 'stoptyping':
+ channel_layer = channels.layers.get_channel_layer()
+ async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'stop_typing'})
+ elif datainfo[0] == 'load':
+ channel_layer = channels.layers.get_channel_layer()
+ async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'reloadmessages'})
+ elif datainfo[0] == 'delmessage':
+ channel_layer = channels.layers.get_channel_layer()
+ async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'delmessage', 'messageid' : datainfo[1] })
+
+ def start_typing(self, event):
+ useristyping = User.objects.get(pk=event["typingname"])
+ self.send("starttyping__" + str(useristyping.pk) + "_" + useristyping.first_name + " " + useristyping.last_name + " tippt...")
+
+ def stop_typing(self, event):
+ self.send("stoptyping")
+
+ def reloadmessages(self, event):
+ 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")
+
+ def delmessage(self, event):
+ self.send("delete_message__" + event["messageid"])
\ No newline at end of file
diff --git a/users/routing.py b/users/routing.py
index 4b0701b..d93fd31 100644
--- a/users/routing.py
+++ b/users/routing.py
@@ -4,6 +4,7 @@ from . import mainwebsocket
websocket_urlpatterns = [
re_path(r'ws/chat/(?P\w+)/(?P\w+)/$', mainwebsocket.UsersChat, name="ws-chat"),
+ re_path(r'ws/groupchat/(?P\w+)/$', mainwebsocket.GroupChat, name="ws-groupchat"),
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
diff --git a/users/templates/users/base.html b/users/templates/users/base.html
index 4b03fcc..160be42 100644
--- a/users/templates/users/base.html
+++ b/users/templates/users/base.html
@@ -154,6 +154,7 @@
{% endif %}
{% if request.user.profile.agency.module_chat %}
+
{% if active_link == 'chat' %}
{% else%}
@@ -436,7 +437,7 @@
-
@@ -739,7 +742,9 @@ $(document).ready(function(){
else{
{% if active_link == "chat" %}
- updatePresenceLive();
+ if(preventUpdatePresLive == false){
+ updatePresenceLive();
+ }
{% endif %}
}
};
@@ -849,4 +854,4 @@ $("#chatButton").click(function(){
-
\ No newline at end of file
+
diff --git a/users/urls.py b/users/urls.py
index 24ee00e..1864935 100644
--- a/users/urls.py
+++ b/users/urls.py
@@ -36,7 +36,8 @@ urlpatterns = [
path('setuserparent/', views.setuserparent, name="users-setuserparent"),
path('sendpassmail/', views.sendpassmail, name="users-sendpassmail"),
path('changeonlinestat/', views.changeonlinestat, name="users-updateonlinestat"),
- path('dacron/', views.cronactions, name="cronmain")
+ path('dacron/', views.cronactions, name="cronmain"),
+ path('dacrondaily/', views.cronactionsdaily, name="cronmaindaily")
]
diff --git a/users/views.py b/users/views.py
index 62aecab..d64a386 100644
--- a/users/views.py
+++ b/users/views.py
@@ -41,6 +41,7 @@ from channels_presence.models import Room
from channels_presence.models import Presence
import channels.layers
from datetime import date
+from timemanagement.models import Workday
def randomString(stringLength=10):
"""Generate a random string of fixed length """
@@ -826,6 +827,7 @@ def handler500(request):
CRONJOB FUNCTION
'''
+# CRONJOBS ALLE 5 MINUTEN
def cronactions(request, code):
data = {}
if(code == settings.CRONAPIKEY):
@@ -856,15 +858,21 @@ def cronactions(request, code):
newnotification = UserNotification(touser=user, notificationtext="Neue Agenturnews: " + news.name, notificationtype="agencynews", elementid=news.pk)
newnotification.save()
- # TODO: CronJob für REST-Urlaub implementieren
+
+# CRONJOBS UM 00:01!
+def cronactionsdaily(request, code):
+ data = {}
+ if(code == settings.CRONAPIKEY):
+ allusers = User.objects.all()
+
'''
Pro User gibt es das Feld loose_holiday in der UserTime-Info. Ist dieser Tag vorbei, muss die Differenz der days_inuse des VORJHARES in den Rest das AKTUELLEN JAHRES gespeichert werden!
-
'''
today = date.today()
for user in allusers:
+ # REST URLAUB BERECHNUNG
usertimedata = UserTime.objects.get(user=user)
day_tocheck = usertimedata.loose_holidedate.split(".")[0]
@@ -887,31 +895,17 @@ def cronactions(request, code):
next_year.restdays = this_year.days - this_year.days_inuse
next_year.save()
- data.update({"status" : "ok"})
- elif(code == settings.MAILINFOKEY):
- pass
- '''
- # GET ALL USERS
- users = User.objects.all().exclude(username="root")
+ # ARBEITSTAGE BEENDEN
+ # Benutzer hat Zeiterfassung aktiv
+ if(user.usertime.usetime):
+ workdays = Workday.objects.filter(user=user, end=None)
+ for wd in workdays:
+ wd.end = datetime(wd.start.year, wd.start.month, wd.start.day, 23, 59)
+ wd.save()
- for u in users:
- u.username = u.email
- try:
- u.save()
- notificationtext = "ab sofort können Sie sich nur noch mit Ihrer E-Mailadresse anmelden. Diese lautet " + u.email + "!"
- msg_html = render_to_string('users/password_to_username_mail.html', {'user': u, 'notificationtext' : notificationtext})
- send_mail(
- 'Agentur-Benachrichtigung',
- 'Hallo ' + u.first_name + ' ' + u.last_name + '! ' + notificationtext,
- 'noreply@digitale-agentur.com',
- [u.email],
- html_message=msg_html,
- fail_silently=True
- )
- data.update({"user_" + str(u.pk) : u.email})
- except:
- data.update({"ERROR_user_" + str(u.pk) : u.email})
- '''
+
+ data.update({"status" : "ok"})
+
else:
print("API CODE FAILED")
data.update({"status" : "failed"})