digitaleagenturnc/dasettings/views.py

1773 lines
67 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, UsersNotificationFormStandard, AgencyGroupPerms, AgencyModulsForm, UserNewUserForm, UserProfileForm, AgencyNetworkForm, AgencyOrganigrammForm, UserTimeForm, AbsenceReasonForm, UsersNotificationFormNews, UsersNotificationFormFiles, UsersNotificationFormMessages ,UsersNotificationFormOrganizer, UsersNotificationFormChat, UsersNotificationFormAbTime, UsersNotificationFormGroups, UsersNotificationFormAgn, UsersNotificationFormTasks, AgencyBillMail, AgencyBillPlan, AgencyEndBillPlan
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, UserNotifications, UserTime, AgencyBills
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
from django.conf import settings # import the settings file
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
# STANDARDS
notificationforms_standard = UsersNotificationFormStandard(instance=request.user.usernotifications)
context.update({'notificationforms_standard' : notificationforms_standard})
notificationforms_news = UsersNotificationFormNews(instance=request.user.usernotifications)
context.update({'notificationforms_news' : notificationforms_news})
notificationforms_files = UsersNotificationFormFiles(instance=request.user.usernotifications)
context.update({'notificationforms_files' : notificationforms_files})
notificationforms_organizer = UsersNotificationFormOrganizer(instance=request.user.usernotifications)
context.update({'notificationforms_organizer' : notificationforms_organizer})
notificationforms_messages = UsersNotificationFormMessages(instance=request.user.usernotifications)
context.update({'notificationforms_messages' : notificationforms_messages})
notificationforms_chat = UsersNotificationFormChat(instance=request.user.usernotifications)
context.update({'notificationforms_chat' : notificationforms_chat})
notificationforms_abtime = UsersNotificationFormAbTime(instance=request.user.usernotifications)
context.update({'notificationforms_abtime' : notificationforms_abtime})
notificationforms_groups = UsersNotificationFormGroups(instance=request.user.usernotifications)
context.update({'notificationforms_groups' : notificationforms_groups})
notificationforms_agn = UsersNotificationFormAgn(instance=request.user.usernotifications)
context.update({'notificationforms_agn' : notificationforms_agn})
notificationforms_task = UsersNotificationFormTasks(instance=request.user.usernotifications)
context.update({'notificationforms_task' : notificationforms_task})
# 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
if request.user.profile.agency.module_recoverdir:
agencygroups = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("agencygroupname").order_by("-savefordel")
else:
agencygroups = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("agencygroupname").order_by("-savefordel").exclude(agencygroupname="Notfallhilfe")
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})
############################### NOTIFIFORMS START ##########################################
notificationforms_standard = UsersNotificationFormStandard(instance=request.user.usernotifications)
context.update({'notificationforms_standard' : notificationforms_standard})
notificationforms_news = UsersNotificationFormNews(instance=request.user.usernotifications)
context.update({'notificationforms_news' : notificationforms_news})
notificationforms_files = UsersNotificationFormFiles(instance=request.user.usernotifications)
context.update({'notificationforms_files' : notificationforms_files})
notificationforms_organizer = UsersNotificationFormOrganizer(instance=request.user.usernotifications)
context.update({'notificationforms_organizer' : notificationforms_organizer})
notificationforms_messages = UsersNotificationFormMessages(instance=request.user.usernotifications)
context.update({'notificationforms_messages' : notificationforms_messages})
notificationforms_chat = UsersNotificationFormChat(instance=request.user.usernotifications)
context.update({'notificationforms_chat' : notificationforms_chat})
notificationforms_abtime = UsersNotificationFormAbTime(instance=request.user.usernotifications)
context.update({'notificationforms_abtime' : notificationforms_abtime})
notificationforms_groups = UsersNotificationFormGroups(instance=request.user.usernotifications)
context.update({'notificationforms_groups' : notificationforms_groups})
notificationforms_agn = UsersNotificationFormAgn(instance=request.user.usernotifications)
context.update({'notificationforms_agn' : notificationforms_agn})
notificationforms_task = UsersNotificationFormTasks(instance=request.user.usernotifications)
context.update({'notificationforms_task' : notificationforms_task})
############################### NOTIFIFORMS END ############################################
# AGENCY UPDATE FORMS
agencyform = AgencyUpdateForm(instance=request.user.profile.agency)
context.update({'agencyform' : agencyform})
# Abrechnung BILLS
lexdata = {}
# HEADERS CURL
headers = {
'Authorization': 'Bearer ' + settings.LEX_API,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
#json_data = json.dumps(lexdata)
#r = requests.get("https://api.lexoffice.io/v1/invoices/"+AgencyBills.objects.filter(agency=request.user.profile.agency)[0].lexid, data=json_data, headers=headers)
#json.loads(r.text)
#print(r.text)
# Alle Rechnungen der Agentur abfragen
context.update({"bills" : AgencyBills.objects.filter(agency=request.user.profile.agency).order_by("-end")})
return render(request, 'dasettings/settings.html', context)
from django.http import FileResponse, Http404
@login_required
def GetBill(request, pk):
# HEADERS CURL
headers = {
'Authorization': 'Bearer ' + settings.LEX_API,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
json_data = {}
r = requests.get("https://api.lexoffice.io/v1/invoices/"+AgencyBills.objects.get(pk=pk).lexid+"/document", data=json_data, headers=headers)
context = {
'active_link' : 'dasettings',
'bill' : AgencyBills.objects.get(pk=pk),
'fileid' : json.loads(r.text)["documentFileId"]
}
return render(request, 'dasettings/bill_single.html', context)
import io as BytesIO
import base64
from django.http import HttpResponse
@login_required
def GetBillPDF(request, pk):
bill = AgencyBills.objects.get(pk=pk)
# Sicherheitscheck, ob der angefragte User zur Agentur gehört und das Recht hat, Agenturinfos zu bearbeiten
if (bill.agency == request.user.profile.agency and request.user.has_perm("users.agencyinfo")) or request.user.is_staff:
headers = {
'Authorization': 'Bearer ' + settings.LEX_API,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
lexdata = {
"renderType" : "pdf"
}
json_data = json.dumps(lexdata)
r = requests.get("https://api.lexoffice.io/v1/invoices/"+bill.lexid+"/document", data=json_data, headers=headers)
json.loads(r.text)
base64String = requests.get("https://api.lexoffice.io/v1/files/"+json.loads(r.text)["documentFileId"]+"/", data=json_data, headers=headers)
buffer = BytesIO.BytesIO()
content = base64.b64decode(base64String.text)
buffer.write(content)
response = HttpResponse(buffer.getvalue(),content_type="application/pdf")
response['Content-Disposition'] = 'inline;filename=some_file.pdf'
return response
else:
messages.warning(request, f'Diese Daten sind für Sie nicht einsehbar.')
return redirect("dasettings")
'''
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):
try:
response = super(AbsenceReasonDeleteView, self).delete(request, *args, **kwargs)
messages.success(request, f'Abwesenheitskategorie wurde gelöscht!')
return response
except:
messages.success(request, f'Abwesenheitskategorie kann nicht gelöscht werden, da Abwesenheiten eingetragen wurden.')
return redirect('dasettings')
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():
usert = User.objects.get(pk=request.user.pk)
userform.save()
usert.username = userform.cleaned_data.get("email")
usert.email = userform.cleaned_data.get("email")
usert.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
'''
if request.method == 'GET' and request.GET['action'] == "update_notifications" :
success = False
new_stat = request.GET['new_stat']
field_to_change = getattr(request.user.usernotifications, request.GET['fieldname'])
if(field_to_change or not field_to_change):
if(new_stat == "1"):
setattr(request.user.usernotifications, request.GET['fieldname'], True)
else:
setattr(request.user.usernotifications, request.GET['fieldname'], False)
request.user.usernotifications.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, task=task).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.username = 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.keys():
tempdate = tempdays_year[k].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:
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
# DELETE ALL FREE DAYS
elif request.method == 'GET' and request.GET['action'] == "delallfreedays" :
if(request.user.has_perm('users.modulesconfig')):
FreeDays.objects.filter(agency=request.user.profile.agency).delete()
messages.success(request, f'Feiertage erfolgreich entfernt!')
success = True
else:
data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name}
success = False
#return render(request, 'dasettings/change_absence_yeardata.html', context)
# HOLIDAYS UPDATE
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)
# UPDATE HOLIDAYS SAVE
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! Das Verfallsdatum der Urlaubstage ist ungültig oder das Format wurde nicht beachtet (TAG.MONAT.).')
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 ist ungültig!')
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! Das Verfallsdatum muss im Format TAG.MONAT. sein und existieren!')
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://app.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()
# USERTIME
user_time = UserTime(user=newuser)
user_time.save()
# USER NOTIFICATIONS
user_notifications = UserNotifications(user=newuser)
user_notifications.save()
newuser.usernotifications = user_notifications
newuser.usertime = user_time
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'Agenturverbund 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)
# Benachrichtigung senden, dass eine neue Agentur dem Verbund beitreten will. DIe Info geht an alle administrativen Agenturen.
for adminagencys in agn.adminagencys.all():
usersofagency = Users.objects.filter(profile__agency=adminagencys)
for u in usersofagency:
if u.has_perm('users.agencynetwork') and u.has_perm('users.agencynetwork'):
if u.usernotifications.agn_own_change_mail:
notificationtext = " eine neue Agentur ist dem Verbund " + agn.name + " beigetreten."
sendMailNoti(notificationtext, u)
if u.usernotifications.agn_own_change_push:
newnotification = UserNotification(touser=u, notificationtext=" eine neue Agentur ist dem Verbund " + agn.name + " beigetreten.", notificationtype="")
newnotification.save()
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Eine neue Agentur ist dem Verbund " + agn.name + " beigetreten."})
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()
# Benachrichtigung senden, dass eine neue Agentur dem Verbund beitreten will. DIe Info geht an alle administrativen Agenturen.
for adminagencys in agn.adminagencys.all():
usersofagency = Users.objects.filter(profile__agency=adminagencys)
for u in usersofagency:
if u.has_perm('users.agencynetwork') and u.has_perm('users.agencynetwork'):
if u.usernotifications.agn_own_change_mail:
notificationtext = " eine neue Agentur möchte dem Verbund " + agn.name + " beitreten."
sendMailNoti(notificationtext, u)
if u.usernotifications.agn_own_change_push:
newnotification = UserNotification(touser=u, notificationtext=" eine neue Agentur möchte dem Verbund " + agn.name + " beitreten.", notificationtype="")
newnotification.save()
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Eine neue Agentur möchte dem Verbund " + agn.name + " beitreten."})
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 im Agenturverbund!')
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
# Benachrichtigung senden, dass eine neue Agentur dem Verbund beitreten will. DIe Info geht an alle administrativen Agenturen.
usersofagency = Users.objects.filter(profile__agency=agency)
for u in usersofagency:
if u.has_perm('users.agencynetwork') and u.has_perm('users.agencynetwork'):
if u.usernotifications.agn_other_change_mail:
notificationtext = " ihre Agentur wurde aus dem Verbund " + agencynetwork.name + " entfernt."
sendMailNoti(notificationtext, u)
if u.usernotifications.agn_other_change_push:
newnotification = UserNotification(touser=u, notificationtext=" ihre Agentur wurde aus dem Verbund " + agencynetwork.name + " entfernt.", notificationtype="")
newnotification.save()
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Ihre Agentur wurde aus dem Verbund " + agencynetwork.name + " entfernt."})
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
usersofagency = Users.objects.filter(profile__agency=agency)
for u in usersofagency:
if u.has_perm('users.agencynetwork') and u.has_perm('users.agencynetwork'):
if u.usernotifications.agn_other_change_mail:
notificationtext = " ihre Agentur hat im Verbund " + agn.name + " andere Rechte erhalten."
sendMailNoti(notificationtext, u)
if u.usernotifications.agn_other_change_push:
newnotification = UserNotification(touser=u, notificationtext=" ihre Agentur hat im Verbund " + agn.name + " andere Rechte erhalten.", notificationtype="")
newnotification.save()
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Ihre Agentur hat im Verbund " + agn.name + " andere Rechte erhalten."})
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):
return JsonResponse({})
'''
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({})
'''
########## ABRECHNUNG ##########
class BillMailUpdate(UpdateView):
model = Agency
success_url = reverse_lazy('dasettings')
form_class = AgencyBillMail
template_name = "dasettings/dasettings_billmail.html"
def form_valid(self, form):
messages.success(self.request, f"E-Mailadresse erfolgreich aktualisiert!")
return super().form_valid(form)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({'active_link' : 'dasettings'})
return context
'''
def getBill(request, billid):
if(request.method == "GET"):
Bill = AgencyBills.objects.get(billid=billid)
response = HttpResponse(content_type='text/pdf')
response['Content-Disposition'] = 'attachment; filename="RechnungPLATZHALTER.pdf"'
return response
else:
pass
'''
class BillPlanEnd(UpdateView):
model = Agency
success_url = reverse_lazy('dasettings')
form_class = AgencyEndBillPlan
template_name = "dasettings/bill_removepayplan.html"
def form_valid(self, form):
self.object.paymentplan = 0
messages.success(self.request, f"Abonnement gekündigt!")
return super().form_valid(form)
from dateutil.relativedelta import *
class BillPlanUpdate(UpdateView):
model = Agency
success_url = reverse_lazy('dasettings')
form_class = AgencyBillPlan
template_name = "dasettings/dasettings_billplan.html"
# LexOffice Verbindung
def form_valid(self, form):
# Form einmal speichern, damit die Adressdaten usw. übernommen werden
form.save()
agency = self.request.user.profile.agency
month = agency.registerdate
# Wenn die Agentur noch KEINE Lexoffice-ID hat, dann ist der Freimonat noch nicht durch.
if agency.lexofficeid == "":
month = month + relativedelta(months=1)
else:
month = AgencyBills.objects.filter(agency=self.request.user.profile.agency).order_by("-end")[0].end
next_month = month + relativedelta(months=1)
voucher_date = next_month.strftime("%Y-%m-%d")
# USERCOUNT BERECHNEN
usercount = len(User.objects.filter(profile__agency=agency))
if(usercount < 4):
usercount = 0
else:
usercount = usercount - 3
# HEADERS CURL
headers = {
'Authorization': 'Bearer ' + settings.LEX_API,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
plan = int(form.cleaned_data['paymentplan'])
start_date = month
start_date_string = month.strftime("%d.%m.%Y")
end_date = month + relativedelta(months=plan)
end_date_string= end_date.strftime("%d.%m.%Y")
voucher_date_today = date.today().strftime("%Y-%m-%d")
# TASK: Was passiert bei Änderungen der Agenturdaten?
# DataJSON
monthword = "Monate"
if form.cleaned_data['paymentplan'] == "1":
monthword = "Monat"
lexdata = {
"voucherDate": voucher_date_today + "T00:00:00.000+00:00",
"address" : {
"name" : agency.name,
"street": agency.street,
"zip": agency.plz,
"city": agency.city,
"countryCode" : "DE"
},
"totalPrice" : {
"currency" : "EUR",
},
"lineItems" : [
{
"type" : "custom",
"name" : "Digitale Agentur: Grundbetrag für " + str(plan) + " " + monthword,
"quantity" : 1,
"unitName" : "Stück",
"description" : "Zeitraum " + start_date_string + " - " + end_date_string,
"unitPrice" :
{
"currency" : "EUR",
"netAmount" : 21.00 * int(form.cleaned_data['paymentplan']),
"taxRatePercentage" : 16
},
},
{
"type" : "custom",
"name" : "Digitale Agentur: Zusätzliche Nutzer",
"description" : "Zeitraum " + start_date_string + " - " + end_date_string,
"quantity" : usercount,
"unitName" : "Stück",
"unitPrice" :
{
"currency" : "EUR",
"netAmount" : 3 * int(form.cleaned_data['paymentplan']),
"taxRatePercentage" : 16
},
}
],
"taxConditions": {
"taxType": "net"
},
"paymentConditions": {
"paymentTermLabel": "Bitte zahlen Sie innerhalb von 14 Tagen.",
"paymentTermDuration": 14,
},
"shippingConditions": {
#"shippingDate": voucher_date_today + "T00:00:00.000+00:00",
"shippingType": "none"
}
}
json_data = json.dumps(lexdata)
self.object = form.save(commit=False)
r = requests.post("https://api.lexoffice.io/v1/invoices/?finalize=true", data=json_data, headers=headers)
if(r.status_code == 201):
messages.success(self.request, f"Rechnung erstellt!")
# Response in JSON umwandeln
response_text = json.loads(r.text)
# Rechnungsidee speichern
# HEADERS CURL
headers = {
'Authorization': 'Bearer ' + settings.LEX_API,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
json_data = json.dumps(lexdata)
newbill_id = response_text["id"]
# OrganizationId berechnen, wenn noch nicht gesetzt
r = requests.get("https://api.lexoffice.io/v1/invoices/" + response_text["id"], data=json_data, headers=headers)
response_text = json.loads(r.text)
if len(agency.lexofficeid) == 0:
self.object.lexofficeid = response_text["organizationId"]
newbill = AgencyBills(agency=agency, lexid=newbill_id, billtype="invoice", billnumber=response_text["voucherNumber"], billstatus=response_text["voucherStatus"], start=start_date, end=end_date, plan=plan, usercount=usercount)
newbill.save()
self.object.save()
mail_to_send = ""
if(self.request.user.profile.agency.payment_address == ""):
mail_to_send = self.request.user.profile.agency.agency_email
else:
mail_to_send = self.request.user.profile.agency.payment_address
msg_html = render_to_string('users/newbill_mail.html', {})
send_mail('Digitale Agentur | Rechnung', 'Sehr geehrte Nutzer, es wurde eine Rechnung für Ihre digitale Agentur erstellt. Diese können Sie unter Einstellungen, Abrechnung einsehen.','noreply@digitale-agentur.com',[mail_to_send],html_message=msg_html,fail_silently=True)
else:
messages.warning(self.request, f"Fehlercode "+str(r.status_code)+". Es wurde keine Rechnung erstellt. Bitte wenden Sie sich an den Support!")
return super().form_valid(form)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Rechnungsbegin setzen
agency = self.request.user.profile.agency
if len(AgencyBills.objects.filter(agency=self.request.user.profile.agency)) == 0:
month = self.request.user.profile.agency.registerdate + relativedelta(months=1)
else:
month = AgencyBills.objects.filter(agency=self.request.user.profile.agency).order_by("-end")[0].end
# Wenn die Agentur noch KEINE Lexoffice-ID hat, dann ist der Freimonat noch nicht durch.
if agency.lexofficeid == "":
month = month + relativedelta(months=1)
context.update({'active_link' : 'dasettings', 'end' : month})
return context