diff --git a/src/pretix/base/migrations/0060_auto_20170510_1027.py b/src/pretix/base/migrations/0060_auto_20170510_1027.py new file mode 100644 index 0000000000..23588bdca4 --- /dev/null +++ b/src/pretix/base/migrations/0060_auto_20170510_1027.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-05-10 10:27 +from __future__ import unicode_literals + +import i18nfield.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0059_checkin_nonce'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='date_admission', + field=models.DateTimeField(blank=True, null=True, verbose_name='Admission time'), + ), + migrations.AlterField( + model_name='event', + name='location', + field=i18nfield.fields.I18nTextField(blank=True, max_length=200, null=True, verbose_name='Location'), + ), + ] diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 3316418364..94e234ad77 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -13,7 +13,7 @@ from django.template.defaultfilters import date as _date from django.utils.crypto import get_random_string from django.utils.timezone import make_aware, now from django.utils.translation import ugettext_lazy as _ -from i18nfield.fields import I18nCharField +from i18nfield.fields import I18nCharField, I18nTextField from pretix.base.email import CustomSMTPBackend from pretix.base.models.base import LoggedModel @@ -85,6 +85,8 @@ class Event(LoggedModel): date_from = models.DateTimeField(verbose_name=_("Event start time")) date_to = models.DateTimeField(null=True, blank=True, verbose_name=_("Event end time")) + date_admission = models.DateTimeField(null=True, blank=True, + verbose_name=_("Admission time")) is_public = models.BooleanField(default=False, verbose_name=_("Visible in public lists"), help_text=_("If selected, this event may show up on the ticket system's start page " @@ -99,7 +101,7 @@ class Event(LoggedModel): verbose_name=_("Start of presale"), help_text=_("No products will be sold before this date."), ) - location = I18nCharField( + location = I18nTextField( null=True, blank=True, max_length=200, verbose_name=_("Location"), diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 808e4604c0..e2bb50690b 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -143,6 +143,7 @@ class EventUpdateForm(I18nModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['slug'].widget.attrs['readonly'] = 'readonly' + self.fields['location'].widget.attrs['rows'] = '3' class Meta: model = Event @@ -153,6 +154,7 @@ class EventUpdateForm(I18nModelForm): 'currency', 'date_from', 'date_to', + 'date_admission', 'is_public', 'presale_start', 'presale_end', @@ -161,6 +163,7 @@ class EventUpdateForm(I18nModelForm): widgets = { 'date_from': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), 'date_to': forms.DateTimeInput(attrs={'class': 'datetimepicker', 'data-date-after': '#id_date_from'}), + 'date_admission': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), 'presale_start': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), 'presale_end': forms.DateTimeInput(attrs={'class': 'datetimepicker', 'data-date-after': '#id_presale_start'}), diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html index 82019bcf63..a98cd90833 100644 --- a/src/pretix/control/templates/pretixcontrol/event/settings.html +++ b/src/pretix/control/templates/pretixcontrol/event/settings.html @@ -12,6 +12,7 @@ {% bootstrap_field form.date_from layout="horizontal" %} {% bootstrap_field form.date_to layout="horizontal" %} {% bootstrap_field form.location layout="horizontal" %} + {% bootstrap_field form.date_admission layout="horizontal" %} {% bootstrap_field form.currency layout="horizontal" %} {% bootstrap_field form.is_public layout="horizontal" %} diff --git a/src/pretix/helpers/formats/en/formats.py b/src/pretix/helpers/formats/en/formats.py index 0bf19be33f..28f35153b5 100644 --- a/src/pretix/helpers/formats/en/formats.py +++ b/src/pretix/helpers/formats/en/formats.py @@ -1,3 +1,4 @@ # Date according to https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date SHORT_DATE_FORMAT = 'Y-m-d' SHORT_DATETIME_FORMAT = 'Y-m-d H:i' +TIME_FORMAT = 'H:i' diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index 00420c6453..6cde8a1ee0 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -82,7 +82,7 @@ class PdfTicketOutput(BaseTicketOutput): elif o['content'] == 'event_name': return str(order.event) elif o['content'] == 'event_location': - return str(order.event.location) + return str(order.event.location).replace("\n", "
\n") elif o['content'] == 'event_date': return order.event.get_date_from_display(show_times=False) elif o['content'] == 'event_begin_time': diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index 15ddac8bc4..48d3d2757a 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -28,7 +28,8 @@
{% csrf_token %} - +
@@ -66,15 +67,57 @@ {% endif %}
{% if frontpage_text %} -
- {{ frontpage_text|rich_text }} -
+
+ {{ frontpage_text|rich_text }} +
{% endif %} -

