Select Git revision
Bryan BRANCOTTE authored
Adding ability to group preferences, and to add a description in each generated tab, only compatible with BS4
views.py 6.67 KiB
import logging
from django import forms
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import update_session_auth_hash, authenticate, login, get_user_model
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import PasswordChangeForm
from django.core.mail import send_mail
from django.db.models import ProtectedError
from django.forms import widgets
from django.http import HttpResponseForbidden
from django.shortcuts import render, redirect
from django.template import TemplateDoesNotExist
from django.utils.translation import ugettext
from basetheme_bootstrap import user_preferences
from basetheme_bootstrap.forms import UserCreationFormWithMore, \
MyUserChangeForm, UserDeleteForm
logger = logging.getLogger(__name__)
def about_page(request):
context = {}
try:
return render(request, settings.BASETHEME_BOOTSTRAP_TEMPLATE_LOCATION_PROJECT + '/about.html')
except TemplateDoesNotExist:
return render(request, 'basetheme_bootstrap/about.example.html')
@login_required
def change_password(request):
if request.method == 'POST':
form = PasswordChangeForm(request.user, request.POST)
if form.is_valid():
user = form.save()
update_session_auth_hash(request, user) # Important!
messages.success(request, 'Your password was successfully updated!')
return redirect('basetheme_bootstrap:account')
else:
messages.error(request, 'Please correct the error below.')
else:
form = PasswordChangeForm(request.user)
return render(request, 'registration/small_form_host.html', {
'title': ugettext('Change password'),
'submit_text': ugettext('Save changes'),
'form': form
})
def signup(request):
if request.method == 'POST':
form = UserCreationFormWithMore(request.POST)
if form.is_valid():
user = form.save()
if get_user_model().objects.filter(pk__gt=1).count() == 0:
user.is_superuser = True
user.is_staff = True
user.save()
username = user.username
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
request.user = user
try:
send_mail(
subject=ugettext('Account successfully created'),
message=ugettext(
'Dear %(first_name)s %(last_name)s\n\n'
'Your account have successfully been created on %(joined)s.\n\nBest regards') % dict(
first_name=request.user.first_name,
last_name=request.user.last_name,
joined=str(request.user.date_joined),
),
from_email=settings.DEFAULT_FROM_EMAIL,
recipient_list=[request.user.email],
fail_silently=False,
)
except Exception as e:
logging.exception("Sending email to user %i failed" % user.pk)
login(request, user)
return redirect('home')
else:
if not request.user.is_anonymous:
return HttpResponseForbidden()
form = UserCreationFormWithMore()
return render(request, 'registration/signup.html', {'form': form})
def user_update(request):
if request.method == 'POST':
form = MyUserChangeForm(instance=request.user, data=request.POST)
if form.is_valid():
user = form.save()
update_session_auth_hash(request, user) # Important!
messages.success(request, 'Your account was successfully updated!')
return redirect('basetheme_bootstrap:account')
else:
messages.error(request, 'Please correct the error below.')
else:
form = MyUserChangeForm(instance=request.user)
return render(request, 'registration/small_form_host.html', {
'title': ugettext('Update account'),
'submit_text': ugettext('Save changes'),
'form': form,
'medium_width': True,
})
def user_delete(request):
if request.method == 'POST':
form = UserDeleteForm(instance=request.user, data=request.POST)
if form.is_valid():
try:
user = form.save()
user.delete()
update_session_auth_hash(request, user) # Important!
messages.success(request, 'Your account was successfully deleted!')
return redirect('/')
except ProtectedError as e:
messages.error(request, ugettext("Some data remaining in the system prevent the deletion of your "
"account. Please either remove these data, or contact the "
"administrator to solve the issue.\nMessage:\n" + str(e)))
except Exception as e:
messages.error(request, e)
else:
form = UserDeleteForm(instance=request.user)
return render(request, 'registration/small_form_host.html', {
'title': ugettext('Account deletion'),
'submit_text': ugettext('Delete account and all related data'),
'form': form,
'medium_width': True,
'btn_classes': 'btn-lg btn-danger text-center',
'btn_container_classes': 'text-center',
})
@login_required
def account_detail(request):
klass = user_preferences.get_user_preference_class()
if klass is None:
form_prefs = None
else:
is_posted = request.method == 'POST'
pref = klass.get_for_user(user=request.user)
form_prefs = forms.modelform_factory(
klass,
fields=list(klass.get_allowed_fields()),
)(instance=pref, data=request.POST if is_posted else None)
if is_posted and form_prefs.is_valid():
form_prefs.save()
form_prefs = forms.modelform_factory(
klass,
fields=list(klass.get_allowed_fields()),
)(instance=klass.get_for_user(user=request.user))
# dirty patch for time field (don't know why django doesn't express the correct type by default)
for f in form_prefs.fields.values():
if isinstance(f.widget, widgets.TimeInput):
f.widget.input_type = 'time'
form_prefs.preferences_groups = getattr(pref, "preferences_groups", None)
form_prefs.preferences_groups_descriptions = getattr(pref, "preferences_groups_descriptions", None)
return render(request, 'registration/account.html', {
'form_prefs': form_prefs,
'btn_classes': 'pull-right float-right'
})