def form_context(request, domain, app_id, module_id, form_id): app = Application.get(app_id) form_url = "%s%s" % (get_url_base(), reverse('download_xform', args=[domain, app_id, module_id, form_id])) case_id = request.GET.get('case_id') try: form = app.get_module(module_id).get_form(form_id).name.values()[0] except (FormNotFoundException, ModuleNotFoundException): raise Http404() # make the name for the session we will use with the case and form session_name = u'{app} > {form}'.format( app=app.name, form=form, ) if case_id: session_name = u'{0} - {1}'.format(session_name, CommCareCase.get(case_id).name) delegation = request.GET.get('task-list') == 'true' offline = request.GET.get('offline') == 'true' session_helper = SessionDataHelper(domain, request.couch_user, case_id, delegation=delegation, offline=offline) return json_response( session_helper.get_full_context({ 'form_url': form_url, }, { 'session_name': session_name, 'app_id': app._id }))
def form_context(request, domain, app_id, module_id, form_id): app = Application.get(app_id) form_url = "%s%s" % (get_url_base(), reverse('download_xform', args=[domain, app_id, module_id, form_id])) case_id = request.GET.get('case_id') instance_id = request.GET.get('instance_id') try: form = app.get_module(module_id).get_form(form_id) except (FormNotFoundException, ModuleNotFoundException): raise Http404() form_name = form.name.values()[0] # make the name for the session we will use with the case and form session_name = u'{app} > {form}'.format( app=app.name, form=form_name, ) if case_id: session_name = u'{0} - {1}'.format(session_name, CommCareCase.get(case_id).name) root_context = { 'form_url': form_url, } if instance_id: try: root_context['instance_xml'] = XFormInstance.get_db( ).fetch_attachment(instance_id, ATTACHMENT_NAME) except ResourceNotFound: raise Http404() session_extras = {'session_name': session_name, 'app_id': app._id} session_extras.update( get_cloudcare_session_data(domain, form, request.couch_user)) delegation = request.GET.get('task-list') == 'true' offline = request.GET.get('offline') == 'true' session_helper = SessionDataHelper(domain, request.couch_user, case_id, delegation=delegation, offline=offline) return json_response( session_helper.get_full_context(root_context, session_extras))
def get_session_context(request, domain, session_id): try: session = EntrySession.objects.get(session_id=session_id) except EntrySession.DoesNotExist: session = None if request.method == 'DELETE': if session: session.delete() return json_response({'status': 'success'}) else: helper = SessionDataHelper(domain, request.couch_user) return json_response( helper.get_full_context({ 'session_id': session_id, 'app_id': session.app_id if session else None }))
def filter_cases(request, domain, app_id, module_id, parent_id=None): app = Application.get(app_id) module = app.get_module(module_id) delegation = request.GET.get('task-list') == 'true' auth_cookie = request.COOKIES.get('sessionid') suite_gen = SuiteGenerator(app) xpath = suite_gen.get_filter_xpath(module, delegation=delegation) extra_instances = [{ 'id': inst.id, 'src': inst.src } for inst in suite_gen.get_instances_for_module( module, additional_xpaths=[xpath])] # touchforms doesn't like this to be escaped xpath = HTMLParser.HTMLParser().unescape(xpath) if delegation: case_type = DELEGATION_STUB_CASE_TYPE else: case_type = module.case_type if xpath: # if we need to do a custom filter, send it to touchforms for processing additional_filters = { "properties/case_type": case_type, "footprint": True } helper = SessionDataHelper(domain, request.couch_user) result = helper.filter_cases(xpath, additional_filters, DjangoAuth(auth_cookie), extra_instances=extra_instances) if result.get('status', None) == 'error': return HttpResponseServerError( result.get("message", _("Something went wrong filtering your cases."))) case_ids = result.get("cases", []) else: # otherwise just use our built in api with the defaults case_ids = [ res.id for res in get_filtered_cases(domain, status=CASE_STATUS_OPEN, case_type=case_type, user_id=request.couch_user._id, ids_only=True) ] cases = [ CommCareCase.wrap(doc) for doc in iter_docs(CommCareCase.get_db(), case_ids) ] if parent_id: cases = filter(lambda c: c.parent and c.parent.case_id == parent_id, cases) # refilter these because we might have accidentally included footprint cases # in the results from touchforms. this is a little hacky but the easiest # (quick) workaround. should be revisted when we optimize the case list. cases = filter(lambda c: c.type == case_type, cases) cases = [c.get_json(lite=True) for c in cases if c] parents = [] if delegation: for case in cases: parent_id = case['indices']['parent']['case_id'] parents.append(CommCareCase.get(parent_id)) return json_response({'cases': cases, 'parents': parents}) else: return json_response(cases)
def filter_cases(request, domain, app_id, module_id, parent_id=None): app = Application.get(app_id) module = app.get_module(module_id) auth_cookie = request.COOKIES.get('sessionid') suite_gen = SuiteGenerator(app) xpath = SuiteGenerator.get_filter_xpath(module) extra_instances = [{ 'id': inst.id, 'src': inst.src } for inst in suite_gen.get_instances_for_module( module, additional_xpaths=[xpath])] # touchforms doesn't like this to be escaped xpath = HTMLParser.HTMLParser().unescape(xpath) case_type = module.case_type if xpath: # if we need to do a custom filter, send it to touchforms for processing additional_filters = { "properties/case_type": case_type, "footprint": True } helper = SessionDataHelper(domain, request.couch_user) result = helper.filter_cases(xpath, additional_filters, DjangoAuth(auth_cookie), extra_instances=extra_instances) if result.get('status', None) == 'error': code = result.get('code', 500) message = result.get( 'message', _("Something went wrong filtering your cases.")) if code == 500: notify_exception(None, message=message) return json_response(message, status_code=code) case_ids = result.get("cases", []) else: # otherwise just use our built in api with the defaults case_ids = [ res.id for res in get_filtered_cases( domain, status=CASE_STATUS_OPEN, case_type=case_type, user_id=request.couch_user._id, footprint=True, ids_only=True, ) ] cases = [ CommCareCase.wrap(doc) for doc in iter_docs(CommCareCase.get_db(), case_ids) ] if parent_id: cases = filter(lambda c: c.parent and c.parent.case_id == parent_id, cases) # refilter these because we might have accidentally included footprint cases # in the results from touchforms. this is a little hacky but the easiest # (quick) workaround. should be revisted when we optimize the case list. cases = filter(lambda c: c.type == case_type, cases) cases = [c.get_json(lite=True) for c in cases if c] return json_response(cases)