예제 #1
0
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()
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
    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)
예제 #8
0
 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)
예제 #9
0
    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)
예제 #10
0
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)
예제 #11
0
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)
예제 #12
0
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()