def subject_screening_on_post_save(sender, instance, raw, created, **kwargs): """Creates an onschedule instance for this enrolled subject, if it does not exist. """ if instance.eligible: if not raw: if not created: _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model='trainee_subject.onschedule', name=instance.schedule_name) schedule.refresh_schedule( subject_identifier=instance.subject_identifier) else: # put subject on schedule _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model='trainee_subject.onschedule', name=instance.schedule_name) schedule.put_on_schedule( subject_identifier=instance.subject_identifier, onschedule_datetime=instance.report_datetime) # Update subject consent with screening identifier try: subject_consent = SubjectConsent.objects.get( subject_identifier=instance.subject_identifier) except SubjectConsent.DoesNotExist: raise ValidationError( 'Subject Consent for subject ' f'{instance.subject_identifier} must exist.') else: subject_consent.screening_identifier = instance.screening_identifier subject_consent.save()
def put_on_schedule(cohort, instance=None, subject_identifier=None, base_appt_datetime=None): if instance: subject_identifier = subject_identifier or instance.subject_identifier cohort_label_lower = ''.join(cohort.split('_')) if 'enrol' in cohort: cohort_label_lower = cohort_label_lower.replace( 'enrol', 'enrollment') elif 'sec' in cohort: cohort_label_lower = cohort_label_lower.replace('qt', 'quart') if 'birth' in cohort: onschedule_model = 'flourish_child.onschedule' + cohort_label_lower schedule_name = cohort.replace('cohort_', '') + '_schedule1' else: onschedule_model = 'flourish_child.onschedulechild' + cohort_label_lower schedule_name = cohort.replace('cohort', 'child') + '_schedule1' if 'quarterly' in cohort: schedule_name = schedule_name.replace('quarterly', 'quart') _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=onschedule_model, name=schedule_name) schedule.put_on_schedule(subject_identifier=subject_identifier, onschedule_datetime=base_appt_datetime, schedule_name=schedule_name, base_appt_datetime=base_appt_datetime)
def antenatal_enrollment_on_post_save(sender, instance, raw, created, **kwargs): """Creates an onschedule instance for this antenatal enrollment, if it does not exist. """ if not raw: _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model='td_maternal.onscheduleantenatalenrollment', name=instance.schedule_name) if not created: if instance.is_eligible: try: OnScheduleAntenatalEnrollment.objects.get( subject_identifier=instance.subject_identifier) except OnScheduleAntenatalEnrollment.DoesNotExist: schedule.put_on_schedule( subject_identifier=instance.subject_identifier, onschedule_datetime=instance.report_datetime) add_schedule_name( model_cls=OnScheduleAntenatalEnrollment, subject_identifier=instance.subject_identifier, schedule_name=instance.schedule_name) else: schedule.refresh_schedule( subject_identifier=instance.subject_identifier, ) else: # put subject on schedule if instance.is_eligible: schedule.put_on_schedule( subject_identifier=instance.subject_identifier, onschedule_datetime=instance.report_datetime) add_schedule_name( model_cls=OnScheduleAntenatalEnrollment, subject_identifier=instance.subject_identifier, schedule_name=instance.schedule_name)
def antenatal_visit_membership_on_post_save(sender, instance, raw, created, **kwargs): """Creates an onschedule instance for this antenatal visit membership, if it does not exist. """ if not raw: antenatal_enroll_model = django_apps.get_model( 'td_maternal.onscheduleantenatalvisitmembership') if not created or instance.antenatal_visits == YES: _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( 'td_maternal.onscheduleantenatalvisitmembership', name=instance.schedule_name) try: antenatal_enroll_model.objects.get( subject_identifier=instance.subject_identifier) except antenatal_enroll_model.DoesNotExist: if instance.antenatal_visits == YES: schedule.put_on_schedule( subject_identifier=instance.subject_identifier, onschedule_datetime=instance.report_datetime) add_schedule_name( model_cls=OnScheduleAntenatalVisitMembership, subject_identifier=instance.subject_identifier, schedule_name=instance.schedule_name) else: schedule.refresh_schedule( subject_identifier=instance.subject_identifier, schedule_name=instance.schedule_name)
def child_take_off_study(sender, instance, raw, created, **kwargs): for visit_schedule in site_visit_schedules.visit_schedules.values(): for schedule in visit_schedule.schedules.values(): onschedule_model_obj = get_child_onschedule_model_obj( schedule, instance.subject_identifier) if onschedule_model_obj: _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=onschedule_model_obj._meta.label_lower, name=onschedule_model_obj.schedule_name) schedule.take_off_schedule( subject_identifier=instance.subject_identifier)
def infant_birth_on_post_save(sender, instance, raw, created, **kwargs): """Creates an onschedule instance for this infant birth, if it does not exist. """ if not raw: # Update infant registered subject try: registered_subject = RegisteredSubject.objects.get( subject_identifier=instance.subject_identifier) except RegisteredSubject.DoesNotExist: raise ValidationError( f'Missing registered subject for {instance.subject_identifier}' ) else: registered_subject.first_name = instance.first_name registered_subject.initials = instance.initials registered_subject.dob = instance.dob registered_subject.gender = instance.gender registered_subject.registration_datetime = instance.report_datetime registered_subject.registration_status = BY_BIRTH registered_subject.registration_identifier = instance.pk registered_subject.consent_datetime = instance.report_datetime registered_subject.save() if not created: _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model='td_infant.onscheduleinfantbirth', name=instance.schedule_name) schedule.refresh_schedule( subject_identifier=instance.subject_identifier, schedule_name=instance.schedule_name) else: # put subject on schedule _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model='td_infant.onscheduleinfantbirth', name=instance.schedule_name) schedule.put_on_schedule( subject_identifier=instance.subject_identifier, onschedule_datetime=instance.report_datetime) add_schedule_name(model_obj=OnScheduleInfantBirth, instance=instance)
def take_off_schedule(self): infant_schedule_model = django_apps.get_model( 'td_infant.onscheduleinfantbirth') on_schedule_objs = infant_schedule_model.objects.filter( subject_identifier=self.subject_identifier) if on_schedule_objs: for on_schedule_obj in on_schedule_objs: _, schedule = \ site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model='td_infant.onscheduleinfantbirth', name=on_schedule_obj.schedule_name) schedule.take_off_schedule(offschedule_model_obj=self)
def take_off_schedule(self): history_model = 'edc_visit_schedule.subjectschedulehistory' history_cls = django_apps.get_model(history_model) onschedules = history_cls.objects.onschedules( subject_identifier=self.subject_identifier) if onschedules: for onschedule in onschedules: _, schedule = \ site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=onschedule._meta.label_lower, name=onschedule.schedule_name) schedule.take_off_schedule( subject_identifier=self.subject_identifier)
def take_off_schedule(self): maternal_labour_del_schedule = django_apps.get_model( 'td_maternal.onschedulematernallabourdel') antenatal_visit_membership_schedule = django_apps.get_model( 'td_maternal.onscheduleantenatalvisitmembership') antenatal_enrollment_schedule = django_apps.get_model( 'td_maternal.onscheduleantenatalenrollment') maternal_schedules = [ maternal_labour_del_schedule, antenatal_visit_membership_schedule, antenatal_enrollment_schedule ] for on_schedule in maternal_schedules: on_schedule_objs = on_schedule.objects.filter( subject_identifier=self.subject_identifier) if on_schedule_objs: for on_schedule_obj in on_schedule_objs: _, schedule = \ site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=on_schedule._meta.label_lower, name=on_schedule_obj.schedule_name) schedule.take_off_schedule(offschedule_model_obj=self)
def maternal_labour_del_on_post_save(sender, instance, raw, created, **kwargs): """Creates an onschedule instance for this maternal labour delivery, if it does not exist. """ if not raw: _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( 'td_maternal.onschedulematernallabourdel', name=instance.schedule_name) try: schedule.refresh_schedule( subject_identifier=instance.subject_identifier, schedule_name=instance.schedule_name) except ObjectDoesNotExist: # put subject on schedule if live_infants_to_register is ONLY 1. if instance.live_infants_to_register == 1: schedule.put_on_schedule( subject_identifier=instance.subject_identifier, onschedule_datetime=instance.report_datetime) add_schedule_name( model_cls=OnScheduleMaternalLabourDel, subject_identifier=instance.subject_identifier, schedule_name=instance.schedule_name) create_registered_infant(instance)
def take_off_schedule(subject_identifier=None, version=None): '''This method is meant to move participant from one schedule i.e any v1 schedule to v3 when a participant reconsents. This is not to be confused with Off study. Off study removes participants completely from ALL schedules. ''' # infant_appointment = django_apps.get_model( # 'td_infant.appointment') # infant_birth_onschedule = django_apps.get_model( # 'td_infant.onscheduleinfantbirth') maternal_labour_del_schedule = django_apps.get_model( 'td_maternal.onschedulematernallabourdel') antenatal_visit_membership_schedule = django_apps.get_model( 'td_maternal.onscheduleantenatalvisitmembership') antenatal_enrollment_schedule = django_apps.get_model( 'td_maternal.onscheduleantenatalenrollment') maternal_schedules = [ maternal_labour_del_schedule, antenatal_visit_membership_schedule, antenatal_enrollment_schedule ] for on_schedule in maternal_schedules: try: on_schedule_obj = on_schedule.objects.get( subject_identifier=subject_identifier) except on_schedule.DoesNotExist: pass else: # get old schedule and put participant offschedule _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=on_schedule._meta.label_lower, name=on_schedule_obj.schedule_name) schedule.take_off_schedule(subject_identifier=subject_identifier) add_schedule_name( model_cls=schedule.offschedule_model_cls().__class__, subject_identifier=subject_identifier, schedule_name=schedule.name) # put participant on new version schedule v3_schedule_name = schedule.name[:-1] + version _, v3_schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=on_schedule._meta.label_lower, name=v3_schedule_name) v3_schedule.put_on_schedule( subject_identifier=subject_identifier, onschedule_datetime=on_schedule_obj.report_datetime, schedule_name=v3_schedule_name) add_schedule_name(model_cls=on_schedule, subject_identifier=subject_identifier, schedule_name=v3_schedule_name) # remove mothers appointments that already exist on the old schedule from # the new one delete_appointments_new_schedule( appointment_obj=Appointment, old_schedule=schedule.name, new_schedule=v3_schedule_name, subject_identifier=subject_identifier) break if check_labour_del(subject_identifier=subject_identifier): # get old infant schedule and put participant offschedule # TODO: get infant schedule names without hardcoding infant_birth_onschedule = django_apps.get_model( 'td_infant.onscheduleinfantbirth') infant_appointment = django_apps.get_model('td_infant.appointment') infant_subject_identifier = subject_identifier + '-10' # Create infant dummy consent infant_consent_model_cls = django_apps.get_model( 'td_infant.infantdummysubjectconsent') try: infant_consent_model_cls.objects.get( subject_identifier=infant_subject_identifier) except infant_consent_model_cls.DoesNotExist: pass except MultipleObjectsReturned: pass else: infant_consent_model_cls.objects.create( subject_identifier=infant_subject_identifier, version=version, report_datetime=get_utcnow(), consent_datetime=timezone.now()) _, infant_schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=infant_birth_onschedule._meta.label_lower, name='infant_schedule_v1') infant_schedule.take_off_schedule( subject_identifier=infant_subject_identifier) add_schedule_name( model_cls=infant_schedule.offschedule_model_cls().__class__, subject_identifier=subject_identifier, schedule_name=infant_schedule.name) infant_v3_schedule_name = infant_schedule.name[:-1] + version _, infant_v3_schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=infant_birth_onschedule._meta.label_lower, name=infant_v3_schedule_name) infant_v3_schedule.put_on_schedule( subject_identifier=infant_subject_identifier, onschedule_datetime=infant_schedule.onschedule_model_cls( ).onschedule_datetime, schedule_name=infant_v3_schedule_name) add_schedule_name( model_cls=infant_v3_schedule.onschedule_model_cls().__class__, subject_identifier=infant_subject_identifier, schedule_name=infant_v3_schedule_name) # update infant schedules delete_appointments_new_schedule( appointment_obj=infant_appointment, old_schedule='infant_schedule_v1', new_schedule=infant_v3_schedule.name, subject_identifier=infant_subject_identifier)
def put_on_schedule(cohort, instance=None, subject_identifier=None, child_subject_identifier=None, base_appt_datetime=None, caregiver_visit_count=None): subject_identifier = subject_identifier or instance.subject_consent.subject_identifier if instance: cohort_label_lower = ''.join(cohort.split('_')) if 'enrol' in cohort: cohort_label_lower = cohort_label_lower.replace( 'enrol', 'enrollment') onschedule_model = 'flourish_caregiver.onschedule' + cohort_label_lower children_count = str( get_schedule_sequence(subject_identifier, instance, django_apps.get_model(onschedule_model), caregiver_visit_count=caregiver_visit_count)) cohort = cohort + children_count if 'pool' not in cohort: cohort = cohort.replace('cohort_', '') schedule_name = cohort + '_schedule1' if 'tb_2_months' in cohort: onschedule_model = 'flourish_caregiver.onschedule' + cohort_label_lower schedule_name = 'tb_2_months_schedule' _, schedule = site_visit_schedules.get_by_onschedule_model_schedule_name( onschedule_model=onschedule_model, name=schedule_name) onschedule_model_cls = django_apps.get_model(onschedule_model) assent_onschedule_datetime = get_assent_onschedule_datetime( subject_identifier) schedule.put_on_schedule( subject_identifier=subject_identifier, onschedule_datetime=(base_appt_datetime or assent_onschedule_datetime or instance.created.replace(microsecond=0)), schedule_name=schedule_name, base_appt_datetime=base_appt_datetime) try: onschedule_model_cls.objects.get( subject_identifier=subject_identifier, schedule_name=schedule_name, child_subject_identifier=child_subject_identifier) except onschedule_model_cls.DoesNotExist: try: onschedule_obj = schedule.onschedule_model_cls.objects.get( subject_identifier=subject_identifier, schedule_name=schedule_name, child_subject_identifier='') except schedule.onschedule_model_cls.DoesNotExist: pass else: onschedule_obj.child_subject_identifier = ( child_subject_identifier or instance.subject_identifier) onschedule_obj.save()