from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from django.http import HttpResponseRedirect,HttpResponse, JsonResponse from .forms import UsersSelfChangeForm, UsersNotificationForm, AgencyGroupPerms, AgencyModulsForm, UserNewUserForm, UserProfileForm, AgencyNetworkForm, AgencyOrganigrammForm, UserTimeForm, AgencyTimeManagement, AbsenceReasonForm from django.contrib import messages from django.contrib.auth import update_session_auth_hash from django.contrib.auth.forms import PasswordChangeForm from users.usersforms import AgencyUpdateForm from users.models import AgencyJob, AgencyGroup, AgencyNetwork, Agency, AgencyNetworkPreperation, UserYearAbsenceInfo from django.contrib.auth.models import User, Group, Permission from users.models import UserTime import random import string from django.template.loader import render_to_string from users.usersforms import UsersPermForm from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import CreateView from users.models import Profile from areas.models import Areas from tasks.models import Tasks import webcolors import datetime from datetime import date from standards.models import Standards from timemanagement.models import AbsenceReason, FreeDays from django.core.mail import send_mail from django.conf import settings import re, os, csv, requests from django.templatetags.static import static from django.db.models import DateField from django.views.generic import DeleteView, UpdateView from timemanagement.forms import AddFreeDayForm from django.urls import reverse_lazy import re import json def randomString(stringLength=10): """Generate a random string of fixed length """ letters = string.ascii_lowercase return ''.join(random.choice(letters) for i in range(stringLength)) @login_required def checkForGroupName(request, newgroupname): stat = True groupsagency = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk) for group in groupsagency: if group.agencygroupname.upper() == newgroupname.upper(): stat = False return stat @login_required def getAllForms(request, context): # USERFORMS userform = UsersSelfChangeForm(instance=request.user) passwordform = PasswordChangeForm(request.user) context.update({'userform' : userform}) context.update({'passwordform' : passwordform}) # NOTIFICTAION FORMS notificationform = UsersNotificationForm(instance=request.user.profile) context.update({'notificationform' : notificationform}) # AGENCY UPDATE FORMS agencyform = AgencyUpdateForm(instance=request.user.profile.agency) context.update({'agencyform' : agencyform}) #PERMS perms = AgencyGroupPerms() context.update({'perms' : perms}) #MODULFORMS modulform = AgencyModulsForm(instance=request.user.profile.agency) context.update({'modulform' : modulform}) #MODULSETTUNGS #Modulsettings ORGANIGRAMM modsettings_organigramm = AgencyOrganigrammForm(instance=request.user.profile.agency) context.update({'modsettings_organigramm' : modsettings_organigramm}) #Modulsettings ABWESENHEIT- UND ZEITERFASSUNG modsettings_tm = AgencyTimeManagement(instance=request.user.profile.agency) context.update({'modsettings_tm' : modsettings_tm}) context.update({"modsettings_tm_abcat" : AbsenceReason.objects.filter(agency=request.user.profile.agency).order_by("name") }) # USER FOR USERTABLE users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).order_by("last_name") return context ''' Lädt die Formulare für die einzelnen Einstellungen vollständig ''' @login_required def DASettings(request): # CHECK FOR EVERY USER YEAR-DATA uina = User.objects.filter(profile__agency=request.user.profile.agency) today = date.today() for u in uina: # NO YEARS FOUND if len(UserYearAbsenceInfo.objects.filter(agency=request.user.profile.agency, user=u)) == 0: # CREATE DATA FOR EVERY USER UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year).save() UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year+1).save() UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year+2).save() # CREATE DATE FOR YEAR PLUS 2 #elif len(UserYearAbsenceInfo.objects.filter(agency=user.profile.agency, year=today.year+2)) == 0: # uina = User.objects.filter(profile__agency=user.profile.agency) # # for u in uina: # UserYearAbsenceInfo(agency=user.profile.agency, user=u, year=today.year+2).save() context = { 'active_link' : 'dasettings', 'baseurl' : settings.BASE_URL } context = getAllForms(request, context) # USERS FOR MEMBERS AND GROUPCOUNTERS usersofagency = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).order_by("last_name") context.update({"usersofagency" : usersofagency}) # LOAD AGENCYJOBS context.update({"agencyjobs" : AgencyJob.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("name")}) # LOAD GROUPS agencygroups = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("agencygroupname").order_by("-savefordel") context.update({"agencygroups" : agencygroups}) # LOAD AREAS agencyareas = Areas.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('areaorder') context.update({"agencyareas" : agencyareas}) # LOAD AGENCYNETWORKS #agencynetworks = AgencyNetwork.objects.filter(creator_agency=request.user.profile.agency) | AgencyNetwork.objects.filter(adminagencys__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(members__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(sharemembers__in=[request.user.profile.agency.pk]) #agencynetworks = AgencyNetwork.objects.filter(adminagencys__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(members__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(sharemembers__in=[request.user.profile.agency.pk]) agencynetworks_all = AgencyNetwork.objects.all() agencynetworks = [] for a in agencynetworks_all: if request.user.profile.agency in a.adminagencys.all() or request.user.profile.agency in a.members.all() or request.user.profile.agency in a.sharemembers.all(): agencynetworks.append(a) context.update({"agencynetworks" : agencynetworks}) # LOAD TASKS alltasks = Tasks.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('name') context.update({"alltasks" : alltasks}) if request.method == 'POST' and request.POST.get("settings_area") == "profil": return SettingsProfilManagement(request, context) elif request.method == 'POST' and request.POST.get("settings_area") == "agency": return SettingsAgency(request, context) elif request.method == 'POST' and request.POST.get("settings_area") == "moduls": return SettingsAgencyModuls(request, context) # Returning the data from database for normal-loading Settings else: # DEFAULT DATA FORM-INFOS # Hier müssen alle Standard-Formulare rein, damit die Seite Settings # generell geladen werden kann. # PROFILE FORMS userform = UsersSelfChangeForm(instance=request.user) passwordform = PasswordChangeForm(request.user) context.update({'userform' : userform}) context.update({'passwordform' : passwordform}) # NOTIFICTAION FORMS notificationform = UsersNotificationForm(instance=request.user.profile) context.update({'notificationform' : notificationform}) # AGENCY UPDATE FORMS agencyform = AgencyUpdateForm(instance=request.user.profile.agency) context.update({'agencyform' : agencyform}) return render(request, 'dasettings/settings.html', context) ''' AGENCY Hier werden die Agenturinfos ink. Agenturcropper für das Agenturbild angepasst. ''' @login_required def SettingsAgency(request, context): if request.POST.get("form_type") == "agencyform": agencyform = AgencyUpdateForm(request.POST, instance=request.user.profile.agency) if agencyform.is_valid(): if 'agencypic' in request.FILES: request.user.profile.agency.agencypic = request.FILES['agencypic'] agencyform.save() context['agencyform'] = AgencyUpdateForm(instance=request.user.profile.agency) messages.success(request, f'Agenturdaten aktualisiert!') return render(request, 'dasettings/settings.html', context) else: messages.success(request, f'Daten falsch eingegeben!') context['agencyform'] = AgencyUpdateForm(instance=request.user.profile.agency) return render(request, 'dasettings/settings.html', context) from django.db.models import F, Func, Value @login_required def FreeDaysManagemenet(request, initload=0): if(initload==1): context = { 'active_link' : 'dasettings', 'init_freedays' : True } return render(request, 'dasettings/freedays_management.html', context) else: context = { 'active_link' : 'dasettings', 'freedays' : FreeDays.objects.filter(agency=request.user.profile.agency).order_by("-day") } return render(request, 'dasettings/freedays_management.html', context) @login_required def FreeDayAdd(request): if request.POST: freedayform = AddFreeDayForm(request.POST, instance=request.user.profile.agency) if freedayform.is_valid(): fd = FreeDays(agency=request.user.profile.agency, day=freedayform.cleaned_data['day'], year=freedayform.cleaned_data['day'].year, name=freedayform.cleaned_data['name']).save() messages.success(request, f'Freier Tag hinzugefügt') context = { "active_link" : "dasettings", } return redirect("tm-managemenetfreedays") else: messages.success(request, f'Fehler beim hinzufügen!') return redirect("tm-managemenetfreedays") else: context = { "active_link" : "dasettings", "form" : AddFreeDayForm() } return render(request, 'dasettings/freedays_add.html', context) class FreeDayDeleteView(LoginRequiredMixin, DeleteView): model = FreeDays success_url = reverse_lazy('tm-managemenetfreedays') template_name = 'dasettings/freedays_confirm_delete.html' def delete(self, request, *args, **kwargs): response = super(FreeDayDeleteView, self).delete(request, *args, **kwargs) messages.success(request, f'Freier Tag wurde gelöscht!') return response def get_context_data(self, **kwargs): context = super(FreeDayDeleteView, self).get_context_data(**kwargs) context['active_link'] = 'dasettings' return context class AbsenceReasonDeleteView(LoginRequiredMixin, DeleteView): model = AbsenceReason success_url = reverse_lazy('dasettings') template_name = 'dasettings/absencereason_confirm_delete.html' def delete(self, request, *args, **kwargs): response = super(AbsenceReasonDeleteView, self).delete(request, *args, **kwargs) messages.success(request, f'Abwesenheitskategorie wurde gelöscht!') return response def get_context_data(self, **kwargs): context = super(AbsenceReasonDeleteView, self).get_context_data(**kwargs) context['active_link'] = 'dasettings' return context class AbsenceReasonAddView(LoginRequiredMixin, CreateView): model = AbsenceReason success_url = reverse_lazy('dasettings') form_class = AbsenceReasonForm template_name = 'dasettings/absencereason_add.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({'active_link' : 'dasettings'}) return context def form_valid(self, form): # Send message to the site messages.success(self.request, f'Abwesenheitskategorie angelegt!') form.instance.color = form.cleaned_data["rgb_color"] # SAVE OBJECTS TO SIGNALE! form.instance.agency = self.request.user.profile.agency return super().form_valid(form) class AbsenceReasonUpdateView(LoginRequiredMixin, UpdateView): model = AbsenceReason template_name = 'dasettings/absencereason_update.html' success_url = reverse_lazy('dasettings') form_class = AbsenceReasonForm def form_valid(self, form): # Send message to the site messages.success(self.request, f'Abwesenheitskategorie aktualisiert!') self.object.color = form.cleaned_data["rgb_color"] self.object.save() return super().form_valid(form) def get_context_data(self, **kwargs): context = super(AbsenceReasonUpdateView, self).get_context_data(**kwargs) context['active_link'] = 'dasettings' return context @login_required def SettingsAgencyModuls(request, context): if request.POST.get("form_type") == "agencymodform": agencymoduleform = AgencyModulsForm(request.POST, instance=request.user.profile.agency) if agencymoduleform.is_valid(): agencymoduleform.save() # Check, if Timemanagement is deactivate, to deactivate Zeiterfassung if(request.user.profile.agency.module_timemanagement == False): ag = request.user.profile.agency ag.module_timemanagement_ze = False if(request.user.has_perm("users.modulesconfig")): FreeDays.objects.filter(agency=request.user.profile.agency).delete() ag.save() temp_freedays = FreeDays.objects.filter(agency=request.user.profile.agency) if(request.user.profile.agency.module_timemanagement and len(temp_freedays) == 0): messages.success(request, f'Moduleinstellungen aktualisiert! Bitte prüfen Sie Ihre Feiertagseinstellungen') return redirect('tm-initload', 1) else: context['modulform'] = AgencyModulsForm(instance=request.user.profile.agency) messages.success(request, f'Moduleinstellungen aktualisiert!') return render(request, 'dasettings/settings.html', context) else: context['modulform'] = AgencyModulsForm(instance=request.user.profile.agency) messages.success(request, f'Fehler beim aktualisieren! Bitte wenden Sie sich an den Support.') return render(request, 'dasettings/settings.html', context) ''' Hier werden die Profilinfos des User zurückgesetzt; Parameter kommen von Settings() - Email - Passwort aktualisieren ''' @login_required def SettingsProfilManagement(request, context): # Check, which form # USERFORM if request.POST.get("form_type") == "userform": userform = UsersSelfChangeForm(request.POST, instance=request.user) if userform.is_valid(): userform.save() messages.success(request, f'E-Mailadresse aktualisiert!') passwordform = PasswordChangeForm(request.user) context['userform'] = userform context['passwordform'] = passwordform return render(request, 'dasettings/settings.html', context) else: messages.success(request, f'Keine E-Mailadresse eingegeben oder E-Mail bereits vorhanden!') passwordform = PasswordChangeForm(request.user) userform = UsersSelfChangeForm(instance=request.user) context['userform'] = userform context['passwordform'] = passwordform return render(request, 'dasettings/settings.html', context) # PASSWORDFORM elif request.POST.get("form_type") == "passwordform": passwordform = PasswordChangeForm(request.user, request.POST) if passwordform.is_valid(): passwordform.save() update_session_auth_hash(request, request.user) userform = UsersSelfChangeForm(instance=request.user) context['userform'] = userform context['passwordform'] = passwordform messages.success(request, f'Passwort aktualisiert!') return render(request, 'dasettings/settings.html', context) else: messages.success(request, f'Passwort falsch eingegeben!') passwordform = PasswordChangeForm(request.user) userform = UsersSelfChangeForm(instance=request.user) context['userform'] = userform context['passwordform'] = passwordform return render(request, 'dasettings/settings.html', context) @login_required def SettingsAjaxRouter(request): success = False data = {} # UPDATE NOTIFICATIONS BY FIELDNAME AND NEW VALUE if request.method == 'GET' and request.GET['action'] == "update_notifications" : success = False new_stat = request.GET['new_stat'] field_to_change = getattr(request.user.profile, request.GET['fieldname']) if(field_to_change or not field_to_change): if(new_stat == "1"): setattr(request.user.profile, request.GET['fieldname'], True) else: setattr(request.user.profile, request.GET['fieldname'], False) request.user.profile.save() success = True # UPDATE TOOLTUP elif request.method == 'GET' and request.GET['action'] == "change_showtooltips" : newtooltipvalue = False user = User.objects.get(pk=request.user.pk, profile__agency=request.user.profile.agency) if(request.GET['newtoolvalue'] == "true"): user.profile.showtooltips = True newtooltipvalue = True else: user.profile.showtooltips = False user.save() success = True data = {'newttvalue' : newtooltipvalue} # UPDATE AGENCYJOB elif request.method == 'GET' and request.GET['action'] == "update_agencyfunc" : job_id = request.GET['id'] job_value = request.GET['newvalue'] tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency) tempjob.name = job_value tempjob.save() success = True # DELETE AGENVY JOB FUNC - RETURN ONLY NAME FOR CONFIRM elif request.method == 'GET' and request.GET['action'] == "get_agencyfunc" : job_id = request.GET['id'] tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency) data = {"funcname" : tempjob.name} success = True # DELETE FINAL AGECY JOB elif request.method == 'GET' and request.GET['action'] == "delete_agencyfunc" : job_id = request.GET['id'] tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency) tempjob.delete() success = True elif request.method == 'GET' and request.GET['action'] == "add_agencyfunc" : tempjob = AgencyJob(name="", agency=request.user.profile.agency) tempjob.save() data = {"new_id" : tempjob.pk} success = True # GRUPPENAMEN AKTUALISIEREN elif request.method == 'GET' and request.GET['action'] == "update_groupname" : group = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) if(checkForGroupName(request, request.GET['newvalue'])): group.agencygroupname = request.GET['newvalue'] group.save() data = {"newvalue" : group.agencygroupname} success = True else: success = False # GRUPPENNAMEN HOLEN elif request.method == 'GET' and request.GET['action'] == "get_groupname" : group = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) data = {"groupname" : group.agencygroupname} success = True elif request.method == 'GET' and request.GET['action'] == "add_group" : if(checkForGroupName(request, request.GET['newvalue'])): tempgroup = Group(name=str(request.user.profile.agency.pk) + "_" + randomString(8)) tempgroup.save() tempgroup_ag = AgencyGroup(savefordel=False, group=tempgroup, agency=request.user.profile.agency, agencygroupname=request.GET['newvalue']) tempgroup_ag.save() success = True data = {"group_id" : tempgroup_ag.pk, "group_name" : tempgroup_ag.agencygroupname} else: success = False elif request.method == 'GET' and request.GET['action'] == "delete_group" : groupag = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) group_to_del = groupag.group group_to_del.delete() success = True # PERMISSIONS ON GROUP! elif request.method == 'GET' and request.GET['action'] == "change_perm_group" : success = True group_id = request.GET['id'] perm_name = request.GET['perm'] val = request.GET['val'] aggroup = AgencyGroup.objects.get(pk=group_id, agency=request.user.profile.agency) # CHECK IF REQUESTED USER IS IN THIS AGENCY if(request.user.profile.agency.pk == aggroup.agency.pk): if(val == "true"): tempperm = Permission.objects.get(codename=perm_name) aggroup.group.permissions.add(tempperm) else: tempperm = Permission.objects.get(codename=perm_name) aggroup.group.permissions.remove(tempperm) else: success = False # REMOVE USER FROM GROUP elif request.method == 'GET' and request.GET['action'] == "remove_user_from_group" : success = True groupid = request.GET['groupid'] userid = request.GET['userid'] aggroup = AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency) usertoremove = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) # CHECK IF REQUESTED USER IS IN THIS AGENCY if(request.user.profile.agency.pk == aggroup.agency.pk): if aggroup.group in usertoremove.groups.all(): aggroup.group.user_set.remove(usertoremove) data = {"userid" : usertoremove.pk, "groupid" : aggroup.pk, "user_fname" : usertoremove.first_name, "user_lname" : usertoremove.last_name} else: success = False # ADD USER TO GROUP elif request.method == 'GET' and request.GET['action'] == "add_user_to_group" : success = True groupid = request.GET['groupid'] userid = request.GET['userid'] aggroup = AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency) usertoadd = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) # CHECK IF REQUESTED USER IS IN THIS AGENCY if(request.user.profile.agency.pk == aggroup.agency.pk): aggroup.group.user_set.add(usertoadd) data = {"userid" : usertoadd.pk, "groupid" : aggroup.pk, "user_fname" : usertoadd.first_name, "user_lname" : usertoadd.last_name} else: success = False # AREA # AREANAMEN HOLEN elif request.method == 'GET' and request.GET['action'] == "get_areaname" : area = Areas.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) data = {"areaname" : area.name, "areacolor" : area.color} success = True # ARENAMEN UPDATE elif request.method == 'GET' and request.GET['action'] == "update_areaname" : area = Areas.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) area.name = request.GET['newvalue'] area.color = request.GET['color'] area.save() data = {"newvalue" : area.name, "color" : area.color} success = True # ADD AREA elif request.method == 'GET' and request.GET['action'] == "add_area" : area = Areas(created_area_by=request.user, agency=request.user.profile.agency, name=request.GET["newvalue"], color=request.GET['color']) area.save() success = True # REMOVE AREA elif request.method == 'GET' and request.GET['action'] == "remove_area" : todelarea = Areas.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) # REMOVE STANDARDS AREA tempstandards = Standards.objects.filter(agency=request.user.profile.agency, area=todelarea) if(request.user.has_perm('users.standardmanager')): for s in tempstandards: s.area = None s.task = None s.public = False s.save() tasks = Tasks.objects.filter(agency=request.user.profile.agency, area=todelarea).delete() todelarea.delete() success = True else: success = False # ADD TASK elif request.method == 'GET' and request.GET['action'] == "add_task" : task = Tasks(created_area_by=request.user, area=Areas.objects.get(pk=request.GET['areaid']), agency=request.user.profile.agency, name=request.GET["newvalue"]) task.save() taskcreator_fullname = task.created_area_by.first_name + " " + task.created_area_by.last_name data = {"name" : task.name, "newtaskid" : task.pk, "areaname" : task.area.name, "taskcreator_fullname" : taskcreator_fullname, "createdate" : task.created_area_date.strftime("%d. %B %Y")} success = True # TASKNAME VISIBLE UND USERS HOLEN elif request.method == 'GET' and request.GET['action'] == "get_taskname" : task = Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) # User still in Area # Get all Users from same Agency which are NOT in context_added_users added_users = task.usersfield.all() addus = {} posus = {} i = 0 # GET ADDED USERS for us in added_users: addus.update({ i : {"fullname" : us.first_name + " " + us.last_name, "userid" : us.pk}}) i += 1 # GET POSSIBLE TO ADD USERS k = 0 possible_users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).exclude(pk__in=added_users) for us in possible_users: posus.update({ k : {"fullname" : us.first_name + " " + us.last_name, "userid" : us.pk}}) k += 1 data = {"taskname" : task.name, "visible" : task.visible, "added_users" : addus, "addedl" : i, "possl" : k, "possible_users" : posus, "taskarea" : task.area.pk} success = True # REMOVE Task elif request.method == 'GET' and request.GET['action'] == "remove_task" : todeltask = Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) # REMOVE STANDARDS AREA tempstandards = Standards.objects.filter(agency=request.user.profile.agency, task=todeltask) if(request.user.has_perm('users.standardmanager')): for s in tempstandards: s.task = None s.public = False s.save() todeltask.delete() success = True else: success = False #success = True # UPDATE TASK VISIBLE elif request.method == 'GET' and request.GET['action'] == "update_visible_taskname" : task = Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) if(task.visible): task.visible = False; else: task.visible = True; task.save() success = True # UPDATE TASKNAME elif request.method == 'GET' and request.GET['action'] == "change_taskname" : task = Tasks.objects.get(pk=request.GET['id']) task.name = request.GET["newvalue"] data = {"newvalue" : task.name} newareaid = request.GET["newareaid"] standardsmoved = False if int(task.area.pk) != int(newareaid): standardsmoved = True newareaobj = Areas.objects.get(pk=newareaid, agency=request.user.profile.agency) Standards.objects.filter(agency=request.user.profile.agency, area=task.area).update(area=newareaobj) task.area = newareaobj task.save() data = {"newvalue" : task.name, "smoved" : standardsmoved} success = True # UPDATE USER MAIL elif request.method == 'GET' and request.GET['action'] == "update_usermail" : tempuser = User.objects.get(pk=request.GET['userid']) if(request.user.profile.agency == tempuser.profile.agency and request.user.has_perm('users.usermanager')): tempmail = tempuser.email regex = '^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$' if(re.search(regex,request.GET['newmail'])): newmail = request.GET['newmail'] usertest = User.objects.filter(email=newmail) if(len(usertest) > 0): data = {"mail" : tempmail} success = False else: tempuser.email = newmail tempuser.save() success = True else: data = {"mail" : tempmail} success = False else: success = False # UPDATE USERNAME elif request.method == 'GET' and request.GET['action'] == "update_usernames" : tempuser = User.objects.get(pk=request.GET['userid']) if(request.user.profile.agency == tempuser.profile.agency and request.user.has_perm('users.usermanager')): regex = '^[a-zA-Z0-9_.-üöäÜÖÄ ]+$' if(re.search(regex,request.GET['new_first_name']) and re.search(regex,request.GET['new_last_name'])): tempuser.first_name = request.GET['new_first_name'] tempuser.last_name = request.GET['new_last_name'] tempuser.save() data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} success = True else: data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} success = False else: data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} success = False # UPDATE FREEDAYS elif request.method == 'GET' and request.GET['action'] == "initloadfreedays" : if(request.user.has_perm('users.modulesconfig')): temp_freedays = FreeDays.objects.filter(agency=request.user.profile.agency) if(len(temp_freedays) == 0): tempdays_thisyear = loadingFreeDays(request.user.profile.agency.plz, date.today().year) tempdays_lastyear = loadingFreeDays(request.user.profile.agency.plz, date.today().year - 1) tempdays_nextyear = loadingFreeDays(request.user.profile.agency.plz, date.today().year + 1) if(tempdays_thisyear != False): for k in tempdays_lastyear.keys(): tempdate = tempdays_lastyear[k]["datum"].split("-") FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year-1).save() for k in tempdays_thisyear.keys(): tempdate = tempdays_thisyear[k]["datum"].split("-") FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year).save() for k in tempdays_nextyear.keys(): tempdate = tempdays_nextyear[k]["datum"].split("-") FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year+1).save() messages.success(request, f'Feiertage erfolgreich gespeichert!') success = True else: success = False else: data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} success = False # LOAD MULTIPLE FREEDAYS elif request.method == 'GET' and request.GET['action'] == "initloadfreedaysmulti" : if(request.user.has_perm('users.modulesconfig')): #tempdays_year = False if(request.GET["land"] == "true"): tempdays_year = loadingFreeDaysMulti(request.user.profile.agency.plz, request.GET["year"], True) if(tempdays_year != False): #for k in tempdays_year: # tempdate = tempdays_year[k][1].split("-") # FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=int(request.GET["year"])).save() #messages.success(request, f'Feiertage erfolgreich gespeichert!') tempdays_year = json.loads(tempdays_year) print(tempdays_year) success = True else: success = False else: tempdays_year = loadingFreeDaysMulti(request.user.profile.agency.plz, request.GET["year"], False) if(tempdays_year != False): for k in tempdays_year.keys(): tempdate = tempdays_year[k]["datum"].split("-") FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=int(request.GET["year"])).save() messages.success(request, f'Feiertage erfolgreich gespeichert!') success = True else: success = False else: data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} success = False elif request.method == 'GET' and request.GET['action'] == "update_holidays" : context = { "user_years" : UserYearAbsenceInfo.objects.filter(user=User.objects.get(pk=request.GET["userid"])), } return render(request, 'dasettings/change_absence_yeardata.html', context) elif request.method == 'GET' and request.GET['action'] == "update_holidays_save" : # GET ELEMENTS newHolidayData = request.GET["new_data_info"].split("___") # EVERY ELEMENT GET ID AND SAVE NEW DAY-INFO for ele in newHolidayData: ele_elements = ele.split("__") if(len(ele_elements) == 2): ele_id = ele_elements[0].split("_")[3] ele_type = ele_elements[0].split("_")[2] temp_year = UserYearAbsenceInfo.objects.get(pk=ele_id, agency=request.user.profile.agency) if(ele_type == "nor"): temp_year.days = ele_elements[1] elif(ele_type == "rest"): temp_year.restdays = ele_elements[1] temp_year.save() context = { "user_years" : UserYearAbsenceInfo.objects.filter(user=User.objects.get(pk=request.GET["userid"])), } return render(request, 'dasettings/data_absence_yeardata.html', context) else: success = False return JsonResponse({"success" : success, "data" : data}) def loadingFreeDays(plz, year): # Getting land file_path = os.path.join(settings.STATIC_ROOT, 'users/extra/plz_short.csv') land = False with open(file_path, 'rt') as csvfile: filecsv = csv.reader(csvfile, delimiter=';') for row in filecsv: if str(row[1]) == str(plz): land = row[6] break; if(land != False): URL = "https://feiertage-api.de/api/" PARAMS = {'jahr':year,'nur_land':land} r = requests.get(url = URL, params = PARAMS) return r.json() else: return False def loadingFreeDaysMulti(plz, year, onlyland): # Getting land file_path = os.path.join(settings.STATIC_ROOT, 'users/extra/plz_short.csv') if(onlyland == False): land = False with open(file_path, 'rt') as csvfile: filecsv = csv.reader(csvfile, delimiter=';') for row in filecsv: if str(row[1]) == str(plz): land = row[6] break; URL = "https://feiertage-api.de/api/" PARAMS = {'jahr':year,'nur_land':land} r = requests.get(url = URL, params = PARAMS) return r.json() elif(onlyland == True): URL = "https://feiertage-api.de/api/" PARAMS = {'jahr':year,'nur_daten':1} r = requests.get(url = URL, params = PARAMS) return r.json() else: return False ''' UserProfileUpdate unterscheidet zwischen newuser=0 --> PROFIL AKTUALISIEREN und newuser=1 --> PROFIL Neu speichern ''' @login_required def UserProfileUpdate(request, pk, newuser=0): usertochange = User.objects.get(pk=pk) user_fullname = usertochange.first_name + " " + usertochange.last_name parentuser = "" if(usertochange.profile.parent != None): parentuser = usertochange.profile.parent.pk if request.method == 'POST': if 'image' in request.FILES: usertochange.profile.image = request.FILES['image'] formtosave = False if(request.POST["form_type"] == "profileform"): formtosave = UserProfileForm(request.POST, instance=usertochange.profile) if formtosave.is_valid(): try: usertochange.profile.parent = User.objects.get(pk=request.POST['usertoparent'], profile__agency=request.user.profile.agency) usertochange.save() except Exception as e: usertochange.profile.parent = None usertochange.save() formtosave.save() messages.success(request, f'Profil gespeichert!') return redirect('dasettings') else: messages.success(request, f'Fehlerhafte Eingabe!') context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, 'first_name' : usertochange.first_name, 'last_name' : usertochange.last_name, 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), 'newuser' : newuser, 'vieweduser' : usertochange.pk, 'parentuser' : parentuser, 'mail' : usertochange.email, 'imagelink' : usertochange.profile.get_photo_url, 'profileform' : UserProfileForm(instance=usertochange.profile), 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) } return render(request, 'dasettings/user_usprof.html', context) elif(request.POST["form_type"] == "contract"): formtosave = UserTimeForm(request.POST, instance=UserTime.objects.get(user=usertochange)) if(formtosave.is_valid()): # CHECK IF HOLIDAYS_LOOSE IS CORRECT if(not re.match(r"^([1-9]{1}|0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-1]{1}).([1-9]{1}|0[0-9]{1}|1[0-2]{1}).$", formtosave.cleaned_data["loose_holidedate"])): messages.success(request, f'Fehlerhafte Eingabe!') context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, 'first_name' : usertochange.first_name, 'last_name' : usertochange.last_name, 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), 'newuser' : newuser, 'vieweduser' : usertochange.pk, 'parentuser' : parentuser, 'mail' : usertochange.email, 'imagelink' : usertochange.profile.get_photo_url, 'profileform' : UserProfileForm(instance=usertochange.profile), 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) } return render(request, 'dasettings/user_usprof.html', context) else: # TRY TO CREATE DATE date = formtosave.cleaned_data["loose_holidedate"].split(".") try: datetime.date(int(2020), int(date[1]), int(date[0])) messages.success(request, f'Vertragsdaten gespeichert!') formtosave.save() return redirect('dasettings') except: messages.success(request, f'Fehlerhafte Eingabe! Das Verfallsdatum der Urlaubstage liegt außerhalb des Monats.') context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, 'first_name' : usertochange.first_name, 'last_name' : usertochange.last_name, 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), 'newuser' : newuser, 'vieweduser' : usertochange.pk, 'parentuser' : parentuser, 'mail' : usertochange.email, 'imagelink' : usertochange.profile.get_photo_url, 'profileform' : UserProfileForm(instance=usertochange.profile), 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) } return render(request, 'dasettings/user_usprof.html', context) else: messages.success(request, f'Fehlerhafte Eingabe!') context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, 'first_name' : usertochange.first_name, 'last_name' : usertochange.last_name, 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), 'newuser' : newuser, 'vieweduser' : usertochange.pk, 'parentuser' : parentuser, 'mail' : usertochange.email, 'imagelink' : usertochange.profile.get_photo_url, 'profileform' : UserProfileForm(instance=usertochange.profile), 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) } return render(request, 'dasettings/user_usprof.html', context) else: usertime = "" try: usertime = UserTimeForm(instance=UserTime.objects.get(user=usertochange)) except: usertime = UserTime(user=usertochange) usertime.save() usertime = UserTimeForm(instance=UserTime.objects.get(user=usertochange)) context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), 'first_name' : usertochange.first_name, 'last_name' : usertochange.last_name, 'newuser' : newuser, 'mail' : usertochange.email, 'vieweduser' : usertochange.pk, 'imagelink' : usertochange.profile.get_photo_url, 'profileform' : UserProfileForm(instance=usertochange.profile), 'parentuser' : parentuser, 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True), 'agencygroups' : AgencyGroup.objects.filter(agency__pk=usertochange.profile.agency.pk).order_by("agencygroupname") } return render(request, 'dasettings/user_usprof.html', context) # View zur Veränderung der Stammdaten des Benutzers @login_required def UserChangeMain(request, pk): usertochange = User.objects.get(pk=pk, profile__agency=request.user.profile.agency) user_fullname = usertochange.first_name + " " + usertochange.last_name if request.method == 'POST': formtosave = UserNewUserForm(request.POST, instance=usertochange) if formtosave.is_valid(): formtosave.save() formtosave.save() messages.success(request, f'Stammdaten aktualisiert!') return redirect('dasettings') else: messages.success(request, f'Fehlerhafte Eingabe! Mailadresse bereits vorhanden!') context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, 'userform' : UserNewUserForm(request.POST, instance=usertochange), } return render(request, 'dasettings/user_changemaindata.html', context) else: context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, 'userform' : UserNewUserForm(instance=usertochange), } return render(request, 'dasettings/user_changemaindata.html', context) # Method for first User-Creation-Step @login_required def NewUserFirstStep(request): context = { 'active_link' : 'dasettings' } if request.method == 'POST': newuserform = UserNewUserForm(request.POST) if newuserform.is_valid(): if(request.POST.get("sendmailnewuser")): msg_html = render_to_string('users/register_mail.html', {'username': newuserform.cleaned_data.get('first_name') + " " + newuserform.cleaned_data.get('last_name')}) send_mail( request.user.profile.agency.name + ' Account', 'Hallo ' + newuserform.cleaned_data.get('first_name') + ' ' + newuserform.cleaned_data.get('last_name') + '! Bitte setzen sie sich auf https://digitale-agentur.com/password-reset/ ein Passwort.', 'noreply@digitale-agentur.com', [newuserform.cleaned_data.get('email')], html_message=msg_html, fail_silently=True, ) newuser = newuserform.save(commit=False) newuser.username = newuser.email newprofile = Profile(agency=request.user.profile.agency, parent=None) newprofile.save() newuser.profile = newprofile newuser.save() newuser_id = newuser.id messages.success(request, f'Benutzer angelegt!') today = date.today() UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year).save() UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year+1).save() UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year+2).save() getadmingroup = AgencyGroup.objects.filter(savefordel=True, is_admin=False, agency=request.user.profile.agency) for g in getadmingroup: g.group.user_set.add(newuser) return redirect('/dasettings/usprof/'+str(newuser_id)+'/1') else: messages.success(request, f'Daten falsch eingegeben!') context['newuserform'] = UserNewUserForm(request.POST) return render(request, 'dasettings/user_newuser_step1.html', context) # Returning the data from database for normal-loading Settings else: newuserform = UserNewUserForm() context.update({'newuserform' : newuserform}) return render(request, 'dasettings/user_newuser_step1.html', context) # NEUER AGENTURVERBUND @login_required def AddAgencyNetwork(request): if request.method == 'POST': newagn = AgencyNetworkForm(request.POST) if(newagn.is_valid()): newagn_object = AgencyNetwork(name=newagn.cleaned_data.get("name"), publicjoin=newagn.cleaned_data.get("publicjoin"), creator=request.user, creator_agency=request.user.profile.agency, networkid=randomString(20)) newagn_object.save() newagn_object.adminagencys.add(request.user.profile.agency) messages.success(request, f'Agenturverbund ' + newagn_object.name + ' angelegt!') return redirect('dasettings') else: context = { 'active_link' : 'dasettings', 'form' : AgencyNetworkForm(), } return render(request, 'dasettings/addagencynetwork_content.html', context) @login_required def UpdateAgencyNetwork(request, pk): if request.method == 'POST': agn = AgencyNetwork.objects.get(pk=pk) formdata = AgencyNetworkForm(request.POST) if(formdata.is_valid()): agn.name = formdata.cleaned_data.get("name") agn.publicjoin= formdata.cleaned_data.get("publicjoin") agn.save() #newagn_object.adminagencys.add(request.user.profile.agency) messages.success(request, f'Agenturverbund ' + agn.name + ' aktualisiert!') return redirect('dasettings') else: context = { 'active_link' : 'dasettings', 'form' : AgencyNetworkForm(instance=AgencyNetwork.objects.get(pk=pk)), } return render(request, 'dasettings/addagencynetwork_content.html', context) @login_required def DelAgencyNetwork(request, pk): agn = AgencyNetwork.objects.get(pk=pk) if request.method == 'POST': if request.user.profile.agency in agn.adminagencys.all(): agn.delete() messages.success(request, f'Agenturverbund erfolgreich gelöscht!') return redirect('dasettings') else: messages.success(request, f'Sie dürfen diesen Agenturverbund nicht löschen!') return redirect('dasettings') else: context = { 'active_link' : 'dasettings', 'agn' : agn } return render(request, 'dasettings/delagencynetwork_content.html', context) @login_required def AddMyAgencyToAgn(request, networkid): agn = AgencyNetwork.objects.filter(networkid=networkid) if len(agn) == 0: messages.info(request, f'Agenturverband nicht gefunden!') return redirect('dasettings') else: context = { 'active_link' : 'dasettings', 'agn' : list(agn)[0] } return render(request, 'dasettings/joinagn_first.html', context) def IsAgencyInAgNetwork(agencyid, agnetworkid): is_in = False agn = AgencyNetwork.objects.get(pk=agnetworkid) agency = Agency.objects.get(pk=agencyid) if agency in agn.adminagencys.all(): is_in = True if agency in agn.members.all(): is_in = True if agency in agn.sharemembers.all(): is_in = True return is_in @login_required def JoinAGN(request, pk): if IsAgencyInAgNetwork(request.user.profile.agency.pk, pk): messages.success(request, f'Ihre Agentur ist bereits in diesem Verbund!') else: agn = AgencyNetwork.objects.get(pk=pk) if(agn.publicjoin): messages.success(request, f'Verbund erfolgreich beigetreten!') agn.members.add(request.user.profile.agency) else: # STATUS # 1 WANTED AG ASKED TO TARGET NETWORK agnp = AgencyNetworkPreperation(target_network=AgencyNetwork.objects.get(pk=pk), wanted_agency=request.user.profile.agency, status=1) agnp.save() messages.success(request, f'Ihre Anfrage zum Beitritt wurde versendet. Sie erhalten eine Information, wenn die Anfrage angenommen wurde!') return redirect('dasettings') @login_required def ManageAgInAgn(request, pk): agn = AgencyNetwork.objects.filter(pk=pk) if len(agn) == 0: messages.info(request, f'Agenturverband nicht gefunden!') return redirect('dasettings') else: network = list(agn)[0] allagofagn = [] for a in network.members.all(): allagofagn.append(a) for a in network.sharemembers.all(): allagofagn.append(a) for a in network.adminagencys.all(): allagofagn.append(a) context = { 'active_link' : 'dasettings', 'agn' : list(agn)[0], 'outstanding': AgencyNetworkPreperation.objects.filter(target_network=list(agn)[0]) , 'allagofagn' : allagofagn } return render(request, 'dasettings/agencynetwork_agmanagement_content.html', context) @login_required def AddAgToNetwork(request, network, targetag, aginvpk): if IsAgencyInAgNetwork(Agency.objects.get(pk=targetag).pk, network): messages.info(request, f'Sie sind bereits in der Agentur!') return redirect('dasettings') else: messages.info(request, f'Einladung angenommen!') agn = AgencyNetwork.objects.get(pk=network) agn.members.add(Agency.objects.get(pk=targetag)) AgencyNetworkPreperation.objects.get(pk=aginvpk).delete() return redirect('managagn', network) @login_required def DelAgInv(request, pk): AgencyNetworkPreperation.objects.get(pk=pk).delete() messages.info(request, f'Einladung abgelehnt!') return redirect('dasettings') @login_required def DelFromAgn(request, agn, ag): return redirect('managagn', agn) @login_required def AgencyNetworkAjaxSettings(request): success = False data = {} if request.method == 'GET' and request.GET['action'] == "remove_ag_from_agn": agency = Agency.objects.get(pk=request.GET['agid']) agencynetwork = AgencyNetwork.objects.get(pk=request.GET['agnid']) if(agency != None and agencynetwork != None): agencynetwork.members.remove(agency) agencynetwork.adminagencys.remove(agency) agencynetwork.sharemembers.remove(agency) success = True elif request.method == 'GET' and request.GET['action'] == "removeinv": AgencyNetworkPreperation.objects.get(pk=request.GET['agn_inv']).delete() success = True elif request.method == 'GET' and request.GET['action'] == "changeagrights": agency = Agency.objects.get(pk=request.GET['agency']) agn = AgencyNetwork.objects.get(pk=request.GET['agnid']) if(agency != None and agn != None): agn.members.remove(agency) agn.adminagencys.remove(agency) agn.sharemembers.remove(agency) if (request.GET['newstatus'] == "0"): agn.members.add(agency) elif (request.GET['newstatus'] == "1"): agn.sharemembers.add(agency) elif (request.GET['newstatus'] == "2"): agn.adminagencys.add(agency) success = True else: success = False return JsonResponse(data) @login_required def ModSettingsOrga(request): if request.method == 'GET' and request.user.has_perm("users.modulesconfig"): if(request.GET['dynorga'] == "true"): ag = request.user.profile.agency ag.dynamicprofile = True ag.save() else: ag = request.user.profile.agency ag.dynamicprofile = False ag.save() return JsonResponse({}) else: return JsonResponse({}) @login_required def ModSettingsTm(request): if request.method == 'GET' and request.user.has_perm("users.modulesconfig"): if(request.GET['aze'] == "true"): ag = request.user.profile.agency ag.module_timemanagement_ze = True ag.save() else: ag = request.user.profile.agency ag.module_timemanagement_ze = False ag.save() return JsonResponse({}) else: return JsonResponse({})