Merge branch 'master' of github.com:pretix/pretix

This commit is contained in:
Raphael Michel
2015-06-16 19:40:10 +02:00
33 changed files with 1299 additions and 716 deletions

View File

@@ -1,47 +1,9 @@
from django.conf import settings
from django.shortcuts import render, redirect
from django.contrib.auth.forms import AuthenticationForm as BaseAuthenticationForm
from django import forms
from django.utils.translation import ugettext as _
from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login
from django.contrib.auth import login as auth_login, authenticate
from django.contrib.auth import logout as auth_logout
class AuthenticationForm(BaseAuthenticationForm):
"""
The login form, providing an email and password field. The form already implements
validation for correct user data.
"""
email = forms.EmailField(label=_("E-mail address"), max_length=254)
password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
username = None
error_messages = {
'invalid_login': _("Please enter a correct e-mail address and password."),
'inactive': _("This account is inactive."),
}
def __init__(self, request=None, *args, **kwargs):
self.request = request
self.user_cache = None
super(forms.Form, self).__init__(*args, **kwargs)
def clean(self):
email = self.cleaned_data.get('email')
password = self.cleaned_data.get('password')
if email and password:
self.user_cache = authenticate(identifier=email.lower(),
password=password)
if self.user_cache is None:
raise forms.ValidationError(
self.error_messages['invalid_login'],
code='invalid_login',
)
else:
self.confirm_login_allowed(self.user_cache)
return self.cleaned_data
from pretix.base.models import User
from pretix.control.forms.auth import AuthenticationForm, GlobalRegistrationForm
def login(request):
@@ -73,3 +35,29 @@ def logout(request):
"""
auth_logout(request)
return redirect('control:auth.login')
def register(request):
"""
Render and process a basic registration form.
"""
ctx = {}
if request.user.is_authenticated():
if "next" in request.GET:
return redirect(request.GET.get("next", 'control:index'))
return redirect('control:index')
if request.method == 'POST':
form = GlobalRegistrationForm(data=request.POST)
if form.is_valid():
user = User.objects.create_global_user(
form.cleaned_data['email'], form.cleaned_data['password'],
locale=request.LANGUAGE_CODE,
timezone=request.timezone if hasattr(request, 'timezone') else settings.TIME_ZONE
)
user = authenticate(identifier=user.identifier, password=form.cleaned_data['password'])
auth_login(request, user)
return redirect('control:index')
else:
form = GlobalRegistrationForm()
ctx['form'] = form
return render(request, 'pretixcontrol/auth/register.html', ctx)

View File

@@ -1,6 +1,9 @@
from collections import OrderedDict
from django import forms
from django.contrib import messages
from django.db.models import Sum
from django.forms import inlineformset_factory, formset_factory, modelformset_factory, BaseInlineFormSet
from django.shortcuts import render, redirect
from django.utils.functional import cached_property
from django.views.generic import FormView
@@ -8,8 +11,9 @@ from django.views.generic.base import TemplateView
from django.views.generic.detail import SingleObjectMixin
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from pretix.base.forms import VersionedModelForm
from pretix.control.forms.event import ProviderForm, TicketSettingsForm, EventSettingsForm, EventUpdateForm
from pretix.base.models import Event
from pretix.base.models import Event, OrderPosition, Order, Item, EventPermission, User
from pretix.base.signals import register_payment_providers, register_ticket_outputs
from pretix.control.permissions import EventPermissionRequiredMixin
from . import UpdateView
@@ -94,13 +98,14 @@ class EventPlugins(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin
plugins_active.remove(module)
self.object.plugins = ",".join(plugins_active)
self.object.save()
messages.success(self.request, _('Your changes have been saved.'))
return redirect(self.get_success_url())
def get_success_url(self) -> str:
return reverse('control:event.settings.plugins', kwargs={
'organizer': self.get_object().organizer.slug,
'event': self.get_object().slug,
}) + '?success=true'
})
class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin):
@@ -153,6 +158,7 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi
else:
success = False
if success:
messages.success(self.request, _('Your changes have been saved.'))
return redirect(self.get_success_url())
else:
return self.get(request)
@@ -161,7 +167,7 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi
return reverse('control:event.settings.payment', kwargs={
'organizer': self.get_object().organizer.slug,
'event': self.get_object().slug,
}) + '?success=true'
})
class TicketSettings(EventPermissionRequiredMixin, FormView):
@@ -170,10 +176,6 @@ class TicketSettings(EventPermissionRequiredMixin, FormView):
template_name = 'pretixcontrol/event/tickets.html'
permission = 'can_change_settings'
def form_valid(self, form):
form.save()
return super().form_valid(form)
def get_context_data(self, *args, **kwargs) -> dict:
context = super().get_context_data(*args, **kwargs)
context['providers'] = self.provider_forms
@@ -183,7 +185,7 @@ class TicketSettings(EventPermissionRequiredMixin, FormView):
return reverse('control:event.settings.tickets', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug
}) + '?success=true'
})
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
@@ -204,6 +206,8 @@ class TicketSettings(EventPermissionRequiredMixin, FormView):
success = False
form = self.get_form(self.get_form_class())
if success and form.is_valid():
form.save()
messages.success(self.request, _('Your changes have been saved.'))
return redirect(self.get_success_url())
else:
return self.get(request)
@@ -232,4 +236,101 @@ class TicketSettings(EventPermissionRequiredMixin, FormView):
def index(request, organizer, event):
return render(request, 'pretixcontrol/event/index.html', {})
ctx = {
'products_active': Item.objects.current.filter(
event=request.event,
active=True,
).count(),
'tickets_total': OrderPosition.objects.current.filter(
order__event=request.event,
item__admission=True
).count(),
'tickets_revenue': Order.objects.current.filter(
event=request.event,
status=Order.STATUS_PAID,
).aggregate(sum=Sum('total'))['sum'],
'tickets_sold': OrderPosition.objects.current.filter(
order__event=request.event,
order__status=Order.STATUS_PAID,
item__admission=True
).count()
}
return render(request, 'pretixcontrol/event/index.html', ctx)
class EventPermissionForm(VersionedModelForm):
class Meta:
model = EventPermission
fields = (
'can_change_settings', 'can_change_items', 'can_change_permissions', 'can_view_orders',
'can_change_orders'
)
class EventPermissionCreateForm(EventPermissionForm):
user = forms.EmailField(required=False, label=_('User'))
class EventPermissions(EventPermissionRequiredMixin, TemplateView):
model = Event
form_class = TicketSettingsForm
template_name = 'pretixcontrol/event/permissions.html'
permission = 'can_change_permissions'
@cached_property
def formset(self):
fs = modelformset_factory(
EventPermission,
form=EventPermissionForm,
can_delete=True, can_order=False, extra=0
)
return fs(data=self.request.POST if self.request.method == "POST" else None,
prefix="formset",
queryset=EventPermission.objects.current.filter(event=self.request.event))
@cached_property
def add_form(self):
return EventPermissionCreateForm(data=self.request.POST if self.request.method == "POST" else None,
prefix="add")
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['formset'] = self.formset
ctx['add_form'] = self.add_form
return ctx
def post(self, *args, **kwargs):
if self.formset.is_valid() and self.add_form.is_valid():
if self.add_form.has_changed():
try:
self.add_form.instance.user = User.objects.get(identifier=self.add_form.cleaned_data['user'])
self.add_form.instance.user_id = self.add_form.instance.user.id
self.add_form.instance.event = self.request.event
self.add_form.instance.event_id = self.request.event.identity
except User.DoesNotExist:
messages.error(self.request, _('There is no user with the email address you entered.'))
return self.get(*args, **kwargs)
else:
if EventPermission.objects.current.filter(user=self.add_form.instance.user,
event=self.request.event).exists():
messages.error(self.request, _('This user already has permissions for this event.'))
return self.get(*args, **kwargs)
self.add_form.save()
for form in self.formset.forms:
if form.instance.user_id == self.request.user.pk:
if not form.cleaned_data['can_change_permissions'] or form in self.formset.deleted_forms:
messages.error(self.request, _('You cannot remove your own permission to view this page.'))
return self.get(*args, **kwargs)
self.formset.save()
messages.success(self.request, _('Your changes have been saved.'))
return redirect(self.get_success_url())
else:
messages.error(self.request, _('Your changes could not be saved.'))
return self.get(*args, **kwargs)
def get_success_url(self) -> str:
return reverse('control:event.settings.permissions', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug
})

View File

@@ -24,7 +24,7 @@ class EventList(ListView):
def index(request):
return render(request, 'pretixcontrol/base.html', {})
return render(request, 'pretixcontrol/dashboard.html', {})
class EventCreateStart(TemplateView):

View File

@@ -8,7 +8,7 @@ from django.http import HttpResponse
from django.shortcuts import redirect, render
from django.utils.functional import cached_property
from django.views.generic import ListView, DetailView, TemplateView
from pretix.base.models import Order, Quota, OrderPosition
from pretix.base.models import Order, Quota, OrderPosition, ItemCategory
from pretix.base.services.orders import mark_order_paid
from pretix.base.signals import register_payment_providers
from pretix.control.forms.orders import ExtendForm
@@ -258,11 +258,12 @@ class OverView(EventPermissionRequiredMixin, TemplateView):
item.num_refunded = sum(var.num_refunded for var in item.all_variations)
item.num_paid = sum(var.num_paid for var in item.all_variations)
nonecat = ItemCategory(name=_('Uncategorized'))
# Regroup those by category
ctx['items_by_category'] = sorted(
[
# a group is a tuple of a category and a list of items
(cat, [i for i in items if i.category == cat])
(cat if cat is not None else nonecat, [i for i in items if i.category == cat])
for cat in set([i.category for i in items])
# insert categories into a set for uniqueness
# a set is unsorted, so sort again by category