def get(self, request, *args, **kwargs): # just copying what was in the old django view here. don't want to mess too much with exports just yet. try: export_tag = [self.domain, json.loads(request.GET.get("export_tag", "null") or "null")] except ValueError: return HttpResponseBadRequest() schema = build_latest_schema(export_tag) if not schema and self.export_helper.export_type == "form": schema = create_basic_form_checkpoint(export_tag) if schema: app_id = request.GET.get('app_id') self.export_helper.custom_export = self.export_helper.ExportSchemaClass.default( schema=schema, name="%s: %s" % ( xmlns_to_name(self.domain, export_tag[1], app_id=app_id) if self.export_helper.export_type == "form" else export_tag[1], datetime.utcnow().strftime("%Y-%m-%d") ), type=self.export_helper.export_type ) if self.export_helper.export_type in ['form', 'case']: self.export_helper.custom_export.app_id = app_id return super(BaseCreateCustomExportView, self).get(request, *args, **kwargs) messages.warning(request, _("<strong>No data found for that form " "(%s).</strong> Submit some data before creating an export!") % xmlns_to_name(self.domain, export_tag[1], app_id=None), extra_tags="html") return HttpResponseRedirect(ExcelExportReport.get_url(domain=self.domain))
def _to_row(error_doc): def _fmt_url(doc_id): view_name = 'render_form_data' \ if error_doc.doc_type in ["XFormInstance", "XFormArchived", "XFormError"] \ else 'download_form' try: return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse(view_name, args=[self.domain, doc_id]), "text": _("View Form") } except NoReverseMatch: return 'unable to view form' def _fmt_date(somedate): time = ServerTime(somedate).user_time(self.timezone).done() return time.strftime(SERVER_DATETIME_FORMAT) return [ _fmt_url(error_doc.get_id), error_doc.metadata.username if error_doc.metadata else EMPTY_USER, _fmt_date(error_doc.received_on), xmlns_to_name( self.domain, error_doc.xmlns, app_id=getattr(error_doc, 'app_id', None)) if error_doc.metadata else EMPTY_FORM, SubmissionErrorType.display_name_by_doc_type( error_doc.doc_type), getattr(error_doc, 'problem', None) or EMPTY_ERROR ]
def _to_row(error_doc): def _fmt_url(doc_id): view_name = 'render_form_data' \ if error_doc.doc_type in ["XFormInstance", "XFormArchived", "XFormError"] \ else 'download_form' try: return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse(view_name, args=[self.domain, doc_id]), "text": _("View Form") } except NoReverseMatch: return 'unable to view form' def _fmt_date(somedate): time = ServerTime(somedate).user_time(self.timezone).done() return time.strftime(SERVER_DATETIME_FORMAT) return [ _fmt_url(error_doc.get_id), error_doc.metadata.username if error_doc.metadata else EMPTY_USER, _fmt_date(error_doc.received_on), xmlns_to_name(self.domain, error_doc.xmlns, app_id=getattr(error_doc, 'app_id', None)) if error_doc.metadata else EMPTY_FORM, SubmissionErrorType.display_name_by_doc_type( error_doc.doc_type), getattr(error_doc, 'problem', None) or EMPTY_ERROR ]
def report_context(self): predata = {} data = [] for user in self.users: startkey = ["u", self.domain, user.get("user_id")] endkey = ["u", self.domain, user.get("user_id"), {}] view = get_db().view( "formtrends/form_type_by_user", startkey=startkey, endkey=endkey, group=True, reduce=True ) for row in view: xmlns = row["key"][-1] form_name = xmlns_to_name(self.domain, xmlns, app_id=None) if form_name in predata: predata[form_name]["value"] = predata[form_name]["value"] + row["value"] predata[form_name]["description"] = "(%s) submissions of %s" % ( predata[form_name]["value"], form_name, ) else: predata[form_name] = { "display": form_name, "value": row["value"], "description": "(%s) submissions of %s" % (row["value"], form_name), } for value in predata.values(): data.append(value) return dict(chart_data=data, user_id=self.individual, graph_width=900, graph_height=500)
def _to_row(error_doc): def _fmt_url(doc_id): view_name = 'render_form_data' \ if error_doc.doc_type in ["XFormInstance", "XFormArchived", "XFormError"] \ else 'download_form' return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse(view_name, args=[self.domain, doc_id]), "text": _("View Form") } def _fmt_date(somedate): time = tz_utils.adjust_datetime_to_timezone( somedate, pytz.utc.zone, self.timezone.zone) return time.strftime("%Y-%m-%d %H:%M:%S") return [ _fmt_url(error_doc.get_id), error_doc.metadata.username if error_doc.metadata else EMPTY_USER, _fmt_date(error_doc.received_on), xmlns_to_name(self.domain, error_doc.xmlns, app_id=getattr(error_doc, 'app_id', None)) if error_doc.metadata else EMPTY_FORM, SubmissionErrorType.display_name_by_doc_type( error_doc.doc_type), error_doc.problem or EMPTY_ERROR ]
def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user.user_id, domain) try: case = CommCareCase.get(case_id) report_name = 'Details for Case "%s"' % case.name except ResourceNotFound: messages.info(request, "Sorry, we couldn't find that case. If you think this is a mistake plase report an issue.") return HttpResponseRedirect(inspect.SubmitHistory.get_url(domain)) form_lookups = dict((form.get_id, "%s: %s" % (form.received_on.date(), xmlns_to_name(domain, form.xmlns, get_app_id(form)))) \ for form in case.get_forms()) return render_to_response(request, "reports/reportdata/case_details.html", { "domain": domain, "case_id": case_id, "form_lookups": form_lookups, "slug":inspect.CaseListReport.slug, "report": dict( name=report_name, slug=inspect.CaseListReport.slug, is_async=False, ), "layout_flush_content": True, "timezone": timezone })
def rows(self): def form_data_link(instance_id): return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": absolute_reverse('render_form_data', args=[self.domain, instance_id]), "text": _("View Form") } submissions = [res['_source'] for res in self.es_results.get('hits', {}).get('hits', [])] for form in submissions: uid = form["form"]["meta"]["userID"] username = form["form"]["meta"].get("username") try: if username not in ['demo_user', 'admin']: full_name = get_cached_property(CouchUser, uid, 'full_name', expiry=7*24*60*60) name = '"%s"' % full_name if full_name else "" else: name = "" except (ResourceNotFound, IncompatibleDocument): name = "<b>[unregistered]</b>" init_cells = [ form_data_link(form["_id"]), (username or _('No data for username')) + (" %s" % name if name else ""), DateTimeProperty().wrap(safe_index(form, self.time_field.split('.'))).strftime("%Y-%m-%d %H:%M:%S"), xmlns_to_name(self.domain, form.get("xmlns"), app_id=form.get("app_id")), ] def cell(field): return form["form"].get(field) init_cells.extend([cell(field) for field in self.other_fields]) yield init_cells
def get(self, request, *args, **kwargs): # just copying what was in the old django view here. don't want to mess too much with exports just yet. try: export_tag = [self.domain, json.loads(request.GET.get("export_tag", "null") or "null")] except ValueError: return HttpResponseBadRequest() if self.export_helper.export_type == "form" and not export_tag[1]: return HttpResponseRedirect(reverse(FormExportListView.urlname, args=(self.domain,))) schema = build_latest_schema(export_tag) if not schema and self.export_helper.export_type == "form": schema = create_basic_form_checkpoint(export_tag) if request.GET.get("minimal", False): # minimal mode is a HACK so that some large domains can # load this page. halp. messages.warning(request, _("Warning you are using minimal mode, some things may not be functional")) if schema: app_id = request.GET.get("app_id") self.export_helper.custom_export = self.export_helper.ExportSchemaClass.default( schema=schema, name="%s: %s" % ( xmlns_to_name(self.domain, export_tag[1], app_id=app_id) if self.export_helper.export_type == "form" else export_tag[1], json_format_date(datetime.utcnow()), ), type=self.export_helper.export_type, ) if self.export_helper.export_type in ["form", "case"]: self.export_helper.custom_export.app_id = app_id if self.export_helper.export_type == "form": self.export_helper.custom_export.update_question_schema() return super(BaseCreateCustomExportView, self).get(request, *args, **kwargs) messages.warning( request, _('<strong>No data found to export "%s".</strong> ' "Please submit data before creating this export.") % xmlns_to_name(self.domain, export_tag[1], app_id=None), extra_tags="html", ) return HttpResponseRedirect(self.export_home_url)
def _key_to_val(formdata, key): if key == "type": return xmlns_to_name(domain, formdata.get("xmlns"), app_id=None) if key == "version": return formdata["form"].get("@version") if key in ["domain", "received_on", "xmlns"]: return formdata.get(key) return formdata["form"].get("meta", {}).get(key)
def form_list(domain): #todo cleanup #referenced in fields SelectFormField view = get_db().view("formtrends/form_duration_by_user", startkey=["xdu", domain, ""], endkey=["xdu", domain, {}], group=True, group_level=3, reduce=True) return [{"text": xmlns_to_name(domain, r["key"][2], app_id=None), "val": r["key"][2]} for r in view]
def get(self, request, *args, **kwargs): # just copying what was in the old django view here. don't want to mess too much with exports just yet. try: export_tag = [self.domain, json.loads(request.GET.get("export_tag", "null") or "null")] except ValueError: return HttpResponseBadRequest() if self.export_helper.export_type == "form" and not export_tag[1]: return HttpResponseRedirect(ExcelExportReport.get_url(domain=self.domain)) schema = build_latest_schema(export_tag) if not schema and self.export_helper.export_type == "form": schema = create_basic_form_checkpoint(export_tag) if request.GET.get('minimal', False): messages.warning(request, _("Warning you are using minimal mode, some things may not be functional")) if schema: app_id = request.GET.get('app_id') self.export_helper.custom_export = self.export_helper.ExportSchemaClass.default( schema=schema, name="%s: %s" % ( xmlns_to_name(self.domain, export_tag[1], app_id=app_id) if self.export_helper.export_type == "form" else export_tag[1], json_format_date(datetime.utcnow()) ), type=self.export_helper.export_type ) if self.export_helper.export_type in ['form', 'case']: self.export_helper.custom_export.app_id = app_id if self.export_helper.export_type == 'form': self.export_helper.custom_export.update_question_schema() return super(BaseCreateCustomExportView, self).get(request, *args, **kwargs) messages.warning(request, _("<strong>No data found for that form " "(%s).</strong> Submit some data before creating an export!") % xmlns_to_name(self.domain, export_tag[1], app_id=None), extra_tags="html") return HttpResponseRedirect(ExcelExportReport.get_url(domain=self.domain))
def custom_export(req, domain): """ Customize an export """ try: export_tag = [ domain, json.loads(req.GET.get("export_tag", "null") or "null") ] except ValueError: return HttpResponseBadRequest() helper = CustomExportHelper.make(req, domain) if req.method == "POST": helper.update_custom_export() messages.success( req, "Custom export created! You can continue editing here.") return _redirect_to_export_home(helper.export_type, domain, ajax=True) schema = build_latest_schema(export_tag) if schema: app_id = req.GET.get('app_id') helper.custom_export = helper.ExportSchemaClass.default( schema=schema, name="%s: %s" % (xmlns_to_name(domain, export_tag[1], app_id=app_id) if helper.export_type == "form" else export_tag[1], datetime.utcnow().strftime("%Y-%m-%d")), type=helper.export_type) if helper.export_type == 'form': helper.custom_export.app_id = app_id return helper.get_response() else: messages.warning(req, "<strong>No data found for that form " "(%s).</strong> Submit some data before creating an export!" % \ xmlns_to_name(domain, export_tag[1], app_id=None), extra_tags="html") return HttpResponseRedirect( export.ExcelExportReport.get_url(domain=domain))
def rows(self): def form_data_link(instance_id): return "<a class='ajax_dialog' target='_new' href='%(url)s'>%(text)s</a>" % { "url": absolute_reverse('render_form_data', args=[self.domain, instance_id]), "text": _("View Form") } submissions = [ res['_source'] for res in self.es_results.get('hits', {}).get('hits', []) ] for form in submissions: uid = form["form"]["meta"]["userID"] username = form["form"]["meta"].get("username") try: if username not in ['demo_user', 'admin']: full_name = get_cached_property(CouchUser, uid, 'full_name', expiry=7 * 24 * 60 * 60) name = '"%s"' % full_name if full_name else "" else: name = "" except (ResourceNotFound, IncompatibleDocument): name = "<b>[unregistered]</b>" time = iso_string_to_datetime( safe_index(form, self.time_field.split('.'))) if self.by_submission_time: user_time = ServerTime(time).user_time(self.timezone) else: user_time = PhoneTime(time, self.timezone).user_time(self.timezone) init_cells = [ form_data_link(form["_id"]), (username or _('No data for username')) + (" %s" % name if name else ""), user_time.ui_string(USER_DATETIME_FORMAT_WITH_SEC), xmlns_to_name(self.domain, form.get("xmlns"), app_id=form.get("app_id")), ] def cell(field): return form["form"].get(field) init_cells.extend([cell(field) for field in self.other_fields]) yield init_cells
def headers(self): form_names = [xmlns_to_name(*id_tuple) for id_tuple in self.form_types] form_names = [name.replace("/", " / ") if name is not None else "(No name)" for name in form_names] if self.form_types: # this fails if form_names, form_types is [], [] form_names, self._form_types = zip(*sorted(zip(form_names, self.form_types))) headers = DataTablesHeader(DataTablesColumn("User", span=3)) for name in list(form_names): headers.add_column(DataTablesColumn(name, sort_type=DTSortType.NUMERIC)) headers.add_column(DataTablesColumn("All Forms", sort_type=DTSortType.NUMERIC)) return headers
def _to_row(xform_dict): def _fmt_url(doc_id): if xform_dict['doc_type'] in [ "XFormInstance", "XFormArchived", "XFormError", "XFormDeprecated"]: view_name = 'render_form_data' else: view_name = 'download_form' try: return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse(view_name, args=[self.domain, doc_id]), "text": _("View Form") } except NoReverseMatch: return 'unable to view form' def _fmt_date(somedate): time = ServerTime(somedate).user_time(self.timezone).done() return time.strftime(SERVER_DATETIME_FORMAT) if xform_dict['form'].get('meta'): form_name = xmlns_to_name( self.domain, xform_dict.get('xmlns'), app_id=xform_dict.get('app_id'), ) form_username = xform_dict['form']['meta'].get('username', EMPTY_USER) else: form_name = EMPTY_FORM form_username = EMPTY_USER error_type = SubmissionErrorType.display_name_by_doc_type(xform_dict['doc_type']) if xform_dict['doc_type'] == "XFormArchived": archive_operations = [operation for operation in xform_dict.get('history') if operation.get('operation') == 'archive'] if archive_operations: error_type = _("{username} {archived_form} on {date}").format( username=cached_user_id_to_username(archive_operations[-1].get('user')) or "", archived_form=SubmissionErrorType.display_name_by_doc_type(xform_dict['doc_type']), date=_fmt_date(string_to_utc_datetime(archive_operations[-1].get('date'))), ) return [ _fmt_url(xform_dict['_id']), form_username, _fmt_date(string_to_utc_datetime(xform_dict['received_on'])), form_name, error_type, xform_dict.get('problem', EMPTY_ERROR), self._make_reproces_button(xform_dict) if self.support_toggle_enabled else '', ]
def rows(self): rows = [] all_hist = HQFormData.objects.filter(userID__in=self.user_ids, domain=self.domain) history = all_hist.extra(order_by=['-received_on'])[self.pagination.start:self.pagination.start+self.pagination.count] for data in history: if data.userID in self.user_ids: time = tz_utils.adjust_datetime_to_timezone(data.received_on, pytz.utc.zone, self.timezone.zone) time = time.strftime("%Y-%m-%d %H:%M:%S") xmlns = data.xmlns app_id = data.app_id xmlns = xmlns_to_name(self.domain, xmlns, app_id=app_id) rows.append([self._form_data_link(data.instanceID), self.usernames[data.userID], time, xmlns]) return rows
def custom_export(req, domain): """ Customize an export """ try: export_tag = [domain, json.loads(req.GET.get("export_tag", "null") or "null")] except ValueError: return HttpResponseBadRequest() helper = CustomExportHelper(req, domain) if req.method == "POST": helper.update_custom_export() helper.custom_export.save() messages.success(req, "Custom export created! You can continue editing here.") return HttpResponseRedirect("%s?type=%s" % (reverse("edit_custom_export", args=[domain, helper.custom_export.get_id]), helper.export_type)) schema = build_latest_schema(export_tag) if schema: app_id = req.GET.get('app_id') helper.custom_export = helper.ExportSchemaClass.default( schema=schema, name="%s: %s" % ( xmlns_to_name(domain, export_tag[1], app_id=app_id) if helper.export_type == "form" else export_tag[1], datetime.utcnow().strftime("%Y-%m-%d") ), type=helper.export_type ) if helper.export_type == 'form': helper.custom_export.app_id = app_id return helper.get_response() else: messages.warning(req, "<strong>No data found for that form " "(%s).</strong> Submit some data before creating an export!" % \ xmlns_to_name(domain, export_tag[1], app_id=None), extra_tags="html") return HttpResponseRedirect(export.ExcelExportReport.get_url(domain))
def form_list(domain): #todo cleanup #referenced in fields SelectFormField view = get_db().view("formtrends/form_duration_by_user", startkey=["xdu", domain, ""], endkey=["xdu", domain, {}], group=True, group_level=3, reduce=True) return [{ "text": xmlns_to_name(domain, r["key"][2], app_id=None), "val": r["key"][2] } for r in view]
def _to_row(error_doc): def _fmt_url(doc_id): return "<a class='ajax_dialog' href='%s'>View Form</a>" % reverse('download_form', args=[self.domain, doc_id]) def _fmt_date(somedate): time = tz_utils.adjust_datetime_to_timezone(somedate, pytz.utc.zone, self.timezone.zone) return time.strftime("%Y-%m-%d %H:%M:%S") return [_fmt_url(error_doc.get_id), error_doc.metadata.username if error_doc.metadata else EMPTY_USER, _fmt_date(error_doc.received_on), xmlns_to_name(self.domain, error_doc.xmlns, app_id=getattr(error_doc, 'app_id', None)) if error_doc.metadata else EMPTY_FORM, SubmissionErrorType.display_name_by_doc_type(error_doc.doc_type), error_doc.problem or EMPTY_ERROR]
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 == 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 plase report an issue.") return HttpResponseRedirect(inspect.CaseListReport.get_url(domain=domain)) report_name = 'Details for Case "%s"' % case.name form_lookups = dict((form.get_id, "%s: %s" % (form.received_on.date(), xmlns_to_name(domain, form.xmlns, get_app_id(form)))) \ for form in case.get_forms()) 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, "username": username, "owner_name": owner_name, "form_lookups": form_lookups, "slug":inspect.CaseListReport.slug, "report": dict( name=report_name, slug=inspect.CaseListReport.slug, is_async=False, ), "layout_flush_content": True, "timezone": timezone })
def rows(self): def form_data_link(instance_id): return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse('render_form_data', args=[self.domain, instance_id]), "text": _("View Form") } submissions = [ res['_source'] for res in self.es_results.get('hits', {}).get('hits', []) ] for form in submissions: uid = form["form"]["meta"]["userID"] username = form["form"]["meta"].get("username") try: if username not in ['demo_user', 'admin']: full_name = get_cached_property(CouchUser, uid, 'full_name', expiry=7 * 24 * 60 * 60) name = '"%s"' % full_name if full_name else "" else: name = "" except (ResourceNotFound, IncompatibleDocument): name = "<b>[unregistered]</b>" init_cells = [ form_data_link(form["_id"]), (username or _('No data for username')) + (" %s" % name if name else ""), DateTimeProperty().wrap( safe_index(form, self.time_field.split('.'))).strftime( "%Y-%m-%d %H:%M:%S"), xmlns_to_name(self.domain, form.get("xmlns"), app_id=form.get("app_id")), ] def cell(field): return form["form"].get(field) init_cells.extend([cell(field) for field in self.other_fields]) yield init_cells
def get_case_history(case): from casexml.apps.case.xform import extract_case_blocks from corehq.apps.reports.display import xmlns_to_name changes = defaultdict(dict) for form in FormAccessors(case.domain).get_forms(case.xform_ids): case_blocks = extract_case_blocks(form) for block in case_blocks: if block.get('@case_id') == case.case_id: property_changes = { 'Form ID': form.form_id, 'Form Name': xmlns_to_name(case.domain, form.xmlns, form.app_id), 'Form Received On': form.received_on, 'Form Submitted By': form.metadata.username, } property_changes.update(block.get('create', {})) property_changes.update(block.get('update', {})) changes[form.form_id].update(property_changes) return sorted(six.itervalues(changes), key=lambda f: f['Form Received On'])
def _to_row(xform_dict): def _fmt_url(doc_id): if xform_dict['doc_type'] in [ "XFormInstance", "XFormArchived", "XFormError", "XFormDeprecated" ]: view_name = 'render_form_data' else: view_name = 'download_form' try: return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse(view_name, args=[self.domain, doc_id]), "text": _("View Form") } except NoReverseMatch: return 'unable to view form' def _fmt_date(somedate): time = ServerTime(somedate).user_time(self.timezone).done() return time.strftime(SERVER_DATETIME_FORMAT) if xform_dict['form'].get('meta'): form_name = xmlns_to_name( self.domain, xform_dict.get('xmlns'), app_id=xform_dict.get('app_id'), ) form_username = xform_dict['form']['meta'].get( 'username', EMPTY_USER) else: form_name = EMPTY_FORM form_username = EMPTY_USER return [ _fmt_url(xform_dict['_id']), form_username, _fmt_date(string_to_utc_datetime(xform_dict['received_on'])), form_name, SubmissionErrorType.display_name_by_doc_type( xform_dict['doc_type']), xform_dict.get('problem', EMPTY_ERROR), self._make_reproces_button(xform_dict) if self.support_toggle_enabled else '', ]
def _to_row(error_doc): def _fmt_url(doc_id): view_name = 'render_form_data' \ if error_doc.doc_type in ["XFormInstance", "XFormArchived", "XFormError"] \ else 'download_form' return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse(view_name, args=[self.domain, doc_id]), "text": _("View Form") } def _fmt_date(somedate): time = tz_utils.adjust_datetime_to_timezone(somedate, pytz.utc.zone, self.timezone.zone) return time.strftime("%Y-%m-%d %H:%M:%S") return [_fmt_url(error_doc.get_id), error_doc.metadata.username if error_doc.metadata else EMPTY_USER, _fmt_date(error_doc.received_on), xmlns_to_name(self.domain, error_doc.xmlns, app_id=getattr(error_doc, 'app_id', None)) if error_doc.metadata else EMPTY_FORM, SubmissionErrorType.display_name_by_doc_type(error_doc.doc_type), error_doc.problem or EMPTY_ERROR]
def get_chart_data(domain, user=None): """ Get data, suitable for a pie chart """ data = [] startkey = ["u", domain, user] if user else ["d", domain] endkey = ["u", domain, user, {}] if user else ["d", domain, {}] view = get_db().view("formtrends/form_type_by_user", startkey=startkey, endkey=endkey, group=True, reduce=True) for row in view: xmlns = row["key"][-1] form_name = xmlns_to_name(domain, xmlns, app_id=None) data.append( { "display": form_name, "value": row["value"], "description": "(%s) submissions of %s" % (row["value"], form_name), } ) return data
def _to_row(xform_dict): def _fmt_url(doc_id): if xform_dict['doc_type'] in [ "XFormInstance", "XFormArchived", "XFormError", "XFormDeprecated"]: view_name = 'render_form_data' else: view_name = 'download_form' try: return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse(view_name, args=[self.domain, doc_id]), "text": _("View Form") } except NoReverseMatch: return 'unable to view form' def _fmt_date(somedate): time = ServerTime(somedate).user_time(self.timezone).done() return time.strftime(SERVER_DATETIME_FORMAT) if xform_dict['form'].get('meta'): form_name = xmlns_to_name( self.domain, xform_dict.get('xmlns'), app_id=xform_dict.get('app_id'), ) form_username = xform_dict['form']['meta']['username'] else: form_name = EMPTY_FORM form_username = EMPTY_USER return [ _fmt_url(xform_dict['_id']), form_username, _fmt_date(string_to_utc_datetime(xform_dict['received_on'])), form_name, SubmissionErrorType.display_name_by_doc_type(xform_dict['doc_type']), xform_dict.get('problem', EMPTY_ERROR), ]
def get_data(domain, user=None, datespan=None): """ Returns a data structure like: { <Form display name>: { <date>: { count: <count>, max: <time in ms>, min: <time in ms>, sum: <time in ms> } } } """ if datespan is None: datespan = DateSpan.since(days=30, format="%Y-%m-%dT%H:%M:%S") all_data = defaultdict(lambda: defaultdict(lambda: 0)) startkey = ["udx", domain, user, datespan.startdate_param] if user \ else ["dx", domain, datespan.startdate_param] endkey = ["udx", domain, user, datespan.enddate_param] if user \ else ["dx", domain, datespan.enddate_param] view = get_db().view("formtrends/form_duration_by_user", startkey=startkey, endkey=endkey, group=True, reduce=True) for row in view: date = row["key"][-2] xmlns = row["key"][-1] form_name = xmlns_to_name(domain, xmlns, app_id=None) data = all_data[form_name] if not date in data: data[date] = defaultdict(lambda: 0) thisrow = row["value"] for key, val in thisrow.items(): data[date][key] = data[date][key] + thisrow[key] return all_data
def rows(self): def form_data_link(instance_id): return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse('render_form_data', args=[self.domain, instance_id]), "text": _("View Form") } submissions = [res['_source'] for res in self.es_results.get('hits', {}).get('hits', [])] for form in submissions: uid = form["form"]["meta"]["userID"] username = form["form"]["meta"].get("username") try: name = ('"%s"' % get_cached_property(CouchUser, uid, 'full_name', expiry=7*24*60*60)) \ if username not in ['demo_user', 'admin'] else "" except (ResourceNotFound, IncompatibleDocument): name = "<b>[unregistered]</b>" yield [ form_data_link(form["_id"]), (username or _('No data for username')) + (" %s" % name if name else ""), datetime.strptime(form["form"]["meta"]["timeEnd"], '%Y-%m-%dT%H:%M:%SZ').strftime("%Y-%m-%d %H:%M:%S"), xmlns_to_name(self.domain, form.get("xmlns"), app_id=form.get("app_id")), ]
def formname(self): return xmlns_to_name(self.domain, self.xmlns, app_id=self.app_id)
def _key_to_val(formdata, key): if key == "type": return xmlns_to_name(domain, formdata.xmlns, app_id=None) else: return getattr(formdata, key)
def get_default_instance_name(schema): return u'{}: {}'.format( xmlns_to_name(schema.domain, schema.xmlns, schema.app_id), datetime.now().strftime('%Y-%m-%d') )
def _to_row(xform_dict): def _fmt_url(doc_id): if xform_dict['doc_type'] in [ "XFormInstance", "XFormArchived", "XFormError", "XFormDeprecated" ]: view_name = 'render_form_data' else: view_name = 'download_form' try: return format_html( "<a class='ajax_dialog' href='{url}'>{text}</a>", url=reverse(view_name, args=[self.domain, doc_id]), text=_("View Form")) except NoReverseMatch: return 'unable to view form' def _fmt_date(somedate): time = ServerTime(somedate).user_time(self.timezone).done() return time.strftime(SERVER_DATETIME_FORMAT) if xform_dict['form'].get('meta'): form_name = xmlns_to_name( self.domain, xform_dict.get('xmlns'), app_id=xform_dict.get('app_id'), ) form_username = xform_dict['form']['meta'].get( 'username', EMPTY_USER) else: form_name = EMPTY_FORM form_username = EMPTY_USER error_type = SubmissionTypeFilter.display_name_by_doc_type( xform_dict['doc_type']) if xform_dict['doc_type'] == "XFormArchived": archive_operations = [ operation for operation in xform_dict.get('history') if operation.get('operation') == 'archive' ] if archive_operations: error_type = _( "{username} {archived_form} on {date}").format( username=cached_user_id_to_username( archive_operations[-1].get('user')) or "", archived_form=SubmissionTypeFilter. display_name_by_doc_type(xform_dict['doc_type']), date=_fmt_date( string_to_utc_datetime( archive_operations[-1].get('date'))), ) return [ _fmt_url(xform_dict['_id']), form_username, _fmt_date(string_to_utc_datetime(xform_dict['received_on'])), form_name, error_type, xform_dict.get('problem', EMPTY_ERROR), self._make_reproces_button(xform_dict) if self.support_toggle_enabled else '', ]