digitaleagenturnc/dasettings/views.py

558 lines
22 KiB
Python

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 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
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")):
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)