Added a settings change view for users in the frontend

This commit is contained in:
Raphael Michel
2015-06-25 20:57:02 +02:00
parent ae5eab628c
commit 11eb01a92b
11 changed files with 190 additions and 57 deletions
@@ -38,10 +38,10 @@ class VersionedBaseModelForm(BaseI18nModelForm):
clone = old.clone() clone = old.clone()
for f in type(self.instance)._meta.get_fields(): for f in type(self.instance)._meta.get_fields():
if f.name not in ( if f.name not in (
'id', 'identity', 'version_start_date', 'version_end_date', 'id', 'identity', 'version_start_date', 'version_end_date',
'version_birth_date' 'version_birth_date'
) and not isinstance(f, ( ) and not isinstance(f, (
models.ManyToOneRel, models.ManyToManyRel, models.ManyToManyField models.ManyToOneRel, models.ManyToManyRel, models.ManyToManyField
)): )):
setattr(clone, f.name, getattr(new, f.name)) setattr(clone, f.name, getattr(new, f.name))
self.instance = clone self.instance = clone
@@ -29,15 +29,19 @@ class UserSettingsForm(forms.ModelForm):
required=False, required=False,
label=_("Repeat new password"), label=_("Repeat new password"),
widget=forms.PasswordInput()) widget=forms.PasswordInput())
timezone = forms.ChoiceField( # timezone = forms.ChoiceField(
choices=((a, a) for a in common_timezones), # choices=((a, a) for a in common_timezones),
label=_("Default timezone"), # label=_("Default timezone"),
) # )
class Meta: class Meta:
model = User model = User
fields = [ fields = [
'givenname', 'familyname', 'locale', 'timezone', 'email' 'givenname',
'familyname',
'locale',
# 'timezone',
'email'
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -12,7 +12,6 @@
{% bootstrap_field form.givenname layout='horizontal' %} {% bootstrap_field form.givenname layout='horizontal' %}
{% bootstrap_field form.familyname layout='horizontal' %} {% bootstrap_field form.familyname layout='horizontal' %}
{% bootstrap_field form.locale layout='horizontal' %} {% bootstrap_field form.locale layout='horizontal' %}
{% bootstrap_field form.timezone layout='horizontal' %}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{% trans "Login settings" %}</legend> <legend>{% trans "Login settings" %}</legend>
+1 -1
View File
@@ -3,7 +3,7 @@ from django.contrib.auth import update_session_auth_hash
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.views.generic import UpdateView from django.views.generic import UpdateView
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from pretix.control.forms.user import UserSettingsForm from pretix.base.forms.user import UserSettingsForm
from pretix.base.models import User from pretix.base.models import User
@@ -34,4 +34,11 @@ footer {
img { img {
vertical-align: baseline; vertical-align: baseline;
} }
}
.huge {
font-size: 40px;
}
a:hover .panel-primary > .panel-heading {
background-color: darken(@btn-primary-bg, 10%);
border-color: darken(@btn-primary-border, 12%);
} }
@@ -0,0 +1,58 @@
{% extends "pretixpresale/event/base.html" %}
{% load i18n %}
{% block title %}{% trans "Your account" %}{% endblock %}
{% block content %}
<h2>{% trans "Welcome back!" %}</h2>
<div class="row">
<div class="col-md-6">
{% if orders %}
<a href="{% url "presale:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-shopping-cart fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">{% trans "Your orders" %}</div>
</div>
</div>
</div>
</div>
</a>
{% else %}
<a href="{% url "presale:event.index" event=request.event.slug organizer=request.event.organizer.slug %}">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-shopping-cart fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">{% trans "Place new order" %}</div>
</div>
</div>
</div>
</div>
</a>
{% endif %}
</div>
<div class="col-md-6">
<a href="{% url "presale:event.account.settings" event=request.event.slug organizer=request.event.organizer.slug %}">
<div class="panel panel-primary">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-wrench fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">{% trans "Your settings" %}</div>
</div>
</div>
</div>
</div>
</a>
</div>
</div>
{% endblock %}
@@ -0,0 +1,33 @@
{% extends "pretixpresale/event/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block title %}{% trans "Account settings" %}{% endblock %}
{% block content %}
<h2>{% trans "Account settings" %}</h2>
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_form_errors form %}
<fieldset>
<legend>{% trans "General settings" %}</legend>
{% bootstrap_field form.givenname layout='horizontal' %}
{% bootstrap_field form.familyname layout='horizontal' %}
{% bootstrap_field form.locale layout='horizontal' %}
</fieldset>
<fieldset>
<legend>{% trans "Login settings" %}</legend>
{% bootstrap_field form.old_pw layout='horizontal' %}
{% bootstrap_field form.email layout='horizontal' %}
{% bootstrap_field form.new_pw layout='horizontal' %}
{% bootstrap_field form.new_pw_repeat layout='horizontal' %}
</fieldset>
<div class="row checkout-button-row">
<div class="col-md-4 col-md-offset-8">
<button class="btn btn-block btn-primary btn-lg" type="submit">
{% trans "Save" %}
</button>
</div>
<div class="clearfix"></div>
</div>
</form>
{% endblock %}
@@ -20,7 +20,7 @@
<div class="container event"> <div class="container event">
<div class="page-header"> <div class="page-header">
<h1 class="pull-left"> <h1 class="pull-left">
{{ event.name }} <a href="{% url "presale:event.index" event=event.slug organizer=event.organizer.slug %}">{{ event.name }}</a>
<small>{{ event.date_from|date:"DATE_FORMAT" }}{% if event.settings.show_date_to %} {{ event.date_to|date:"DATE_FORMAT" }}{% endif %}</small> <small>{{ event.date_from|date:"DATE_FORMAT" }}{% if event.settings.show_date_to %} {{ event.date_to|date:"DATE_FORMAT" }}{% endif %}</small>
</h1> </h1>
<div class="pull-right loginbox"> <div class="pull-right loginbox">
@@ -39,8 +39,8 @@
{% blocktrans trimmed with name=request.user.get_short_name %} {% blocktrans trimmed with name=request.user.get_short_name %}
Hello, {{ name }}! Hello, {{ name }}!
{% endblocktrans %} &middot; {% endblocktrans %} &middot;
<a href="{% url "presale:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}"> <a href="{% url "presale:event.account" event=request.event.slug organizer=request.event.organizer.slug %}">
{% trans "My orders" %}</a> &middot; {% trans "Your account" %}</a> &middot;
<a href="{% url "presale:event.logout" event=request.event.slug organizer=request.event.organizer.slug %}"> <a href="{% url "presale:event.logout" event=request.event.slug organizer=request.event.organizer.slug %}">
{% trans "Logout" %}</a> {% trans "Logout" %}</a>
{% else %} {% else %}
@@ -3,45 +3,38 @@
{% block title %}{% trans "Your orders" %}{% endblock %} {% block title %}{% trans "Your orders" %}{% endblock %}
{% block content %} {% block content %}
<h2>{% trans "Welcome back!" %}</h2> <h2>{% trans "Your orders" %}</h2>
<div class="panel panel-primary"> <table class="table">
<div class="panel-heading"> <thead>
<h3 class="panel-title">{% trans "Your orders" %}</h3> <th>{% trans "Order code" %}</th>
</div> <th>{% trans "Date" %}</th>
<div class="panel-body"> <th>{% trans "Total" %}</th>
<table class="table"> <th>{% trans "Status" %}</th>
<thead> <th></th>
<th>{% trans "Order code" %}</th> </thead>
<th>{% trans "Date" %}</th> <tbody>
<th>{% trans "Total" %}</th> {% for order in orders %}
<th>{% trans "Status" %}</th> <tr>
<th></th> <td>{{ order.code }}</td>
</thead> <td>{{ order.datetime|date:"SHORT_DATE_FORMAT" }}</td>
<tbody> <td>{{ event.currency }} {{ order.total|floatformat:2 }}</td>
{% for order in orders %} <td>{% include "pretixpresale/event/fragment_order_status.html" with order=order %}</td>
<tr> <td><a href="{% url "presale:event.order" event=request.event.slug organizer=request.event.organizer.slug order=order.code %}">
<td>{{ order.code }}</td> {% trans "View details" %}
<td>{{ order.datetime|date:"SHORT_DATE_FORMAT" }}</td> </a></td>
<td>{{ event.currency }} {{ order.total|floatformat:2 }}</td> </tr>
<td>{% include "pretixpresale/event/fragment_order_status.html" with order=order %}</td> {% empty %}
<td><a href="{% url "presale:event.order" event=request.event.slug organizer=request.event.organizer.slug order=order.code %}"> <tr>
{% trans "View details" %} <td colspan="5">
</a></td> <em>{% trans "You did not yet place any orders." %}</em>
</tr> </td>
{% empty %} </tr>
<tr> {% endfor %}
<td colspan="5"> </tbody>
<em>{% trans "You did not yet place any orders." %}</em> </table>
</td> <a href="{% url "presale:event.index" event=request.event.slug organizer=request.event.organizer.slug %}"
</tr> class="btn btn-primary btn-lg">
{% endfor %} <span class="fa fa-plus"></span>
</tbody> {% trans "Place new order" %}
</table> </a>
<a href="{% url "presale:event.index" event=request.event.slug organizer=request.event.organizer.slug %}"
class="btn btn-primary btn-lg">
<span class="fa fa-plus"></span>
{% trans "Place new order" %}
</a>
</div>
</div>
{% endblock %} {% endblock %}
+2
View File
@@ -34,6 +34,8 @@ urlpatterns = [
url(r'^forgot/recover$', pretix.presale.views.event.EventRecover.as_view(), name='event.forgot.recover'), url(r'^forgot/recover$', pretix.presale.views.event.EventRecover.as_view(), name='event.forgot.recover'),
url(r'^logout$', pretix.presale.views.event.EventLogout.as_view(), name='event.logout'), url(r'^logout$', pretix.presale.views.event.EventLogout.as_view(), name='event.logout'),
url(r'^orders$', pretix.presale.views.event.EventOrders.as_view(), name='event.orders'), url(r'^orders$', pretix.presale.views.event.EventOrders.as_view(), name='event.orders'),
url(r'^account$', pretix.presale.views.event.EventAccount.as_view(), name='event.account'),
url(r'^account/settings$', pretix.presale.views.event.EventAccountSettings.as_view(), name='event.account.settings'),
])), ])),
url(r'^locale/set$', pretix.presale.views.locale.LocaleSet.as_view(), name='locale.set'), url(r'^locale/set$', pretix.presale.views.locale.LocaleSet.as_view(), name='locale.set'),
] ]
+40 -3
View File
@@ -1,7 +1,7 @@
import json import json
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import authenticate, logout from django.contrib.auth import authenticate, logout, update_session_auth_hash
from django.core import signing from django.core import signing
from django.core.signing import SignatureExpired, BadSignature from django.core.signing import SignatureExpired, BadSignature
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
@@ -9,9 +9,10 @@ from django.db.models import Count
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.contrib.auth import login from django.contrib.auth import login
from django.views.generic import TemplateView, View from django.views.generic import TemplateView, View, UpdateView
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.conf import settings from django.conf import settings
from pretix.base.forms.user import UserSettingsForm
from pretix.base.services.mail import mail from pretix.base.services.mail import mail
from pretix.base.models import User from pretix.base.models import User
from pretix.helpers.urls import build_absolute_uri from pretix.helpers.urls import build_absolute_uri
@@ -89,7 +90,7 @@ class EventLogin(EventViewMixin, TemplateView):
if 'next' in self.request.GET: if 'next' in self.request.GET:
return redirect(self.request.GET.get('next')) return redirect(self.request.GET.get('next'))
else: else:
return redirect('presale:event.orders', return redirect('presale:event.account',
organizer=self.request.event.organizer.slug, organizer=self.request.event.organizer.slug,
event=self.request.event.slug) event=self.request.event.slug)
@@ -297,6 +298,15 @@ class EventLogout(EventViewMixin, View):
event=self.request.event.slug) event=self.request.event.slug)
class EventAccount(EventLoginRequiredMixin, EventViewMixin, TemplateView):
template_name = 'pretixpresale/event/account.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['orders'] = self.request.user.orders.current.count()
return context
class EventOrders(EventLoginRequiredMixin, EventViewMixin, TemplateView): class EventOrders(EventLoginRequiredMixin, EventViewMixin, TemplateView):
template_name = 'pretixpresale/event/orders.html' template_name = 'pretixpresale/event/orders.html'
@@ -304,3 +314,30 @@ class EventOrders(EventLoginRequiredMixin, EventViewMixin, TemplateView):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['orders'] = self.request.user.orders.current.all() context['orders'] = self.request.user.orders.current.all()
return context return context
class EventAccountSettings(EventLoginRequiredMixin, EventViewMixin, UpdateView):
model = User
form_class = UserSettingsForm
template_name = 'pretixpresale/event/account_settings.html'
def get_object(self, queryset=None):
return self.request.user
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def form_invalid(self, form):
messages.error(self.request, _('Your changes could not be saved. See below for details.'))
return super().form_invalid(form)
def form_valid(self, form):
messages.success(self.request, _('Your changes have been saved.'))
sup = super().form_valid(form)
update_session_auth_hash(self.request, self.request.user)
return sup
def get_success_url(self):
return reverse('control:user.settings')