Skip to content
Snippets Groups Projects
Select Git revision
  • b1837f8c9af59f01a0e15117b152db11fbcdf5cf
  • master default protected
  • exponential-backoff-login
  • v1.10.0
  • v1.9.2
  • v1.9.0
  • v1.8.8
  • v1.8.7
  • v1.8.5
  • v1.8.4
  • v1.8.2
  • v1.8
  • v1.7
  • v1.6
  • v1.5
  • v1.4
  • v1.3
  • v1.2
  • v1.1
  • v1.0.1
  • v1.0
  • v0.2.80
  • v0.2.79
23 results

views.py

Blame
  • Bryan Brancotte's avatar
    Bryan BRANCOTTE authored
    Adding ability to group preferences, and to add a description in each generated tab, only compatible with BS4
    842d8cf9
    History
    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'
        })