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 import urllib.request as urllib2 from django.contrib.auth import login, logout ''' def ncLogin(request, uid): #try: logout(request) useridFromServer = getNCLoggedUserBySession(request.COOKIES['nc_session_id']) if(uid == urllib2.unquote(request.COOKIES['nc_username']) and useridFromServer == uid): login(request, User.objects.get(username=urllib2.unquote(request.COOKIES['nc_username']))) return redirect('users-dashboard') #return redirect('login') #return redirect('users-dashboard') ''' ''' 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']