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
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)
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
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")
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")