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.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: 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' return render(request, 'registration/account.html', { 'form_prefs': form_prefs, 'btn_classes': 'pull-right float-right' })