def get_dict_to_report(domain, case_id, report_slug): try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None baby_case = [c for c in case.get_subcases().all() if c.type == 'baby'] if baby_case: forms = case.get_forms() + baby_case[0].get_forms() else: forms = case.get_forms() try: user = CommCareUser.get_by_user_id(case.user_id, domain) except Exception: user = None sections = get_questions_with_answers(forms, domain, report_slug) return { "domain": domain, "case_id": case_id, "report": dict( name=case_inline_display(case), slug=report_slug, is_async=False, ), "user": user, "case": case, "sections": sections }
def get_dict_to_report(domain, case_id, report_slug): try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None baby_case = [c for c in case.get_subcases().all() if c.type == 'baby'] if baby_case: mother_forms = [form for form in case.get_forms() if form.xmlns == MOTHER_POSTPARTUM_VISIT_FORM_XMLNS] baby_forms = [form for form in baby_case[0].get_forms() if form.xmlns == BABY_POSTPARTUM_VISIT_FORM_XMLNS] forms = mother_forms + baby_forms else: forms = [form for form in case.get_forms() if form.xmlns == MOTHER_POSTPARTUM_VISIT_FORM_XMLNS] try: user = CommCareUser.get_by_user_id(case.user_id, domain) except Exception: user = None sections = get_questions_with_answers(forms, domain, report_slug) return { "domain": domain, "case_id": case_id, "report": dict( name=case_inline_display(case), slug=report_slug, is_async=False, ), "user": user, "case": case, "sections": sections }
def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user.user_id, domain) try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None if case is None or case.doc_type != "CommCareCase" or case.domain != domain: messages.info(request, "Sorry, we couldn't find that case. If you think this is a mistake please report an issue.") return HttpResponseRedirect(inspect.CaseListReport.get_url(domain=domain)) try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).raw_username except Exception: try: owning_group = Group.get(case.owner_id) owner_name = owning_group.display_name if owning_group.domain == domain else '' except Exception: owner_name = None try: username = CommCareUser.get_by_user_id(case.user_id, domain).raw_username except Exception: username = None return render(request, "reports/reportdata/case_details.html", { "domain": domain, "case_id": case_id, "case": case, "username": username, "owner_name": owner_name, "slug": inspect.CaseListReport.slug, "report": dict( name=case_inline_display(case), slug=inspect.CaseListReport.slug, is_async=False, ), "layout_flush_content": True, "timezone": timezone, "case_display_options": { "display": request.project.get_case_display(case), "timezone": timezone, "get_case_url": lambda case_id: reverse( case_details, args=[domain, case_id]) }, })
def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user, domain) try: case = _get_case_or_404(domain, case_id) except Http404: messages.info( request, "Sorry, we couldn't find that case. If you think this is a mistake please report an issue." ) return HttpResponseRedirect(CaseListReport.get_url(domain=domain)) try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).raw_username except Exception: try: owning_group = Group.get(case.owner_id) owner_name = owning_group.display_name if owning_group.domain == domain else "" except Exception: owner_name = None try: username = CommCareUser.get_by_user_id(case.user_id, domain).raw_username except Exception: username = None return render( request, "reports/reportdata/case_details.html", { "domain": domain, "case_id": case_id, "case": case, "username": username, "owner_name": owner_name, "slug": CaseListReport.slug, "report": dict(name=case_inline_display(case), slug=CaseListReport.slug, is_async=False), "layout_flush_content": True, "timezone": timezone, "case_display_options": { "display": request.project.get_case_display(case), "timezone": timezone, "get_case_url": lambda case_id: reverse(case_details, args=[domain, case_id]), }, "show_case_rebuild": toggles.CASE_REBUILD.enabled(request.user.username), }, )
def _get_cases_changed_context(domain, form, case_id=None): case_blocks = extract_case_blocks(form) for i, block in enumerate(list(case_blocks)): if case_id and block.get(const.CASE_ATTR_ID) == case_id: case_blocks.pop(i) case_blocks.insert(0, block) cases = [] for b in case_blocks: this_case_id = b.get(const.CASE_ATTR_ID) try: this_case = CaseAccessors(domain).get_case( this_case_id) if this_case_id else None valid_case = True except ResourceNotFound: this_case = None valid_case = False if this_case and this_case.case_id: url = reverse('case_details', args=[domain, this_case.case_id]) else: url = "#" definition = get_default_definition( sorted_case_update_keys(b.keys()), assume_phonetimes=( not form.metadata or (form.metadata.deviceID != CLOUDCARE_DEVICE_ID)), ) cases.append({ "is_current_case": case_id and this_case_id == case_id, "name": case_inline_display(this_case), "table": get_tables_as_columns(b, definition, timezone=get_timezone_for_request()), "url": url, "valid_case": valid_case, "case_type": this_case.type if valid_case else None, }) return {'cases': cases}
def get_dict_to_report(domain, case_id, report_slug): try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).full_name except Exception: owner_name = None try: owning_group = Group.get(case.owner_id) sub_center = owning_group.display_name if owning_group.domain == domain else '' except Exception: sub_center = None try: user = CommCareUser.get_by_user_id(case.user_id, domain) except Exception: user = None questions = get_questions_with_answers(case.get_forms(), domain, report_slug) return { "domain": domain, "case_id": case_id, "report": dict( name=case_inline_display(case), slug=report_slug, is_async=False, ), "owner_name": owner_name, "user": user, "sub_center": sub_center, "case": case, "questions": questions }
def render_form(form, domain, options): """ Uses options since Django 1.3 doesn't seem to support templatetag kwargs. Change to kwargs when we're on a version of Django that does. """ timezone = get_timezone_for_request() case_id = options.get('case_id') side_pane = options.get('side_pane', False) user = options.get('user', None) request = options.get('request', None) support_enabled = toggle_enabled(request, toggles.SUPPORT) _get_tables_as_columns = partial(get_tables_as_columns, timezone=timezone) # Form Data tab form_data, question_list_not_found = get_readable_data_for_submission(form) # Case Changes tab case_blocks = extract_case_blocks(form) for i, block in enumerate(list(case_blocks)): if case_id and block.get(const.CASE_ATTR_ID) == case_id: case_blocks.pop(i) case_blocks.insert(0, block) cases = [] for b in case_blocks: this_case_id = b.get(const.CASE_ATTR_ID) try: this_case = CaseAccessors(domain).get_case(this_case_id) if this_case_id else None valid_case = True except ResourceNotFound: this_case = None valid_case = False if this_case and this_case.case_id: url = reverse('case_details', args=[domain, this_case.case_id]) else: url = "#" definition = get_default_definition( sorted_case_update_keys(b.keys()), assume_phonetimes=(not form.metadata or (form.metadata.deviceID != CLOUDCARE_DEVICE_ID)), ) cases.append({ "is_current_case": case_id and this_case_id == case_id, "name": case_inline_display(this_case), "table": _get_tables_as_columns(b, definition), "url": url, "valid_case": valid_case }) # Form Metadata tab meta = _top_level_tags(form).get('meta', None) or {} meta['received_on'] = json_format_datetime(form.received_on) if support_enabled: meta['last_sync_token'] = form.last_sync_token definition = get_default_definition(sorted_form_metadata_keys(meta.keys())) form_meta_data = _get_tables_as_columns(meta, definition) if getattr(form, 'auth_context', None): auth_context = AuthContext(form.auth_context) auth_context_user_id = auth_context.user_id auth_user_info = get_doc_info_by_id(domain, auth_context_user_id) else: auth_user_info = get_doc_info_by_id(domain, None) auth_context = AuthContext( user_id=None, authenticated=False, domain=domain, ) meta_userID = meta.get('userID') meta_username = meta.get('username') if meta_userID == 'demo_user': user_info = DocInfo( domain=domain, display='demo_user', ) elif meta_username == 'admin': user_info = DocInfo( domain=domain, display='admin', ) else: user_info = get_doc_info_by_id(domain, meta_userID) user_can_edit = ( request and user and request.domain and (user.can_edit_data() or user.is_commcare_user()) ) show_edit_options = ( user_can_edit and can_edit_form_location(domain, user, form) ) show_edit_submission = ( user_can_edit and has_privilege(request, privileges.DATA_CLEANUP) and not form.is_deprecated ) show_resave = ( user_can_edit and support_enabled ) def _get_edit_info(instance): info = { 'was_edited': False, 'is_edit': False, } if instance.is_deprecated: info.update({ 'was_edited': True, 'latest_version': instance.orig_id, }) if getattr(instance, 'edited_on', None) and getattr(instance, 'deprecated_form_id', None): info.update({ 'is_edit': True, 'edited_on': instance.edited_on, 'previous_version': instance.deprecated_form_id }) return info return render_to_string("reports/form/partials/single_form.html", { "context_case_id": case_id, "instance": form, "is_archived": form.is_archived, "edit_info": _get_edit_info(form), "domain": domain, 'question_list_not_found': question_list_not_found, "form_data": form_data, "cases": cases, "form_table_options": { # todo: wells if display config has more than one column "put_loners_in_wells": False }, "form_meta_data": form_meta_data, "auth_context": auth_context, "auth_user_info": auth_user_info, "user_info": user_info, "side_pane": side_pane, "show_edit_options": show_edit_options, "show_edit_submission": show_edit_submission, "show_resave": show_resave, }, RequestContext(request))
def render_form(form, domain, options): """ Uses options since Django 1.3 doesn't seem to support templatetag kwargs. Change to kwargs when we're on a version of Django that does. """ # don't actually use the passed in timezone since we assume form submissions already come # in in local time. # todo: we should revisit this when we properly handle timezones in form processing. timezone = pytz.utc case_id = options.get('case_id') case_id_attr = "@%s" % const.CASE_TAG_ID _get_tables_as_columns = partial(get_tables_as_columns, timezone=timezone) # Form Data tab form_data, question_list_not_found = get_readable_form_data(form) # Case Changes tab case_blocks = extract_case_blocks(form) for i, block in enumerate(list(case_blocks)): if case_id and block.get(case_id_attr) == case_id: case_blocks.pop(i) case_blocks.insert(0, block) cases = [] for b in case_blocks: this_case_id = b.get(case_id_attr) try: this_case = CommCareCase.get( this_case_id) if this_case_id else None valid_case = True except ResourceNotFound: this_case = None valid_case = False if this_case and this_case._id: url = reverse('case_details', args=[domain, this_case._id]) else: url = "#" definition = get_definition(sorted_case_update_keys(b.keys())) cases.append({ "is_current_case": case_id and this_case_id == case_id, "name": case_inline_display(this_case), "table": _get_tables_as_columns(b, definition), "url": url, "valid_case": valid_case }) # Form Metadata tab meta = form.top_level_tags().get('meta', {}) definition = get_definition(sorted_form_metadata_keys(meta.keys())) form_meta_data = _get_tables_as_columns(meta, definition) if 'auth_context' in form: auth_context = AuthContext(form.auth_context) auth_context_user_id = auth_context.user_id auth_user_info = get_doc_info_by_id(domain, auth_context_user_id) else: auth_user_info = get_doc_info_by_id(domain, None) auth_context = AuthContext( user_id=None, authenticated=False, domain=domain, ) meta_userID = meta.get('userID') meta_username = meta.get('username') if meta_userID == 'demo_user': user_info = DocInfo( domain=domain, display='demo_user', ) elif meta_username == 'admin': user_info = DocInfo( domain=domain, display='admin', ) else: user_info = get_doc_info_by_id(domain, meta_userID) return render_to_string( "reports/form/partials/single_form.html", { "context_case_id": case_id, "instance": form, "is_archived": form.doc_type == "XFormArchived", "domain": domain, 'question_list_not_found': question_list_not_found, "form_data": form_data, "cases": cases, "form_table_options": { # todo: wells if display config has more than one column "put_loners_in_wells": False }, "form_meta_data": form_meta_data, "auth_context": auth_context, "auth_user_info": auth_user_info, "user_info": user_info, })
def render_form(form, domain, options): """ Uses options since Django 1.3 doesn't seem to support templatetag kwargs. Change to kwargs when we're on a version of Django that does. """ # don't actually use the passed in timezone since we assume form submissions already come # in in local time. # todo: we should revisit this when we properly handle timezones in form processing. timezone = pytz.utc case_id = options.get('case_id') side_pane = options.get('side_pane', False) user = options.get('user', None) _get_tables_as_columns = partial(get_tables_as_columns, timezone=timezone) # Form Data tab form_data, question_list_not_found = get_readable_data_for_submission(form) # Case Changes tab case_blocks = extract_case_blocks(form) for i, block in enumerate(list(case_blocks)): if case_id and block.get(const.CASE_ATTR_ID) == case_id: case_blocks.pop(i) case_blocks.insert(0, block) cases = [] for b in case_blocks: this_case_id = b.get(const.CASE_ATTR_ID) try: this_case = CommCareCase.get(this_case_id) if this_case_id else None valid_case = True except ResourceNotFound: this_case = None valid_case = False if this_case and this_case._id: url = reverse('case_details', args=[domain, this_case._id]) else: url = "#" definition = get_definition(sorted_case_update_keys(b.keys())) cases.append({ "is_current_case": case_id and this_case_id == case_id, "name": case_inline_display(this_case), "table": _get_tables_as_columns(b, definition), "url": url, "valid_case": valid_case }) # Form Metadata tab meta = form.top_level_tags().get('meta', None) or {} definition = get_definition(sorted_form_metadata_keys(meta.keys())) form_meta_data = _get_tables_as_columns(meta, definition) if 'auth_context' in form: auth_context = AuthContext(form.auth_context) auth_context_user_id = auth_context.user_id auth_user_info = get_doc_info_by_id(domain, auth_context_user_id) else: auth_user_info = get_doc_info_by_id(domain, None) auth_context = AuthContext( user_id=None, authenticated=False, domain=domain, ) meta_userID = meta.get('userID') meta_username = meta.get('username') if meta_userID == 'demo_user': user_info = DocInfo( domain=domain, display='demo_user', ) elif meta_username == 'admin': user_info = DocInfo( domain=domain, display='admin', ) else: user_info = get_doc_info_by_id(domain, meta_userID) request = options.get('request', None) user_can_edit = ( request and user and request.domain and (user.can_edit_data() or user.is_commcare_user()) ) show_edit_submission = ( user_can_edit and has_privilege(request, privileges.CLOUDCARE) and toggle_enabled(request, toggles.EDIT_SUBMISSIONS) ) # stuffing this in the same flag as case rebuild show_resave = ( user_can_edit and toggle_enabled(request, toggles.CASE_REBUILD) ) return render_to_string("reports/form/partials/single_form.html", { "context_case_id": case_id, "instance": form, "is_archived": form.doc_type == "XFormArchived", "domain": domain, 'question_list_not_found': question_list_not_found, "form_data": form_data, "cases": cases, "form_table_options": { # todo: wells if display config has more than one column "put_loners_in_wells": False }, "form_meta_data": form_meta_data, "auth_context": auth_context, "auth_user_info": auth_user_info, "user_info": user_info, "side_pane": side_pane, "user": user, "show_edit_submission": show_edit_submission, "show_resave": show_resave, })
def render_form(form, domain, options): """ Uses options since Django 1.3 doesn't seem to support templatetag kwargs. Change to kwargs when we're on a version of Django that does. """ timezone = get_timezone_for_request() case_id = options.get('case_id') side_pane = options.get('side_pane', False) user = options.get('user', None) request = options.get('request', None) support_enabled = toggle_enabled(request, toggles.SUPPORT) _get_tables_as_columns = partial(get_tables_as_columns, timezone=timezone) # Form Data tab form_data, question_list_not_found = get_readable_data_for_submission(form) # Case Changes tab case_blocks = extract_case_blocks(form) for i, block in enumerate(list(case_blocks)): if case_id and block.get(const.CASE_ATTR_ID) == case_id: case_blocks.pop(i) case_blocks.insert(0, block) cases = [] for b in case_blocks: this_case_id = b.get(const.CASE_ATTR_ID) try: this_case = CaseAccessors(domain).get_case( this_case_id) if this_case_id else None valid_case = True except ResourceNotFound: this_case = None valid_case = False if this_case and this_case.case_id: url = reverse('case_details', args=[domain, this_case.case_id]) else: url = "#" definition = get_default_definition( sorted_case_update_keys(b.keys()), assume_phonetimes=( not form.metadata or (form.metadata.deviceID != CLOUDCARE_DEVICE_ID)), ) cases.append({ "is_current_case": case_id and this_case_id == case_id, "name": case_inline_display(this_case), "table": _get_tables_as_columns(b, definition), "url": url, "valid_case": valid_case }) # Form Metadata tab meta = _top_level_tags(form).get('meta', None) or {} meta['received_on'] = json_format_datetime(form.received_on) if support_enabled: meta['last_sync_token'] = form.last_sync_token definition = get_default_definition(sorted_form_metadata_keys(meta.keys())) form_meta_data = _get_tables_as_columns(meta, definition) if getattr(form, 'auth_context', None): auth_context = AuthContext(form.auth_context) auth_context_user_id = auth_context.user_id auth_user_info = get_doc_info_by_id(domain, auth_context_user_id) else: auth_user_info = get_doc_info_by_id(domain, None) auth_context = AuthContext( user_id=None, authenticated=False, domain=domain, ) meta_userID = meta.get('userID') meta_username = meta.get('username') if meta_userID == 'demo_user': user_info = DocInfo( domain=domain, display='demo_user', ) elif meta_username == 'admin': user_info = DocInfo( domain=domain, display='admin', ) else: user_info = get_doc_info_by_id(domain, meta_userID) user_can_edit = (request and user and request.domain and (user.can_edit_data() or user.is_commcare_user())) show_edit_options = (user_can_edit and can_edit_form_location(domain, user, form)) show_edit_submission = (user_can_edit and has_privilege(request, privileges.DATA_CLEANUP) and not form.is_deprecated) show_resave = (user_can_edit and support_enabled) def _get_edit_info(instance): info = { 'was_edited': False, 'is_edit': False, } if instance.is_deprecated: info.update({ 'was_edited': True, 'latest_version': instance.orig_id, }) if getattr(instance, 'edited_on', None) and getattr( instance, 'deprecated_form_id', None): info.update({ 'is_edit': True, 'edited_on': instance.edited_on, 'previous_version': instance.deprecated_form_id }) return info return render_to_string( "reports/form/partials/single_form.html", { "context_case_id": case_id, "instance": form, "is_archived": form.is_archived, "edit_info": _get_edit_info(form), "domain": domain, 'question_list_not_found': question_list_not_found, "form_data": form_data, "cases": cases, "form_table_options": { # todo: wells if display config has more than one column "put_loners_in_wells": False }, "form_meta_data": form_meta_data, "auth_context": auth_context, "auth_user_info": auth_user_info, "user_info": user_info, "side_pane": side_pane, "show_edit_options": show_edit_options, "show_edit_submission": show_edit_submission, "show_resave": show_resave, }, RequestContext(request))
def render_form(form, domain, options): """ Uses options since Django 1.3 doesn't seem to support templatetag kwargs. Change to kwargs when we're on a version of Django that does. """ # don't actually use the passed in timezone since we assume form submissions already come # in in local time. # todo: we should revisit this when we properly handle timezones in form processing. timezone = pytz.utc case_id = options.get('case_id') side_pane = options.get('side_pane', False) user = options.get('user', None) case_id_attr = "@%s" % const.CASE_TAG_ID _get_tables_as_columns = partial(get_tables_as_columns, timezone=timezone) # Form Data tab form_data, question_list_not_found = get_readable_data_for_submission(form) # Case Changes tab case_blocks = extract_case_blocks(form) for i, block in enumerate(list(case_blocks)): if case_id and block.get(case_id_attr) == case_id: case_blocks.pop(i) case_blocks.insert(0, block) cases = [] for b in case_blocks: this_case_id = b.get(case_id_attr) try: this_case = CommCareCase.get(this_case_id) if this_case_id else None valid_case = True except ResourceNotFound: this_case = None valid_case = False if this_case and this_case._id: url = reverse('case_details', args=[domain, this_case._id]) else: url = "#" definition = get_definition(sorted_case_update_keys(b.keys())) cases.append({ "is_current_case": case_id and this_case_id == case_id, "name": case_inline_display(this_case), "table": _get_tables_as_columns(b, definition), "url": url, "valid_case": valid_case }) # Form Metadata tab meta = form.top_level_tags().get('meta', None) or {} definition = get_definition(sorted_form_metadata_keys(meta.keys())) form_meta_data = _get_tables_as_columns(meta, definition) if 'auth_context' in form: auth_context = AuthContext(form.auth_context) auth_context_user_id = auth_context.user_id auth_user_info = get_doc_info_by_id(domain, auth_context_user_id) else: auth_user_info = get_doc_info_by_id(domain, None) auth_context = AuthContext( user_id=None, authenticated=False, domain=domain, ) meta_userID = meta.get('userID') meta_username = meta.get('username') if meta_userID == 'demo_user': user_info = DocInfo( domain=domain, display='demo_user', ) elif meta_username == 'admin': user_info = DocInfo( domain=domain, display='admin', ) else: user_info = get_doc_info_by_id(domain, meta_userID) edit_session_data = {'user_id': meta_userID} if len(case_blocks) == 1 and case_blocks[0].get(case_id_attr): edit_session_data["case_id"] = case_blocks[0].get(case_id_attr) return render_to_string("reports/form/partials/single_form.html", { "context_case_id": case_id, "instance": form, "form_meta": options.get('form_meta', {}), "maps_api_key": settings.GMAPS_API_KEY, "is_archived": form.doc_type == "XFormArchived", "domain": domain, 'question_list_not_found': question_list_not_found, "form_data": form_data, "cases": cases, "form_table_options": { # todo: wells if display config has more than one column "put_loners_in_wells": False }, "form_meta_data": form_meta_data, "auth_context": auth_context, "auth_user_info": auth_user_info, "user_info": user_info, "side_pane": side_pane, "user": user, "edit_session_data": edit_session_data, "request": options.get('request', None), # needed for toggles })
def render_form(form, domain, options): """ Uses options since Django 1.3 doesn't seem to support templatetag kwargs. Change to kwargs when we're on a version of Django that does. """ timezone = options.get('timezone', pytz.utc) #display = options.get('display') case_id = options.get('case_id') case_id_attr = "@%s" % const.CASE_TAG_ID _get_tables_as_columns = partial(get_tables_as_columns, timezone=timezone) # Form Data tab form_dict = form.top_level_tags() form_dict.pop('change', None) # this data already in Case Changes tab form_keys = [k for k in form_dict.keys() if form_key_filter(k)] form_data = _get_tables_as_columns(form_dict, get_definition(form_keys)) # Case Changes tab case_blocks = extract_case_blocks(form) for i, block in enumerate(list(case_blocks)): if case_id and block.get(case_id_attr) == case_id: case_blocks.pop(i) case_blocks.insert(0, block) cases = [] for b in case_blocks: this_case_id = b.get(case_id_attr) try: this_case = CommCareCase.get(this_case_id) if this_case_id else None valid_case = True except ResourceNotFound: this_case = None valid_case = False if this_case and this_case._id: url = reverse('case_details', args=[domain, this_case._id]) else: url = "#" definition = get_definition(sorted_case_update_keys(b.keys())) cases.append({ "is_current_case": case_id and this_case_id == case_id, "name": case_inline_display(this_case), "table": _get_tables_as_columns(b, definition), "url": url, "valid_case": valid_case }) # Form Metadata tab meta = form_dict.pop('meta', {}) definition = get_definition(sorted_form_metadata_keys(meta.keys())) form_meta_data = _get_tables_as_columns(meta, definition) return render_to_string("form/partials/single_form.html", { "context_case_id": case_id, "instance": form, "is_archived": form.doc_type == "XFormArchived", "domain": domain, "form_data": form_data, "cases": cases, "form_table_options": { # todo: wells if display config has more than one column "put_loners_in_wells": False }, "form_meta_data": form_meta_data, })
def render_form(form, domain, options): """ Uses options since Django 1.3 doesn't seem to support templatetag kwargs. Change to kwargs when we're on a version of Django that does. """ # don't actually use the passed in timezone since we assume form submissions already come # in in local time. # todo: we should revisit this when we properly handle timezones in form processing. timezone = pytz.utc case_id = options.get('case_id') readable_form_data = READABLE_FORM_DATA.enabled(domain) use_old_reason = '' case_id_attr = "@%s" % const.CASE_TAG_ID _get_tables_as_columns = partial(get_tables_as_columns, timezone=timezone) form_dict = form.top_level_tags() form_dict.pop('change', None) # this data already in Case Changes tab # Form Data tab if readable_form_data: try: form_data = get_readable_form_data(form) except QuestionListNotFound as e: readable_form_data = False use_old_reason = e.message if not readable_form_data: form_keys = [k for k in form_dict.keys() if form_key_filter(k)] form_data = _get_tables_as_columns(form_dict, get_definition(form_keys)) # Case Changes tab case_blocks = extract_case_blocks(form) for i, block in enumerate(list(case_blocks)): if case_id and block.get(case_id_attr) == case_id: case_blocks.pop(i) case_blocks.insert(0, block) cases = [] for b in case_blocks: this_case_id = b.get(case_id_attr) try: this_case = CommCareCase.get(this_case_id) if this_case_id else None valid_case = True except ResourceNotFound: this_case = None valid_case = False if this_case and this_case._id: url = reverse('case_details', args=[domain, this_case._id]) else: url = "#" definition = get_definition(sorted_case_update_keys(b.keys())) cases.append({ "is_current_case": case_id and this_case_id == case_id, "name": case_inline_display(this_case), "table": _get_tables_as_columns(b, definition), "url": url, "valid_case": valid_case }) # Form Metadata tab meta = form_dict.pop('meta', {}) definition = get_definition(sorted_form_metadata_keys(meta.keys())) form_meta_data = _get_tables_as_columns(meta, definition) if 'auth_context' in form: auth_context = AuthContext(form.auth_context) auth_context_user_id = auth_context.user_id auth_user_info = get_doc_info_by_id(domain, auth_context_user_id) else: auth_user_info = get_doc_info_by_id(domain, None) auth_context = AuthContext( user_id=None, authenticated=False, domain=domain, ) meta_userID = meta.get('userID') meta_username = meta.get('username') if meta_userID == 'demo_user': user_info = DocInfo( domain=domain, display='demo_user', ) elif meta_username == 'admin': user_info = DocInfo( domain=domain, display='admin', ) else: user_info = get_doc_info_by_id(domain, meta_userID) return render_to_string("reports/form/partials/single_form.html", { "context_case_id": case_id, "instance": form, "is_archived": form.doc_type == "XFormArchived", "domain": domain, 'readable_form_data': readable_form_data, 'use_old_reason': use_old_reason, "form_data": form_data, "cases": cases, "form_table_options": { # todo: wells if display config has more than one column "put_loners_in_wells": False }, "form_meta_data": form_meta_data, "auth_context": auth_context, "auth_user_info": auth_user_info, "user_info": user_info, })