Create new events

This commit is contained in:
Raphael Michel
2015-05-27 23:09:33 +02:00
parent 79dfe7a084
commit 3ac26f64f3
10 changed files with 185 additions and 16 deletions

View File

@@ -297,9 +297,19 @@ class Organizer(Versionable):
name = models.CharField(max_length=200, name = models.CharField(max_length=200,
verbose_name=_("Name")) verbose_name=_("Name"))
slug = models.SlugField(max_length=50, slug = models.SlugField(
db_index=True, max_length=50, db_index=True,
verbose_name=_("Slug")) help_text=_(
"Should be short, only contain lowercase letters and numbers, and must be unique among your events. "
+ "This is being used in addresses and bank transfer references."),
validators=[
RegexValidator(
regex="^[a-zA-Z0-9.-]+$",
message=_("The slug may only contain letters, numbers, dots and dashes."),
)
],
verbose_name=_("Slug"),
)
permitted = models.ManyToManyField(User, through='OrganizerPermission', permitted = models.ManyToManyField(User, through='OrganizerPermission',
related_name="organizers") related_name="organizers")

View File

@@ -3,11 +3,6 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% block inside %} {% block inside %}
<form action="" method="post" class="form-horizontal"> <form action="" method="post" class="form-horizontal">
{% if "success" in request.GET %}
<div class="alert alert-success">
{% trans "Your changes have been saved." %}
</div>
{% endif %}
{% csrf_token %} {% csrf_token %}
<fieldset> <fieldset>
<legend>{% trans "General information" %}</legend> <legend>{% trans "General information" %}</legend>

View File

