Example #1
0
def get_form_data_schema(request, domain, app_id, form_unique_id):
    """Get data schema

    :returns: A list of data source schema definitions. A data source schema
    definition is a dictionary. For details on the content of the dictionary,
    see https://github.com/dimagi/Vellum/blob/master/src/datasources.js
    """
    data = []

    app = get_app(domain, app_id)
    form = app.get_form(form_unique_id)

    try:
        data.append(get_session_schema(form))
        if form.requires_case() or is_usercase_in_use(domain):
            data.append(get_casedb_schema(form))
    except AppManagerException as e:
        notify_exception(request, message=str(e))
        return HttpResponseBadRequest(
            str(e) or
            _("There is an error in the case management of your application. "
              "Please fix the error to see case properties in this tree"))
    except Exception as e:
        notify_exception(request, message=str(e))
        return HttpResponseBadRequest("schema error, see log for details")

    data.extend(item_lists_by_domain(domain))
    kw = {}
    if "pretty" in request.GET:
        kw["indent"] = 2
    return HttpResponse(json.dumps(data, **kw))
Example #2
0
    def test_get_session_schema_for_child_module(self):
        # m0 - opens 'gold-fish' case.
        # m1 - has m0 as root-module, has parent-select, updates 'guppy' case
        self.module_0, _ = self.factory.new_basic_module('parent', 'gold-fish')
        self.module_1, _ = self.factory.new_basic_module(
            'child', 'guppy', parent_module=self.module_0)
        # m0f0 registers gold-fish case and a child case ('guppy')
        m0f0 = self.module_0.get_form(0)
        self.factory.form_requires_case(m0f0, update={'name': 'goldilocks'})
        self.factory.form_opens_case(m0f0, 'guppy', is_subcase=True)

        # m1f0 has parent-select, updates `guppy` case
        m1f0 = self.module_1.get_form(0)
        self.factory.form_requires_case(m1f0, parent_case_type='gold-fish')

        session_schema = get_session_schema(m1f0)

        expected_session_schema_structure = {
            "data": {
                "merge": True,
                "structure": {
                    "case_id_guppy": {
                        "reference": {
                            "hashtag": "#case",
                            "subset": "case",
                            "source": "casedb",
                            "key": "@case_id"
                        }
                    }
                }
            }
        }

        self.assertEqual(session_schema['structure'],
                         expected_session_schema_structure)
Example #3
0
    def test_get_session_schema_with_advanced_form(self):
        module_id = len(self.factory.app.modules)
        module, form = self.factory.new_advanced_module(module_id, "village")
        self.factory.form_opens_case(form, "village")
        self.factory.form_requires_case(
            form,
            case_type=self.factory.app.get_module(0).case_type,
            update={'foo': '/data/question1'})
        schema = get_session_schema(form)

        expected_schema = {
            'id': 'commcaresession',
            'uri': 'jr://instance/session',
            'name': 'Session',
            'path': '/session',
            'structure': {
                'data': {
                    'merge': True,
                    'structure': {
                        'case_id_load_village_0': {
                            'reference': {
                                'hashtag': '#case',
                                'source': 'casedb',
                                'subset': 'case',
                                'key': '@case_id'
                            }
                        }
                    }
                }
            }
        }
        self.assertEqual(schema, expected_schema)
Example #4
0
 def test_session_schema(self):
     # Session schema should not contain case
     self.assertEqual(
         get_session_schema(self.form), {
             'id': 'commcaresession',
             'name': 'Session',
             'path': '/session',
             'structure': {},
             'uri': 'jr://instance/session'
         })
Example #5
0
 def test_get_session_schema_for_module_with_no_case_type(self):
     form = self.add_form()
     schema = get_session_schema(form)
     self.assert_has_kv_pairs(
         schema, {
             "id": "commcaresession",
             "uri": "jr://instance/session",
             "name": "Session",
             "path": "/session",
         })
     assert "data" not in schema["structure"], schema["structure"]
Example #6
0
    def test_get_session_schema_for_child_module_not_parent_case_type(self):
        # m0 - opens 'goldfish' case.
        # m1 - has m0 as root-module, has parent-select, updates 'guppy' case
        self.module_0, m0f0 = self.factory.new_basic_module(
            'parent', 'goldfish')
        self.factory.form_requires_case(m0f0)

        self.module_1, m1f0 = self.factory.new_basic_module(
            'child', 'guppy', parent_module=self.module_0)
        self.factory.form_requires_case(m1f0)
        self.module_1.parent_select.active = True
        self.module_1.parent_select.relationship = None
        self.module_1.parent_select.module_id = self.module_0.unique_id

        session_schema = get_session_schema(m1f0)

        expected_session_schema_structure = {
            "data": {
                "merge": True,
                "structure": {
                    "case_id_guppy": {
                        "reference": {
                            "hashtag": "#case",
                            "subset": "case",
                            "source": "casedb",
                            "key": "@case_id"
                        }
                    },
                    "case_id": {
                        "reference": {
                            "hashtag": "#case:parent-module",
                            "subset": "case:parent-module",
                            "source": "casedb",
                            "key": "@case_id"
                        }
                    }
                }
            }
        }

        self.assertEqual(session_schema['structure'],
                         expected_session_schema_structure)
Example #7
0
 def test_get_session_schema_for_simple_module_with_case(self):
     module, form = self.factory.new_basic_module('village', 'village')
     self.factory.form_requires_case(form)
     schema = get_session_schema(form)
     self.assertDictEqual(
         schema["structure"], {
             "data": {
                 "merge": True,
                 "structure": {
                     "case_id": {
                         "reference": {
                             "hashtag": "#case",
                             "source": "casedb",
                             "subset": "case",
                             "key": "@case_id",
                         },
                     },
                 },
             },
         })
