Beispiel #1
0
    def _create_context_model_on_fly(self):
        assert self.CREATE_MODE, "Must be in CREATE MODE"
        assert self.rdrf_context_id == "add", "Must be adding"
        assert self.current_form_model is not None, "Must be on a form"
        registry_model = self.current_form_model.registry
        # locate the multiple form group this form (must) be in
        form_group = None
        for cfg in registry_model.multiple_form_groups:
            form_models = cfg.form_models
            if len(form_models) == 1:
                if form_models[0].pk == self.current_form_model.pk:
                    form_group = cfg
                    break

        if form_group is None:
            raise Exception("Cannot add this form!")

        from django.contrib.contenttypes.models import ContentType
        patient_content_type = ContentType.objects.get(model='patient')
        from rdrf.models.definition.models import RDRFContext
        context_model = RDRFContext(registry=registry_model,
                                    object_id=self.obj.pk,
                                    content_type=patient_content_type)
        context_model.context_form_group = form_group
        context_model.save()
        return context_model.pk
Beispiel #2
0
    def create_context_and_goto_form(self, registry_model, patient_model, context_form_group):
        assert len(
            context_form_group.form_models) == 1, "Direct link only possible if num forms in form group is 1"
        patient_content_type = ContentType.objects.get_for_model(patient_model)
        form_model = context_form_group.form_models[0]
        context_model = RDRFContext()
        context_model.registry = registry_model
        context_model.name = "change me"
        context_model.content_object = patient_model
        context_model.content_type = patient_content_type
        context_model.context_form_group = context_form_group

        context_model.save()
        form_link = reverse('registry_form', args=(registry_model.code,
                                                   form_model.id,
                                                   patient_model.pk,
                                                   context_model.id))

        return HttpResponseRedirect(form_link)
Beispiel #3
0
    def create_context(self, patient_model, display_name):
        rdrf_context = RDRFContext(registry=self.registry_model,
                                   content_object=patient_model, display_name=display_name)

        default_context_form_group = self.registry_model.default_context_form_group
        if default_context_form_group is not None:
            rdrf_context.context_form_group = default_context_form_group
            rdrf_context.display_name = default_context_form_group.get_default_name(
                patient_model)

        rdrf_context.save()
        return rdrf_context
Beispiel #4
0
    def _update_proms_fields(self, survey_request, survey_data):
        from rdrf.models.definition.models import RDRFContext
        from rdrf.models.definition.models import ContextFormGroup
        # pokes downloaded proms into correct fields inside
        # clinical system
        logger.debug("updating downloaded proms for survey request %s" %
                     survey_request.pk)
        patient_model = survey_request.patient
        metadata = self.registry_model.metadata
        consent_exists = False
        if "consents" in metadata:
            consent_dict = metadata["consents"]
            logger.debug("Consent Codes %s" % consent_dict)
            consent_exists = True
        else:
            logger.warning("No Consent metadata exists")

        is_followup = survey_request.survey.is_followup

        if is_followup:
            context_form_group = ContextFormGroup.objects.get(
                registry=self.registry_model, name="Followup")
            context_model = RDRFContext(registry=self.registry_model,
                                        context_form_group=context_form_group,
                                        content_object=patient_model,
                                        display_name="Follow Up")
            context_model.save()

        for cde_code, value in survey_data.items():
            try:
                cde_model = CommonDataElement.objects.get(code=cde_code)
            except CommonDataElement.DoesNotExist:
                logger.error("could not find cde %s" % cde_code)
                continue

            # NB. this assumes cde  is unique across reg ...
            try:
                is_consent = False
                if consent_exists:
                    consent_question_code = consent_dict.get(cde_code, None)
                    if consent_question_code is not None:
                        self._update_consentvalue(patient_model,
                                                  consent_question_code, value)
                        is_consent = True

                if not is_consent:
                    form_model, section_model = self._locate_cde(cde_model)
            except BaseException:
                logger.error("could not locate cde %s" % cde_code)
                # should fail for now skip

                continue

            try:
                if is_followup:
                    patient_model.set_form_value(self.registry_model.code,
                                                 form_model.name,
                                                 section_model.code,
                                                 cde_model.code, value,
                                                 context_model)
                else:
                    patient_model.set_form_value(self.registry_model.code,
                                                 form_model.name,
                                                 section_model.code,
                                                 cde_model.code, value)
            except Exception as ex:
                logger.error("Error updating proms field %s->%s: %s" %
                             (cde_code, value, ex))
                continue

            logger.debug("proms updated! %s %s %s %s --> %s" %
                         (patient_model, form_model.name, section_model.code,
                          cde_model.code, value))

        survey_request.state = SurveyRequestStates.RECEIVED
        survey_request.response = json.dumps(survey_data)
        survey_request.save()
        logger.debug("updated survey_request state to received")
