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 .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': request.user.nsfw_allowed, '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)).decode(), '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})