From 188589c8b0ed252b431aafcdff4818d2c651d6dd Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 20 Dec 2018 15:32:13 +0100 Subject: [PATCH] FIX: fixed several deadline issues. --- dav_events/forms/events.py | 86 ++++++++++++++------------------------ dav_events/workflow.py | 35 +++++++++++++++- 2 files changed, 65 insertions(+), 56 deletions(-) diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index ac2b638..188963f 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -13,6 +13,7 @@ from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget from .. import choices from .. import config from .. import models +from ..workflow import workflow from .generic import ChainedForm, ModelMixin app_config = apps.get_containing_app_config(__package__) @@ -676,35 +677,38 @@ class RegistrationForm(EventCreateForm): if trainer_3: n_trainer += 1 value = n_trainer * matrix_config[field_name] + elif field_name == 'deadline_month': + first_day = self._session_data.get('first_day') + m = first_day.month - 1 - 1 + y = first_day.year + m / 12 + m = m % 12 + 1 + d = min(first_day.day, calendar.monthrange(y, m)[1]) + date = datetime.date(y, m, d) + value = date.isoformat() + elif field_name == 'deadline_quarter': + first_day = self._session_data.get('first_day') + m = first_day.month - 1 - 3 + y = first_day.year + m / 12 + m = m % 12 + 1 + d = min(first_day.day, calendar.monthrange(y, m)[1]) + date = datetime.date(y, m, d) + value = date.isoformat() return value def proceed_session_data(self, session_data): super(RegistrationForm, self).proceed_session_data(session_data) - first_day = session_data.get('first_day', None) - - if first_day: - new_choices = [] - for key, desc in self.fields['deadline'].choices: - if key == 'month': - m = first_day.month - 1 - 1 - y = first_day.year + m / 12 - m = m % 12 + 1 - d = min(first_day.day, calendar.monthrange(y, m)[1]) - date = datetime.date(y, m, d) - desc += u' ({})'.format(format_date(date, 'EEEE, d. MMMM yyyy', locale=get_language()[0:2])) - self.fields['deadline_month'].initial = date.isoformat() - elif key == 'quarter': - m = first_day.month - 1 - 3 - y = first_day.year + m / 12 - m = m % 12 + 1 - d = min(first_day.day, calendar.monthrange(y, m)[1]) - date = datetime.date(y, m, d) - desc += u' ({})'.format(format_date(date, 'EEEE, d. MMMM yyyy', locale=get_language()[0:2])) - self.fields['deadline_quarter'].initial = date.isoformat() - new_choices.append((key, desc)) - self.fields['deadline'].choices = new_choices + new_choices = [] + for key, desc in self.fields['deadline'].choices: + field_name = 'deadline_%s' % key + if field_name in self.fields: + date_str = self.get_initial_for_field(self.fields[field_name], field_name) + datetime_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d') + date = datetime_obj.date() + desc += u' ({})'.format(format_date(date, 'EEEE, d. MMMM yyyy', locale=get_language()[0:2])) + new_choices.append((key, desc)) + self.fields['deadline'].choices = new_choices class ChargesForm(EventCreateForm): @@ -950,34 +954,8 @@ class SummaryForm(EventCreateForm): logger.error('SummaryForm.proceed_session_data(): invalid value for deadline.') deadline = None - if deadline: - publication_deadline = deadline - datetime.timedelta(app_config.settings.publish_before_deadline_days) - else: - first_day = self._session_data.get('first_day') - publication_deadline = first_day - datetime.timedelta(app_config.settings.publish_before_begin_days) - - today = datetime.date.today() - - break_outer_loop = False - for year in (today.year, today.year + 1): - for issue in app_config.settings.publish_issues: - if not ('issue' in issue and 'release' in issue and 'deadline' in issue): - logger.error('SummaryForm.proceed_session_data(): invalid configured issue.') - continue - - issue_release = datetime.date(year, issue['release'][1], issue['release'][0]) - if issue_release < today: - continue - - issue_deadline = datetime.date(year, issue['deadline'][1], issue['deadline'][0]) - if issue_deadline > issue_release: - issue_deadline = datetime.date(year - 1, issue['deadline'][1], issue['deadline'][0]) - - if publication_deadline > issue_release and today < issue_deadline: - self.fields['planned_publication_date'].initial = issue_release - self.fields['planned_publication_issue'].initial = u'%s/%s' % (issue['issue'], year) - break_outer_loop = True - break - - if break_outer_loop: - break + first_day = self._session_data.get('first_day') + issue_date, issue = workflow.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/workflow.py b/dav_events/workflow.py index 750a5c8..37d7076 100644 --- a/dav_events/workflow.py +++ b/dav_events/workflow.py @@ -13,7 +13,6 @@ class BasicWorkflow(object): # # Status updates # - @classmethod def validate_status_code_update(cls, code, event, callback=None, *args, **kwargs): valid = True @@ -124,7 +123,6 @@ class BasicWorkflow(object): # # Signal handlers # - @classmethod def send_emails_on_event_update(cls, sender, **kwargs): event = kwargs.get('event') @@ -205,5 +203,38 @@ class BasicWorkflow(object): confirm_publication_action=action) email.send() + # + # Misc logic + # + @classmethod + def plan_publication(cls, first_day, deadline=None): + app_config = apps.get_containing_app_config(__package__) + + if deadline: + publication_deadline = deadline - datetime.timedelta(app_config.settings.publish_before_deadline_days) + else: + publication_deadline = first_day - datetime.timedelta(app_config.settings.publish_before_begin_days) + + today = datetime.date.today() + + for year in (today.year, today.year + 1): + for issue in app_config.settings.publish_issues: + if not ('issue' in issue and 'release' in issue and 'deadline' in issue): + logger.error('workflow.plan_publication(): invalid configured issue.') + continue + + issue_release = datetime.date(year, issue['release'][1], issue['release'][0]) + if issue_release < today: + continue + + issue_deadline = datetime.date(year, issue['deadline'][1], issue['deadline'][0]) + if issue_deadline > issue_release: + issue_deadline = datetime.date(year - 1, issue['deadline'][1], issue['deadline'][0]) + + if publication_deadline > issue_release and today <= issue_deadline: + return issue_release, u'%s/%s' % (issue['issue'], year) + + return None, None + workflow = BasicWorkflow