Fix #898 -- Add setting to configure subevent ordering on frontpage (#906)

Fixes #898.
This commit is contained in:
Felix Rindt
2018-05-31 12:28:44 +02:00
committed by Raphael Michel
parent c4ed210fed
commit 6fe02f156a
6 changed files with 56 additions and 3 deletions

View File

@@ -2,6 +2,7 @@ import string
import uuid
from collections import OrderedDict
from datetime import datetime, time
from operator import attrgetter
import pytz
from django.conf import settings
@@ -535,6 +536,23 @@ class Event(EventMixin, LoggedModel):
)
).order_by('date_from', 'name')
@property
def subevent_list_subevents(self):
ordering = self.settings.get('frontpage_subevent_ordering', default='date_ascending', as_type=str)
orderfields = {
'date_ascending': ('date_from', 'name'),
'date_descending': ('-date_from', 'name'),
'name_ascending': ('name', 'date_from'),
'name_descending': ('-name', 'date_from'),
}[ordering]
subevs = self.subevents.filter(
Q(active=True) & (
Q(Q(date_to__isnull=True) & Q(date_from__gte=now()))
| Q(date_to__gte=now())
)
) # order_by doesn't make sense with I18nField
return sorted(subevs, key=attrgetter(*orderfields))
@property
def meta_data(self):
data = {p.name: p.default for p in self.organizer.meta_properties.all()}

View File

@@ -495,6 +495,10 @@ Your {event} team"""))
'default': '',
'type': LazyI18nString
},
'frontpage_subevent_ordering': {
'default': 'date_ascending',
'type': str
},
}
settings_hierarkey = Hierarkey(attribute_name='settings')

View File

@@ -6,7 +6,9 @@ from django.core.validators import RegexValidator
from django.db.models import Q
from django.forms import formset_factory
from django.utils.timezone import get_current_timezone_name
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django.utils.translation import (
pgettext, pgettext_lazy, ugettext_lazy as _,
)
from django_countries import Countries
from django_countries.fields import LazyTypedChoiceField
from i18nfield.forms import (
@@ -854,12 +856,24 @@ class DisplaySettingsForm(SettingsForm):
label=_("Show variations of a product expanded by default"),
required=False
)
frontpage_subevent_ordering = forms.ChoiceField(
label=pgettext('subevent', 'Date ordering'),
choices=[
('date_ascending', _('Event start time')),
('date_descending', _('Event start time (descending)')),
('name_ascending', _('Name')),
('name_descending', _('Name (descending)')),
], # When adding a new ordering, remember to also define it in the event model
)
def __init__(self, *args, **kwargs):
event = kwargs['obj']
super().__init__(*args, **kwargs)
self.fields['primary_font'].choices += [
(a, a) for a in get_fonts()
]
if not event.has_subevents:
del self.fields['frontpage_subevent_ordering']
class TicketSettingsForm(SettingsForm):

View File

@@ -11,6 +11,9 @@
{% bootstrap_field form.logo_image layout="control" %}
{% bootstrap_field form.frontpage_text layout="control" %}
{% bootstrap_field form.show_variations_expanded layout="control" %}
{% if form.frontpage_subevent_ordering %}
{% bootstrap_field form.frontpage_subevent_ordering layout="control" %}
{% endif %}
</fieldset>
<fieldset>
<legend>{% trans "Shop design" %}</legend>

View File

@@ -1,6 +1,6 @@
{% load i18n %}
{% load eventurl %}
{% for subev in event.active_future_subevents %}
{% for subev in event.subevent_list_subevents %}
<a href="{% eventurl event "presale:event.index" subevent=subev.id cart_namespace=cart_namespace %}"
class="subevent-row">
<div class="row">