@@ -0,0 +1,33 @@
{% extends "pretixcontrol/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block title %}{% trans "Create a new event" %}{% endblock %}
{% block content %}
<h1>{% trans "Create a new event" %}</h1>
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
<fieldset>
<legend>{% trans "General information" %}</legend>
{% bootstrap_field form.name layout="horizontal" %}
{% bootstrap_field form.slug layout="horizontal" %}
{% bootstrap_field form.date_from layout="horizontal" %}
{% bootstrap_field form.date_to layout="horizontal" %}
{% bootstrap_field form.currency layout="horizontal" %}
</fieldset>
<fieldset>
<legend>{% trans "Timeline" %}</legend>
{% bootstrap_field form.presale_start layout="horizontal" %}
{% bootstrap_field form.presale_end layout="horizontal" %}
</fieldset>
<p>
{% blocktrans trimmed %}
You will be able to adjust further settings in the next step.
{% endblocktrans %}
</p>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form>
{% endblock %}

View File

@@ -4,6 +4,10 @@
{% block content %} {% block content %}
<h1>{% trans "Events" %}</h1> <h1>{% trans "Events" %}</h1>
<p>{% trans "The list below shows all events you have administrative access to. Click on the event name to access event details." %}</p> <p>{% trans "The list below shows all events you have administrative access to. Click on the event name to access event details." %}</p>
<a href="{% url "control:events.add" %}" class="btn btn-default">
<span class="fa fa-plus"></span>
{% trans "Create a new event" %}
</a>
<table class="table table-condensed table-hover"> <table class="table table-condensed table-hover">
<thead> <thead>
<tr> <tr>

View File

@@ -0,0 +1,30 @@
{% extends "pretixcontrol/base.html" %}
{% load i18n %}
{% block title %}{% trans "Create a new event" %}{% endblock %}
{% block content %}
<h1>{% trans "Create a new event" %}</h1>
{% if organizers|length == 0 %}
<div class="alert alert-info">
{% trans "You are not permitted to create new events in the name of any organizer." %}
</div>
{% else %}
<p>{% trans "Please choose the organizer of this event from the list below." %}</p>
<table class="table table-condensed table-hover">
<thead>
<tr>
<th>{% trans "Organizer name" %}</th>
</tr>
</thead>
<tbody>
{% for o in organizers %}
<tr>
<td><strong>
<a href="{% url "control:events.create" organizer=o.slug %}">{{ o.name }}</a>
</strong></td>
</tr>
{% endfor %}
</tbody>
</table>
{% include "pretixcontrol/pagination.html" %}
{% endif %}
{% endblock %}

View File

@@ -1,9 +1,9 @@
{% extends "pretixcontrol/base.html" %} {% extends "pretixcontrol/base.html" %}
{% load i18n %} {% load i18n %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% block title %}{% trans "Create Organizer" %}{% endblock %} {% block title %}{% trans "Create a new organizer" %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans "Create Organizer" %}</h1> <h1>{% trans "Create a new organizer" %}</h1>
<form action="" method="post" class="form-horizontal"> <form action="" method="post" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
<fieldset> <fieldset>

View File

@@ -12,6 +12,8 @@ urlpatterns = [
url(r'^organizers/add$', organizer.OrganizerCreate.as_view(), name='organizers.add'), url(r'^organizers/add$', organizer.OrganizerCreate.as_view(), name='organizers.add'),
url(r'^organizer/(?P<organizer>[^/]+)/edit$', organizer.OrganizerUpdate.as_view(), name='organizer.edit'), url(r'^organizer/(?P<organizer>[^/]+)/edit$', organizer.OrganizerUpdate.as_view(), name='organizer.edit'),
url(r'^events/$', main.EventList.as_view(), name='events'), url(r'^events/$', main.EventList.as_view(), name='events'),
url(r'^events/add$', main.EventCreateStart.as_view(), name='events.add'),
url(r'^event/(?P<organizer>[^/]+)/add', main.EventCreate.as_view(), name='events.create'),
url(r'^event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/', include([ url(r'^event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/', include([
url(r'^$', event.index, name='event.index'), url(r'^$', event.index, name='event.index'),
url(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'), url(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'),

View File

@@ -1,5 +1,6 @@
from collections import OrderedDict from collections import OrderedDict
from django.conf import settings from django.conf import settings
from django.contrib import messages
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.views.generic import FormView from django.views.generic import FormView
@@ -156,13 +157,14 @@ class EventUpdate(EventPermissionRequiredMixin, UpdateView):
def form_valid(self, form): def form_valid(self, form):
self.sform.save() self.sform.save()
messages.success(self.request, _('Your changes have been saved.'))
return super().form_valid(form) return super().form_valid(form)
def get_success_url(self) -> str: def get_success_url(self) -> str:
return reverse('control:event.settings', kwargs={ return reverse('control:event.settings', kwargs={
'organizer': self.object.organizer.slug, 'organizer': self.object.organizer.slug,
'event': self.object.slug, 'event': self.object.slug,
}) + '?success=true' })
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
form = self.get_form() form = self.get_form()

View File

@@ -1,7 +1,13 @@
from django import forms
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.shortcuts import render from django.shortcuts import render
from django.views.generic import ListView from django.views.generic import ListView, CreateView, TemplateView
from django.utils.translation import ugettext_lazy as _
from pretix.base.forms import VersionedModelForm
from pretix.base.models import Event from pretix.base.models import Event, EventPermission, Organizer, OrganizerPermission
from pretix.control.permissions import OrganizerPermissionRequiredMixin
class EventList(ListView): class EventList(ListView):
@@ -20,3 +26,79 @@ class EventList(ListView):
def index(request): def index(request):
return render(request, 'pretixcontrol/base.html', {}) return render(request, 'pretixcontrol/base.html', {})
class EventForm(VersionedModelForm):
error_messages = {
'duplicate_slug': _("You already used this slug for a different event. Please choose a new one."),
}
class Meta:
model = Event
fields = [
'name',
'slug',
'currency',
'date_from',
'date_to',
'presale_start',
'presale_end'
]
def __init__(self, *args, **kwargs):
self.organizer = kwargs.pop('organizer')
super().__init__(*args, **kwargs)
def clean_slug(self):
slug = self.cleaned_data['slug']
if Event.objects.filter(slug=slug, organizer=self.organizer).exists():
raise forms.ValidationError(
self.error_messages['duplicate_slug'],
code='duplicate_slug',
)
return slug
class EventCreateStart(TemplateView):
template_name = 'pretixcontrol/events/start.html'
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['organizers'] = [
p.organizer for p in OrganizerPermission.objects.current.filter(
user=self.request.user, can_create_events=True
).select_related("organizer")
]
return ctx
class EventCreate(OrganizerPermissionRequiredMixin, CreateView):
model = Event
form_class = EventForm
template_name = 'pretixcontrol/events/create.html'
context_object_name = 'event'
permission = 'can_create_events'
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['organizer'] = self.request.organizer
return kwargs
def form_valid(self, form):
messages.success(self.request, _('The new event has been created.'))
form.instance.organizer = self.request.organizer
ret = super().form_valid(form)
EventPermission.objects.create(
event=form.instance, user=self.request.user,
)
self.object = form.instance
return ret
def get_success_url(self) -> str:
return reverse('control:event.settings', kwargs={
'organizer': self.request.organizer.slug,
'event': self.object.slug,
})

View File

@@ -1,3 +1,4 @@
from django import forms
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import HttpResponseForbidden from django.http import HttpResponseForbidden
@@ -25,10 +26,23 @@ class OrganizerList(ListView):
class OrganizerForm(VersionedModelForm): class OrganizerForm(VersionedModelForm):
error_messages = {
'duplicate_slug': _("This slug is already in use. Please choose a different one."),
}
class Meta: class Meta:
model = Organizer model = Organizer
fields = ['name', 'slug'] fields = ['name', 'slug']
def clean_slug(self):
slug = self.cleaned_data['slug']
if Organizer.objects.filter(slug=slug).exists():
raise forms.ValidationError(
self.error_messages['duplicate_slug'],
code='duplicate_slug',
)
return slug
class OrganizerUpdateForm(OrganizerForm): class OrganizerUpdateForm(OrganizerForm):
@@ -71,9 +85,6 @@ class OrganizerCreate(CreateView):
return HttpResponseForbidden() # TODO return HttpResponseForbidden() # TODO
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def get_object(self, queryset=None) -> Organizer:
return self.request.organizer
def form_valid(self, form): def form_valid(self, form):
messages.success(self.request, _('The new organizer has been created.')) messages.success(self.request, _('The new organizer has been created.'))
ret = super().form_valid(form) ret = super().form_valid(form)