import json from datetime import timedelta from django import forms from django.contrib.auth import authenticate, login, logout from django.contrib.auth.models import User from django.contrib.auth.views import PasswordChangeView from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse_lazy from django.views.generic import ListView from django.views.generic.edit import UpdateView from .models import Musician class MusicianList(ListView): model = Musician def get_queryset(self): return Musician.objects.filter(user__is_active=True) class UserEditForm(forms.ModelForm): email = forms.EmailField() class Meta: model = Musician exclude = [ "user", "image", "small_image", "instrument", "position", "public_description", ] def __init__(self, *args, **kw): if "instance" in kw: user = kw["instance"].user initVals = {"email": user.email} if "initial" not in kw: kw["initial"] = initVals else: kw["initial"].update(initVals) super().__init__(*args, **kw) # Reorder fields to put email near the top if "email" in self.fields: email_field = self.fields.pop("email") new_fields = {} field_names = list(self.fields.keys()) # Insert email at position 2 (after first two fields) for i, name in enumerate(field_names): if i == 2: new_fields["email"] = email_field new_fields[name] = self.fields[name] if "email" not in new_fields: new_fields["email"] = email_field self.fields = new_fields def save(self, commit=True): if self.is_valid(): instance = super().save(commit=commit) self.instance.user.email = self.cleaned_data["email"] self.instance.user.save() return instance return None def own_profile(request): return user_edit(request, request.user) def user_edit(request, username): musician = get_object_or_404(Musician, user__username=username) if request.method == "POST": form = UserEditForm(request.POST, instance=musician) if form.is_valid(): form.save() return HttpResponseRedirect("/") else: form = UserEditForm(instance=musician) return render( request, "musicians/musician_edit.html", {"form": form, "musician": musician} ) class MusicianUpdate(UpdateView): model = Musician template_name = "musicians/musician_edit.html" success_url = "/books/" fields = "__all__" def addressbook(request): context = {} context["musicians"] = Musician.objects.filter(user__is_active=True).order_by("user__first_name") return render(request, "musicians/addressbook.html", context) ############################################################################################################ ######################### User Management Views ############################################################ ############################################################################################################ class ChangePasswordView(PasswordChangeView): template_name = "musicians/change_password.html" success_url = reverse_lazy("website:home") def change_password(request): return ChangePasswordView.as_view()(request) def logout_view(request): logout(request) return redirect(login_view) def userlistForAutocompletion(request): result = [u.username for u in User.objects.all()] return HttpResponse(json.dumps(result), content_type="application/json") def login_view(request): if request.method == "POST": raiseFirstLetter = lambda s: s[:1].upper() + s[1:] if s else "" username = raiseFirstLetter(request.POST.get("username", "")) password = request.POST.get("password", "") user = authenticate(request, username=username, password=password) result = {} result["err"] = "" if user is not None: if user.is_active: if not request.POST.get("remember", None): # Expire in one year request.session.set_expiry(timedelta(weeks=52)) else: # Expire on browser close request.session.set_expiry(0) login(request, user) result["redirect"] = "/" if "next" in request.POST: result["redirect"] = request.POST["next"] else: result["err"] = "Dein Account wurde deaktiviert." else: result["err"] = "Falscher Benutzername oder falsches Kennwort." return HttpResponse(json.dumps(result), content_type="application/json") else: # Check if user already logged in if request.user.is_authenticated: return redirect("/") if "next" in request.GET: nextPage = request.GET["next"] else: nextPage = "/" return render(request, "musicians/login.html", {"next": nextPage})