Timezone indicators in the backend

This commit is contained in:
Raphael Michel
2019-05-01 13:53:45 +02:00
parent db187a2537
commit f1b07777bc
5 changed files with 88 additions and 20 deletions

View File

@@ -380,6 +380,12 @@
{% block content %} {% block content %}
{% endblock %} {% endblock %}
<footer> <footer>
{% if request.timezone %}
<span class="fa fa-globe"></span>
{% blocktrans trimmed with tz=request.timezone %}
Times displayed in {{ tz }}
{% endblocktrans %} &middot;
{% endif %}
{% with "href='http://pretix.eu'" as a_attr %} {% with "href='http://pretix.eu'" as a_attr %}
{% blocktrans trimmed %} {% blocktrans trimmed %}
powered by <a {{ a_attr }}>pretix</a> powered by <a {{ a_attr }}>pretix</a>

View File

@@ -106,6 +106,9 @@
{{ e.get_short_date_to_display }} {{ e.get_short_date_to_display }}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if e.settings.timezone != request.timezone %}
<span class="fa fa-globe text-muted" data-toggle="tooltip" title="{{ e.timezone }}"></span>
{% endif %}
</td> </td>
<td> <td>
{% for q in e.first_quotas|slice:":3" %} {% for q in e.first_quotas|slice:":3" %}

View File

