Beispiel #1
0
    def generateRoot(self, instance):
        ref = instance.getReference()
        def from_bundle(inst):
            root = inst.getRoot()
            root.setParent(instance.getBase())
            return root

        if 'casedb' in ref:
            return CaseInstanceTreeElement(
                instance.getBase(),
                CaseDatabase(
                    self.vars.get('host'),
                    self.vars['domain'],
                    self.auth,
                    self.vars.get("additional_filters", {}),
                    self.vars.get("preload_cases", False),
                    self.form_context,
                ),
                False
            )
        elif 'fixture' in ref:
            fixture_id = ref.split('/')[-1]
            user_id = self.vars['user_id']
            ret = self._get_fixture(user_id, fixture_id)
            # Unclear why this is necessary but it is
            ret.setParent(instance.getBase())
            return ret
        elif 'ledgerdb' in ref:
            return LedgerInstanceTreeElement(
                instance.getBase(),
                LedgerDatabase(
                    self.vars.get('host'), self.vars['domain'],
                    self.auth, self.vars.get("additional_filters", {}),
                    self.vars.get("preload_cases", False),
                )
            )

        elif 'session' in ref:
            meta_keys = ['device_id', 'app_version', 'username', 'user_id']
            exclude_keys = ['additional_filters', 'user_data']
            sess = CommCareSession(None) # will not passing a CCPlatform cause problems later?
            for k, v in self.vars.iteritems():
                if k not in meta_keys and k not in exclude_keys:
                    # com.xhaus.jyson.JysonCodec returns data as byte strings
                    # in unknown encoding (possibly ISO-8859-1)
                    sess.setDatum(k, unicode(v, errors='replace'))

            clean_user_data = {}
            for k, v in self.vars.get('user_data', {}).iteritems():
                clean_user_data[k] = unicode(v if v is not None else '', errors='replace')

            return from_bundle(sess.getSessionInstance(*([self.vars.get(k, '') for k in meta_keys] + \
                                                         [to_hashtable(clean_user_data)])))
Beispiel #2
0
def filter_cases(content):
    try:
        modified_xpath = "join(',', instance('casedb')/casedb/case%(filters)s/@case_id)" % \
                {"filters": content["filter_expr"]}

        api_auth = content.get('hq_auth')
        session_data = content.get("session_data", {})
        ccInstances = CCInstances(session_data, api_auth)
        caseInstance = ExternalDataInstance("jr://instance/casedb", "casedb")
        caseInstance.initialize(ccInstances, "casedb")
        instances = to_hashtable({"casedb": caseInstance})
        case_list = XPathFuncExpr.toString(XPathParseTool.parseXPath(modified_xpath)\
            .eval(EvaluationContext(None, instances)))
        return {'cases': filter(lambda x: x, case_list.split(","))}
    except Exception, e:
        return {'error': str(e)}
Beispiel #3
0
def filter_cases(content):
    try: 
        modified_xpath = "join(',', instance('casedb')/casedb/case%(filters)s/@case_id)" % \
                {"filters": content["filter_expr"]}
            
        api_auth = content.get('hq_auth')
        session_data = content.get("session_data", {})
        ccInstances = CCInstances(session_data, api_auth)
        caseInstance = ExternalDataInstance("jr://instance/casedb", "casedb")
        caseInstance.initialize(ccInstances, "casedb")
        instances = to_hashtable({"casedb": caseInstance})
        case_list = XPathFuncExpr.toString(XPathParseTool.parseXPath(modified_xpath)\
            .eval(EvaluationContext(None, instances)))
        return {'cases': filter(lambda x: x,case_list.split(","))}
    except Exception, e:
        return {'error': str(e)}
Beispiel #4
0
    def generateRoot(self, instance):

        ref = instance.getReference()

        def from_bundle(inst):
            root = inst.getRoot()
            root.setParent(instance.getBase())
            return root

        if 'casedb' in ref:
            if self.uses_sqlite:
                case_storage = self.sandbox.getCaseStorage()
            else:
                case_storage = CaseDatabase(
                    self.vars.get('host'),
                    self.vars['domain'],
                    self.auth,
                    self.vars.get("additional_filters", {}),
                    self.vars.get("preload_cases", False),
                    self.form_context,
                )
            return CaseInstanceTreeElement(
                instance.getBase(),
                case_storage,
                False
            )
        elif 'fixture' in ref:
            fixture_id = ref.split('/')[-1]
            user_id = self.vars['user_id']
            if self.uses_sqlite:
                fixture = SandboxUtils.loadFixture(self.sandbox, fixture_id, user_id)
                root = fixture.getRoot()
            else:
                root = self._get_fixture(user_id, fixture_id)
            root.setParent(instance.getBase())
            return root
        elif 'ledgerdb' in ref:
            if self.uses_sqlite:
                ledger_storage = self.sandbox.getLedgerStorage()
            else:
                ledger_storage = LedgerDatabase(
                    self.vars.get('host'), self.vars['domain'],
                    self.auth, self.vars.get("additional_filters", {}),
                    self.vars.get("preload_cases", False),
                )
            return LedgerInstanceTreeElement(
                instance.getBase(),
                ledger_storage
            )
        elif 'session' in ref:
            meta_keys = ['device_id', 'app_version', 'username', 'user_id']
            exclude_keys = ['additional_filters', 'user_data']
            sess = CommCareSession()  # will not passing a CCPlatform cause problems later?
            for k, v in self.vars.iteritems():
                if k not in meta_keys \
                        and k not in exclude_keys:
                    # com.xhaus.jyson.JysonCodec returns data as byte strings
                    # in unknown encoding (possibly ISO-8859-1)
                    sess.setDatum(k, unicode(v, errors='replace'))

            clean_user_data = {}
            for k, v in self.vars.get('user_data', {}).iteritems():
                clean_user_data[k] = unicode(v if v is not None else '', errors='replace')

            form_instance = SessionInstanceBuilder.getSessionInstance(sess.getFrame(), *([self.vars.get(k, '') for k in meta_keys] +
                                                     [to_hashtable(clean_user_data)]))
            return from_bundle(form_instance)
