206 lines
9.7 KiB
Python
206 lines
9.7 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:
|
|
# TODO: Hier einmal testen ob das korrekto ist
|
|
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)
|
|
workdays = Workday.objects.filter(user=absence.user, start__day=day.day, start__month=day.month, start__year=day.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:
|
|
if absence.reason.is_time == True:
|
|
# 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:
|
|
if workday.delflag == True:
|
|
workday.delflag = False
|
|
workday.save()
|
|
else:
|
|
workday.delflag = True
|
|
workday.save()
|
|
|
|
'''
|
|
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=day.day, start__month=day.month, start__year=day.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 == True:
|
|
# 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()
|
|
# 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()
|
|
else:
|
|
workday.delflag = True
|
|
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()
|
|
'''
|
|
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=day.day, start__month=day.month, start__year=day.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 == True:
|
|
# 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()
|
|
# 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()
|
|
else:
|
|
workday.delflag = True
|
|
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)
|
|
|
|
# New user login - set initial status
|
|
try:
|
|
if(final_json['ocs']['meta']['status'] == 'failure'):
|
|
nc_login_headers = {'Authorization' : 'Bearer ' + sid, 'OCS-APIREQUEST' : 'true'}
|
|
r = requests.get(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/user_status/api/v1/user_status/status", headers=nc_login_headers, data={'statusType' : 'dnd'})
|
|
|
|
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)
|
|
except:
|
|
nc_login_headers = {'Authorization' : 'Bearer ' + sid, 'OCS-APIREQUEST' : 'true'}
|
|
r = requests.get(settings.NEXTCLOUD_URL + "ocs/v2.php/apps/user_status/api/v1/user_status/status", headers=nc_login_headers, data={'statusType' : 'dnd'})
|
|
|
|
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']
|
|
|
|
|