khaganat-web/neluser/views.py

138 lines
4.7 KiB
Python
Raw Normal View History

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
2018-01-27 20:06:40 +00:00
@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)
2018-02-04 11:29:25 +00:00
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,
2018-02-04 10:43:47 +00:00
'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})