134 lines
4.7 KiB
Python
134 lines
4.7 KiB
Python
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
|
|
from django.shortcuts import redirect, render, get_object_or_404
|
|
from django.contrib.auth.tokens import default_token_generator
|
|
from django.contrib.sites.shortcuts import get_current_site
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
|
from django.contrib.auth import logout
|
|
from django.contrib import messages
|
|
from django.template.loader import render_to_string
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.core.mail import EmailMultiAlternatives
|
|
from django.views.generic.edit import FormView
|
|
from django.utils.encoding import force_bytes
|
|
from django.http import HttpResponse, Http404
|
|
from django.conf import settings
|
|
from django.urls import reverse_lazy
|
|
from nsfw.views import is_nsfw_allowed
|
|
from .forms import RegistrationForm, ChangePasswordForm, DeleteAccountForm
|
|
from .models import NelUser
|
|
|
|
|
|
@login_required
|
|
def settings_default(request):
|
|
next_page = reverse_lazy("set_nsfw")
|
|
return redirect(next_page)
|
|
|
|
|
|
@login_required
|
|
def set_nsfw(request):
|
|
ctx = {
|
|
"nsfw_allowed": is_nsfw_allowed(request),
|
|
"current_url": reverse_lazy("set_nsfw"),
|
|
"tab": "preferences",
|
|
"active_block": "nsfw_filter",
|
|
}
|
|
return render(request, "neluser/settings/preferences/nsfw.html", ctx)
|
|
|
|
|
|
class ChangePasswordView(LoginRequiredMixin, FormView):
|
|
template_name = "neluser/settings/security/password.html"
|
|
form_class = ChangePasswordForm
|
|
success_url = reverse_lazy("password_change")
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context["tab"] = "security"
|
|
context["active_block"] = "password"
|
|
return context
|
|
|
|
def get_form_kwargs(self):
|
|
kw = super().get_form_kwargs()
|
|
kw["request"] = self.request
|
|
return kw
|
|
|
|
def form_valid(self, form):
|
|
new_password = form.cleaned_data["new_password"]
|
|
user = self.request.user
|
|
user.set_password(new_password)
|
|
user.save()
|
|
return super().form_valid(form)
|
|
|
|
|
|
class DeleteAccountView(LoginRequiredMixin, FormView):
|
|
template_name = "neluser/settings/security/delete_account.html"
|
|
form_class = DeleteAccountForm
|
|
success_url = reverse_lazy("delete_account")
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context["tab"] = "security"
|
|
context["active_block"] = "delete_account"
|
|
return context
|
|
|
|
def get_form_kwargs(self):
|
|
kw = super().get_form_kwargs()
|
|
kw["request"] = self.request
|
|
return kw
|
|
|
|
def form_valid(self, form):
|
|
self.request.user.delete()
|
|
logout(self.request)
|
|
messages.info(self.request, _("Your account has been deleted."))
|
|
return super().form_valid(form)
|
|
|
|
|
|
def send_activation_email(request, user):
|
|
current_site = get_current_site(request)
|
|
context = {
|
|
"email": user.email,
|
|
"domain": current_site.domain,
|
|
"site_name": current_site.name,
|
|
"uid": urlsafe_base64_encode(force_bytes(user.pk)),
|
|
"user": user,
|
|
"token": default_token_generator.make_token(user),
|
|
"protocol": "https" if request.is_secure() else "http",
|
|
}
|
|
subject = render_to_string("neluser/activate_email_subject.txt", context)
|
|
subject = "".join(subject.splitlines())
|
|
email_message = EmailMultiAlternatives(
|
|
subject,
|
|
render_to_string("neluser/activate_email.txt", context),
|
|
settings.DEFAULT_FROM_EMAIL,
|
|
[user.email],
|
|
)
|
|
email_message.attach_alternative(
|
|
render_to_string("neluser/activate_email.html", context), "text/html"
|
|
)
|
|
email_message.send()
|
|
|
|
|
|
def activate(request, uidb64, token):
|
|
uid = urlsafe_base64_decode(uidb64).decode()
|
|
user = get_object_or_404(NelUser, pk=uid)
|
|
if default_token_generator.check_token(user, token):
|
|
user.is_active = True
|
|
user.save()
|
|
return render(request, "neluser/activate_done.html")
|
|
raise Http404("Unable to activate user %d with token %s." % (uid, token))
|
|
|
|
|
|
def register(request):
|
|
if request.method == "GET":
|
|
form = RegistrationForm()
|
|
elif request.method == "POST":
|
|
form = RegistrationForm(data=request.POST)
|
|
if form.is_valid():
|
|
user = form.save(commit=False)
|
|
user.set_password(form.cleaned_data.get("password1"))
|
|
user.is_active = not settings.REGISTER_REQUIRE_VALIDATION
|
|
user.save()
|
|
if settings.REGISTER_REQUIRE_VALIDATION:
|
|
send_activation_email(request, user)
|
|
return render(request, "neluser/register_done.html")
|
|
return render(request, "neluser/register.html", {"form": form})
|