diff --git a/dav_events/migrations/0029_event_registration_closed.py b/dav_events/migrations/0029_event_registration_closed.py new file mode 100644 index 0000000..13b11a2 --- /dev/null +++ b/dav_events/migrations/0029_event_registration_closed.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-05-29 08:31 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dav_events', '0028_auto_20190401_1310'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='registration_closed', + field=models.BooleanField(default=False, verbose_name='Anmeldung geschlossen'), + ), + ] diff --git a/dav_events/models/event.py b/dav_events/models/event.py index 7467e5f..b59bdd6 100644 --- a/dav_events/models/event.py +++ b/dav_events/models/event.py @@ -228,6 +228,9 @@ class Event(models.Model): internal_note = models.TextField(blank=True, verbose_name=_('Bearbeitungshinweis')) + registration_closed = models.BooleanField(default=False, + verbose_name=_('Anmeldung geschlossen')) + @property def workflow(self): return DefaultWorkflow(self) diff --git a/dav_events/templates/dav_events/event_detail.html b/dav_events/templates/dav_events/event_detail.html index e60b743..ee51b78 100644 --- a/dav_events/templates/dav_events/event_detail.html +++ b/dav_events/templates/dav_events/event_detail.html @@ -165,6 +165,10 @@ {% trans 'Ändern' %} +
  • + {% trans 'Anmeldungen' %} +
  • diff --git a/dav_events/templates/dav_events/event_registrations.html b/dav_events/templates/dav_events/event_registrations.html new file mode 100644 index 0000000..9a572b2 --- /dev/null +++ b/dav_events/templates/dav_events/event_registrations.html @@ -0,0 +1,263 @@ +{% extends 'dav_events/base.html' %} +{% load bootstrap3 %} +{% load i18n %} +{% load dav_events %} + +{% block head-title %}{% trans 'Anmeldungen' %} - {{ event }} - {{ block.super }}{% endblock head-title %} + +{% block modals %} + + + +{% endblock modals %} + +{% block page-container-fluid %} +
    + +
    + +{% if not event.registration_required %} + +{% endif %} + +
    +
    +
    + {% render_event_status event show_void=False %} +
    +

    {{ event }}

    +
    +
    +
    +
    + +
    +
    +
    +
    + {% trans 'Teilnehmerzahl' %}: + {{ event.min_participants }} - + {% if event.max_participants > 0 %} + {{ event.max_participants }} + {% else %} + ∞ + {% endif %} +
    +
    + {% trans 'Anmeldeschluss' %}: + {% if event.deadline %} + {{ event.deadline|date:'l, d. F Y' }} + {% else %} + - + {% endif %} +
    +
    + {% trans 'Anmeldestatus' %}: + {% if not event.registration_required %} + {% trans 'Anmeldung nicht erforderlich' %} + {% elif is_done %} + {% trans 'Veranstaltung beendet' %} + {% elif event.registration_closed %} + {% trans 'Anmeldung geschlossen' %} + {% elif event.is_deadline_expired %} + {% trans 'Anmeldeschluss abgelaufen' %} + {% elif is_published_any %} + {% trans 'Anmeldung geöffnet' %} + {% else %} + {% trans 'Veranstaltung noch nicht veröffentlicht' %} + {% endif %} +
    +
    +
    + +
    +
    +
    +

    Teilnehmer (Designstudie - Das funktioniert alles noch nicht!)

    +
    + +
    +
    + Formular +
    + +
    +
    + {% for participant in participants %} +
    + +
    +
    + Hier tauchen dann die Teilnehmerdaten auf +
    +
    +
    + {% endfor %} +
    +
    +
    +{% endblock page-container-fluid %} \ No newline at end of file diff --git a/dav_events/templates/dav_events/event_update_form.html b/dav_events/templates/dav_events/event_update_form.html index ffd6373..1d3ef79 100644 --- a/dav_events/templates/dav_events/event_update_form.html +++ b/dav_events/templates/dav_events/event_update_form.html @@ -45,6 +45,10 @@
  • {% trans 'Ändern' %}
  • +
  • + {% trans 'Anmeldungen' %} +
  • diff --git a/dav_events/urls.py b/dav_events/urls.py index 781fead..b348d56 100644 --- a/dav_events/urls.py +++ b/dav_events/urls.py @@ -7,6 +7,7 @@ urlpatterns = [ url(r'^$', views.events.EventListView.as_view(), name='list'), url(r'^export$', views.events.EventListExportView.as_view(), name='list_export'), url(r'^create$', views.events.EventCreateView.as_view(), name='create'), + url(r'^(?P\d+)/registrations', views.events.EventRegistrationsView.as_view(), name='registrations'), url(r'^(?P\d+)/status/(?P[a-z0-9._-][a-z0-9._-]*)', views.events.EventUpdateStatusView.as_view(), name='updatestatus'), url(r'^(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='update'), diff --git a/dav_events/views/events.py b/dav_events/views/events.py index bec3289..c088b62 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -150,6 +150,7 @@ class EventDetailView(EventPermissionMixin, generic.DetailView): context['is_publishing'] = obj.workflow.has_reached_status('publishing') context['is_publishing_any'] = obj.workflow.has_reached_status('publishing*') context['is_published'] = obj.workflow.has_reached_status('published') + context['is_published_any'] = obj.workflow.has_reached_status('published*') return context @method_decorator(login_required) @@ -157,6 +158,63 @@ class EventDetailView(EventPermissionMixin, generic.DetailView): return super(EventDetailView, self).dispatch(request, *args, **kwargs) +class EventRegistrationsView(EventPermissionMixin, generic.DetailView): + permission = 'update-registration' + model = models.Event + template_name = 'dav_events/event_registrations.html' + + def get_object(self, queryset=None): + obj = super(EventRegistrationsView, self).get_object(queryset=queryset) + self.enforce_permission(obj) + return obj + + def get_context_data(self, **kwargs): + context = super(EventRegistrationsView, self).get_context_data(**kwargs) + obj = context.get('event') + context['has_permission_update'] = self.has_permission('update', obj) + context['is_published_any'] = obj.workflow.has_reached_status('published*') + context['is_done'] = obj.workflow.has_reached_status('expired') + + class MockParticipant(object): + def __init__(self, id, name): + self.id = id + self.name = name + + @property + def position(self): + return self.id + + def get_full_name(self): + return self.name + + participants = [MockParticipant(1, 'Erika Musterfrau'), MockParticipant(2, 'Max Mustermann')] + context['participants'] = participants + + return context + + def post(self, request, *args, **kwargs): + event = self.get_object() + action = request.POST.get('action') + if action == 'close-registration': + event.registration_closed = True + event.save() + messages.success(request, _(u'Die Anmeldung wurde geschlossen')) + elif action == 'open-registration': + event.registration_closed = False + event.save() + messages.success(request, _(u'Die Anmeldung wurde geöffnet')) + elif action == 'kill-deadline': + event.deadline = None + event.registration_closed = False + event.save() + messages.success(request, _(u'Der Anmeldeschluss wurde gelöscht')) + return HttpResponseRedirect(reverse('dav_events:registrations', kwargs={'pk': event.pk})) + + @method_decorator(login_required) + def dispatch(self, request, *args, **kwargs): + return super(EventRegistrationsView, self).dispatch(request, *args, **kwargs) + + class EventUpdateStatusView(EventPermissionMixin, generic.DetailView): model = models.Event diff --git a/dav_events/workflow.py b/dav_events/workflow.py index c339760..3a9aa18 100644 --- a/dav_events/workflow.py +++ b/dav_events/workflow.py @@ -436,6 +436,15 @@ class BasicWorkflow(object): return True elif has_role(user, 'publisher'): return True + elif permission == 'update-registration': + if user == event.owner: + return True + if has_role(user, 'manager_super'): + return True + if has_role(user, 'manager_{}'.format(event.sport.lower())): + return True + if has_role(user, 'publisher'): + return True return False # TODO: is a class method a good idea? diff --git a/dav_registration/templates/dav_registration/event_detail.html b/dav_registration/templates/dav_registration/event_detail.html index 0787136..805f6e6 100644 --- a/dav_registration/templates/dav_registration/event_detail.html +++ b/dav_registration/templates/dav_registration/event_detail.html @@ -5,7 +5,14 @@ {% block head-title %}{{ event.number }} - {{ block.super }}{% endblock head-title %} {% block messages %} -{% if event.is_deadline_expired %} +{% if event.registration_closed %} +
    +
    + Die Teilnehmerliste ist bereits voll!
    + Eine Anmeldung ist nicht mehr möglich. +
    +
    +{% elif event.is_deadline_expired %}
    Der Anmeldeschluss ist bereits abgelaufen!
    @@ -45,7 +52,7 @@ {% endblocktrans %}
    {% endif %} - {% if not event.is_deadline_expired %} + {% if not event.registration_closed and not event.is_deadline_expired %} {% trans 'Anmeldung' %} {% endif %} {% trans 'Zurück' %} diff --git a/dav_registration/templates/dav_registration/event_list.html b/dav_registration/templates/dav_registration/event_list.html index 9634d5d..a971e50 100644 --- a/dav_registration/templates/dav_registration/event_list.html +++ b/dav_registration/templates/dav_registration/event_list.html @@ -24,9 +24,12 @@
    - {% if event.is_deadline_expired %} - - {% trans 'Anmeldeschluss abgelaufen' %} + {% if event.registration_closed %} + + {% trans 'Teilnehmerliste voll' %} + {% elif event.is_deadline_expired %} + + {% trans 'Anmeldeschluss abgelaufen' %} {% else %} {% trans 'Details & Anmeldung' %} {% endif %} @@ -58,7 +61,7 @@
  • {% render_event_facts event %}
  • - {% if not event.is_deadline_expired %} + {% if not event.registration_closed and not event.is_deadline_expired %}
  • {% trans 'zur Anmeldung' %}
  • diff --git a/dav_registration/templates/dav_registration/registration_form.html b/dav_registration/templates/dav_registration/registration_form.html index a3f8d56..addb143 100644 --- a/dav_registration/templates/dav_registration/registration_form.html +++ b/dav_registration/templates/dav_registration/registration_form.html @@ -110,7 +110,7 @@

    - Die erfolgreiche Anmeldung bedeutet nicht, dass du auf jeden Fall + Die erfolgreiche Anmeldung hier im Portal bedeutet nicht, dass du auf jeden Fall an der Tour oder dem Kurs teilnehmen kannst.
    diff --git a/dav_registration/views.py b/dav_registration/views.py index c3753b6..33531dd 100644 --- a/dav_registration/views.py +++ b/dav_registration/views.py @@ -37,6 +37,7 @@ class EventListView(generic.ListView): 'published', 'published_web', 'published_facebook')) filter &= Q(planned_publication_date__isnull=True) | Q(planned_publication_date__lte=today) filter &= Q(first_day__gte=today) + # filter &= Q(registration_closed=False) # filter &= Q(deadline__isnull=True) | Q(deadline__gte=today) qs = self.model.objects.filter(filter).order_by('first_day', 'number').distinct() @@ -55,6 +56,7 @@ class EventDetailView(generic.DetailView): 'published', 'published_web', 'published_facebook')) filter &= Q(planned_publication_date__isnull=True) | Q(planned_publication_date__lte=today) filter &= Q(first_day__gte=today) + # filter &= Q(registration_closed=False) # filter &= Q(deadline__isnull=True) | Q(deadline__gte=today) qs = self.model.objects.filter(filter).distinct() @@ -76,6 +78,7 @@ class RegistrationView(generic.CreateView): 'published', 'published_web', 'published_facebook')) filter &= Q(planned_publication_date__isnull=True) | Q(planned_publication_date__lte=today) filter &= Q(first_day__gte=today) + filter &= Q(registration_closed=False) filter &= Q(deadline__isnull=True) | Q(deadline__gte=today) qs = Event.objects.filter(filter).distinct()