FIX: fixed several deadline issues.

This commit is contained in:
2018-12-20 15:32:13 +01:00
parent 06a42fca18
commit 188589c8b0
2 changed files with 65 additions and 56 deletions

View File

@@ -13,6 +13,7 @@ from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget
from .. import choices from .. import choices
from .. import config from .. import config
from .. import models from .. import models
from ..workflow import workflow
from .generic import ChainedForm, ModelMixin from .generic import ChainedForm, ModelMixin
app_config = apps.get_containing_app_config(__package__) app_config = apps.get_containing_app_config(__package__)
@@ -676,35 +677,38 @@ class RegistrationForm(EventCreateForm):
if trainer_3: if trainer_3:
n_trainer += 1 n_trainer += 1
value = n_trainer * matrix_config[field_name] 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 return value
def proceed_session_data(self, session_data): def proceed_session_data(self, session_data):
super(RegistrationForm, self).proceed_session_data(session_data) super(RegistrationForm, self).proceed_session_data(session_data)
first_day = session_data.get('first_day', None) new_choices = []
for key, desc in self.fields['deadline'].choices:
if first_day: field_name = 'deadline_%s' % key
new_choices = [] if field_name in self.fields:
for key, desc in self.fields['deadline'].choices: date_str = self.get_initial_for_field(self.fields[field_name], field_name)
if key == 'month': datetime_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
m = first_day.month - 1 - 1 date = datetime_obj.date()
y = first_day.year + m / 12 desc += u' ({})'.format(format_date(date, 'EEEE, d. MMMM yyyy', locale=get_language()[0:2]))
m = m % 12 + 1 new_choices.append((key, desc))
d = min(first_day.day, calendar.monthrange(y, m)[1]) self.fields['deadline'].choices = new_choices
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
class ChargesForm(EventCreateForm): class ChargesForm(EventCreateForm):
@@ -950,34 +954,8 @@ class SummaryForm(EventCreateForm):
logger.error('SummaryForm.proceed_session_data(): invalid value for deadline.') logger.error('SummaryForm.proceed_session_data(): invalid value for deadline.')
deadline = None deadline = None
if deadline: first_day = self._session_data.get('first_day')
publication_deadline = deadline - datetime.timedelta(app_config.settings.publish_before_deadline_days) issue_date, issue = workflow.plan_publication(first_day, deadline)
else: if issue_date:
first_day = self._session_data.get('first_day') self.fields['planned_publication_date'].initial = issue_date
publication_deadline = first_day - datetime.timedelta(app_config.settings.publish_before_begin_days) self.fields['planned_publication_issue'].initial = issue
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

View File

@@ -13,7 +13,6 @@ class BasicWorkflow(object):
# #
# Status updates # Status updates
# #
@classmethod @classmethod
def validate_status_code_update(cls, code, event, callback=None, *args, **kwargs): def validate_status_code_update(cls, code, event, callback=None, *args, **kwargs):
valid = True valid = True
@@ -124,7 +123,6 @@ class BasicWorkflow(object):
# #
# Signal handlers # Signal handlers
# #
@classmethod @classmethod
def send_emails_on_event_update(cls, sender, **kwargs): def send_emails_on_event_update(cls, sender, **kwargs):
event = kwargs.get('event') event = kwargs.get('event')
@@ -205,5 +203,38 @@ class BasicWorkflow(object):
confirm_publication_action=action) confirm_publication_action=action)
email.send() 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 workflow = BasicWorkflow