Files
blechreiz-website/musicians/views.py
2026-04-08 22:28:49 +02:00

185 lines
5.7 KiB
Python

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.core.exceptions import PermissionDenied
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.user != musician.user and not request.user.is_staff:
raise PermissionDenied
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 = [
"image",
"small_image",
"instrument",
"birthday",
"street",
"city",
"zip_code",
"phone_home",
"phone_mobile",
"phone_work",
"position",
"public_description",
]
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('musicians:login')
def userlistForAutocompletion(request):
result = [u.username for u in User.objects.filter(is_active=True).order_by("username")]
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 request.POST.get("remember", None):
# "Remember me" checked: keep session for one year
request.session.set_expiry(timedelta(weeks=52))
else:
# No "remember me": 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})