diff --git a/dav_events/apps.py b/dav_events/apps.py index 593da58..7a87fe6 100644 --- a/dav_events/apps.py +++ b/dav_events/apps.py @@ -31,6 +31,6 @@ class AppConfig(_AppConfig): default_settings = DEFAULT_SETTINGS def ready(self): - from .workflow import workflow - signals.event_updated.connect(workflow.send_emails_on_event_update) - signals.event_status_updated.connect(workflow.send_emails_on_event_status_update) + from .workflow import DefaultWorkflow + signals.event_updated.connect(DefaultWorkflow.send_emails_on_event_update) + signals.event_status_updated.connect(DefaultWorkflow.send_emails_on_event_status_update) diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index 91b249c..44d50cd 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -13,7 +13,7 @@ from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget from .. import choices from .. import config from .. import models -from ..workflow import workflow +from ..workflow import DefaultWorkflow from .generic import ChainedForm, ModelMixin app_config = apps.get_containing_app_config(__package__) @@ -955,7 +955,7 @@ class SummaryForm(EventCreateForm): deadline = None first_day = self._session_data.get('first_day') - issue_date, issue = workflow.plan_publication(first_day, deadline) + issue_date, issue = DefaultWorkflow.plan_publication(first_day, deadline) if issue_date: self.fields['planned_publication_date'].initial = issue_date self.fields['planned_publication_issue'].initial = issue \ No newline at end of file diff --git a/dav_events/migrations/0021_create_flags.py b/dav_events/migrations/0021_create_flags.py index 4a0ef37..e175819 100644 --- a/dav_events/migrations/0021_create_flags.py +++ b/dav_events/migrations/0021_create_flags.py @@ -3,13 +3,13 @@ from __future__ import unicode_literals from django.db import migrations -from dav_events.models.eventstatus import get_event_status +from dav_events.models.eventstatus import get_or_create_event_status def create_stati(apps, schema_editor): l = ('draft', 'submitted', 'accepted', 'publishing', 'published', 'expired') for c in l: - get_event_status(c) + get_or_create_event_status(c) def create_flags(apps, schema_editor): diff --git a/dav_events/models/event.py b/dav_events/models/event.py index 2fc4339..6d7096b 100644 --- a/dav_events/models/event.py +++ b/dav_events/models/event.py @@ -19,9 +19,9 @@ from .. import choices from .. import config from .. import signals from ..utils import get_ghost_user, get_system_user -from ..workflow import workflow +from ..workflow import DefaultWorkflow -from .eventstatus import EventStatus, get_event_status +from .eventstatus import EventStatus, get_or_create_event_status logger = logging.getLogger(__name__) @@ -232,6 +232,10 @@ class Event(models.Model): internal_note = models.TextField(blank=True, verbose_name=_(u'Bearbeitungshinweis')) + @property + def workflow(self): + return DefaultWorkflow(self) + @property def editor(self): if not hasattr(self, '_editor'): @@ -302,7 +306,7 @@ class Event(models.Model): if creating: logger.info('Event created: %s', self) signals.event_created.send(sender=self.__class__, event=self) - self.confirm_status('draft', self.editor) + self.workflow.update_status('draft', self.editor) elif not implicit_update: modified_text = self.render_as_text(show_internal_fields=True) o_lines = original_text.split('\n') @@ -311,9 +315,10 @@ class Event(models.Model): logger.info('Event updated: %s', self) signals.event_updated.send(sender=self.__class__, event=self, diff=diff_lines, user=self.editor) + # TODO: move this into workflow def set_flag(self, status, **kwargs): if not isinstance(status, EventStatus): - status = get_event_status(status) + status = get_or_create_event_status(status) kwargs['event'] = self kwargs['status'] = status flag = EventFlag(**kwargs) @@ -321,80 +326,8 @@ class Event(models.Model): logger.info('Flagging status \'%s\' for %s', status.code, self) return flag - def is_flagged(self, status): - if isinstance(status, EventStatus): - code = status.code - else: - code = status - workflow.status_code_update(self, code) - if self.flags.filter(status__code=code).exists(): - return True - return False - - def get_status_flags(self): - return workflow.get_status_flags(self) - - def get_status(self): - workflow.status_code_update(self) - - last_flag = self.flags.last() - if last_flag: - return last_flag.status - return get_event_status('void') - - def get_status_codes(self): - workflow.status_code_update(self) - return [flag.status.code for flag in self.flags.all()] - - def confirm_status(self, status, user): - if isinstance(status, EventStatus): - code = status.code - else: - code = status - - flag = self.flags.filter(status__code=code).last() - if flag: - return flag - - valid, return_code, message = workflow.validate_status_code_update(code, self) - if not valid: - logger.warning(u'Invalid status update to \'%s\': %s Event: %s', code, message, self) - - flag = self.set_flag(status=code, user=user) - - workflow.status_code_update(self, code) - signals.event_status_updated.send(sender=self.__class__, event=self, flag=flag) - - return flag - def get_number(self): - number = workflow.get_number(self) - if number: - return number - else: - return '%s**/%d' % (self.sport, self.first_day.year % 100) - - def set_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(number__isnull=False, - sport=self.sport, - first_day__gte=year_begin, - first_day__lte=year_end).order_by('number') - last = qs.last() - 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 - self.number = '%s%02d/%d' % (self.sport, counter, year % 100) - self.save(implicit_update=True) - return self.number + return self.workflow.get_number() def get_formated_date(self, begin_date=None, end_date=None, format='normalized_long'): if begin_date is None: diff --git a/dav_events/models/eventstatus.py b/dav_events/models/eventstatus.py index a3ba2d0..35bf08f 100644 --- a/dav_events/models/eventstatus.py +++ b/dav_events/models/eventstatus.py @@ -1,5 +1,5 @@ -# -*- coding: utf-8 -*- from django.db import models +from django.utils.html import format_html from django.utils.translation import ugettext_lazy as _ from ..validators import IdStringValidator @@ -12,34 +12,6 @@ BOOTSTRAP_CONTEXT_CHOICES = ( ('warning', 'warning'), ('danger', 'danger'), ) -DEFAULT_EVENT_STATI = { - 'void': (0, _(u'Ungültig'), None), - 'draft': (10, _(u'Entwurf'), 'info'), - 'submitted': (30, _(u'Eingereicht'), 'danger'), - 'accepted': (50, _(u'Freigegeben'), 'warning'), - 'publishing_facebook': (68, _(u'Veröffentlichung Facebook'), 'warning'), - 'publishing_web': (69, _(u'Veröffentlichung Web'), 'warning'), - 'publishing': (70, _(u'Veröffentlichung'), 'warning'), - 'published_facebook': (78, _(u'Veröffentlicht Facebook'), 'success'), - 'published_web': (79, _(u'Veröffentlicht Web'), 'success'), - 'published': (80, _(u'Veröffentlicht'), 'success'), - 'expired': (100, _(u'Ausgelaufen'), None), -} - - -def get_event_status(code): - try: - obj = EventStatus.objects.get(code=code) - except EventStatus.DoesNotExist as e: - if code not in DEFAULT_EVENT_STATI: - raise e - severity = DEFAULT_EVENT_STATI[code][0] - label = DEFAULT_EVENT_STATI[code][1] - obj = EventStatus(code=code, severity=severity, label=label) - if DEFAULT_EVENT_STATI[code][2]: - obj.bootstrap_context = DEFAULT_EVENT_STATI[code][2] - obj.save() - return obj class EventStatus(models.Model): @@ -60,5 +32,24 @@ class EventStatus(models.Model): def get_bootstrap_label(self): context = self.bootstrap_context or 'default' - return u'{label}'.format(context=context, - label=self.label) + return format_html(u'{label}', + context=context, + label=self.label) + #return u'{label}'.format(context=context, + # label=self.label) + + +def get_or_create_event_status(code): + try: + obj = EventStatus.objects.get(code=code) + except EventStatus.DoesNotExist as e: + from ..workflow import DEFAULT_EVENT_STATI + if code not in DEFAULT_EVENT_STATI: + raise e + severity = DEFAULT_EVENT_STATI[code][0] + label = DEFAULT_EVENT_STATI[code][1] + obj = EventStatus(code=code, severity=severity, label=label) + if DEFAULT_EVENT_STATI[code][2]: + obj.bootstrap_context = DEFAULT_EVENT_STATI[code][2] + obj.save() + return obj diff --git a/dav_events/models/oneclickaction.py b/dav_events/models/oneclickaction.py index 461e015..1ee9ce1 100644 --- a/dav_events/models/oneclickaction.py +++ b/dav_events/models/oneclickaction.py @@ -86,7 +86,7 @@ class OneClickAction(models.Model): 'user': flag.user.get_full_name(), }) else: - flag = event.confirm_status(status_code, user) + flag = event.workflow.update_status(status_code, user) message = (ugettext(u'Der Status wurde auf \'%(status)s\' gesetzt.') % {'status': flag.status.label}) diff --git a/dav_events/templates/dav_events/event/default.html b/dav_events/templates/dav_events/event/default.html index 7b578fe..6621288 100644 --- a/dav_events/templates/dav_events/event/default.html +++ b/dav_events/templates/dav_events/event/default.html @@ -1,14 +1,10 @@ {% load i18n %} +{% load dav_events %}
- {% for flag in event.get_status_flags %} - {{ flag.status.get_bootstrap_label|safe }} - {% if planned_publication_date and flag.status.code|slice:":10" == 'publishing' %} - {{ planned_publication_date|date:'d.m.Y' }} - {% endif %} - {% endfor %} + {% render_event_status event show_void='False' %}
{{ number }} - {{ title }}
diff --git a/dav_events/templates/dav_events/event_detail.html b/dav_events/templates/dav_events/event_detail.html index 0c11e64..dc2155b 100644 --- a/dav_events/templates/dav_events/event_detail.html +++ b/dav_events/templates/dav_events/event_detail.html @@ -68,7 +68,7 @@ @@ -102,9 +110,9 @@
{% if has_permission_submit %} - - {% if 'submitted' in event.get_status_codes %} + {% if is_submitted %} {% bootstrap_icon 'check' %}  {% else %} {% bootstrap_icon 'unchecked' %}  @@ -113,9 +121,9 @@ {% endif %} {% if has_permission_accept %} - - {% if 'accepted' in event.get_status_codes %} + {% if is_accepted %} {% bootstrap_icon 'check' %}  {% else %} {% bootstrap_icon 'unchecked' %}  @@ -124,9 +132,9 @@ {% endif %} {% if has_permission_publish %} - - {% if 'publishing' in event.get_status_codes or 'published' in event.get_status_codes %} + {% if is_publishing %} {% bootstrap_icon 'check' %}  {% else %} {% bootstrap_icon 'unchecked' %}  diff --git a/dav_events/templates/dav_events/event_list.html b/dav_events/templates/dav_events/event_list.html index 9b51f16..dee44ed 100644 --- a/dav_events/templates/dav_events/event_list.html +++ b/dav_events/templates/dav_events/event_list.html @@ -1,6 +1,7 @@ {% extends 'dav_events/base.html' %} {% load bootstrap3 %} {% load i18n %} +{% load dav_events %} {% block page-container-fluid %}
@@ -43,11 +44,13 @@ {% for event in event_list %} - - {{ event.get_number }}
+ {% with number=event.get_number %} + + {{ number }}
({{ event.get_sport_display }}) + {% endwith %} {{ event.title }} @@ -65,14 +68,7 @@ {{ event.get_numeric_date }} - {% for flag in event.get_status_flags %} - {{ flag.status.get_bootstrap_label|safe }} - {% if event.planned_publication_date and flag.status.code|slice:':10' == 'publishing' %} - {{ event.planned_publication_date|date:'d.m.Y' }} - {% endif %} - {% empty %} - {{ event.get_status.get_bootstrap_label|safe }} - {% endfor %} + {% render_event_status event %} {% endfor %} diff --git a/dav_events/templates/dav_events/event_update_form.html b/dav_events/templates/dav_events/event_update_form.html index ac6c95b..9b4a3c0 100644 --- a/dav_events/templates/dav_events/event_update_form.html +++ b/dav_events/templates/dav_events/event_update_form.html @@ -21,18 +21,18 @@
{% csrf_token %} - {% if 'expired' in event.get_status_codes %} + {% if is_expired %} - {% elif 'publishing' in event.get_status_codes or 'published' in event.get_status_codes %} + {% elif is_publishing %} - {% elif 'accepted' in event.get_status_codes %} + {% elif is_accepted %}