From 0a674f71caa287ec02183dcaecb8894f872524e7 Mon Sep 17 00:00:00 2001 From: Holger Trampe Date: Sat, 4 Jul 2020 21:05:48 +0200 Subject: [PATCH] =?UTF-8?q?Benachrichtigungen=20weiter,=20Wochenende=20in?= =?UTF-8?q?=20Arbeitszeit=20eingef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dasettings/forms.py | 4 +- .../templates/dasettings/user_usprof.html | 2 + .../__pycache__/counter_tag.cpython-38.pyc | Bin 15197 -> 15293 bytes standards/templatetags/counter_tag.py | 7 +- .../timemanagement/rendered_table.html | 10 +-- timemanagement/views.py | 43 ++++++++++- users/models.py | 13 ++-- users/signals.py | 68 +++++++++++++++++- users/views.py | 29 +++++++- 9 files changed, 156 insertions(+), 20 deletions(-) diff --git a/dasettings/forms.py b/dasettings/forms.py index 8dc1116..2945e4d 100644 --- a/dasettings/forms.py +++ b/dasettings/forms.py @@ -273,10 +273,12 @@ class UserTimeForm(forms.ModelForm): "wd_we" : "Mittwoch", "wd_th" : "Donnerstag", "wd_fr" : "Freitag", + "wd_sa" : "Samstag", + "wd_so" : "Sonntag", "usetime" : "Zeiterfassung" , "usetime_start" : "Zeiterfassung ab" } - fields = ["startdate", "usetime", "usetime_start", "wd_mo", "wd_tu", "wd_we", "wd_th", "wd_fr", "loose_holidedate"] + fields = ["startdate", "usetime", "usetime_start", "wd_mo", "wd_tu", "wd_we", "wd_th", "wd_fr", "wd_sa", "wd_so", "loose_holidedate"] widgets = { "startdate" : DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}), "usetime_start" : DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}) diff --git a/dasettings/templates/dasettings/user_usprof.html b/dasettings/templates/dasettings/user_usprof.html index 5f8bdc0..65588c0 100644 --- a/dasettings/templates/dasettings/user_usprof.html +++ b/dasettings/templates/dasettings/user_usprof.html @@ -190,6 +190,8 @@ {{usertime_form.wd_we|as_crispy_field}} {{usertime_form.wd_th|as_crispy_field}} {{usertime_form.wd_fr|as_crispy_field}} + {{usertime_form.wd_sa|as_crispy_field}} + {{usertime_form.wd_so|as_crispy_field}} diff --git a/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc b/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc index 3c4a07f548d6fa363d95181c43493d8dd0078660..e69048649bd9105139e1a2acbebd59bc6dea9240 100644 GIT binary patch delta 365 zcmcaxwzr%wl$V!_0SMmhWr(kE-N-lDwEhN=o5EPjRKvJ{VIe~bQ#MnPQVl~EV-`~i zGmw2Hg{77$Zxd9O6)55WmSskgodT6*1IosMWm%A9%b>FCK-n6wEGv?1d<0aQ11LQU zEX{@_Z3UI(1j_CJ%d#WM%0OkgfU;M>vK$E68m3?dP43CgW{Ny7*?^vW$qpnmIVY!? zS@PXtEl-IrPJ~eTljoaRGwMygZKgc=jTsLM3uDpy$&vE1ljY6Z89z*3Ztg2x&BVY^ rECAHcz{JAH#3;we#>fZ6Y)nO;H}hNQFtNP{N&(r9R+5a&ax9DhKOALb delta 276 zcmdm6ez%M-l$V!_0SL~sUyHlsvXO7HY5g1^H-)j5sfKX@!$O7>rfjAnr5c7T#w?~3 zW*~b;3QH|hUKv!D6)55WmSskgjeyFs0cGRBvMfllR!~`Xpll6TmK8}>Sq3W20kRA% z&4!S!VG3r@b$1){IJ%_05%8SQv|5PmYwAom_9;&iH0ByM?cG v8509Tu>i<}Oe~B{jB<=@jC?@M##HovbH0TR6WeQ`6p+2pN|KRTl7$ffO5{j? diff --git a/standards/templatetags/counter_tag.py b/standards/templatetags/counter_tag.py index 6d37c75..57ce374 100644 --- a/standards/templatetags/counter_tag.py +++ b/standards/templatetags/counter_tag.py @@ -619,9 +619,14 @@ def getthisdaynotworking(user, day): elif(day.isoweekday() == 5): if user.usertime.wd_fr == 0.0: stat = True + elif(day.isoweekday() == 6): + if user.usertime.wd_sa == 0.0: + stat = True + elif(day.isoweekday() == 7): + if user.usertime.wd_so == 0.0: + stat = True return stat - ''' Gibt das verfügbare Urlaubskontingent eines Mitarbeiters zurück diff --git a/timemanagement/templates/timemanagement/rendered_table.html b/timemanagement/templates/timemanagement/rendered_table.html index 842dafd..957f917 100644 --- a/timemanagement/templates/timemanagement/rendered_table.html +++ b/timemanagement/templates/timemanagement/rendered_table.html @@ -41,9 +41,6 @@ {% elif thisdaynotworking == True %} - {% elif da.weekday == 5 or da.weekday == 6 %} - - {% elif abday != False %} {% if abday.confirm_status == 0 %} @@ -159,7 +156,12 @@ {% else %} - + + {% if da.weekday == 5 or da.weekday == 6 %} + + {% else %} + + {% endif %} {% endif %} {% endfor %} diff --git a/timemanagement/views.py b/timemanagement/views.py index 814bb39..d3c2eb7 100644 --- a/timemanagement/views.py +++ b/timemanagement/views.py @@ -358,7 +358,11 @@ def TimeAjax(request): elif(today.isoweekday() == 4): targettime = request.user.usertime.wd_th elif(today.isoweekday() == 5): - targettime = request.user.usertime.wd_fr + targettime = request.user.usertime.wd_fr + elif(today.isoweekday() == 6): + targettime = request.user.usertime.wd_sa + elif(today.isoweekday() == 7): + targettime = request.user.usertime.wd_so wd = Workday(user=request.user, agency=request.user.profile.agency, start=timezone.now(), target=targettime) wd.save() @@ -504,6 +508,27 @@ def TimeAjax(request): Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_fr) + if(dt.isoweekday() == 6): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_sa) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_sa) + + if(dt.isoweekday() == 7): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_so) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_so) # Get Rendered Table elif request.GET["action"] == "getrenderedtable": prevmonth = "" @@ -820,7 +845,7 @@ def calculateHolidays(request, start, end, start_half, end_half, user): if(end_half): counter -= 0.5 - weekdays = [6,7] + weekdays = [] freedaycounter = 0 for dt in daterange(start, end): @@ -846,6 +871,12 @@ def calculateHolidays(request, start, end, start_half, end_half, user): elif(dt.isoweekday() == 5): if user.usertime.wd_fr == 0.0: freedaycounter += 1 + elif(dt.isoweekday() == 6): + if user.usertime.wd_sa == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 7): + if user.usertime.wd_so == 0.0: + freedaycounter += 1 return restdays - counter + freedaycounter @@ -871,7 +902,7 @@ def calculatingHolidaysByAbsence(request, absence): if absence.endday_info == "1" or absence.endday_info == "2": finalholidayinabsence -= 0.5 - weekdays = [6,7] + weekdays = [] freedaycounter = 0 for dt in daterange(absence.start, absence.end): @@ -899,6 +930,12 @@ def calculatingHolidaysByAbsence(request, absence): elif(dt.isoweekday() == 5): if absence.user.usertime.wd_fr == 0.0: freedaycounter += 1 + elif(dt.isoweekday() == 6): + if absence.user.usertime.wd_sa == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 7): + if absence.user.usertime.wd_so == 0.0: + freedaycounter += 1 return finalholidayinabsence - freedaycounter diff --git a/users/models.py b/users/models.py index d1ab0d6..00a1782 100644 --- a/users/models.py +++ b/users/models.py @@ -255,11 +255,13 @@ class UserTime(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True, default=None) # TIME ELEMENTS - wd_mo = models.FloatField(default=8.0) - wd_tu = models.FloatField(default=8.0) - wd_we = models.FloatField(default=8.0) - wd_th = models.FloatField(default=8.0) - wd_fr = models.FloatField(default=8.0) + wd_mo = models.FloatField(default=0.0) + wd_tu = models.FloatField(default=0.0) + wd_we = models.FloatField(default=0.0) + wd_th = models.FloatField(default=0.0) + wd_fr = models.FloatField(default=0.0) + wd_sa = models.FloatField(default=0.0) + wd_so = models.FloatField(default=0.0) loose_holidedate = models.CharField(default="30.04.", max_length=6) startdate = models.DateField(default=None, blank=True, null=True) usetime = models.BooleanField(default=False) @@ -363,7 +365,6 @@ class UserNotifications(models.Model): absence_user_is_rep_reminder_mail = models.BooleanField(default=True) absence_user_is_rep_reminder_push = models.BooleanField(default=True) - # Zeiterfassung # Info an den User, wenn seine Zeitdaten verändert wurden time_data_changed_mail = models.BooleanField(default=True) time_data_changed_push = models.BooleanField(default=True) diff --git a/users/signals.py b/users/signals.py index 07dc512..24c77b9 100644 --- a/users/signals.py +++ b/users/signals.py @@ -130,7 +130,7 @@ def sendMailNoti(notificationtext, user_touched, linktarget=""): html_message=msg_html, fail_silently=True ) - + # Deletes all Notifications added to to delete news @@ -612,7 +612,63 @@ def save_newabsence(sender, instance, **kwargs): instance.holidays_rest_next = newdata[3][3] instance.save() + # NEUE ABWESENHEIT ERSTELLT + if(kwargs["created"]): + + usersofagency = User.objects.filter(profile__agency=instance.user.profile.agency) + for user in usersofagency: + # Benutzer erhält Benachrichtigung bei Abwesenheit, wenn er Rechte hat + if(user.has_perm("users.absencemanager")): + if(user.usernotifications.absence_created_mail): + sendMailNoti(" es wurde eine neue Abwesenheit für den Mitarbeiter " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!", user) + + if(user.usernotifications.absence_created_push): + newnotification = UserNotification(touser=user, notificationtext="Neue Abwesenheit!", notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | Neue Abwesenheit für " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!"}) + # Benutzer ist Vertreter + if(user == instance.representator): + if(user.usernotifications.absence_user_is_rep_mail): + sendMailNoti(" Sie wurden als Vertreter bei einer Abwesenheit von " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!", user) + + if(user.usernotifications.absence_user_is_rep_push): + newnotification = UserNotification(touser=user, notificationtext="Neue Abwesenheitsvertretung!", notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | Sie wurden als Vertreter für " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!"}) + + # ABWESENHEIT GEÄNDERT + else: + usersofagency = User.objects.filter(profile__agency=instance.user.profile.agency) + + for user in usersofagency: + # Benutzer erhält Benachrichtigung bei Abwesenheit, wenn er Rechte hat + if(user.has_perm("users.absencemanager")): + if(user.usernotifications.time_data_changed_mail): + sendMailNoti(" es wurde eine Abwesenheit für den Mitarbeiter " + instance.user.first_name + " " + instance.user.last_name + " aktualisiert!", user) + + if(user.usernotifications.time_data_changed_push): + newnotification = UserNotification(touser=user, notificationtext="Aktualisierte Abwesenheit!", notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | Abwesenheit für " + instance.user.first_name + " " + instance.user.last_name + " wurde aktualisiert!"}) + + # Benutzer ist Vertreter + if(user == instance.representator): + if(user.usernotifications.absence_user_is_rep_mail): + sendMailNoti(" Sie wurden als Vertreter bei einer Abwesenheit von " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!", user) + + if(user.usernotifications.absence_user_is_rep_push): + newnotification = UserNotification(touser=user, notificationtext="Neue Abwesenheitsvertretung!", notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | Sie wurden als Vertreter für " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!"}) else: print("Absence-Object is no holiday...") @@ -780,7 +836,7 @@ def calculateHolidays(user, start, end, start_half, end_half): if(end_half): counter -= 0.5 - weekdays = [6,7] + weekdays = [] freedaycounter = 0 for dt in daterange(start, end): @@ -794,7 +850,7 @@ def calculateHolidays(user, start, end, start_half, end_half): if user.usertime.wd_mo == 0.0: freedaycounter += 1 elif(dt.isoweekday() == 2): - if user.usertime.wd_tu == 0.0:# + if user.usertime.wd_tu == 0.0: freedaycounter += 1 elif(dt.isoweekday() == 3): if user.usertime.wd_we == 0.0: @@ -805,6 +861,12 @@ def calculateHolidays(user, start, end, start_half, end_half): elif(dt.isoweekday() == 5): if user.usertime.wd_fr == 0.0: freedaycounter += 1 + elif(dt.isoweekday() == 6): + if user.usertime.wd_sa == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 7): + if user.usertime.wd_so == 0.0: + freedaycounter += 1 return restdays - counter + freedaycounter diff --git a/users/views.py b/users/views.py index 5af0835..17bb9e9 100644 --- a/users/views.py +++ b/users/views.py @@ -40,8 +40,8 @@ from asgiref.sync import async_to_sync from channels_presence.models import Room from channels_presence.models import Presence import channels.layers -from datetime import date -from timemanagement.models import Workday +from datetime import date, timedelta +from timemanagement.models import Workday, Absence import base64 import filetype from django.db.models.signals import m2m_changed @@ -959,7 +959,20 @@ def cronactionsdaily(request, code): wd.end = datetime(wd.start.year, wd.start.month, wd.start.day, 23, 59) wd.save() + # Erinnerungsmails/Push bei Vertretung verschicken + one_week_later = date.today() + timedelta(days=7) + repre_absence = Absence.objects.filter(representator=user, start=one_week_later) + + for r in repre_absence: + if(r.representator.usernotifications.absence_user_is_rep_reminder_mail): + sendMailNoti(" in einer Woche startet Ihre Vertretung für " + r.user.first_name + " " + r.user.last_name + "!", user) + if(r.representator.usernotifications.absence_user_is_rep_reminder_push): + newnotification = UserNotification(touser=user, notificationtext="Erinnerung für Abwesenheitsvertretung!", notificationtype="", elementid=r.pk) + newnotification.save() + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | In einer Woche startet Ihre Vertretung für " + r.user.first_name + " " + r.user.last_name + "!"}) + data.update({"status" : "ok"}) else: @@ -968,3 +981,15 @@ def cronactionsdaily(request, code): return JsonResponse(data) +def sendMailNoti(notificationtext, user_touched, linktarget=""): + + username = user_touched.first_name + " " + user_touched.last_name + msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext, 'linktarget' : linktarget}) + send_mail( + 'Agentur-Benachrichtigung', + 'Hallo ' + user_touched.first_name + ' ' + user_touched.last_name + '! ' + notificationtext, + 'noreply@digitale-agentur.com', + [user_touched.email], + html_message=msg_html, + fail_silently=True + ) \ No newline at end of file