def test_not_eligible_egfr_less_than_45(self): obj = self.get_screening_part_three() self.assertEqual(obj.eligible_part_one, YES) self.assertFalse(obj.reasons_ineligible_part_one) self.assertEqual(obj.eligible_part_two, YES) self.assertFalse(obj.reasons_ineligible_part_two) obj.part_three_report_datetime = get_utcnow() obj.part_three_report_datetime = get_utcnow() obj.weight = 65 obj.height = 110 obj.hba1c_performed = YES obj.hba1c_value = 7.0 obj.creatinine_performed = NO obj.creatinine_value = 200 obj.creatinine_units = MICROMOLES_PER_LITER obj.fasting = YES obj.fasting_duration_str = "8h" obj.ifg_value = 7.0 obj.ifg_datetime = get_utcnow() obj.ogtt_base_datetime = get_utcnow() obj.ogtt_value = 7.5 obj.ogtt_units = MILLIMOLES_PER_LITER obj.ogtt_datetime = get_utcnow() obj.save() self.assertEqual(obj.eligible_part_three, NO) self.assertIn(EGFR_LT_45, obj.reasons_ineligible_part_three) self.assertFalse(obj.eligible) self.assertFalse(obj.consented)
def setUp(self): super().setUp() self.eligibility_datetime = get_utcnow() - relativedelta(days=1) # yesterday self.subject_screening = self.get_subject_screening( report_datetime=get_utcnow(), eligibility_datetime=self.eligibility_datetime ) self.screening_identifier = self.subject_screening.screening_identifier
def setUp(self): self.user = User.objects.create_superuser("user_login", "*****@*****.**", "pass") site_labs._registry = {} site_labs.loaded = False site_labs.register(lab_profile=lab_profile) register_to_site_reference_configs() site_visit_schedules._registry = {} site_visit_schedules.loaded = False site_visit_schedules.register(visit_schedule) site_reference_configs.register_from_visit_schedule( visit_models={ "edc_appointment.appointment": "edc_model_admin.subjectvisit" }) self.subject_identifier = "101-12345" SubjectConsent.objects.create( subject_identifier=self.subject_identifier, consent_datetime=get_utcnow(), identity="1111111", confirm_identity="1111111", visit_schedule_name="visit_schedule", schedule_name="schedule", ) appointment = Appointment.objects.get(visit_code="1000") self.subject_visit = SubjectVisit.objects.create( appointment=appointment, report_datetime=get_utcnow(), reason=SCHEDULED)
def test_not_eligible_egfr_less_than_45(self): obj = ScreeningPartThree.objects.get( screening_identifier=self.screening_identifier) self.assertEqual(obj.eligible_part_one, YES) self.assertFalse(obj.reasons_ineligible_part_one) self.assertEqual(obj.eligible_part_two, YES) self.assertFalse(obj.reasons_ineligible_part_two) obj.part_three_report_datetime = get_utcnow() obj.part_three_report_datetime = get_utcnow() obj.weight = 65 obj.height = 110 obj.hba1c_performed = YES obj.hba1c = 7.0 obj.creatinine_performed = NO obj.creatinine = 200 obj.creatinine_units = MICROMOLES_PER_LITER obj.fasted = YES obj.fasted_duration_str = "8h" obj.fasting_glucose = 7.0 obj.fasting_glucose_datetime = get_utcnow() obj.ogtt_base_datetime = get_utcnow() obj.ogtt_two_hr = 7.5 obj.ogtt_two_hr_units = MILLIMOLES_PER_LITER obj.ogtt_two_hr_datetime = get_utcnow() obj.save() self.assertEqual(obj.eligible_part_three, NO) self.assertIn(EGFR_LT_45, obj.reasons_ineligible_part_three) self.assertFalse(obj.eligible) self.assertFalse(obj.consented)
def setUp(self): self.lab_helper.setup_site_labs() self.panel = self.lab_helper.panel self.profile_aliquot_count = self.lab_helper.profile_aliquot_count self.subject_identifier = "1111111111" Site.objects.get_current() SubjectConsent.objects.create( subject_identifier=self.subject_identifier, consent_datetime=get_utcnow(), identity="1111111", confirm_identity="1111111", visit_schedule_name="visit_schedule", schedule_name="schedule", ) appointment = Appointment.objects.get(visit_code="1000") self.subject_visit = SubjectVisit.objects.create( appointment=appointment, report_datetime=get_utcnow(), reason=SCHEDULED) self.requisition = SubjectRequisition.objects.create( subject_visit=self.subject_visit, panel=self.panel.panel_model_obj, protocol_number="999", is_drawn=YES, ) self.specimen = Specimen(requisition=self.requisition)
def setUp(self): obj = ScreeningPartOne( screening_consent=YES, report_datetime=get_utcnow(), hospital_identifier="111", initials="ZZ", gender=FEMALE, age_in_years=25, ethnicity=BLACK, hiv_pos=YES, art_six_months=YES, on_rx_stable=YES, lives_nearby=YES, staying_nearby=YES, pregnant=NOT_APPLICABLE, ) obj.save() self.screening_identifier = obj.screening_identifier obj = ScreeningPartTwo.objects.get( screening_identifier=self.screening_identifier) obj.part_two_report_datetime = get_utcnow() obj.urine_bhcg_performed = NO obj.congestive_heart_failure = NO obj.liver_disease = NO obj.alcoholism = NO obj.acute_metabolic_acidosis = NO obj.renal_function_condition = NO obj.tissue_hypoxia_condition = NO obj.acute_condition = NO obj.metformin_sensitivity = NO obj.advised_to_fast = YES obj.appt_datetime = get_utcnow() + relativedelta(days=1) obj.save()
def in_bounds_or_raise(self, age: int = None): self.reasons_ineligible = None dob = localtime(get_utcnow() - relativedelta(years=age)).date() age_units = "years" report_datetime = localtime(get_utcnow()) return super().in_bounds_or_raise(dob=dob, report_datetime=report_datetime, age_units=age_units)
def setUp(self): self.user = User.objects.create_superuser("user_login", "*****@*****.**", "pass") site_labs._registry = {} site_labs.loaded = False site_labs.register(lab_profile=lab_profile) register_to_site_reference_configs() site_visit_schedules._registry = {} site_visit_schedules.loaded = False site_visit_schedules.register(visit_schedule) site_reference_configs.register_from_visit_schedule(visit_models={ "edc_appointment.appointment": "review_dashboard_app.subjectvisit" }) self.subject_identifiers = ["101-40990028-3", "101-40990029-4"] for subject_identifier in self.subject_identifiers: subject_consent = SubjectConsent.objects.create( subject_identifier=subject_identifier, consent_datetime=get_utcnow(), identity=subject_identifier, confirm_identity=subject_identifier, dob=get_utcnow() - relativedelta(years=25), ) for schedule in visit_schedule.schedules.values(): for visit in schedule.visits.values(): appointment = Appointment.objects.create( appt_datetime=get_utcnow(), subject_identifier=subject_identifier, visit_schedule_name="visit_schedule", schedule_name="schedule", timepoint=visit.timepoint, visit_code=visit.code, user_created="user_login", ) SubjectVisit.objects.create( appointment=appointment, subject_identifier=subject_identifier, reason=SCHEDULED, user_created="user_login", ) # put subject on schedule _, schedule = site_visit_schedules.get_by_onschedule_model( "review_dashboard_app.onschedule") schedule.put_on_schedule( subject_identifier=subject_consent.subject_identifier, onschedule_datetime=subject_consent.consent_datetime, )
def test_age(self): context = {"reference_datetime": None} born = get_utcnow() - relativedelta(years=25) self.assertEqual(25, age_in_years(context, born)) reference_datetime = get_utcnow() - relativedelta(years=25) context = {"reference_datetime": reference_datetime} born = reference_datetime - relativedelta(years=5) self.assertEqual(5, age_in_years(context, born)) reference_datetime = get_utcnow() - relativedelta(years=25) context = {"reference_datetime": reference_datetime} born = get_utcnow() self.assertEqual(born, age_in_years(context, born))
def check_eligible_final(obj): """Updates model instance fields `eligible` and `reasons_ineligible`. """ reasons_ineligible = [] if obj.unsuitable_for_study == YES: obj.eligible = False reasons_ineligible.append("Subject unsuitable") else: obj.eligible = True if calculate_eligible_final(obj) == YES else False if obj.eligible: obj.reasons_ineligible = None else: if obj.qualifying_condition == NO: reasons_ineligible.append("No qualifying condition") if obj.lives_nearby == NO: reasons_ineligible.append("Not in catchment area") if obj.requires_acute_care == YES: reasons_ineligible.append("Requires acute care") if reasons_ineligible: obj.reasons_ineligible = "|".join(reasons_ineligible) else: obj.reasons_ineligible = None obj.eligibility_datetime = get_utcnow()
def get_display_name(self): template_name = (f"edc_data_manager/bootstrap{settings.EDC_BOOTSTRAP}/" f"action_item_display_name.html") title = getattr(self.reference_obj, "title", "") visit_schedule = getattr(self.reference_obj, "visit_schedule", "") modified = getattr(self.reference_obj, "modified", None) auto = "auto" if getattr(self.reference_obj, "rule_generated", False) else "" try: query_priority = self.reference_obj.get_query_priority_display() except AttributeError: query_priority = NORMAL context = dict( HIGH_PRIORITY=HIGH_PRIORITY, auto=auto, category=self.get_category(), modified=modified, object=self.reference_obj, query_priority=query_priority, title=title, utcnow=get_utcnow(), visit_schedule=visit_schedule, ) form_and_numbers_to_string = getattr(self.reference_obj, "form_and_numbers_to_string", None) if form_and_numbers_to_string: context.update(form_and_numbers=form_and_numbers_to_string()) return render_to_string(template_name, context=context)
def test_redirect_next(self): """Assert redirects to "dashboard_url" as give in the query_string "next=". """ self.login() self.app.get( reverse("dashboard_app:dashboard_url", args=(self.subject_identifier, )), user=self.user, status=200, ) CrfOne.objects.create(subject_visit=self.subject_visit, report_datetime=get_utcnow()) model = "redirectnextmodel" query_string = ("next=dashboard_app:dashboard_url,subject_identifier&" f"subject_identifier={self.subject_identifier}") url = reverse( f"admin:edc_model_admin_{model}_add") + "?" + query_string response = self.app.get(url, user=self.user) response.form["subject_identifier"] = self.subject_identifier response = response.form.submit(name="_save").follow() self.assertIn("You are at the subject dashboard", response) self.assertIn(self.subject_identifier, response)
def check_eligible_final(obj): """Updates model instance fields `eligible` and `reasons_ineligible`. """ reasons_ineligible = [] if obj.unsuitable_for_study == YES: obj.eligible = False reasons_ineligible.append("Subject unsuitable") else: obj.eligible = True if calculate_eligible_final(obj) == YES else False if obj.eligible: obj.reasons_ineligible = None else: if obj.reasons_ineligible_part_one: reasons_ineligible.append(obj.reasons_ineligible_part_one) if obj.reasons_ineligible_part_two: reasons_ineligible.append(obj.reasons_ineligible_part_two) if obj.reasons_ineligible_part_three: reasons_ineligible.append(obj.reasons_ineligible_part_three) if reasons_ineligible: obj.reasons_ineligible = "|".join(reasons_ineligible) else: obj.reasons_ineligible = None obj.eligibility_datetime = get_utcnow()
def get_subject_screening(self, report_datetime=None, eligibility_datetime=None, **kwargs): data = { "screening_consent": YES, "age_in_years": 25, "clinic_type": HIV_CLINIC, "gender": MALE, "hospital_identifier": "13343322", "initials": "EW", "lives_nearby": YES, "qualifying_condition": YES, "report_datetime": report_datetime or get_utcnow(), "requires_acute_care": NO, "selection_method": RANDOM_SAMPLING, "unsuitable_agreed": NOT_APPLICABLE, "unsuitable_for_study": NO, } data.update(**kwargs) form = SubjectScreeningForm(data=data, instance=None) form.save() subject_screening = SubjectScreening.objects.get( screening_identifier=form.instance.screening_identifier ) self.assertTrue(subject_screening.eligible) if eligibility_datetime: subject_screening.eligibility_datetime = eligibility_datetime subject_screening.save() return subject_screening
def try_to_resolve_auto_generated_query(self): if (not self.dm_resolved and self.rule_generated and self.site_response_status == RESOLVED and self.site_response_text and self.site_response_text.strip() == AUTO_RESOLVED): self.status = CLOSED self.resolved_datetime = get_utcnow() self.dm_user = self.sender
def validate_reportable_fields(self): reportables = self.reportables_cls( self.reference_range_collection_name, cleaned_data=copy(self.cleaned_data), gender=MALE, dob=get_utcnow() - relativedelta(years=25), report_datetime=get_utcnow(), ) reportables.validate_reportable_fields() reportables.validate_results_abnormal_field() self.applicable_if(YES, field="results_abnormal", field_applicable="results_reportable") reportables.validate_results_reportable_field()
def get_subject_consent(self, subject_screening): return mommy.make_recipe( "meta_consent.subjectconsent", user_created="erikvw", user_modified="erikvw", screening_identifier=subject_screening.screening_identifier, initials=subject_screening.initials, dob=get_utcnow().date() - relativedelta(years=subject_screening.age_in_years), site=Site.objects.get(name="hindu_mandal"), )
def setUp(self): site_visit_schedules._registry = {} site_visit_schedules.register(visit_schedule) self.subject_identifier = "1111111111" self.lab_helper.setup_site_labs() self.panel = self.lab_helper.panel SubjectConsent.objects.create( subject_identifier=self.subject_identifier, consent_datetime=get_utcnow(), identity="1111111", confirm_identity="1111111", visit_schedule_name="visit_schedule", schedule_name="schedule", site=Site.objects.get_current(), ) appointment = Appointment.objects.get(visit_code="1000") self.subject_visit = SubjectVisit.objects.create( appointment=appointment, report_datetime=get_utcnow(), reason=SCHEDULED)
def get_subject_consent(self, subject_screening, site_name=None): site_name = site_name or "kinoni" return baker.make_recipe( "inte_consent.subjectconsent", user_created="erikvw", user_modified="erikvw", screening_identifier=subject_screening.screening_identifier, initials=subject_screening.initials, dob=get_utcnow().date() - relativedelta(years=subject_screening.age_in_years), site=Site.objects.get(name=site_name), )
def test_creates_icp_referral(self): obj = ScreeningPartThree.objects.get( screening_identifier=self.screening_identifier) self.assertEqual(obj.eligible_part_one, YES) self.assertFalse(obj.reasons_ineligible_part_one) self.assertEqual(obj.eligible_part_two, YES) self.assertFalse(obj.reasons_ineligible_part_two) obj.part_three_report_datetime = get_utcnow() obj.weight = 65 obj.height = 110 obj.hba1c_performed = YES obj.hba1c_value = 7.0 obj.creatinine_performed = YES obj.creatinine_value = 100 obj.creatinine_units = MICROMOLES_PER_LITER obj.fasting = YES obj.fasting_duration_str = "8h" obj.ifg_value = 7.5 obj.ifg_datetime = get_utcnow() obj.ogtt_base_datetime = get_utcnow() obj.ogtt_value = 12.0 obj.ogtt_units = MILLIMOLES_PER_LITER obj.ogtt_datetime = get_utcnow() obj.save() self.assertTrue(obj.reasons_ineligible_part_three) self.assertEqual(obj.eligible_part_three, NO) self.assertFalse(obj.eligible) self.assertFalse(obj.consented) self.assertTrue(refer_to_icp(obj)) try: IcpReferral.objects.get(subject_screening=obj) except ObjectDoesNotExist as e: self.fail(f"ObjectDoesNotExist unexpectedly raised. Got {e}")
def get_subject_consent(self, subject_screening, site_name=None, **kwargs): site_name = site_name or "kinoni" options = dict( user_created="erikvw", user_modified="erikvw", screening_identifier=subject_screening.screening_identifier, initials=subject_screening.initials, dob=get_utcnow().date() - relativedelta(years=subject_screening.age_in_years), site=Site.objects.get(name=site_name), clinic_type=HIV_CLINIC, ) options.update(**kwargs) return baker.make_recipe("inte_consent.subjectconsent", **options)
def setUp(self): import_holidays() self.user = User.objects.create_superuser("user_login", "*****@*****.**", "pass") site_labs._registry = {} site_labs.loaded = False site_labs.register(lab_profile=lab_profile) site_visit_schedules._registry = {} site_visit_schedules.loaded = False site_visit_schedules.register(visit_schedule) populate_visit_schedule() site_reference_configs.register_from_visit_schedule( visit_models={ "edc_appointment.appointment": "data_manager_app.subjectvisit" }) self.subject_identifier = "101-40990029-4" identity = "123456789" subject_consent = SubjectConsent.objects.create( subject_identifier=self.subject_identifier, consent_datetime=get_utcnow() - relativedelta(days=10), identity=identity, confirm_identity=identity, dob=get_utcnow() - relativedelta(years=25), ) # put subject on schedule _, schedule = site_visit_schedules.get_by_onschedule_model( "data_manager_app.onschedule") schedule.put_on_schedule( subject_identifier=subject_consent.subject_identifier, onschedule_datetime=subject_consent.consent_datetime, )
def get_data(self): return { "screening_consent": YES, "selection_method": RANDOM_SAMPLING, "report_datetime": get_utcnow(), "initials": "EW", "gender": MALE, "age_in_years": 25, "clinic_type": NCD_CLINIC, "qualifying_condition": YES, "lives_nearby": YES, "requires_acute_care": NO, "unsuitable_for_study": NO, "unsuitable_agreed": NOT_APPLICABLE, }
def test_redirect_on_delete_with_url_name_is_none(self): self.login() crfsix = CrfSix.objects.create(subject_visit=self.subject_visit, report_datetime=get_utcnow()) model = "crfsix" url = reverse(f"admin:edc_model_admin_{model}_change", args=(crfsix.id, )) response = self.app.get(url, user=self.user) delete_url = reverse(f"admin:edc_model_admin_{model}_delete", args=(crfsix.id, )) response = response.click(href=delete_url) response = response.form.submit().follow() self.assertRaises(ObjectDoesNotExist, CrfSix.objects.get, id=crfsix.id) self.assertIn("changelist", response)
def test_redirect_on_delete_with_url_name_from_settings(self): self.login() self.app.get( reverse("dashboard_app:dashboard_url", args=(self.subject_identifier, )), user=self.user, status=200, ) model = "crffour" query_string = ("next=dashboard_app:dashboard_url,subject_identifier&" f"subject_identifier={self.subject_identifier}") url = reverse( f"admin:edc_model_admin_{model}_add") + "?" + query_string form_data = { "subject_visit": str(self.subject_visit.id), "report_datetime_0": get_utcnow().strftime("%Y-%m-%d"), "report_datetime_1": "00:00:00", } response = self.app.get(url, user=self.user) for key, value in form_data.items(): response.form[key] = value response = response.form.submit(name="_save").follow() # delete crffour = CrfFour.objects.all()[0] url = (reverse(f"admin:edc_model_admin_{model}_change", args=(crffour.id, )) + "?" + query_string) response = self.app.get(url, user=self.user) delete_url = reverse(f"admin:edc_model_admin_{model}_delete", args=(crffour.id, )) response = response.click(href=delete_url) # submit confirmation page response = response.form.submit().follow() # redirects to the dashboard self.assertIn("You are at the subject dashboard", response) self.assertRaises(ObjectDoesNotExist, CrfFour.objects.get, id=crffour.id)
def setUp(self): super().setUp() self.subject_visit = self.get_subject_visit() symptoms = BaselineSymptoms.objects.filter(name=NONE) arv_regimen = ArvRegimens.objects.get(name="TDF_3TC_ATV_r") oi_prophylaxis = OiProphylaxis.objects.filter( name__in=["fluconazole", "isoniazid"] ) diabetes_symptoms = DiabetesSymptoms.objects.all() self.options = { "current_arv_regimen": arv_regimen.id, "current_smoker": YES, "dia_blood_pressure": 80, "diabetes_in_family": NO, "diabetes_symptoms": diabetes_symptoms, "family_diabetics": NO, "former_smoker": NOT_APPLICABLE, "has_abdominal_tenderness": NO, "has_enlarged_liver": NO, "has_previous_arv_regimen": NO, "heart_rate": 65, "hypertension_diagnosis": NO, "hypertension_treatment": None, "is_heartbeat_regular": YES, "jaundice": YES, "oi_prophylaxis": oi_prophylaxis, "on_hypertension_treatment": NO, "on_oi_prophylaxis": YES, "other_diabetes_symptoms": "erik", "past_year_symptoms": None, "peripheral_oedema": YES, "previous_arv_regimen": None, "previous_arv_regimen": [], "report_datetime": get_utcnow(), "respiratory_rate": 12, "subject_visit": self.subject_visit.pk, "symptoms": None, "symptoms": symptoms, "sys_blood_pressure": 120, "taking_statins": YES, "temperature": 37, "waist_circumference": 61, "weight": 65, }
def get_subject_consent(subject_screening, consent_datetime=None, **kwargs): dob = (consent_datetime or get_utcnow()).date() - relativedelta( years=subject_screening.age_in_years) consent_datetime = consent_datetime or subject_screening.report_datetime options = dict( user_created="erikvw", user_modified="erikvw", screening_identifier=subject_screening.screening_identifier, initials=subject_screening.initials, dob=dob, site=Site.objects.get(id=settings.SITE_ID), clinic_type=HIV_CLINIC, consent_datetime=consent_datetime, ) options.update(**kwargs) return baker.make_recipe("inte_consent.subjectconsent", **options)
def test_screening_two_urine_bhcg_pregnant_na(self): instance = self.complete_part_one(gender=FEMALE, pregnant=NOT_APPLICABLE) instance = self.complete_part_two(instance=instance) # if pregnant == NOT_APPLICABLE, urine_bhcg_performed is not applicable try: ScreeningPartThreeForm( data=dict(urine_bhcg=NOT_APPLICABLE, urine_bhcg_performed=NOT_APPLICABLE), instance=instance, ) except AssertionError: self.fail("AssertionError unexpectedly raised.") self.assertRaises( AssertionError, self.complete_part_three, instance=instance, urine_bhcg=NOT_APPLICABLE, urine_bhcg_performed=YES, ) self.assertIn("urine_bhcg_performed", self.part_three_form._errors) self.assertIn( "This field is not applicable", self.part_three_form._errors.get("urine_bhcg_performed")[0], ) self.assertRaises( AssertionError, self.complete_part_three, instance=instance, urine_bhcg_date=get_utcnow().date(), urine_bhcg_performed=NOT_APPLICABLE, ) self.assertIn("urine_bhcg_date", self.part_three_form._errors) self.assertIn( "This field is not required", self.part_three_form._errors.get("urine_bhcg_date")[0], )
def test_eligible(self): obj = ScreeningPartTwo.objects.get( screening_identifier=self.screening_identifier) self.assertEqual(obj.eligible_part_one, YES) self.assertTrue(obj.reasons_ineligible_part_one == "") for k, v in part_two_eligible_options.items(): setattr(obj, k, v) obj.acute_condition = None obj.metformin_sensitivity = None obj.advised_to_fast = NO obj.appt_datetime = None obj.save() self.assertEqual(obj.eligible_part_two, TBD) self.assertFalse(obj.reasons_ineligible_part_two) self.assertFalse(obj.eligible) self.assertFalse(obj.consented) obj.acute_condition = NO obj.metformin_sensitivity = YES obj.save() self.assertEqual(obj.eligible_part_two, NO) self.assertIn("Metformin", obj.reasons_ineligible_part_two) self.assertFalse(obj.eligible) self.assertFalse(obj.consented) obj.acute_condition = NO obj.metformin_sensitivity = NO obj.advised_to_fast = YES obj.appt_datetime = get_utcnow() + relativedelta(days=1) obj.save() self.assertEqual(obj.eligible_part_two, YES) self.assertFalse(obj.reasons_ineligible_part_two) self.assertFalse(obj.eligible) self.assertFalse(obj.consented)
def test_ineligible(self): obj = ScreeningPartOne( report_datetime=get_utcnow(), hospital_identifier="111", initials="ZZ", gender=FEMALE, age_in_years=25, ethnicity=BLACK, hiv_pos=YES, art_six_months=YES, on_rx_stable=YES, lives_nearby=YES, staying_nearby=NO, pregnant=NOT_APPLICABLE, ) obj.save() self.assertEqual(obj.eligible_part_one, NO) self.assertIn("Unable/Unwilling to stay nearby", obj.reasons_ineligible_part_one) obj.staying_nearby = YES obj.save() self.assertEqual(obj.eligible_part_one, YES) self.assertTrue(obj.reasons_ineligible_part_one == "")