From 9f2ba9912c69a3d71e692d8d0019b5a8b87c27de Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Wed, 24 Jan 2018 17:19:29 +0100 Subject: [PATCH] Enabled event numbers. --- TODO.txt | 1 - dav_events/config.py | 2 + .../migrations/0002_auto_20180124_1514.py | 39 ++++++++++++++ .../migrations/0003_auto_20180124_1617.py | 20 ++++++++ dav_events/models.py | 51 +++++++++++++++++-- .../dav_events/emails/event_accepted.txt | 2 +- dav_events/templates/dav_events/event.html | 2 +- dav_events/templates/dav_events/event.txt | 2 +- .../templates/dav_events/event_detail.html | 34 ++++++++++--- .../templates/dav_events/event_list.html | 9 +++- dav_events/views/events.py | 2 +- 11 files changed, 145 insertions(+), 19 deletions(-) create mode 100644 dav_events/migrations/0002_auto_20180124_1514.py create mode 100644 dav_events/migrations/0003_auto_20180124_1617.py diff --git a/TODO.txt b/TODO.txt index 1cba82c..396052a 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,4 +1,3 @@ -- Veranstaltungsnummern - Anmeldungstext - One-Click-Links in Accept-Mails - Download Veranstaltungsliste diff --git a/dav_events/config.py b/dav_events/config.py index c8780b6..9b8b127 100644 --- a/dav_events/config.py +++ b/dav_events/config.py @@ -19,6 +19,8 @@ INCREMENTAL_PUBLISHER_GROUP = 'OnlineRedaktion' # Form Config COMMON_CHAR_FIELD_LENGTH = 250 +NUMBER_MAX_LENGTH = 12 + TITLE_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH TRAINER_NAME_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH diff --git a/dav_events/migrations/0002_auto_20180124_1514.py b/dav_events/migrations/0002_auto_20180124_1514.py new file mode 100644 index 0000000..721c3bb --- /dev/null +++ b/dav_events/migrations/0002_auto_20180124_1514.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.9 on 2018-01-24 15:14 +from __future__ import unicode_literals + +import dav_events.models +from django.conf import settings +from django.db import migrations, models +import django_countries.fields + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('dav_events', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='accepted_by', + field=models.ForeignKey(null=True, on_delete=models.SET(dav_events.models.get_ghost_user), related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='event', + name='number', + field=models.CharField(blank=True, max_length=12), + ), + migrations.AlterField( + model_name='event', + name='country', + field=django_countries.fields.CountryField(max_length=2), + ), + migrations.AlterField( + model_name='event', + name='terrain', + field=models.CharField(choices=[(b'gym', 'Kletterhalle'), (b'crag', 'Klettergarten'), (b'flats', 'Flachland'), (b'submountains', 'Mittelgebirge'), (b'alpine', 'Alpin')], max_length=25), + ), + ] diff --git a/dav_events/migrations/0003_auto_20180124_1617.py b/dav_events/migrations/0003_auto_20180124_1617.py new file mode 100644 index 0000000..48b8e61 --- /dev/null +++ b/dav_events/migrations/0003_auto_20180124_1617.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.9 on 2018-01-24 16:17 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dav_events', '0002_auto_20180124_1514'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='number', + field=models.CharField(blank=True, max_length=12, unique=True), + ), + ] diff --git a/dav_events/models.py b/dav_events/models.py index 938876e..f58db4e 100644 --- a/dav_events/models.py +++ b/dav_events/models.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +import datetime +import logging import os +import re from babel.dates import format_date from django.conf import settings from django.contrib.auth import get_user_model @@ -14,6 +17,8 @@ from . import choices from . import config from . import emails +logger = logging.getLogger(__name__) + CHOICE_FIELD_MAX_LENGTH = 25 @@ -30,6 +35,13 @@ class Event(models.Model): created_at = models.DateTimeField(auto_now_add=True) accepted = models.BooleanField(default=False) accepted_at = models.DateTimeField(null=True) + accepted_by = models.ForeignKey(settings.AUTH_USER_MODEL, + null=True, + on_delete=models.SET(get_ghost_user), + related_name='+') + number = models.CharField(unique=True, + max_length=config.NUMBER_MAX_LENGTH, + blank=True) # DescriptionForm title = models.CharField(max_length=config.TITLE_MAX_LENGTH) @@ -135,9 +147,9 @@ class Event(models.Model): default_permissions = ('view', 'accept', 'edit', 'delete') def __unicode__(self): - return u'{sport} - {title} ({first_day})'.format(title=self.title, - sport=self.sport, - first_day=self.first_day) + return u'{number} - {title} ({date})'.format(number=self.number, + title=self.title, + date=self.get_short_date()) def get_absolute_url(self): return reverse('dav_events:event_detail', kwargs={'pk': self.pk}) @@ -164,10 +176,13 @@ class Event(models.Model): for email in emails_to_send: email.send() - def accept(self): + def accept(self, user=None): if not self.accepted: + self.number = self.get_next_number() self.accepted = True self.accepted_at = timezone.now() + if user: + self.accepted_by = user self.save() emails_to_send = [ emails.EventAcceptedMail(event=self), @@ -176,6 +191,33 @@ class Event(models.Model): for email in emails_to_send: email.send() + def get_next_number(self): + counter = 0 + + year = self.first_day.year + year_begin = datetime.date(year, 1, 1) + year_end = datetime.date(year, 12, 31) + qs = Event.objects.filter(accepted=True, + sport=self.sport, + first_day__gte=year_begin, + first_day__lte=year_end).order_by('-number') + last = qs.first() + if last: + match = re.match(r'^(?P[A-Z])(?P[0-9][0-9]*)/(?P[0-9][0-9]*)', last.number) + if match: + gd = match.groupdict() + counter = int(gd['count']) + + counter += 1 + n = '%s%02d/%d' % (self.sport, counter, year % 100) + return n + + def get_number(self): + if self.accepted and self.number: + return self.number + else: + return '%s**/%d' % (self.sport, self.first_day.year % 100) + def get_short_date(self, begin_date=None, end_date=None): if begin_date is None: begin_date = self.first_day @@ -209,6 +251,7 @@ class Event(models.Model): def get_template_context(self): context = { 'event': self, + 'number': self.get_number(), 'mode': self.mode, 'sport': self.sport, 'title': self.title, diff --git a/dav_events/templates/dav_events/emails/event_accepted.txt b/dav_events/templates/dav_events/emails/event_accepted.txt index 6c7ba52..48dcbe8 100644 --- a/dav_events/templates/dav_events/emails/event_accepted.txt +++ b/dav_events/templates/dav_events/emails/event_accepted.txt @@ -1,6 +1,6 @@ Hallo {{ trainer_firstname }}, -deine folgende Veranstaltung wurde von einem Tourenreferent freigegeben: +ein Tourenreferent hat deine Veranstaltung freigegeben: ----- {{ event.render_as_text }}----- diff --git a/dav_events/templates/dav_events/event.html b/dav_events/templates/dav_events/event.html index 0667878..d5575a7 100644 --- a/dav_events/templates/dav_events/event.html +++ b/dav_events/templates/dav_events/event.html @@ -2,7 +2,7 @@
- {{ sport|upper }}**/{{ first_day|date:'y' }} - {{ title }} + {{ number }} - {{ title }}
  • diff --git a/dav_events/templates/dav_events/event.txt b/dav_events/templates/dav_events/event.txt index a4082cb..c51e5a9 100644 --- a/dav_events/templates/dav_events/event.txt +++ b/dav_events/templates/dav_events/event.txt @@ -1,4 +1,4 @@ -{% load i18n %}{{ sport|upper }}**/{{ first_day|date:'y' }} - {{ title }} +{% load i18n %}{{ number }} - {{ title }} {{ short_date }} {% if alt_short_date %}({% trans 'Ersatztermin' %}: {{ alt_short_date }}) diff --git a/dav_events/templates/dav_events/event_detail.html b/dav_events/templates/dav_events/event_detail.html index 105a3eb..ee2f0e0 100644 --- a/dav_events/templates/dav_events/event_detail.html +++ b/dav_events/templates/dav_events/event_detail.html @@ -1,7 +1,7 @@ {% extends 'dav_events/base.html' %} {% load i18n %} -{% block head-title %}{{ event.title }} - {{ block.super }}{% endblock head-title %} +{% block head-title %}{{ event }} - {{ block.super }}{% endblock head-title %} {% block page-container-fluid %}
    @@ -34,17 +34,35 @@
    -
    - {% trans 'Eingereicht' %}: -
    -
    - {{ event.created_at|date:'l, d. F Y, H:i' }} Uhr +
    +
    +
    + {% trans 'Eingereicht' %}: +
    +
    + {{ event.created_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}
    + {{ event.owner.get_full_name }} +
    +
    +
    +
    + {% trans 'Freigegeben' %}: +
    +
    + {% if event.accepted %} + {{ event.accepted_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}
    + {{ event.accepted_by.get_full_name }} + {% else %} + - + {% endif %} +
    +
    {% if event.accepted %} - {% trans 'Freigegeben' %} + {% trans 'Freigegeben' %} {% else %} - {% trans 'Nicht Freigegeben' %} + {% trans 'Eingereicht' %} {% endif %}
    diff --git a/dav_events/templates/dav_events/event_list.html b/dav_events/templates/dav_events/event_list.html index efbe49b..86db779 100644 --- a/dav_events/templates/dav_events/event_list.html +++ b/dav_events/templates/dav_events/event_list.html @@ -21,6 +21,7 @@ {% trans 'Spielart' %} + {% trans 'Nummer' %} {% trans 'Titel' %} {% trans 'Trainer' %} {% trans 'Datum' %} @@ -32,6 +33,7 @@ + @@ -40,6 +42,9 @@ {{ event.get_sport_display }} + + {{ event.get_number }} + {{ event.title }} @@ -55,9 +60,9 @@ {% if event.accepted %} - {% trans 'Freigegeben' %} + {% trans 'Freigegeben' %} {% else %} - {% trans 'Nicht Freigegeben' %} + {% trans 'Eingereicht' %} {% endif %} diff --git a/dav_events/views/events.py b/dav_events/views/events.py index a5c89f8..19ddb2c 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -102,7 +102,7 @@ class EventAcceptView(EventDetailView): def accept(self): event = self.get_object() - event.accept() + event.accept(self.request.user) messages.success(self.request, _(u'Veranstaltung freigegeben.')) def get(self, request, *args, **kwargs):