- - {% trans "Add to Calendar" %} - -

+ + + {% if event.location %} +
+ +

+ {{ event.location|linebreaksbr }} +

+
+ {% endif %} + {% if event.settings.show_times or event.date_admission %} +
+ +

+ {% if event.settings.show_times %} + {% blocktrans trimmed with time=event.date_from|date:"TIME_FORMAT" %} + Begin: {{ time }} + {% endblocktrans %} + {% endif %} + {% if event.date_admission and event.settings.show_times %} +
+ {% endif %} + {% if event.date_admission %} + {% if event.date_admission|date:"SHORT_DATE_FORMAT" == event.date_from|date:"SHORT_DATE_FORMAT" %} + {% blocktrans trimmed with time=event.date_admission|date:"TIME_FORMAT" %} + Admission: {{ time }} + {% endblocktrans %} + {% else %} + {% blocktrans trimmed with datetime=event.date_admission|date:"SHORT_DATETIME_FORMAT" %} + Admission: {{ datetime }} + {% endblocktrans %} + {% endif %} + {% endif %} +
+ + {% trans "Add to Calendar" %} + +

+
+ {% else %} +

+ + {% trans "Add to Calendar" %} + +

+ {% endif %} +
{% eventsignal event "pretix.presale.signals.front_page_top" %} @@ -112,11 +155,13 @@
{% endif %} {% if item.min_per_order %} -

- {% blocktrans trimmed with num=item.min_per_order %} - minimum amount to order: {{ num }} - {% endblocktrans %} -

+

+ + {% blocktrans trimmed with num=item.min_per_order %} + minimum amount to order: {{ num }} + {% endblocktrans %} + +

{% endif %}
@@ -222,11 +267,13 @@ {% include "pretixpresale/event/fragment_quota_left.html" with avail=item.cached_availability %} {% endif %} {% if item.min_per_order %} -

- {% blocktrans trimmed with num=item.min_per_order %} - minimum amount to order: {{ num }} - {% endblocktrans %} -

+

+ + {% blocktrans trimmed with num=item.min_per_order %} + minimum amount to order: {{ num }} + {% endblocktrans %} + +

{% endif %}
diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 0a9f7764dc..bdf73b44fc 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -10,6 +10,7 @@ from django.db.models import Count, Prefetch, Q from django.http import Http404, HttpResponse from django.shortcuts import redirect from django.utils.decorators import method_decorator +from django.utils.formats import date_format from django.utils.functional import cached_property from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ @@ -149,6 +150,11 @@ class EventIcalDownload(EventViewMixin, View): else: vevent.add('dtend').value = event.date_to.astimezone(self.event_timezone).date() + if event.date_admission: + vevent.add('description').value = str(_('Admission: {datetime}')).format( + datetime=date_format(event.date_admission.astimezone(self.event_timezone), 'SHORT_DATETIME_FORMAT') + ) + resp = HttpResponse(cal.serialize(), content_type='text/calendar') resp['Content-Disposition'] = 'attachment; filename="{}-{}.ics"'.format( event.organizer.slug, event.slug diff --git a/src/pretix/static/pretixpresale/scss/main.scss b/src/pretix/static/pretixpresale/scss/main.scss index 78599ff247..a12aac6749 100644 --- a/src/pretix/static/pretixpresale/scss/main.scss +++ b/src/pretix/static/pretixpresale/scss/main.scss @@ -116,6 +116,22 @@ body.loading .container { -webkit-transition: opacity .5s ease-in-out; } +.info-row { + & > .fa { + font-size: 26px; + color: $brand-primary; + float: left; + margin-top: 3px; + } + p { + min-height: 30px; + margin-left: 40px; + } + p:first-child { + margin-top: 0; + } +} + @media (min-width: $screen-md-min) { .thank-you { min-height: 170px; diff --git a/src/tests/helpers/test_daterange.py b/src/tests/helpers/test_daterange.py index 420175f714..10b4569103 100644 --- a/src/tests/helpers/test_daterange.py +++ b/src/tests/helpers/test_daterange.py @@ -1,5 +1,7 @@ from datetime import date + from django.utils import translation + from pretix.helpers.daterange import daterange