class DmInitialReview(InitialReviewModelMixin, GlucoseModelMixin, CrfModelMixin, edc_models.BaseUuidModel): # TODO: change to m2m 10 JULY 2020 # remove "alone" ... allow select all that apply managed_by = models.CharField( verbose_name="How is the patient's diabetes managed?", max_length=25, choices=DM_MANAGEMENT, default=NOT_APPLICABLE, ) med_start_ago = edc_models.DurationYMDField( verbose_name=("If the patient is taking medicines for diabetes, " "how long have they been taking these?"), null=True, blank=True, ) med_start_estimated_date = models.DateField( verbose_name="Estimated medication start date", null=True, editable=False, ) med_start_date_estimated = models.CharField( verbose_name="Was the medication start date estimated?", max_length=15, choices=YES_NO, default=YES, editable=False, ) glucose_performed = models.CharField( verbose_name= "Has the patient had their glucose measured in the last few months?", max_length=15, choices=YES_NO, ) def save(self, *args, **kwargs): if self.med_start_ago: self.med_start_estimated_date = edc_models.duration_to_date( self.med_start_ago, self.report_datetime) super().save(*args, **kwargs) class Meta(CrfModelMixin.Meta, edc_models.BaseUuidModel.Meta): verbose_name = "Diabetes Initial Review" verbose_name_plural = "Diabetes Initial Reviews"
class ClinicalReviewBaselineHivModelMixin(models.Model): hiv_test = models.CharField( verbose_name="Has the patient ever tested for HIV infection?", max_length=15, choices=YES_NO, ) hiv_test_ago = edc_models.DurationYMDField( verbose_name="How long ago was the patient's most recent HIV test?", null=True, blank=True, help_text="If positive, most recent HIV(+) test", ) hiv_test_estimated_datetime = models.DateTimeField( null=True, blank=True, editable=False, help_text="calculated by the EDC using `hiv_test_ago`", ) hiv_test_date = models.DateField( verbose_name="Date of patient's most recent HIV test?", validators=[date_not_future], null=True, blank=True, ) hiv_dx = models.CharField( verbose_name=mark_safe( "Has the patient ever tested <U>positive</U> for HIV infection?"), max_length=15, choices=YES_NO_NA, default=NOT_APPLICABLE, help_text="If yes, complete form `HIV Initial Review`", ) def save(self, *args, **kwargs): if self.hiv_test_ago: self.hiv_test_estimated_datetime = edc_models.duration_to_date( self.hiv_test_ago, self.report_datetime) super().save(*args, **kwargs) class Meta: abstract = True
class ClinicalReviewBaselineHtnModelMixin(models.Model): htn_test = models.CharField( verbose_name="Has the patient ever tested for Hypertension?", max_length=15, choices=YES_NO, ) htn_test_ago = edc_models.DurationYMDField( verbose_name= "If Yes, how long ago was the patient tested for Hypertension?", null=True, blank=True, ) htn_test_estimated_datetime = models.DateTimeField( null=True, blank=True, help_text="calculated by the EDC using `htn_test_ago`", ) htn_test_date = models.DateField( verbose_name="Date of patient's most recent Hypertension test?", validators=[date_not_future], null=True, blank=True, ) htn_dx = models.CharField( verbose_name=mark_safe( "Has the patient ever been diagnosed with Hypertension"), max_length=15, choices=YES_NO_NA, default=NOT_APPLICABLE, help_text="If yes, complete form `Hypertension Initial Review`", ) def save(self, *args, **kwargs): if self.htn_test_ago: self.htn_test_estimated_datetime = edc_models.duration_to_date( self.htn_test_ago, self.report_datetime) super().save(*args, **kwargs) class Meta: abstract = True
class HtnInitialReview(InitialReviewModelMixin, CrfModelMixin, edc_models.BaseUuidModel): managed_by = models.CharField( verbose_name="How is the patient's hypertension managed?", max_length=15, choices=HTN_MANAGEMENT, default=NOT_APPLICABLE, ) med_start_ago = edc_models.DurationYMDField( verbose_name=("If the patient is taking medicines for hypertension, " "how long have they been taking these?"), null=True, blank=True, ) med_start_estimated_date = models.DateField( verbose_name="Estimated medication start date", null=True, editable=False, ) med_start_date_estimated = models.CharField( verbose_name="Was the medication start date estimated?", max_length=15, choices=YES_NO, default=YES, editable=False, ) def save(self, *args, **kwargs): if self.med_start_ago: self.med_start_estimated_date = edc_models.duration_to_date( self.med_start_ago, self.report_datetime) super().save(*args, **kwargs) class Meta(CrfModelMixin.Meta, edc_models.BaseUuidModel.Meta): verbose_name = "Hypertension Initial Review" verbose_name_plural = "Hypertension Initial Reviews"
class HivInitialReview(InitialReviewModelMixin, CrfModelMixin, edc_models.BaseUuidModel): receives_care = models.CharField( verbose_name="Is the patient receiving care for HIV?", max_length=15, choices=YES_NO, ) clinic = models.CharField( verbose_name="Where does the patient receive care for HIV", max_length=15, choices=CARE_ACCESS, default=NOT_APPLICABLE, ) clinic_other = models.CharField( verbose_name=mark_safe( "If <u>not</u> attending here, where does the patient attend?"), max_length=50, null=True, blank=True, ) arv_initiated = models.CharField( verbose_name="Has the patient started antiretroviral therapy (ART)?", max_length=15, choices=YES_NO, default=YES, ) arv_initiation_ago = edc_models.DurationYMDField( verbose_name="How long ago did the patient start ART?", null=True, blank=True, help_text= "If possible, provide the exact date below instead of estimating here.", ) arv_initiation_actual_date = models.DateField( verbose_name="Date started antiretroviral therapy (ART)", validators=[edc_models.date_not_future], null=True, help_text= "If possible, provide the exact date here instead of estimating above.", ) arv_initiation_estimated_date = models.DateField( verbose_name="Estimated Date started antiretroviral therapy (ART)", validators=[edc_models.date_not_future], null=True, editable=False, help_text="Calculated based on response to `arv_initiation_ago`", ) arv_initiation_date_estimated = models.CharField( verbose_name="Was the ART start date estimated?", max_length=15, choices=YES_NO, default=YES, editable=False, ) # Viral Load has_vl = models.CharField( verbose_name= "Is the patient's most recent viral load result available?", max_length=25, choices=YES_NO_PENDING_NA, default=NOT_APPLICABLE, ) vl = models.IntegerField( verbose_name="Most recent viral load", validators=[MinValueValidator(0), MaxValueValidator(9999999)], null=True, blank=True, help_text=COPIES_PER_MILLILITER, ) vl_quantifier = models.CharField( max_length=10, choices=VL_QUANTIFIER_NA, null=True, blank=True, ) vl_date = models.DateField( verbose_name="Date of most recent viral load", validators=[edc_models.date_not_future], null=True, blank=True, ) # CD4 has_cd4 = models.CharField( verbose_name="Is the patient's most recent CD4 result available?", max_length=25, choices=YES_NO_NA, default=NOT_APPLICABLE, ) cd4 = models.IntegerField( verbose_name="Most recent CD4", validators=[MinValueValidator(0), MaxValueValidator(3000)], null=True, blank=True, help_text=CELLS_PER_MILLIMETER_CUBED_DISPLAY, ) cd4_date = models.DateField( verbose_name="Date of most recent CD4", validators=[edc_models.date_not_future], null=True, blank=True, ) def save(self, *args, **kwargs): if self.dx_ago: self.dx_estimated_date = edc_models.duration_to_date( self.dx_ago, self.report_datetime) if self.arv_initiation_ago: self.arv_initiation_estimated_date = edc_models.duration_to_date( self.arv_initiation_ago, self.report_datetime) super().save(*args, **kwargs) @property def best_art_initiation_date(self): return self.arv_initiation_actual_date or self.arv_initiation_estimated_date class Meta(CrfModelMixin.Meta, edc_models.BaseUuidModel.Meta): verbose_name = "HIV Initial Review" verbose_name_plural = "HIV Initial Reviews"
class ComplicationsBaseline(CrfModelMixin, edc_models.BaseUuidModel): # stroke stroke = models.CharField( verbose_name="Stroke", max_length=25, choices=YES_NO, null=True, blank=False, ) stroke_ago = edc_models.DurationYMDField( verbose_name="If yes, how long ago", null=True, blank=True, ) stroke_estimated_date = models.DateField( verbose_name="Estimated date of stroke", null=True, blank=True, editable=False, ) # heart_attack heart_attack = models.CharField( verbose_name="Heart attack / heart failure", max_length=25, choices=YES_NO, null=True, blank=False, ) heart_attack_ago = edc_models.DurationYMDField( verbose_name="If yes, how long ago", null=True, blank=True, ) heart_attack_estimated_date = models.DateField( verbose_name="Estimated date of heart attack / heart failure", null=True, blank=True, editable=False, ) # renal renal_disease = models.CharField( verbose_name="Renal (kidney) disease", max_length=25, choices=YES_NO, null=True, blank=False, ) renal_disease_ago = edc_models.DurationYMDField( verbose_name="If yes, how long ago", null=True, blank=True, ) renal_disease_estimated_date = models.DateField( verbose_name="Estimated date of renal_disease", null=True, blank=True, editable=False, ) # vision vision = models.CharField( verbose_name="Vision problems (e.g. blurred vision)", max_length=25, choices=YES_NO, null=True, blank=False, ) vision_ago = edc_models.DurationYMDField( verbose_name="If yes, how long ago", null=True, blank=True, ) vision_estimated_date = models.DateField( verbose_name="Estimated date of vision problems", null=True, blank=True, editable=False, ) # numbness numbness = models.CharField( verbose_name="Numbness / burning sensation", max_length=25, choices=YES_NO, null=True, blank=False, ) numbness_ago = edc_models.DurationYMDField( verbose_name="If yes, how long ago", null=True, blank=True, ) numbness_estimated_date = models.DateField( verbose_name="Estimated date of numbness", null=True, blank=True, editable=False, ) # foot ulcers foot_ulcers = models.CharField( verbose_name="Foot ulcers", max_length=25, choices=YES_NO, null=True, blank=False, ) foot_ulcers_ago = edc_models.DurationYMDField( verbose_name="If yes, how long ago", null=True, blank=True, ) foot_ulcers_estimated_date = models.DateField( verbose_name="Estimated date of foot ulcers", null=True, blank=True, editable=False, ) complications = models.CharField( verbose_name="Are there any other major complications to report?", max_length=25, choices=YES_NO, default=NO, ) complications_other = models.TextField( null=True, blank=True, help_text="Please include dates", ) def save(self, *args, **kwargs): complications = [ "stroke", "heart_attack", "renal_disease", "vision", "numbness", "foot_ulcers", ] for complication in complications: if getattr(self, f"{complication}_ago", None): duration = edc_models.duration_to_date( getattr(self, f"{complication}_ago", None), self.report_datetime) setattr(self, f"{complication}_estimated_date", duration) super().save(*args, **kwargs) class Meta(CrfModelMixin.Meta, edc_models.BaseUuidModel.Meta): verbose_name = "Complications: Baseline" verbose_name_plural = "Complications: Baseline"
class OtherBaselineData(CrfModelMixin, edc_models.BaseUuidModel): employment_status = models.CharField( verbose_name="What is the patient's employment status?", max_length=25, choices=EMPLOYMENT_STATUS, ) employment_status_other = edc_models.OtherCharField() education = models.CharField( verbose_name="How much formal education does the patient have?", max_length=25, choices=EDUCATION, ) marital_status = models.CharField( verbose_name="Personal status?", max_length=25, choices=MARITAL_STATUS, ) smoking_status = models.CharField( verbose_name="Which of these options describes you", max_length=15, choices=SMOKER_STATUS_SIMPLE, ) smoker_quit_ago = edc_models.DurationYMDField( verbose_name= "If you used to smoke but stopped, how long ago did you stop", null=True, blank=True, ) smoker_quit_estimated_date = models.DateField( verbose_name="Estimated date smoker quit?", null=True, editable=False, ) alcohol = models.CharField( verbose_name="Do you drink alcohol?", max_length=15, choices=YES_NO, ) alcohol_consumption = models.CharField( verbose_name="If yes, how often do you drink alcohol?", max_length=25, choices=ALCOHOL_CONSUMPTION, default=NOT_APPLICABLE, ) def save(self, *args, **kwargs): if self.smoker_quit_ago: self.smoker_quit_estimated_date = edc_models.duration_to_date( self.smoker_quit_ago, self.report_datetime) super().save(*args, **kwargs) class Meta(CrfModelMixin.Meta, edc_models.BaseUuidModel.Meta): verbose_name = "Other Baseline Data" verbose_name_plural = "Other Baseline Data"