from django.shortcuts import render, redirect from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.contrib.auth.decorators import login_required from django.conf import settings from .usersforms import UsersAddNewUser, UsersAddProfileForm, UsersChangeProfil, AgencyUpdateForm, UsersPermForm from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView, View from django.contrib import messages from django.contrib.auth.models import User from django.db import models from .models import Profile, Agency from django.core.mail import send_mail from django.contrib.auth.models import Permission from django.http import HttpResponseRedirect ''' DASHBOARD-View View nach erfolgreichem Login und anzeige des Dashboards. TODO: ROLLENVERTEILUNG Templates: welcomeusers.html und base.html ''' class AgencyCreateView(CreateView): model = User fields = ['first_name', 'last_name','username', 'email'] success_url = '/register/done' def form_valid(self, form): # Send message to the site messages.success(self.request, f'Agentur erstellt! Es wurde eine E-Mail verschickt mit weitere Infos zur Passworterstellung.') # SAVE OBJECTS TO SIGNALE! agency = Agency() agency.save() form.instance.agency = agency # E-Mail für Passwort-Setzung! send_mail( 'Agenturanmeldung', 'Hallo ' + form.cleaned_data.get('first_name') + ' ' + form.cleaned_data.get('last_name') + '! Bitte setzen sie sich auf localhost:8000/password-reset/ ein Passwort. Anschließend können Sie weitere Details Ihrer Agentur eingeben.', 'htrampe@gmail.com', [form.cleaned_data.get('email')], fail_silently=False, ) return super().form_valid(form) @login_required def dashboard(request): context = { 'active_link' : 'dashboard' } return render (request, 'users/dashboard.html', context) class UsersManagement(LoginRequiredMixin, ListView): model = User # Adding active_link # Loading only user same agency # Change context and return for template-data def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # Get all Users of the Same Agency as logged user users_of_agency = User.objects.filter(profile__agency__pk=self.request.user.profile.agency.pk) context.update({'active_link' : 'usersmanagement', 'users_of_agency':users_of_agency}) return context ''' Class AddNewUser() Erstellt einen neuen Nutzer mit SIGNALS, Profile und Agency (des aktuellen Users mit Rechten) ''' class UsersCreateUser(LoginRequiredMixin, CreateView): model = User fields = ['first_name', 'last_name','username', 'email'] success_url = '/dashboard/usersman/' # Adding active_link def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({'active_link' : 'usersmanagement'}) return context def form_valid(self, form): # Send message to the site messages.success(self.request, f'Benutzer angelegt!') # SAVE OBJECTS TO SIGNALE! form.instance.agency = self.request.user.profile.agency # E-Mail für Passwort-Setzung! send_mail( self.request.user.profile.agency.name + ' Anmeldung', 'Hallo ' + form.cleaned_data.get('first_name') + ' ' + form.cleaned_data.get('last_name') + '! Bitte setzen sie sich auf localhost:8000/password-reset/ ein Passwort.', 'htrampe@gmail.com', [form.cleaned_data.get('email')], fail_silently=False, ) return super().form_valid(form) # USER muss eingeloggt sein, um diese Seite zu sehen @login_required def profile(request): # NEUE DATEN KOMMEN AN! if request.method == 'POST': # Hier werden die Daten aus POST geholt und in die Instance(konkreten User) gespeichert u_form = UsersChangeProfil(request.POST, instance=request.user) #p_form = UsersAddProfileForm(request.POST, request.FILES, instance=request.user.profile) if u_form.is_valid(): #if u_form.is_valid() and p_form.is_valid(): u_form.save() #p_form.save() prename = request.user.first_name name = request.user.last_name #name = p_form.cleaned_data.get('name') messages.success(request, f'Daten für {prename} {name} aktualisiert!') # Daten neu laden und nicht die "Mächten sie die Daten speichern...?" return redirect('users-dashboard') else: # Form in Klammern sind die aktuellen Daten :) u_form = UsersChangeProfil(instance=request.user) #p_form = UsersAddProfileForm(instance=request.user.profile) context = { 'u_form' : u_form, #'p_form' : p_form, 'active_link' : 'dashboard' } return render(request, 'users/profile.html', context) # Hier andere Nutzer ändern, wenn man Usersmanagement darf! class UserManagementUpdateForm(LoginRequiredMixin, UpdateView): model = Profile labels = { "phoneland" : "Telefon", "phonemobile" : "Mobil", "compfunc" : "Agenturfunktion", } fields = ['phoneland','phonemobile','compfunc'] class UsersPermUpdateView(LoginRequiredMixin, View): template_name = 'users/users_perm.html' form_class = UsersPermForm success_url = '/dashboard/usersman/' # Form wird geladen; Checkboxen werden vorbereitet und hier rausgerendert. def get(self,request,*args, **kwargs): # User ist der hier Aufgerufene, bzw. das Profil! user_tochange = Profile.objects.get(pk=kwargs['pk']).user return render (request, self.template_name, {'form':self.form_class(user_tochange), 'active_link': 'usersmanagement', 'user_tochange': user_tochange}) #messages.success(self.request, f'Berechtigungen aktualisiert!') #print(form) #return super().form_valid(form) # Handle POST GTTP requests def post(self, request, *args, **kwargs): permissions_loaded = dict(request.POST.lists()) user_tochange = Profile.objects.get(pk=kwargs['pk']).user # ITERATION Über alle Elemente gehen und Rechte entziehen (nicht vorhanden) oder adden (wenn vorhanden) # Hat ein user ein Recht NICHT, ist es NICHT in permissions # LOAD PERMISSIONS temprof = Profile for ele in temprof._meta.permissions: tempperm = Permission.objects.get(codename=ele[0]) if ele[0] in permissions_loaded: user_tochange.user_permissions.add(tempperm) else: user_tochange.user_permissions.remove(tempperm) user_tochange.save() messages.success(request, f'Berechtigungen für {user_tochange.first_name} {user_tochange.last_name} aktualisiert!') return HttpResponseRedirect('/dashboard/usersman/') # Benutzerprofil wird aktualisiert class ProfileUpdateView(LoginRequiredMixin, UpdateView): model = Profile form_class = UsersAddProfileForm template_name = 'users/profile_update.html' success_url = '/dashboard/usersman/' def get_context_data(self, **kwargs): context = super(ProfileUpdateView, self).get_context_data(**kwargs) context['active_link'] = 'usersmanagement' return context # Delete a user! class ProfileDeleteView(LoginRequiredMixin, DeleteView): model = User success_url = '/dashboard/usersman' template_name = 'users/user_confirm_delete.html' def test_func(self): tempuser = self.get_object() todel_name = self.get_object().first_name + " " + self.get_object().last_name # self request user ist der aktuell user messages.success(self.request, f'Benutzer {todel_name} entfernet!') if self.request.user == tempuser: return False return True # USER muss eingeloggt sein, um diese Seite zu sehen @login_required def agency(request): context = { 'active_link' : 'agencyinfo' } return render(request, 'users/agency.html', context) class AgencyUpdateView(LoginRequiredMixin, UpdateView): model = Agency form_class = AgencyUpdateForm template_name = 'users/agency_update.html' success_url = '/dashboard/agencyinfo' def get_context_data(self, **kwargs): context = super(AgencyUpdateView, self).get_context_data(**kwargs) context['active_link'] = 'agencyinfo' return context