235 lines
8.0 KiB
Python
235 lines
8.0 KiB
Python
from django.shortcuts import render, redirect
|
|
from django.http.request import HttpRequest
|
|
from django.contrib import messages
|
|
from django.contrib.auth.decorators import login_required
|
|
from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm
|
|
from django.contrib.auth import views as auth_views
|
|
from django.contrib.auth import authenticate, login, logout
|
|
from django.views.decorators.csrf import csrf_protect
|
|
|
|
from .models import Profile, Preference
|
|
|
|
from home.context import hydrate, base
|
|
|
|
from django.contrib.auth.forms import AuthenticationForm
|
|
|
|
# @hydrate(base)
|
|
# def login_view(request, context={}):
|
|
# """Custom login view"""
|
|
# if request.method=='POST':
|
|
# form = AuthenticationForm(data = request.POST)
|
|
# if form.is_valid():
|
|
# user = authenticate(
|
|
# username = request.POST['username'],
|
|
# password = request.POST['password'],
|
|
# )
|
|
# if user is not None:
|
|
# messages.add_message(request, messages.SUCCESS,
|
|
# "Welcome back, {}".format(user))
|
|
# login(request, user,
|
|
# backend = 'django.contrib.auth.backends.ModelBackend')
|
|
# print('user authenticated:', user.is_authenticated)
|
|
# print('user active:', user.is_active)
|
|
# return redirect('profile')
|
|
|
|
# messages.add_message(request, messages.ERROR,
|
|
# f"Invalid user.")
|
|
# print('Invalid user')
|
|
# context['form'] = AuthenticationForm()
|
|
# return render(request, 'users/login.html', context)
|
|
|
|
# elif request.method == 'GET':
|
|
# context['form'] = AuthenticationForm()
|
|
# return render(request, 'users/login.html', context)
|
|
|
|
# else:
|
|
# raise Exception(f"{request.method} is an unsupported method type.\n\
|
|
# Use GET or POST methods instead.")
|
|
|
|
|
|
class LoginView(auth_views.LoginView):
|
|
"""Login view hydrated with context."""
|
|
|
|
template_name = "users/login.html"
|
|
authentication_form = AuthenticationForm
|
|
redirect_authenticated_user = True
|
|
|
|
def get_context_data(self, **kwargs):
|
|
"""Compute the context."""
|
|
context = super().get_context_data(**kwargs)
|
|
context.update(base(self.request))
|
|
return context
|
|
|
|
@classmethod
|
|
def as_view(cls, *args, **kwargs):
|
|
"""Force authentication."""
|
|
f = super().as_view(*args, **kwargs)
|
|
|
|
@csrf_protect
|
|
def view(request):
|
|
if request.method == "POST":
|
|
# form = AuthenticationForm(data = request.POST)
|
|
# if form.is_valid():
|
|
user = authenticate(
|
|
username=request.POST["username"], password=request.POST["password"]
|
|
)
|
|
login(request, user)
|
|
print("user authenticated:", user.is_authenticated)
|
|
for key, value in request.session.items():
|
|
print("{} => {}".format(key, value))
|
|
return redirect("profile")
|
|
return f(request)
|
|
|
|
return view
|
|
|
|
|
|
class PasswordResetView(auth_views.PasswordResetView):
|
|
"""Password reset view hydrated with context."""
|
|
|
|
template_name = "users/password_reset.html"
|
|
# authentication_form = AuthenticationForm
|
|
|
|
def get_context_data(self, **kwargs):
|
|
"""Compute the context."""
|
|
context = super().get_context_data(**kwargs)
|
|
context.update(base(self.request))
|
|
return context
|
|
|
|
|
|
class LogoutView(auth_views.LogoutView):
|
|
"""Logout view hydrated with context."""
|
|
|
|
template_name = "users/logout.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
"""Compute the context."""
|
|
context = super().get_context_data(**kwargs)
|
|
context.update(base(self.request))
|
|
return context
|
|
|
|
|
|
class PasswordResetDoneView(auth_views.PasswordResetDoneView):
|
|
"""Password reset done view hydrated with context."""
|
|
|
|
template_name = "users/password_reset_done.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
"""Compute the context."""
|
|
context = super().get_context_data(**kwargs)
|
|
context.update(base(self.request))
|
|
return context
|
|
|
|
|
|
class PasswordResetConfirmView(auth_views.PasswordResetConfirmView):
|
|
"""Password reset confirm view hydrated with context."""
|
|
|
|
template_name = "users/password_reset_confirm.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
"""Compute the context."""
|
|
context = super().get_context_data(**kwargs)
|
|
context.update(base(self.request))
|
|
return context
|
|
|
|
|
|
class PasswordResetCompleteView(auth_views.PasswordResetCompleteView):
|
|
"""Password reset complete view hydrated with context."""
|
|
|
|
template_name = "users/password_reset_complete.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
"""Compute the context."""
|
|
context = super().get_context_data(**kwargs)
|
|
context.update(base(self.request))
|
|
return context
|
|
|
|
|
|
@hydrate(base)
|
|
def register(request, context={}):
|
|
"""Register view that sends web forms and receives them."""
|
|
if request.method == "POST":
|
|
form = UserRegisterForm(request.POST)
|
|
if form.is_valid():
|
|
form.save()
|
|
username = form.cleaned_data.get("username")
|
|
messages.success(
|
|
request,
|
|
f"Your account has been created! You are now able to log in as {username}.",
|
|
)
|
|
return redirect("login")
|
|
elif request.method == "GET":
|
|
form = UserRegisterForm()
|
|
else:
|
|
raise Exception(f"HTTP {request.method} method is not supported.")
|
|
context["form"] = form
|
|
return render(request, "users/register.html", context)
|
|
|
|
|
|
@login_required
|
|
@hydrate(base)
|
|
def profile(request, context={}):
|
|
"""Show profile view."""
|
|
# print all session variables
|
|
for key, value in request.session.items():
|
|
print("{} => {}".format(key, value))
|
|
|
|
print("user authenticated:", request.user.is_authenticated)
|
|
print("user active:", request.user.is_active)
|
|
if request.method == "POST":
|
|
u_form = UserUpdateForm(request.POST, instance=request.user)
|
|
p_form = ProfileUpdateForm(
|
|
request.POST, request.FILES, instance=request.user.profile
|
|
)
|
|
if u_form.is_valid() and p_form.is_valid():
|
|
u_form.save()
|
|
p_form.save()
|
|
messages.success(request, f"Your account has been updated!")
|
|
return redirect("profile")
|
|
|
|
else:
|
|
u_form = UserUpdateForm(instance=request.user)
|
|
p_form = ProfileUpdateForm(instance=request.user.profile)
|
|
context.update({"u_form": u_form, "p_form": p_form})
|
|
return render(request, "users/profile.html", context)
|
|
|
|
|
|
@login_required
|
|
@hydrate(base)
|
|
def public_profile(request, context={}):
|
|
"""Show profile view."""
|
|
# print all session variables
|
|
for key, value in request.session.items():
|
|
print("{} => {}".format(key, value))
|
|
|
|
print("user authenticated:", request.user.is_authenticated)
|
|
print("user active:", request.user.is_active)
|
|
if request.method == "POST":
|
|
u_form = UserUpdateForm(request.POST, instance=request.user)
|
|
p_form = ProfileUpdateForm(
|
|
request.POST, request.FILES, instance=request.user.profile
|
|
)
|
|
if u_form.is_valid() and p_form.is_valid():
|
|
u_form.save()
|
|
p_form.save()
|
|
messages.success(request, f"Your account has been updated!")
|
|
return redirect("profile")
|
|
|
|
else:
|
|
u_form = UserUpdateForm(instance=request.user)
|
|
p_form = ProfileUpdateForm(instance=request.user.profile)
|
|
context.update({"u_form": u_form, "p_form": p_form})
|
|
return render(request, "users/profile.html", context)
|
|
|
|
|
|
@login_required
|
|
@hydrate(base)
|
|
def preference(request: HttpRequest, context: dict):
|
|
"""Edit preferences of an user.
|
|
Preferences are stored as JSONField."""
|
|
if request.method == "GET":
|
|
profile = Profile.objects.filter(user=request.user).first()
|
|
print(profile)
|
|
return render(request, "users/preference.html", context)
|
|
elif request.method == "POST":
|
|
raise NotImplementedError
|