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})