185 lines
5.7 KiB
Python
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.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 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})
|