Example #8
0
def get_form_data_schema(request, domain, form_unique_id):
    """Get data schema

    One of `app_id` or `form_unique_id` is required. `app_id` is ignored
    if `form_unique_id` is provided.

    :returns: A list of data source schema definitions. A data source schema
    definition is a dictionary. For details on the content of the dictionary,
    see https://github.com/dimagi/Vellum/blob/master/src/datasources.js
    """
    data = []

    try:
        form, app = Form.get_form(form_unique_id, and_app=True)
    except ResourceConflict:
        raise Http404()

    if app.domain != domain:
        raise Http404()

    try:
        data.append(get_session_schema(form))
        if form.requires_case() or is_usercase_in_use(domain):
            data.append(get_casedb_schema(form))
    except AppManagerException as e:
        notify_exception(request, message=str(e))
        return HttpResponseBadRequest(
            str(e) or _("There is an error in the case management of your application. "
            "Please fix the error to see case properties in this tree")
        )
    except Exception as e:
        notify_exception(request, message=six.text_type(e))
        return HttpResponseBadRequest("schema error, see log for details")

    data.extend(
        sorted(item_lists_by_domain(domain), key=lambda x: x['name'].lower())
    )
    kw = {}
    if "pretty" in request.GET:
        kw["indent"] = 2
    return HttpResponse(json.dumps(data, **kw))
Example #9
0
def get_form_data_schema(request, domain, form_unique_id):
    """Get data schema

    One of `app_id` or `form_unique_id` is required. `app_id` is ignored
    if `form_unique_id` is provided.

    :returns: A list of data source schema definitions. A data source schema
    definition is a dictionary. For details on the content of the dictionary,
    see https://github.com/dimagi/Vellum/blob/master/src/datasources.js
    """
    data = []

    try:
        form, app = Form.get_form(form_unique_id, and_app=True)
    except ResourceConflict:
        raise Http404()

    if app.domain != domain:
        raise Http404()

    try:
        data.append(get_session_schema(form))
        if form.requires_case() or is_usercase_in_use(domain):
            data.append(get_casedb_schema(form))
    except AppManagerException as e:
        notify_exception(request, message=str(e))
        return HttpResponseBadRequest(
            str(e) or _("There is an error in the case management of your application. "
            "Please fix the error to see case properties in this tree")
        )
    except Exception as e:
        notify_exception(request, message=six.text_type(e))
        return HttpResponseBadRequest("schema error, see log for details")

    data.extend(
        sorted(item_lists_by_domain(domain), key=lambda x: x['name'].lower())
    )
    kw = {}
    if "pretty" in request.GET:
        kw["indent"] = 2
    return HttpResponse(json.dumps(data, **kw))
Example #10
0
 def test_get_session_schema_with_user_case(self):
     module, form = self.factory.new_basic_module('village', 'village')
     with patch('corehq.apps.app_manager.app_schemas.casedb_schema.is_usercase_in_use') as mock1, \
             patch('corehq.apps.app_manager.app_schemas.session_schema.is_usercase_in_use') as mock2:
         mock1.return_value = True
         mock2.return_value = True
         schema = get_session_schema(form)
         self.assertDictEqual(
             schema["structure"]["context"], {
                 "merge": True,
                 "structure": {
                     "userid": {
                         "reference": {
                             "hashtag": "#user",
                             "source": "casedb",
                             "subset": util.USERCASE_TYPE,
                             "subset_key": "@case_type",
                             "subset_filter": True,
                             "key": "hq_user_id",
                         },
                     },
                 },
             })
Example #11
0
 def test_get_session_schema(self):
     module, form = self.factory.new_basic_module('village', 'village')
     schema = get_session_schema(form)
     self.assertNotIn("context", schema["structure"], repr(schema))
Example #12
0
    def test_get_session_schema_for_child_module_with_registry(self):
        """Child module loads a case with the same case type as the parent module.
        Child module is using data registry search"""
        self.module_0, m0f0 = self.factory.new_basic_module(
            'parent', 'patient')
        self.factory.form_requires_case(m0f0)

        self.module_1, m1f0 = self.factory.new_basic_module(
            'child', 'patient', parent_module=self.module_0)
        self.factory.form_requires_case(m1f0)
        self.module_1.search_config.data_registry = "reg1"
        self.module_1.parent_select.active = True
        self.module_1.parent_select.relationship = None
        self.module_1.parent_select.module_id = self.module_0.unique_id

        session_schema = get_session_schema(m1f0)
        casedb_schema = get_casedb_schema(m1f0)
        registry_schema = get_registry_schema(m1f0)

        expected_session_schema_structure = {
            "data": {
                "merge": True,
                "structure": {
                    "case_id_patient": {
                        "reference": {
                            "hashtag": "#registry_case",
                            "source": "registry",
                            "subset": "case",
                            "key": "@case_id",
                        }
                    },
                    "case_id": {
                        "reference": {
                            "hashtag": "#case:parent-module",
                            "subset": "case:parent-module",
                            "source": "casedb",
                            "key": "@case_id"
                        }
                    }
                }
            }
        }

        expected_casedb_schema_subsets = [{
            "structure": {
                "case_name": {
                    "description": "",
                }
            },
            "related": None,
            "id": "case:parent-module",
            "name": "patient - parent module",
        }]
        expected_registry_schema_subsets = [{
            "structure": {
                "case_name": {
                    "description": "",
                }
            },
            "related": None,
            "id": "case",
            "name": "patient",
        }]

        self.assertEqual(session_schema['structure'],
                         expected_session_schema_structure)
        self.assertEqual(casedb_schema['subsets'],
                         expected_casedb_schema_subsets)
        self.assertEqual(registry_schema['subsets'],
                         expected_registry_schema_subsets)