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)])))
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)}
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)}
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)
{"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)))
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)
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' %