def follow_up_reports(self, ae_initial): """Returns a formatted list of links to AE Follow up reports.""" followups = [] AeFollowup = get_ae_model("aefollowup") AeSusar = get_ae_model("aesusar") for ae_followup in AeFollowup.objects.filter( related_action_item=ae_initial.action_item): url = self.get_changelist_url(ae_followup) report_datetime = ae_followup.report_datetime.strftime( convert_php_dateformat(settings.SHORT_DATETIME_FORMAT)) followups.append( f'<a title="go to AE follow up report for ' f'{report_datetime}" ' f'href="{url}?q={ae_initial.action_identifier}">' f"<span nowrap>{ae_followup.identifier}</span></a>") for ae_susar in AeSusar.objects.filter( related_action_item=ae_initial.action_item): url = self.get_changelist_url(ae_susar) report_datetime = ae_susar.report_datetime.strftime( convert_php_dateformat(settings.SHORT_DATETIME_FORMAT)) followups.append( f'<a title="go to AE SUSAR report for ' f'{report_datetime}" ' f'href="{url}?q={ae_initial.action_identifier}">' f"<span nowrap>{ae_susar.identifier} (SUSAR)</span></a>") if followups: return mark_safe("<BR>".join(followups)) return None
def user(self, obj): """Returns formatted user names and creation/modification dates.""" return mark_safe("<BR>".join([ obj.user_created, obj.created.strftime( convert_php_dateformat(settings.SHORT_DATE_FORMAT)), obj.user_modified, obj.modified.strftime( convert_php_dateformat(settings.SHORT_DATE_FORMAT)), ]))
def validate_ae_initial_outcome_date(form_obj): ae_initial = form_obj.cleaned_data.get("ae_initial") if not ae_initial and form_obj.instance: ae_initial = form_obj.instance.ae_initial outcome_date = form_obj.cleaned_data.get("outcome_date") if ae_initial and outcome_date: if outcome_date < ae_initial.ae_start_date: formatted_dte = ae_initial.ae_start_date.strftime( convert_php_dateformat(settings.SHORT_DATE_FORMAT)) raise forms.ValidationError({ "outcome_date": (f"May not be before the AE start date {formatted_dte}.") })
def validate_consent_datetime(self): """Validate consent datetime with the eligibility datetime. Eligibility datetime must come first. Watchout for timezone. """ if (self.consent_datetime - self.subject_screening.eligibility_datetime ).total_seconds() < 0: local_dt = self.subject_screening.eligibility_datetime.astimezone( self.tz) formatted = local_dt.strftime( convert_php_dateformat(settings.SHORT_DATETIME_FORMAT)) raise forms.ValidationError( { "consent_datetime": (f"Cannot be before the date and time eligibility " f"was confirmed. Eligibility was confirmed at " f"{formatted}.") }, )
def validate(self): # datetime_not_before_study_start try: datetime_not_before_study_start(self.report_datetime) except ValidationError as e: message = e.message if hasattr(e, "message") else str(e) raise CrfReportDateBeforeStudyStart(message) # datetime_not_future try: datetime_not_future(self.report_datetime) except ValidationError as e: message = e.message if hasattr(e, "message") else str(e) raise CrfReportDateIsFuture(message) formatted_visit_datetime = self.visit_report_datetime.strftime( convert_php_dateformat(settings.SHORT_DATE_FORMAT)) # not before the visit report_datetime if (not self.allow_report_datetime_before_visit and self.report_datetime.date() < self.visit_report_datetime.date()): raise CrfReportDateAllowanceError( "Report datetime may not be before the visit report datetime. " f"Visit report datetime is {formatted_visit_datetime}. ") # not more than x days greater than the visit report_datetime # if self.report_datetime_allowance > 0: max_allowed_report_datetime = self.visit_report_datetime + relativedelta( days=self.report_datetime_allowance) if self.report_datetime.date() > max_allowed_report_datetime.date(): diff = (max_allowed_report_datetime.date() - self.visit_report_datetime.date()).days raise CrfReportDateAllowanceError( f"Report datetime may not be more than {self.report_datetime_allowance} " f"days greater than the visit report datetime. Got {diff} days." f"Visit report datetime is {formatted_visit_datetime}. " f"See also AppConfig.report_datetime_allowance.")