@@ -3,8 +3,16 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% block inner %} {% block inner %}
<h1> <h1>
{% blocktrans with name=organizer.name %}Organizer: {{ name }}{% endblocktrans %} {% blocktrans with name=request.organizer.name %}Organizer: {{ name }}{% endblocktrans %}
</h1> </h1>
{% if "can_create_events" in request.orgapermset %}
<p>
<a href="{% url "control:events.add" %}" class="btn btn-default">
<span class="fa fa-plus"></span>
{% trans "Create a new event" %}
</a>
</p>
{% endif %}
{% if events|length == 0 %} {% if events|length == 0 %}
<p> <p>
<em>{% trans "You currently do not have access to any events." %}</em> <em>{% trans "You currently do not have access to any events." %}</em>
@@ -14,7 +22,12 @@
<thead> <thead>
<tr> <tr>
<th>{% trans "Event name" %}</th> <th>{% trans "Event name" %}</th>
<th>{% trans "Start date" %}</th> <th>
{% trans "Start date" %}
/
{% trans "End date" %}
</th>
<th>{% trans "Status" %}</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@@ -25,16 +38,47 @@
<strong><a <strong><a
href="{% url "control:event.index" organizer=e.organizer.slug event=e.slug %}">{{ e.name }}</a></strong> href="{% url "control:event.index" organizer=e.organizer.slug event=e.slug %}">{{ e.name }}</a></strong>
</td> </td>
<td>{{ e.get_date_from_display }}</td> <td>
{% if e.has_subevents %}
{{ e.min_from|default_if_none:""|date:"SHORT_DATETIME_FORMAT" }}
{% else %}
{{ e.get_short_date_from_display }}
{% endif %}
{% if e.has_subevents %}
<span class="label label-default">{% trans "Series" %}</span>
{% endif %}
{% if e.settings.show_date_to and e.date_to %}
<br>
{% if e.has_subevents %}
{{ e.max_fromto|default_if_none:e.max_from|default_if_none:e.max_to|default_if_none:""|date:"SHORT_DATETIME_FORMAT" }}
{% else %}
{{ e.get_short_date_to_display }}
{% endif %}
{% endif %}
{% if e.settings.timezone != request.timezone %}
<span class="fa fa-globe text-muted" data-toggle="tooltip" title="{{ e.timezone }}"></span>
{% endif %}
</td>
<td>
{% if not e.live %}
<span class="label label-danger">{% trans "Shop disabled" %}</span>
{% elif e.presale_has_ended %}
<span class="label label-warning">{% trans "Presale over" %}</span>
{% elif not e.presale_is_running %}
<span class="label label-warning">{% trans "Presale not started" %}</span>
{% else %}
<span class="label label-success">{% trans "On sale" %}</span>
{% endif %}
</td>
<td class="text-right"> <td class="text-right">
<a href="{% url "control:event.index" organizer=e.organizer.slug event=e.slug %}" <a href="{% url "control:event.index" organizer=e.organizer.slug event=e.slug %}"
class="btn btn-sm btn-default" title="{% trans "Open event dashboard" %}" class="btn btn-sm btn-default" title="{% trans "Open event dashboard" %}"
data-toggle="tooltip"> data-toggle="tooltip">
<span class="fa fa-eye"></span> <span class="fa fa-eye"></span>
</a> </a>
{% if "can_create_events" in request.orgapermset %} {% if "can_create_events" in request.orgapermset %}
<a href="{% url "control:events.add" %}?clone={{ e.pk }}" class="btn btn-sm btn-default" <a href="{% url "control:events.add" %}?clone={{ e.pk }}" class="btn btn-sm btn-default"
title="{% trans "Clone event" %}" data-toggle="tooltip"> title="{% trans "Clone event" %}" data-toggle="tooltip">
<span class="fa fa-copy"></span> <span class="fa fa-copy"></span>
</a> </a>
{% endif %} {% endif %}
@@ -43,11 +87,6 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %} {% include "pretixcontrol/pagination.html" %}
{% if "can_create_events" in request.orgapermset %}
<a href="{% url "control:events.add" %}" class="btn btn-default">
<span class="fa fa-plus"></span>
{% trans "Create a new event" %}
</a>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@@ -360,7 +360,8 @@ def widgets_for_event_qs(request, qs, user, nmax):
'_settings_objects', 'organizer___settings_objects' '_settings_objects', 'organizer___settings_objects'
).select_related('organizer')[:nmax] ).select_related('organizer')[:nmax]
for event in events: for event in events:
tz = pytz.timezone(event.cache.get_or_set('timezone', lambda: event.settings.timezone)) tzname = event.cache.get_or_set('timezone', lambda: event.settings.timezone)
tz = pytz.timezone(tzname)
if event.has_subevents: if event.has_subevents:
if event.min_from is None: if event.min_from is None:
dr = pgettext("subevent", "No dates") dr = pgettext("subevent", "No dates")
@@ -393,6 +394,9 @@ def widgets_for_event_qs(request, qs, user, nmax):
((date_format(event.date_admission.astimezone(tz), 'TIME_FORMAT') + ' / ') ((date_format(event.date_admission.astimezone(tz), 'TIME_FORMAT') + ' / ')
if event.date_admission and event.date_admission != event.date_from else '') if event.date_admission and event.date_admission != event.date_from else '')
+ (date_format(event.date_from.astimezone(tz), 'TIME_FORMAT') if event.date_from else '') + (date_format(event.date_from.astimezone(tz), 'TIME_FORMAT') if event.date_from else '')
) + (
' <span class="fa fa-globe text-muted" data-toggle="tooltip" title="{}"></span>'.format(tzname)
if tzname != request.timezone and not event.has_subevents else ''
), ),
url=reverse('control:event.index', kwargs={ url=reverse('control:event.index', kwargs={
'event': event.slug, 'event': event.slug,

View File

@@ -6,7 +6,8 @@ from django.contrib import messages
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.files import File from django.core.files import File
from django.db import transaction from django.db import transaction
from django.db.models import Count, ProtectedError from django.db.models import Count, Max, Min, ProtectedError
from django.db.models.functions import Coalesce, Greatest
from django.forms import inlineformset_factory from django.forms import inlineformset_factory
from django.http import JsonResponse from django.http import JsonResponse
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
@@ -19,7 +20,7 @@ from django.views.generic import (
from pretix.api.models import WebHook from pretix.api.models import WebHook
from pretix.base.models import Device, Organizer, Team, TeamInvite, User from pretix.base.models import Device, Organizer, Team, TeamInvite, User
from pretix.base.models.event import EventMetaProperty from pretix.base.models.event import Event, EventMetaProperty
from pretix.base.models.organizer import TeamAPIToken from pretix.base.models.organizer import TeamAPIToken
from pretix.base.services.mail import SendMailException, mail from pretix.base.services.mail import SendMailException, mail
from pretix.control.forms.filter import OrganizerFilterForm from pretix.control.forms.filter import OrganizerFilterForm
@@ -86,18 +87,33 @@ class OrganizerDetailViewMixin:
return self.request.organizer return self.request.organizer
class OrganizerDetail(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, DetailView): class OrganizerDetail(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
model = Organizer model = Event
template_name = 'pretixcontrol/organizers/detail.html' template_name = 'pretixcontrol/organizers/detail.html'
permission = None permission = None
context_object_name = 'organizer' context_object_name = 'events'
def get_object(self, queryset=None) -> Organizer: @property
def organizer(self):
return self.request.organizer return self.request.organizer
def get_queryset(self):
qs = self.request.user.get_events_with_any_permission(self.request).select_related('organizer').prefetch_related(
'_settings_objects', 'organizer___settings_objects'
).filter(organizer=self.request.organizer).order_by('-date_from')
qs = qs.annotate(
min_from=Min('subevents__date_from'),
max_from=Max('subevents__date_from'),
max_to=Max('subevents__date_to'),
max_fromto=Greatest(Max('subevents__date_to'), Max('subevents__date_from'))
).annotate(
order_from=Coalesce('min_from', 'date_from'),
order_to=Coalesce('max_fromto', 'max_to', 'max_from', 'date_to', 'date_from'),
)
return qs
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
ctx['events'] = self.request.organizer.events.all()
return ctx return ctx