Enabled event numbers.

This commit is contained in:
2018-01-24 17:19:29 +01:00
parent 05d5a77a97
commit 9f2ba9912c
11 changed files with 145 additions and 19 deletions

View File

@@ -1,4 +1,3 @@
- Veranstaltungsnummern
- Anmeldungstext
- One-Click-Links in Accept-Mails
- Download Veranstaltungsliste

View File

@@ -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

View File

@@ -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),
),
]

View File

@@ -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),
),
]

View File

@@ -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<sport>[A-Z])(?P<count>[0-9][0-9]*)/(?P<year>[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,

View File

@@ -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 }}-----

View File

@@ -2,7 +2,7 @@
<div class="panel panel-default">
<div class="panel-heading">
<span class="panel-title">{{ sport|upper }}**/{{ first_day|date:'y' }} - {{ title }}</span>
<span class="panel-title">{{ number }} - {{ title }}</span>
</div>
<ul class="list-group">
<li class="list-group-item">

View File

@@ -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 }})

View File

@@ -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 %}
<div class="action-tabs">
@@ -34,17 +34,35 @@
<div class="panel panel-default">
<div class="panel-body">
<div class="row">
<div class="col-sm-2">
<strong>{% trans 'Eingereicht' %}:</strong>
</div>
<div class="col-sm-7">
{{ event.created_at|date:'l, d. F Y, H:i' }} Uhr
<div class="col-sm-10">
<div class="row">
<div class="col-sm-2">
<strong>{% trans 'Eingereicht' %}:</strong>
</div>
<div class="col-sm-10">
{{ event.created_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
{{ event.owner.get_full_name }}
</div>
</div>
<div class="row">
<div class="col-sm-2">
<strong>{% trans 'Freigegeben' %}:</strong>
</div>
<div class="col-sm-10">
{% if event.accepted %}
{{ event.accepted_at|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
{{ event.accepted_by.get_full_name }}
{% else %}
-
{% endif %}
</div>
</div>
</div>
<div class="col-sm-2">
{% if event.accepted %}
<span class="label label-success">{% trans 'Freigegeben' %}</span>
<span class="label label-warning">{% trans 'Freigegeben' %}</span>
{% else %}
<span class="label label-danger">{% trans 'Nicht Freigegeben' %}</span>
<span class="label label-danger">{% trans 'Eingereicht' %}</span>
{% endif %}
</div>
</div>

View File

@@ -21,6 +21,7 @@
<thead>
<tr>
<th>{% trans 'Spielart' %}</th>
<th>{% trans 'Nummer' %}</th>
<th>{% trans 'Titel' %}</th>
<th>{% trans 'Trainer' %}</th>
<th>{% trans 'Datum' %}</th>
@@ -32,6 +33,7 @@
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
</tr>
</thead>
<tbody>
@@ -40,6 +42,9 @@
<td>
{{ event.get_sport_display }}
</td>
<td>
<a href="{% url 'dav_events:event_detail' event.pk %}">{{ event.get_number }}</a>
</td>
<td>
<a href="{% url 'dav_events:event_detail' event.pk %}">{{ event.title }}</a>
</td>
@@ -55,9 +60,9 @@
</td>
<td>
{% if event.accepted %}
<span class="label label-success">{% trans 'Freigegeben' %}</span>
<span class="label label-warning">{% trans 'Freigegeben' %}</span>
{% else %}
<span class="label label-danger">{% trans 'Nicht Freigegeben' %}</span>
<span class="label label-danger">{% trans 'Eingereicht' %}</span>
{% endif %}
</td>
</tr>

View File

@@ -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):