Beispiel #5
0
    def _update_proms_fields(self, survey_request, survey_data):
        from rdrf.models.definition.models import RDRFContext
        # pokes downloaded proms into correct fields inside
        # clinical system
        context_model = None
        logger.debug("updating downloaded proms for survey request %s" %
                     survey_request.pk)
        patient_model = survey_request.patient
        metadata = self.registry_model.metadata
        consent_exists = False
        if "consents" in metadata:
            consent_dict = metadata["consents"]
            logger.debug("Consent Codes %s" % consent_dict)
            consent_exists = True
        else:
            logger.warning("No Consent metadata exists")

        is_followup = survey_request.survey.is_followup
        context_form_group = survey_request.survey.context_form_group
        if context_form_group is None and self.registry_model.has_feature(
                "contexts"):
            error_msg = "No Context Form Group selected on Survey %s" % survey_request.survey.name
            raise Exception(error_msg)

        if survey_request.survey.form:
            target_form_model = survey_request.survey.form
        else:
            target_form_model = None

        if is_followup:
            context_model = RDRFContext(registry=self.registry_model,
                                        context_form_group=context_form_group,
                                        content_object=patient_model,
                                        display_name="Follow Up")
            context_model.save()
        else:
            if self.registry_model.has_feature("contexts"):
                try:
                    context_model = RDRFContext.objects.get(
                        registry=self.registry_model,
                        context_form_group=context_form_group,
                        object_id=patient_model.pk)

                    if target_form_model and target_form_model not in context_form_group.forms:
                        error_msg = "The target form %s is not in the form group %s" % (
                            target_form_model.name, context_form_group.name)
                        raise Exception(error_msg)
                except RDRFContext.DoesNotExist:
                    error_msg = "Cannot locate context for group %s patient id %s" % (
                        context_form_group, patient_model.pk)
                    raise Exception(error_msg)
                except RDRFContext.MultipleObjectsReturned:
                    error_msg = "Expecting one context for group %s patient id %s" % (
                        context_form_group, patient_model.pk)
                    raise Exception(error_msg)

            else:
                # we should just use the "default" context
                context_model = patient_model.default_context(
                    self.registry_model)

        if context_model is None:
            raise Exception(
                "cannot determine proms pull context for patient id %s" %
                patient_model.pk)

        # Retrieve the cde_path
        cde_paths = {}
        for question in survey_request.survey.survey_questions.all():
            cde_paths = {**cde_paths, question.cde.code: question.cde_path}

        for cde_code, value in survey_data.items():
            try:
                cde_model = CommonDataElement.objects.get(code=cde_code)
            except CommonDataElement.DoesNotExist:
                logger.error("could not find cde %s" % cde_code)
                continue

            try:
                is_consent = False
                if consent_exists:
                    consent_question_code = consent_dict.get(cde_code, None)
                    if consent_question_code is not None:
                        self._update_consentvalue(patient_model,
                                                  consent_question_code, value)
                        is_consent = True

                if not is_consent:
                    # Find the cde code in the survey questions and check existance of cde_path
                    if cde_code in cde_paths.keys() and cde_paths[cde_code]:
                        form_name, section_code = list(
                            filter(None, cde_paths[cde_code].split("/")))
                        form_model = RegistryForm.objects.get(
                            name=form_name,
                            registry__code=self.registry_model.code)
                        section_model = Section.objects.get(code=section_code)
                    else:
                        # override target_form_model if cde_path exists
                        form_model, section_model = self._locate_cde(
                            cde_model, context_model, target_form_model)
            except BaseException as e:
                logger.error(f"could not locate cde {cde_code}: {e}")
                # should fail for now skip

                continue

            try:
                if not self.registry_model.has_feature("contexts"):
                    context_arg = None
                else:
                    context_arg = context_model

                if not is_consent:
                    patient_model.set_form_value(self.registry_model.code,
                                                 form_model.name,
                                                 section_model.code,
                                                 cde_model.code, value,
                                                 context_arg)
            except Exception as ex:
                logger.error("Error updating proms field %s->%s: %s" %
                             (cde_code, value, ex))
                continue

            logger.debug(
                "proms updated: patient %s context %s form %s sec %s cde %s val %s"
                % (patient_model, context_model.pk, form_model.name,
                   section_model.code, cde_model.code, value))

        survey_request.state = SurveyRequestStates.RECEIVED
        survey_request.response = json.dumps(survey_data)
        survey_request.save()
        logger.debug("updated survey_request state to received")