def pre_transition(self): res = super(IsByEmail, self).pre_transition() if self.wizard.email: res.globals[u'delivered_date'] = local_date(self.wizard.email.processed) res.globals[u'attachments'] = None res.next = CanAddClarificationRequest else: res.next = InputBasics return res
def __init__(self, *args, **kwargs): self.instance = kwargs.pop(u'instance') attached_to = kwargs.pop(u'attached_to') super(InforequestEmailAdminDecideForm, self).__init__(*args, **kwargs) self.fields[u'branch'].queryset = Branch.objects.filter(inforequest=self.instance.inforequest).order_by_pk() self.fields[u'branch'].widget.url_params = dict(inforequest=self.instance.inforequest) self.fields[u'subject'].initial = self.instance.email.subject self.fields[u'content'].initial = self.instance.email.text self.fields[u'attachments'].initial = self.instance.email.attachment_set.order_by_pk() self.fields[u'attachments'].attached_to = [self.instance.email, attached_to] self.fields[u'effective_date'].initial = local_date(self.instance.email.processed)
def pre_transition(self): res = super(IsByEmail, self).pre_transition() if self.wizard.email: res.globals[u'delivered_date'] = local_date( self.wizard.email.processed) res.globals[u'attachments'] = None res.next = CanAddClarificationRequest else: res.next = InputBasics return res
def _decide_email(request, inforequest_pk, email_pk, form_class): assert form_class.action_type in Action.OBLIGEE_EMAIL_ACTION_TYPES inforequest = (Inforequest.objects .not_closed() .owned_by(request.user) .prefetch_related(Inforequest.prefetch_branches(None, Branch.objects.select_related(u'historicalobligee'))) .prefetch_related(Branch.prefetch_last_action(u'branches')) .get_or_404(pk=inforequest_pk) ) inforequestemail = (inforequest.inforequestemail_set .undecided() .oldest() .select_related(u'email') .get_or_404() ) email = inforequestemail.email if email.pk != Message._meta.pk.to_python(email_pk): return HttpResponseNotFound() if not inforequest.can_add_action(form_class.action_type): return HttpResponseNotFound() if request.method != u'POST': form = form_class(inforequest=inforequest) return render_form(request, form, inforequest=inforequest, email=email) form = form_class(request.POST, inforequest=inforequest) if not form.is_valid(): return json_form(request, form, inforequest=inforequest, email=email) action = Action( subject=email.subject, content=email.text, effective_date=local_date(email.processed), email=email, type=form_class.action_type, ) form.save(action) action.save() for attch in email.attachments: attachment = attch.clone(action) attachment.save() inforequestemail.type = InforequestEmail.TYPES.OBLIGEE_ACTION inforequestemail.save(update_fields=[u'type']) # The inforequest was changed, we need to refetch it inforequest = Inforequest.objects.prefetch_detail().get(pk=inforequest.pk) return json_success(request, inforequest, action)
def obligee_deadline_reminder(): with translation(settings.LANGUAGE_CODE): inforequests = (Inforequest.objects.not_closed(). without_undecided_email().prefetch_related( Inforequest.prefetch_branches()).prefetch_related( Branch.prefetch_last_action(u'branches'))) filtered = [] for inforequest in inforequests: for branch in inforequest.branches: try: if not branch.last_action.has_obligee_deadline: continue if not branch.last_action.deadline_missed: continue # The last reminder was sent after the deadline was extended for the last time iff # the extended deadline was missed before the reminder was sent. We don't want to # send any more reminders if the last reminder was sent after the deadline was # extended for the last time. last = branch.last_action.last_deadline_reminder last_date = local_date(last) if last else None if last and branch.last_action.deadline_missed_at( last_date): continue nop() # To let tests raise testing exception here. filtered.append(branch) except Exception: cron_logger.error( u'Checking if obligee deadline reminder should be sent failed: %s\n%s' % (repr(branch.last_action), traceback.format_exc())) if not filtered: return filtered = (Branch.objects.select_related(u'inforequest__applicant'). select_related(u'historicalobligee').prefetch_related( Branch.prefetch_last_action()).filter( pk__in=(o.pk for o in filtered))) for branch in filtered: try: with transaction.atomic(): branch.inforequest.send_obligee_deadline_reminder( branch.last_action) nop() # To let tests raise testing exception here. cron_logger.info( u'Sent obligee deadline reminder: %s' % repr(branch.last_action)) # pragma: no branch except Exception: cron_logger.error( u'Sending obligee deadline reminder failed: %s\n%s' % (repr(branch.last_action), traceback.format_exc()))
def save_action(self): assert self.values[u'result'] == u'action' assert self.values[u'result_action'] in Action.OBLIGEE_ACTION_TYPES assert not self.email or self.values[ u'result_action'] in Action.OBLIGEE_EMAIL_ACTION_TYPES assert self.values[u'result_branch'].can_add_action( self.values[u'result_action']) action = Action(type=self.values[u'result_action']) action.branch = self.values[u'result_branch'] action.email = self.email if self.email else None action.subject = self.email.subject if self.email else u'' action.content = self.email.text if self.email else u'' action.effective_date = (local_date(self.email.processed) if self.email else self.values[u'result_effective_date']) action.file_number = self.values.get(u'result_file_number', u'') action.deadline = self.values.get(u'result_deadline', None) action.disclosure_level = self.values.get(u'result_disclosure_level', None) action.refusal_reason = self.values.get(u'result_refusal_reason', None) action.save() if self.email: for attch in self.email.attachments: attachment = attch.clone(action) attachment.save() else: action.attachment_set = self.values[u'result_attachments'] for obligee in self.values.get(u'result_advanced_to', []): if obligee: sub_branch = Branch( obligee=obligee, inforequest=action.branch.inforequest, advanced_by=action, ) sub_branch.save() sub_action = Action( branch=sub_branch, effective_date=action.effective_date, type=Action.TYPES.ADVANCED_REQUEST, ) sub_action.save() if self.email: self.inforequestemail.type = InforequestEmail.TYPES.OBLIGEE_ACTION self.inforequestemail.save(update_fields=[u'type']) return action
def obligee_deadline_reminder(): with translation(settings.LANGUAGE_CODE): inforequests = (Inforequest.objects .not_closed() .without_undecided_email() .prefetch_related(Inforequest.prefetch_branches()) .prefetch_related(Branch.prefetch_last_action(u'branches')) ) filtered = [] for inforequest in inforequests: for branch in inforequest.branches: action = branch.last_action try: if not action.has_obligee_deadline_snooze_missed: continue # The last reminder was sent after the applicant snoozed for the last time iff # the snooze was missed before the reminder was sent. We don't want to send any # more reminders if the last reminder was sent after the last snooze. last = action.last_deadline_reminder last_date = local_date(last) if last else None if last and action.deadline.is_snooze_missed_at(last_date): continue filtered.append(branch) except Exception: msg = u'Checking if obligee deadline reminder should be sent failed: {}\n{}' trace = unicode(traceback.format_exc(), u'utf-8') cron_logger.error(msg.format(action, trace)) if not filtered: return filtered = (Branch.objects .select_related(u'inforequest__applicant') .select_related(u'historicalobligee') .prefetch_related(Branch.prefetch_last_action()) .filter(pk__in=(o.pk for o in filtered)) ) for branch in filtered: try: with transaction.atomic(): branch.inforequest.send_obligee_deadline_reminder(branch.last_action) msg = u'Sent obligee deadline reminder: {}' cron_logger.info(msg.format(branch.last_action)) except Exception: msg = u'Sending obligee deadline reminder failed: {}\n{}' trace = unicode(traceback.format_exc(), u'utf-8') cron_logger.error(msg.format(branch.last_action, trace))
def obligee_deadline_reminder(): with translation(settings.LANGUAGE_CODE): inforequests = (Inforequest.objects .not_closed() .without_undecided_email() .prefetch_related(Inforequest.prefetch_branches()) .prefetch_related(Branch.prefetch_last_action(u'branches')) ) filtered = [] for inforequest in inforequests: for branch in inforequest.branches: try: if not branch.last_action.has_obligee_deadline: continue if not branch.last_action.deadline_missed: continue # The last reminder was sent after the deadline was extended for the last time iff # the extended deadline was missed before the reminder was sent. We don't want to # send any more reminders if the last reminder was sent after the deadline was # extended for the last time. last = branch.last_action.last_deadline_reminder last_date = local_date(last) if last else None if last and branch.last_action.deadline_missed_at(last_date): continue nop() # To let tests raise testing exception here. filtered.append(branch) except Exception: cron_logger.error(u'Checking if obligee deadline reminder should be sent failed: %s\n%s' % (repr(branch.last_action), traceback.format_exc())) if not filtered: return filtered = (Branch.objects .select_related(u'inforequest__applicant') .select_related(u'historicalobligee') .prefetch_related(Branch.prefetch_last_action()) .filter(pk__in=(o.pk for o in filtered)) ) for branch in filtered: try: with transaction.atomic(): branch.inforequest.send_obligee_deadline_reminder(branch.last_action) nop() # To let tests raise testing exception here. cron_logger.info(u'Sent obligee deadline reminder: %s' % repr(branch.last_action)) # pragma: no branch except Exception: cron_logger.error(u'Sending obligee deadline reminder failed: %s\n%s' % (repr(branch.last_action), traceback.format_exc()))
def obligee_deadline_reminder(): with translation(settings.LANGUAGE_CODE): inforequests = (Inforequest.objects.not_closed(). without_undecided_email().prefetch_related( Inforequest.prefetch_branches()).prefetch_related( Branch.prefetch_last_action(u'branches'))) filtered = [] for inforequest in inforequests: for branch in inforequest.branches: action = branch.last_action try: if not action.has_obligee_deadline_snooze_missed: continue # The last reminder was sent after the applicant snoozed for the last time iff # the snooze was missed before the reminder was sent. We don't want to send any # more reminders if the last reminder was sent after the last snooze. last = action.last_deadline_reminder last_date = local_date(last) if last else None if last and action.deadline.is_snooze_missed_at(last_date): continue filtered.append(branch) except Exception: msg = u'Checking if obligee deadline reminder should be sent failed: {}\n{}' trace = unicode(traceback.format_exc(), u'utf-8') cron_logger.error(msg.format(action, trace)) if not filtered: return filtered = (Branch.objects.select_related(u'inforequest__applicant'). select_related(u'historicalobligee').prefetch_related( Branch.prefetch_last_action()).filter( pk__in=(o.pk for o in filtered))) for branch in filtered: try: with transaction.atomic(): branch.inforequest.send_obligee_deadline_reminder( branch.last_action) msg = u'Sent obligee deadline reminder: {}' cron_logger.info(msg.format(branch.last_action)) except Exception: msg = u'Sending obligee deadline reminder failed: {}\n{}' trace = unicode(traceback.format_exc(), u'utf-8') cron_logger.error(msg.format(branch.last_action, trace))
def __init__(self, *args, **kwargs): self.instance = kwargs.pop(u'instance') attached_to = kwargs.pop(u'attached_to') super(InforequestEmailAdminDecideForm, self).__init__(*args, **kwargs) self.fields[u'branch'].queryset = Branch.objects.filter( inforequest=self.instance.inforequest).order_by_pk() self.fields[u'branch'].widget.url_params = dict( inforequest=self.instance.inforequest) self.fields[u'subject'].initial = self.instance.email.subject self.fields[u'content'].initial = self.instance.email.text self.fields[ u'attachments'].initial = self.instance.email.attachment_set.order_by_pk( ) self.fields[u'attachments'].attached_to = [ self.instance.email, attached_to ] self.fields[u'effective_date'].initial = local_date( self.instance.email.processed)
def undecided_email_reminder(): with translation(settings.LANGUAGE_CODE): inforequests = (Inforequest.objects.not_closed().with_undecided_email( ).prefetch_related(Inforequest.prefetch_newest_undecided_email())) filtered = [] for inforequest in inforequests: try: email = inforequest.newest_undecided_email last = inforequest.last_undecided_email_reminder if last and last > email.processed: continue days = workdays.between(local_date(email.processed), local_today()) if days < 5: continue nop() # To let tests raise testing exception here. filtered.append(inforequest) except Exception: cron_logger.error( u'Checking if undecided email reminder should be sent failed: %s\n%s' % (repr(inforequest), traceback.format_exc())) if not filtered: return filtered = (Inforequest.objects.select_related( u'applicant').select_undecided_emails_count().prefetch_related( Inforequest.prefetch_main_branch( None, Branch.objects.select_related(u'historicalobligee')) ).prefetch_related( Inforequest.prefetch_newest_undecided_email()).filter( pk__in=(o.pk for o in filtered))) for inforequest in filtered: try: with transaction.atomic(): inforequest.send_undecided_email_reminder() nop() # To let tests raise testing exception here. cron_logger.info(u'Sent undecided email reminder: %s' % repr(inforequest)) # pragma: no branch except Exception: cron_logger.error( u'Sending undecided email reminder failed: %s\n%s' % (repr(inforequest), traceback.format_exc()))
def undecided_email_reminder(): with translation(settings.LANGUAGE_CODE): inforequests = (Inforequest.objects .not_closed() .with_undecided_email() .prefetch_related(Inforequest.prefetch_newest_undecided_email()) ) filtered = [] for inforequest in inforequests: try: email = inforequest.newest_undecided_email last = inforequest.last_undecided_email_reminder if last and last > email.processed: continue days = workdays.between(local_date(email.processed), local_today()) if days < 5: continue filtered.append(inforequest) except Exception: msg = u'Checking if undecided email reminder should be sent failed: {}\n{}' trace = unicode(traceback.format_exc(), u'utf-8') cron_logger.error(msg.format(inforequest, trace)) if not filtered: return filtered = (Inforequest.objects .select_related(u'applicant') .select_undecided_emails_count() .prefetch_related(Inforequest.prefetch_main_branch(None, Branch.objects.select_related(u'historicalobligee'))) .prefetch_related(Inforequest.prefetch_newest_undecided_email()) .filter(pk__in=(o.pk for o in filtered)) ) for inforequest in filtered: try: with transaction.atomic(): inforequest.send_undecided_email_reminder() cron_logger.info(u'Sent undecided email reminder: {}'.format(inforequest)) except Exception: msg = u'Sending undecided email reminder failed: {}\n{}' trace = unicode(traceback.format_exc(), u'utf-8') cron_logger.error(msg.format(inforequest, trace))
def undecided_email_reminder(): with translation(settings.LANGUAGE_CODE): inforequests = (Inforequest.objects.not_closed().with_undecided_email( ).prefetch_related(Inforequest.prefetch_newest_undecided_email())) filtered = [] for inforequest in inforequests: try: email = inforequest.newest_undecided_email last = inforequest.last_undecided_email_reminder if last and last > email.processed: continue days = workdays.between(local_date(email.processed), local_today()) if days < 5: continue filtered.append(inforequest) except Exception: msg = u'Checking if undecided email reminder should be sent failed: {}\n{}' trace = unicode(traceback.format_exc(), u'utf-8') cron_logger.error(msg.format(inforequest, trace)) if not filtered: return filtered = (Inforequest.objects.select_related( u'applicant').select_undecided_emails_count().prefetch_related( Inforequest.prefetch_main_branch( None, Branch.objects.select_related(u'historicalobligee')) ).prefetch_related( Inforequest.prefetch_newest_undecided_email()).filter( pk__in=(o.pk for o in filtered))) for inforequest in filtered: try: with transaction.atomic(): inforequest.send_undecided_email_reminder() cron_logger.info( u'Sent undecided email reminder: {}'.format( inforequest)) except Exception: msg = u'Sending undecided email reminder failed: {}\n{}' trace = unicode(traceback.format_exc(), u'utf-8') cron_logger.error(msg.format(inforequest, trace))
def undecided_email_reminder(): with translation(settings.LANGUAGE_CODE): inforequests = (Inforequest.objects .not_closed() .with_undecided_email() .prefetch_related(Inforequest.prefetch_newest_undecided_email()) ) filtered = [] for inforequest in inforequests: try: email = inforequest.newest_undecided_email last = inforequest.last_undecided_email_reminder if last and last > email.processed: continue days = workdays.between(local_date(email.processed), local_today()) if days < 5: continue nop() # To let tests raise testing exception here. filtered.append(inforequest) except Exception: cron_logger.error(u'Checking if undecided email reminder should be sent failed: %s\n%s' % (repr(inforequest), traceback.format_exc())) if not filtered: return filtered = (Inforequest.objects .select_related(u'applicant') .select_undecided_emails_count() .prefetch_related(Inforequest.prefetch_main_branch(None, Branch.objects.select_related(u'historicalobligee'))) .prefetch_related(Inforequest.prefetch_newest_undecided_email()) .filter(pk__in=(o.pk for o in filtered)) ) for inforequest in filtered: try: with transaction.atomic(): inforequest.send_undecided_email_reminder() nop() # To let tests raise testing exception here. cron_logger.info(u'Sent undecided email reminder: %s' % repr(inforequest)) # pragma: no branch except Exception: cron_logger.error(u'Sending undecided email reminder failed: %s\n%s' % (repr(inforequest), traceback.format_exc()))
def test_local_date(self): value = local_date(self._parse_dt(u'2014-12-10 15:45:00', u'UTC')) self._check_date(value, u'2014-12-10')
def test_local_date_with_day_change(self): value = local_date(self._parse_dt(u'2014-12-10 23:45:00', u'UTC')) self._check_date(value, u'2014-12-11')
def test_local_date_with_tz_as_tzinfo(self): value = local_date(self._parse_dt(u'2014-12-10 15:45:00', u'UTC'), pytz.timezone(u'America/Montreal')) self._check_date(value, u'2014-12-10')
def test_local_date_with_tz_as_string(self): value = local_date(self._parse_dt(u'2014-12-10 15:45:00', u'UTC'), u'America/Montreal') self._check_date(value, u'2014-12-10')
def test_local_date(self): value = local_date(self._parse_dt(u'2014-12-10 15:45:00', u'UTC')) self._check_date(value, u'2014-12-10')
def test_local_date_with_day_change(self): value = local_date(self._parse_dt(u'2014-12-10 23:45:00', u'UTC')) self._check_date(value, u'2014-12-11')
def test_local_date_with_tz_as_string(self): value = local_date(self._parse_dt(u'2014-12-10 15:45:00', u'UTC'), u'America/Montreal') self._check_date(value, u'2014-12-10')
def test_local_date_with_tz_as_tzinfo(self): value = local_date(self._parse_dt(u'2014-12-10 15:45:00', u'UTC'), pytz.timezone(u'America/Montreal')) self._check_date(value, u'2014-12-10')