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 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 from django.contrib.auth.models import User, Group, Permission 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 from datetime import datetime from standards.models import Standards from django.core.mail import send_mail 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}) # USER FOR USERTABLE users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk) return context ''' Lädt die Formulare für die einzelnen Einstellungen vollständig ''' @login_required def DASettings(request): context = { 'active_link' : 'dasettings' } 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") 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 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) @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() 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" : Areas(pk=request.GET['id']).delete() success = True # 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) print(possible_users) for us in possible_users: posus.update({ k : {"fullname" : us.first_name + " " + us.last_name, "userid" : us.pk}}) k += 1 print(posus) 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" : Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency).delete() 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 else: success = False return JsonResponse({"success" : success, "data" : data}) ''' 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 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, '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: context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, '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.', 'support@digitale-agentur.com', [newuserform.cleaned_data.get('email')], html_message=msg_html, fail_silently=False, ) 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!') 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)