Beispiel #1
0
    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))
Beispiel #2
0
        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
            ]
Beispiel #3
0
        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
            ]
Beispiel #4
0
 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)
Beispiel #5
0
        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
            ]
Beispiel #6
0
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
    })
Beispiel #7
0
    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
Beispiel #8
0
    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)
Beispiel #9
0
 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)
Beispiel #10
0
 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)
Beispiel #11
0
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]
Beispiel #12
0
    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))
Beispiel #13
0
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))
Beispiel #14
0
    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
Beispiel #15
0
    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
Beispiel #16
0
        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 '',
            ]
Beispiel #17
0
 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
Beispiel #18
0
 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
Beispiel #19
0
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))
Beispiel #20
0
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]
Beispiel #21
0
 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]
Beispiel #22
0
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
    })
Beispiel #23
0
    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
Beispiel #24
0
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'])
Beispiel #25
0
        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 '',
            ]
Beispiel #26
0
 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]
Beispiel #27
0
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
Beispiel #28
0
        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),
            ]
Beispiel #29
0
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
Beispiel #30
0
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
Beispiel #31
0
    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")),
            ]
Beispiel #32
0
 def formname(self):
     return xmlns_to_name(self.domain, self.xmlns, app_id=self.app_id)
Beispiel #33
0
 def formname(self):
     return xmlns_to_name(self.domain, self.xmlns, app_id=self.app_id)
Beispiel #34
0
 def _key_to_val(formdata, key):
     if key == "type":  return xmlns_to_name(domain, formdata.xmlns, app_id=None)
     else:              return getattr(formdata, key)
Beispiel #35
0
 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')
     )
Beispiel #36
0
 def _key_to_val(formdata, key):
     if key == "type":
         return xmlns_to_name(domain, formdata.xmlns, app_id=None)
     else:
         return getattr(formdata, key)
Beispiel #37
0
        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 '',
            ]