FIX: fixed several deadline issues.
This commit is contained in:
@@ -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,33 +677,36 @@ 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)
|
|
||||||
|
|
||||||
if first_day:
|
|
||||||
new_choices = []
|
new_choices = []
|
||||||
for key, desc in self.fields['deadline'].choices:
|
for key, desc in self.fields['deadline'].choices:
|
||||||
if key == 'month':
|
field_name = 'deadline_%s' % key
|
||||||
m = first_day.month - 1 - 1
|
if field_name in self.fields:
|
||||||
y = first_day.year + m / 12
|
date_str = self.get_initial_for_field(self.fields[field_name], field_name)
|
||||||
m = m % 12 + 1
|
datetime_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
|
||||||
d = min(first_day.day, calendar.monthrange(y, m)[1])
|
date = datetime_obj.date()
|
||||||
date = datetime.date(y, m, d)
|
|
||||||
desc += u' ({})'.format(format_date(date, 'EEEE, d. MMMM yyyy', locale=get_language()[0:2]))
|
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))
|
new_choices.append((key, desc))
|
||||||
self.fields['deadline'].choices = new_choices
|
self.fields['deadline'].choices = new_choices
|
||||||
|
|
||||||
@@ -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:
|
|
||||||
publication_deadline = deadline - datetime.timedelta(app_config.settings.publish_before_deadline_days)
|
|
||||||
else:
|
|
||||||
first_day = self._session_data.get('first_day')
|
first_day = self._session_data.get('first_day')
|
||||||
publication_deadline = first_day - datetime.timedelta(app_config.settings.publish_before_begin_days)
|
issue_date, issue = workflow.plan_publication(first_day, deadline)
|
||||||
|
if issue_date:
|
||||||
today = datetime.date.today()
|
self.fields['planned_publication_date'].initial = issue_date
|
||||||
|
self.fields['planned_publication_issue'].initial = issue
|
||||||
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
|
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user