forked from CGM_Public/pretix_original
Merge branch 'master' of github.com:pretix/pretix
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user