digitaleagenturnc/digitaleagentur/utils.py

135 lines
5.9 KiB
Python

from timemanagement.models import *
from digitaleagentur.timemanagement_utils import *
from django.conf import settings
from django.shortcuts import redirect
'''
Hier sind Funktion implementiert, die in verschiedenen Module benötigt werden
getAbsenceForOneDay - Gibt Abwesenheit eines Users für einen Tag zurück
'''
# getAbsenceForOneDay
'''
Gibt eine Abwesenheit für einen übergebenen Tag zurück oder False, wenn keine Abwesenheit vorliegt.
@param:
- user (der entsprechende Nutzer)
- day (Tag, welcher auf Abwesenheiten geprüft werden soll)
'''
def getAbsenceForOneDay(user, day):
absencedays = Absence.objects.filter(agency=user.profile.agency, user=user, confirm_status=0) & (Absence.objects.filter(agency=user.profile.agency, user=user, start=day) | (Absence.objects.filter(agency=user.profile.agency, user=user, start__lt=day) & Absence.objects.filter(agency=user.profile.agency, user=user, end__gt=day)) | Absence.objects.filter(agency=user.profile.agency, user=user, end=day))
# Gibt es eine Abwesenheit an diesem Tag, welche einen halben Tag ist, dann gibt die Methode True zurück und bricht die Schleife ab!
for ab in absencedays:
if ab.startday_info == "1" or ab.startday_info == "2" or ab.endday_info == "1" or ab.endday_info == "2":
return True
# Es gibt an diesem Tag keine Abwesenheit mit einem halben Tag
return False
'''
# checkAbsenceWorkdayCollide()
Prüft, ob eine aktualisierte Abwesenheit Einfluss auf bereits bestehende Arbeitstage hat. Wenn zB nachträglich Arbeitstage eingetragen werden, dann würden diese hier angepasst werden.
Folgende Fälle werden berücksichtigt:
- Halber Tag der Abwesenheit verringert die Zielarbeitszeit dieses Tags auf die Hälfte
- Abwesenheit ist der komplette Tag, dann wird dieser Arbeitstag gelöscht, wenn es is_time false ist, sprich die Zeiterfassung soll nicht angefasst werden
- Abwesenheit ist kompletter Tag und die Abwesenheit soll Zeiterfassung beeinflussen (z.B. Gleitzeit) dann wird der Arbeitstag nicht verändert. Ist die Gleitzeit ein halber Tag, wird die Zielarbeitszeit halbiert.
'''
def checkAbsenceWorkdayCollide(absence):
# Alle einzelnen Tage der Abwesenheit werden durchgegangen:
for day in daterange(absence.start, absence.end):
# Arbeitstage an diesem Tag werden geladen
workdays = Workday.objects.filter(user=absence.user, start__day=absence.start.day, start__month=absence.start.month, start__year=absence.start.year)
# Wenn es Arbeitstage gibt, dann wird geprüft, ob die Abwesenheit diesen verändert hat.
for workday in workdays:
# Arbeitstag in Tag ohne Zeit umwandeln
# Wenn die Abwesenheit die Zeiterfassung NICHT ändert, muss diese ggf. geändert werden. Ansonsten bleibt sie gleich.
if absence.reason.is_time == False:
# Prüfung, ob der Tag halb ist oder nicht. Wenn ja, dann Zielarbeitszeit des Tages um die Hälfte reduzieren.
if (workday.start.day == absence.start.day and workday.start.month == absence.start.month and workday.start.year == absence.start.year) or (workday.end.day == absence.end.day and workday.end.month == absence.end.month and workday.end.year == absence.end.year):
if(getIsAbsenceStartEndHalf(absence)):
workday.target = workday.target / 2
workday.save()
# Ganzer Tag vorhanden, Arbeitstag wird als löschen markiert, aber nicht gelöscht
else:
workday.delflag = True
workday.save()
else:
# Sollte der ganze Tag mal als zu löschen markiert worden sein, wird dies hier zurückgenommen
if workday.delflag == True:
workday.delflag = False
workday.save()
def checkAbsenceWorkdayCollideDelete(absence):
# Alle einzelnen Tage der Abwesenheit werden durchgegangen:
for day in daterange(absence.start, absence.end):
# Arbeitstage an diesem Tag werden geladen
workdays = Workday.objects.filter(user=absence.user, start__day=absence.start.day, start__month=absence.start.month, start__year=absence.start.year)
# Wenn es Arbeitstage gibt, dann wird geprüft, ob die Abwesenheit diesen verändert hat.
for workday in workdays:
# Arbeitstag in Tag ohne Zeit umwandeln
# Wenn die Abwesenheit die Zeiterfassung NICHT ändert, muss diese ggf. geändert werden. Ansonsten bleibt sie gleich.
if absence.reason.is_time == False:
# Prüfung, ob der Tag halb ist oder nicht. Wenn ja, dann Zielarbeitszeit des Tages um die Hälfte reduzieren.
if (workday.start.day == absence.start.day and workday.start.month == absence.start.month and workday.start.year == absence.start.year) or (workday.end.day == absence.end.day and workday.end.month == absence.end.month and workday.end.year == absence.end.year):
if(getIsAbsenceStartEndHalf(absence)):
workday.target = workday.target / 2
workday.save()
# Ganzer Tag vorhanden, Arbeitstag wird als löschen markiert, aber nicht gelöscht
else:
workday.delflag = False
workday.save()
else:
# Sollte der ganze Tag mal als zu löschen markiert worden sein, wird dies hier zurückgenommen
if workday.delflag == True:
workday.delflag = False
workday.save()
# NC LOGIN
'''
A User has to be logged in in NC. If yes, we check the user-status and retrieving the userId. If the logged user by this session is the same we want to see in Django, than the user will logged in.
Double-Check: Logged-Session from NC (session-id cannot be hacked cause it is serverside) and we check userId local, django and NC
'''
import xmltodict, json, requests
'''
getNCLoggedUserBySession
Returns the UserId of the user in the given session
@params:
- sid (string) from nc_session_id, saved in the server and cookie
'''
from django.core.mail import send_mail
def getNCLoggedUserBySession(sid):
nc_login_headers = {'Authorization' : 'Bearer ' + sid}
r = requests.get(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/user_status/api/v1/user_status", headers=nc_login_headers)
xpars = xmltodict.parse(r.text)
js = json.dumps(xpars)
final_json = json.loads(js)
return final_json['ocs']['data']['userId']