Beispiel #5
0
                     {"filters": filter_expr}
    # whenever we do a filter case operation we need to load all
    # the cases, so force this unless manually specified
    if 'preload_cases' not in session_data:
        session_data['preload_cases'] = True

    ccInstances = CCInstances(session_data, api_auth, form_context=form_context,
                              restore_xml=restore_xml, force_sync=force_sync, uses_sqlite=uses_sqlite)
    caseInstance = ExternalDataInstance("jr://instance/casedb", "casedb")

    try:
        caseInstance.initialize(ccInstances, "casedb")
    except (HTTPError, URLError), e:
        raise TouchFormsUnauthorized('Unable to connect to HQ: %s' % str(e))

    instances = to_hashtable({"casedb": caseInstance})

    # load any additional instances needed
    for extra_instance_config in session_data.get('extra_instances', []):
        data_instance = ExternalDataInstance(extra_instance_config['src'], extra_instance_config['id'])
        data_instance.initialize(ccInstances, extra_instance_config['id'])
        instances[extra_instance_config['id']] = data_instance

    try:
        case_list = XPathFuncExpr.toString(
            XPathParseTool.parseXPath(modified_xpath).eval(
                EvaluationContext(None, instances)))
        return {'cases': filter(lambda x: x, case_list.split(","))}
    except (XPathException, XPathSyntaxException), e:
        raise TouchcareInvalidXPath('Error querying cases with xpath %s: %s' % (filter_expr, str(e)))
Beispiel #6
0
    def generateRoot(self, instance):

        ref = instance.getReference()

        def from_bundle(inst):
            root = inst.getRoot()
            root.setParent(instance.getBase())
            return root

        if 'casedb' in ref:
            if self.uses_sqlite:
                case_storage = self.sandbox.getCaseStorage()
            else:
                case_storage = CaseDatabase(
                    self.vars.get('host'),
                    self.vars['domain'],
                    self.auth,
                    self.vars.get("additional_filters", {}),
                    self.vars.get("preload_cases", False),
                    self.form_context,
                )
            return CaseInstanceTreeElement(instance.getBase(), case_storage,
                                           False)
        elif 'fixture' in ref:
            fixture_id = ref.split('/')[-1]
            user_id = self.vars['user_id']
            if self.uses_sqlite:
                fixture = SandboxUtils.loadFixture(self.sandbox, fixture_id,
                                                   user_id)
                root = fixture.getRoot()
            else:
                root = self._get_fixture(user_id, fixture_id)
            root.setParent(instance.getBase())
            return root
        elif 'ledgerdb' in ref:
            if self.uses_sqlite:
                ledger_storage = self.sandbox.getLedgerStorage()
            else:
                ledger_storage = LedgerDatabase(
                    self.vars.get('host'),
                    self.vars['domain'],
                    self.auth,
                    self.vars.get("additional_filters", {}),
                    self.vars.get("preload_cases", False),
                )
            return LedgerInstanceTreeElement(instance.getBase(),
                                             ledger_storage)
        elif 'session' in ref:
            meta_keys = ['device_id', 'app_version', 'username', 'user_id']
            exclude_keys = ['additional_filters', 'user_data']
            sess = CommCareSession(
            )  # will not passing a CCPlatform cause problems later?
            for k, v in self.vars.iteritems():
                if k not in meta_keys \
                        and k not in exclude_keys:
                    # com.xhaus.jyson.JysonCodec returns data as byte strings
                    # in unknown encoding (possibly ISO-8859-1)
                    sess.setDatum(k, unicode(v, errors='replace'))

            clean_user_data = {}
            for k, v in self.vars.get('user_data', {}).iteritems():
                clean_user_data[k] = unicode(v if v is not None else '',
                                             errors='replace')

            form_instance = SessionInstanceBuilder.getSessionInstance(
                sess.getFrame(),
                *([self.vars.get(k, '')
                   for k in meta_keys] + [to_hashtable(clean_user_data)]))
            return from_bundle(form_instance)
Beispiel #7
0
        session_data['preload_cases'] = True

    ccInstances = CCInstances(session_data,
                              api_auth,
                              form_context=form_context,
                              restore_xml=restore_xml,
                              force_sync=force_sync,
                              uses_sqlite=uses_sqlite)
    caseInstance = ExternalDataInstance("jr://instance/casedb", "casedb")

    try:
        caseInstance.initialize(ccInstances, "casedb")
    except (HTTPError, URLError), e:
        raise TouchFormsUnauthorized('Unable to connect to HQ: %s' % str(e))

    instances = to_hashtable({"casedb": caseInstance})

    # load any additional instances needed
    for extra_instance_config in session_data.get('extra_instances', []):
        data_instance = ExternalDataInstance(extra_instance_config['src'],
                                             extra_instance_config['id'])
        data_instance.initialize(ccInstances, extra_instance_config['id'])
        instances[extra_instance_config['id']] = data_instance

    try:
        case_list = XPathFuncExpr.toString(
            XPathParseTool.parseXPath(modified_xpath).eval(
                EvaluationContext(None, instances)))
        return {'cases': filter(lambda x: x, case_list.split(","))}
    except (XPathException, XPathSyntaxException), e:
        raise TouchcareInvalidXPath('Error querying cases with xpath %s: %s' %