Example #1
0
def toggle_diff(request, domain):
    params = json_request(request.GET)
    other_domain = params.get('domain')
    diff = []
    if Domain.get_by_name(other_domain):
        diff = [{
            'slug': t.slug,
            'label': t.label,
            'url': reverse(ToggleEditView.urlname, args=[t.slug]),
            'tag_name': _('Preview'),
            'tag_css_class': 'default',
            'tag_index': -1,
        } for t in feature_previews.all_previews()
                if _can_copy_toggle(t, request.domain, other_domain)]
        diff.extend([{
            'slug': t.slug,
            'label': t.label,
            'url': reverse(ToggleEditView.urlname, args=[t.slug]),
            'tag_name': t.tag.name,
            'tag_css_class': t.tag.css_class,
            'tag_index': t.tag.index,
        } for t in toggles.all_toggles()
                     if _can_copy_toggle(t, request.domain, other_domain)])
        diff.sort(key=lambda x: (x['tag_index'], x['label']))
    return json_response(diff)
Example #2
0
def create_export_filter(request, domain, export_type='form'):
    from corehq.apps.reports.fields import FilterUsersField
    app_id = request.GET.get('app_id', None)

    group, users = get_group_params(domain, **json_request(request.GET))

    user_filters, use_user_filters = FilterUsersField.get_user_filter(request)

    if export_type == 'case':
        if user_filters and use_user_filters:
            users_matching_filter = map(
                lambda x: x.get('user_id'),
                get_all_users_by_domain(domain,
                                        user_filter=user_filters,
                                        simplified=True))
            filter = SerializableFunction(case_users_filter,
                                          users=users_matching_filter)
        else:
            filter = SerializableFunction(case_group_filter, group=group)
    else:
        filter = SerializableFunction(instances) & SerializableFunction(
            app_export_filter, app_id=app_id)
        filter &= SerializableFunction(datespan_export_filter,
                                       datespan=request.datespan)
        if user_filters and use_user_filters:
            users_matching_filter = map(
                lambda x: x.get('user_id'),
                get_all_users_by_domain(domain,
                                        user_filter=user_filters,
                                        simplified=True))
            filter &= SerializableFunction(users_filter,
                                           users=users_matching_filter)
        else:
            filter &= SerializableFunction(group_filter, group=group)
    return filter
Example #3
0
def create_export_filter(request, domain, export_type='form'):
    from corehq.apps.reports.filters.users import UserTypeFilter
    app_id = request.GET.get('app_id', None)

    group, users = get_group_params(domain, **json_request(request.GET))

    user_filters, use_user_filters = UserTypeFilter.get_user_filter(request)

    if export_type == 'case':
        if user_filters and use_user_filters:
            filtered_users = users_matching_filter(domain, user_filters)
            filter = SerializableFunction(case_users_filter,
                                          users=filtered_users)
        else:
            filter = SerializableFunction(case_group_filter, group=group)
    else:
        filter = SerializableFunction(app_export_filter, app_id=app_id)
        datespan = request.datespan
        if datespan.is_valid():
            datespan.set_timezone(get_timezone(request.couch_user, domain))
            filter &= SerializableFunction(datespan_export_filter, datespan=datespan)
        if user_filters and use_user_filters:
            filtered_users = users_matching_filter(domain, user_filters)
            filter &= SerializableFunction(users_filter, users=filtered_users)
        else:
            filter &= SerializableFunction(group_filter, group=group)
    return filter
Example #4
0
    def __init__(self, request, base_context=None, domain=None, **kwargs):
        if not self.name or not self.section_name or self.slug is None or not self.dispatcher:
            raise NotImplementedError(
                "Missing a required parameter: (name: %(name)s, section_name: %(section_name)s,"
                " slug: %(slug)s, dispatcher: %(dispatcher)s" %
                dict(name=self.name,
                     section_name=self.section_name,
                     slug=self.slug,
                     dispatcher=self.dispatcher))

        from corehq.apps.reports.dispatcher import ReportDispatcher
        if isinstance(self.dispatcher, ReportDispatcher):
            raise ValueError(
                "Class property dispatcher should point to a subclass of ReportDispatcher."
            )

        self.request = request
        self.request_params = json_request(
            self.request.GET if self.request.method ==
            'GET' else self.request.POST)
        self.domain = normalize_domain_name(domain)
        self.context = base_context or {}
        self._update_initial_context()
        self.is_rendered_as_email = False  # setting this to true in email_response
        self.override_template = "reports/async/email_report.html"
Example #5
0
 def post(self, request, *args, **kwargs):
     request_json = json_request(request.POST)
     doc = request_json.get('doc')
     CommCareBuildConfig.get_db().save_doc(doc)
     CommCareBuildConfig.clear_local_cache()
     messages.success(request, "Your changes have been saved")
     return HttpResponseRedirect(self.page_url)
Example #6
0
def create_export_filter(request, domain, export_type='form'):
    request_obj = request.POST if request.method == 'POST' else request.GET
    from corehq.apps.reports.filters.users import UserTypeFilter
    app_id = request_obj.get('app_id', None)

    user_filters, use_user_filters = UserTypeFilter.get_user_filter(request)
    use_user_filters &= bool(user_filters)
    group = None if use_user_filters else get_group(**json_request(request_obj))

    if export_type == 'case':
        if use_user_filters:
            groups = [g.get_id for g in Group.get_case_sharing_groups(domain)]
            filtered_users = users_matching_filter(domain, user_filters)
            filter = SerializableFunction(case_users_filter,
                                          users=filtered_users,
                                          groups=groups)
        else:
            filter = SerializableFunction(case_group_filter, group=group)
    else:
        filter = SerializableFunction(app_export_filter, app_id=app_id)
        datespan = request.datespan
        if datespan.is_valid():
            datespan.set_timezone(get_timezone_for_user(request.couch_user, domain))
            filter &= SerializableFunction(datespan_export_filter, datespan=datespan)
        if use_user_filters:
            filtered_users = users_matching_filter(domain, user_filters)
            filter &= SerializableFunction(users_filter,
                                           users=filtered_users)
        else:
            filter &= SerializableFunction(group_filter, group=group)
    return filter
Example #7
0
def create_export_filter(request, domain, export_type='form'):
    request_obj = request.POST if request.method == 'POST' else request.GET
    from corehq.apps.reports.filters.users import UserTypeFilter
    app_id = request_obj.get('app_id', None)

    user_filters, use_user_filters = UserTypeFilter.get_user_filter(request)
    use_user_filters &= bool(user_filters)
    group = None if use_user_filters else get_group(
        **json_request(request_obj))

    if export_type == 'case':
        if use_user_filters:
            groups = [g.get_id for g in Group.get_case_sharing_groups(domain)]
            filtered_users = users_matching_filter(domain, user_filters)
            filter = SerializableFunction(case_users_filter,
                                          users=filtered_users,
                                          groups=groups)
        else:
            filter = SerializableFunction(case_group_filter, group=group)
    else:
        filter = SerializableFunction(app_export_filter, app_id=app_id)
        datespan = request.datespan
        if datespan.is_valid():
            datespan.set_timezone(
                get_timezone_for_user(request.couch_user, domain))
            filter &= SerializableFunction(datespan_export_filter,
                                           datespan=datespan)
        if use_user_filters:
            filtered_users = users_matching_filter(domain, user_filters)
            filter &= SerializableFunction(users_filter, users=filtered_users)
        else:
            filter &= SerializableFunction(group_filter, group=group)
    return filter
Example #8
0
def create_export_filter(request, domain, export_type='form'):
    from corehq.apps.reports.fields import FilterUsersField
    app_id = request.GET.get('app_id', None)

    group, users = get_group_params(domain, **json_request(request.GET))

    user_filters, use_user_filters = FilterUsersField.get_user_filter(request)

    if export_type == 'case':
        if user_filters and use_user_filters:
            users_matching_filter = map(lambda x: x.get('user_id'), get_all_users_by_domain(domain,
                user_filter=user_filters, simplified=True))
            filter = SerializableFunction(case_users_filter, users=users_matching_filter)
        else:
            filter = SerializableFunction(case_group_filter, group=group)
    else:
        filter = SerializableFunction(app_export_filter, app_id=app_id)
        filter &= SerializableFunction(datespan_export_filter, datespan=request.datespan)
        if user_filters and use_user_filters:
            users_matching_filter = map(lambda x: x.get('user_id'), get_all_users_by_domain(domain,
                user_filter=user_filters, simplified=True))
            filter &= SerializableFunction(users_filter, users=users_matching_filter)
        else:
            filter &= SerializableFunction(group_filter, group=group)
    return filter
Example #9
0
def edit_app_translations(request, domain, app_id):
    params = json_request(request.POST)
    lang = params.get('lang')
    translations = params.get('translations')
    app = get_app(domain, app_id)
    app.set_translations(lang, translations)
    response = {}
    app.save(response)
    return json_response(response)
Example #10
0
def export_data(req, domain):
    """
    Download all data for a couchdbkit model
    """
    try:
        export_tag = json.loads(req.GET.get("export_tag", "null") or "null")
    except ValueError:
        return HttpResponseBadRequest()

    group, users = util.get_group_params(domain, **json_request(req.GET))
    include_errors = string_to_boolean(req.GET.get("include_errors", False))

    kwargs = {
        "format": req.GET.get("format", Format.XLS_2007),
        "previous_export_id": req.GET.get("previous_export", None),
        "filename": export_tag,
        "use_cache": string_to_boolean(req.GET.get("use_cache", "True")),
        "max_column_size": int(req.GET.get("max_column_size", 2000)),
        "separator": req.GET.get("separator", "|")
    }

    user_filter, _ = UserTypeFilter.get_user_filter(req)

    if user_filter:
        filtered_users = users_matching_filter(domain, user_filter)

        def _ufilter(user):
            try:
                return user['form']['meta']['userID'] in filtered_users
            except KeyError:
                return False

        filter = _ufilter
    else:
        filter = SerializableFunction(util.group_filter, group=group)

    errors_filter = instances if not include_errors else None

    kwargs['filter'] = couchexport.util.intersect_functions(
        filter, errors_filter)
    if kwargs['format'] == 'raw':
        resp = export_raw_data([domain, export_tag], filename=export_tag)
    else:
        try:
            resp = export_data_shared([domain, export_tag], **kwargs)
        except CouchExportException as e:
            return HttpResponseBadRequest(e)
    if resp:
        return resp
    else:
        messages.error(
            req,
            "Sorry, there was no data found for the tag '%s'." % export_tag)
        next = req.GET.get("next", "")
        if not next:
            next = export.ExcelExportReport.get_url(domain=domain)
        return HttpResponseRedirect(next)
Example #11
0
def toggle_diff(request, domain):
    params = json_request(request.GET)
    other_domain = params.get('domain')
    diff = []
    if Domain.get_by_name(other_domain):
        diff = [{'slug': t.slug, 'label': t.label, 'url': reverse(ToggleEditView.urlname, args=[t.slug])}
                for t in feature_previews.all_previews() + all_toggles()
                if t.enabled(request.domain, NAMESPACE_DOMAIN) and not t.enabled(other_domain, NAMESPACE_DOMAIN)]
        diff.sort(key=lambda x: x['label'])
    return json_response(diff)
Example #12
0
def edit_report_module(request, domain, app_id, module_unique_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    and sort_elements.
    """
    params = json_request(request.POST)
    app = get_app(domain, app_id)

    try:
        module = app.get_module_by_unique_id(module_unique_id)
    except ModuleNotFoundException:
        # temporary fallback
        module = app.get_module(module_unique_id)

    assert isinstance(module, ReportModule)
    module.name = params['name']

    try:
        module.report_configs = [
            ReportAppConfig.wrap(spec) for spec in params['reports']
        ]
    except Exception:
        notify_exception(
            request,
            message="Something went wrong while editing report modules",
            details={
                'domain': domain,
                'app_id': app_id,
            })
        return HttpResponseBadRequest(
            _("There was a problem processing your request."))

    if app.enable_module_filtering:
        module['module_filter'] = request.POST.get('module_filter')
    module.media_image.update(params['multimedia']['mediaImage'])
    module.media_audio.update(params['multimedia']['mediaAudio'])

    try:
        app.save()
    except Exception:
        notify_exception(
            request,
            message=
            "Something went wrong while saving app {} while editing report modules"
            .format(app_id),
            details={
                'domain': domain,
                'app_id': app_id,
            })
        return HttpResponseBadRequest(
            _("There was a problem processing your request."))

    get_uuids_by_instance_id.clear(domain)
    return json_response('success')
Example #13
0
def get_app_ui_translations(request, domain):
    params = json_request(request.GET)
    lang = params.get('lang', 'en')
    key = params.get('key', None)
    one = params.get('one', False)
    translations = Translation.get_translations(lang, key, one)
    if isinstance(translations, dict):
        translations = {k: v for k, v in translations.items()
                        if not id_strings.is_custom_app_string(k)
                        and '=' not in k}
    return json_response(translations)
Example #14
0
def get_app_ui_translations(request, domain):
    params = json_request(request.GET)
    lang = params.get("lang", "en")
    key = params.get("key", None)
    one = params.get("one", False)
    translations = Translation.get_translations(lang, key, one)
    if isinstance(translations, dict):
        translations = {
            k: v for k, v in translations.items() if not id_strings.is_custom_app_string(k) and "=" not in k
        }
    return json_response(translations)
Example #15
0
def get_app_ui_translations(request, domain):
    params = json_request(request.GET)
    lang = params.get('lang', 'en')
    key = params.get('key', None)
    one = params.get('one', False)
    translations = Translation.get_translations(lang, key, one)
    if isinstance(translations, dict):
        translations = {k: v for k, v in translations.items()
                        if not id_strings.is_custom_app_string(k)
                        and '=' not in k}
    return json_response(translations)
Example #16
0
def export_data(req, domain):
    """
    Download all data for a couchdbkit model
    """
    try:
        export_tag = json.loads(req.GET.get("export_tag", "null") or "null")
    except ValueError:
        return HttpResponseBadRequest()

    group, users = util.get_group_params(domain, **json_request(req.GET))
    include_errors = string_to_boolean(req.GET.get("include_errors", False))

    kwargs = {
        "format": req.GET.get("format", Format.XLS_2007),
        "previous_export_id": req.GET.get("previous_export", None),
        "filename": export_tag,
        "use_cache": string_to_boolean(req.GET.get("use_cache", "True")),
        "max_column_size": int(req.GET.get("max_column_size", 2000)),
        "separator": req.GET.get("separator", "|"),
    }

    user_filter, _ = UserTypeFilter.get_user_filter(req)

    if user_filter:
        filtered_users = users_matching_filter(domain, user_filter)

        def _ufilter(user):
            try:
                return user["form"]["meta"]["userID"] in filtered_users
            except KeyError:
                return False

        filter = _ufilter
    else:
        filter = SerializableFunction(util.group_filter, group=group)

    errors_filter = instances if not include_errors else None

    kwargs["filter"] = couchexport.util.intersect_functions(filter, errors_filter)
    if kwargs["format"] == "raw":
        resp = export_raw_data([domain, export_tag], filename=export_tag)
    else:
        try:
            resp = export_data_shared([domain, export_tag], **kwargs)
        except CouchExportException as e:
            return HttpResponseBadRequest(e)
    if resp:
        return resp
    else:
        messages.error(req, "Sorry, there was no data found for the tag '%s'." % export_tag)
        next = req.GET.get("next", "")
        if not next:
            next = export.ExcelExportReport.get_url(domain=domain)
        return HttpResponseRedirect(next)
Example #17
0
def edit(request, template="translations/edit.html"):
    params = json_request(request.GET)
    doc_id  = params.get('doc_id')
    lang    = params.get('lang')

    trans = TranslationMixin.get(doc_id)
    validate_trans_doc(trans)
    return render(request, template, {
        "translations_json": json.dumps(trans.translations[lang]),
        "doc_id": doc_id,
        "lang": lang
    })
Example #18
0
def export_data(req, domain):
    """
    Download all data for a couchdbkit model
    """
    try:
        export_tag = json.loads(req.GET.get("export_tag", "null") or "null")
    except ValueError:
        return HttpResponseBadRequest()

    group, users = util.get_group_params(domain, **json_request(req.GET))
    include_errors = string_to_boolean(req.GET.get("include_errors", False))

    kwargs = {"format": req.GET.get("format", Format.XLS_2007),
              "previous_export_id": req.GET.get("previous_export", None),
              "filename": export_tag,
              "use_cache": string_to_boolean(req.GET.get("use_cache", "True")),
              "max_column_size": int(req.GET.get("max_column_size", 2000)),
              "separator": req.GET.get("separator", "|")}

    user_filter, _ = FilterUsersField.get_user_filter(req)

    if user_filter:
        users_matching_filter = map(lambda x: x.get('user_id'), get_all_users_by_domain(domain,
            user_filter=user_filter, simplified=True))
        def _ufilter(user):
            try:
                return user['form']['meta']['userID'] in users_matching_filter
            except KeyError:
                return False
        filter = _ufilter
    else:
        filter = SerializableFunction(util.group_filter, group=group)

    errors_filter = instances if not include_errors else None

    kwargs['filter'] = couchexport.util.intersect_functions(filter, errors_filter)

    if kwargs['format'] == 'raw':
        resp = export_raw_data([domain, export_tag], filename=export_tag)
    else:
        try:
            resp = export_data_shared([domain,export_tag], **kwargs)
        except UnsupportedExportFormat as e:
            return HttpResponseBadRequest(e)
    if resp:
        return resp
    else:
        messages.error(req, "Sorry, there was no data found for the tag '%s'." % export_tag)
        next = req.GET.get("next", "")
        if not next:
            next = export.ExcelExportReport.get_url(domain)
        return HttpResponseRedirect(next)
Example #19
0
def edit(request, template="translations/edit.html"):
    params = json_request(request.GET)
    doc_id = params.get('doc_id')
    lang = params.get('lang')

    trans = TranslationMixin.get(doc_id)
    validate_trans_doc(trans)
    return render(
        request, template, {
            "translations_json": json.dumps(trans.translations[lang]),
            "doc_id": doc_id,
            "lang": lang
        })
Example #20
0
def query_dict_to_dict(query_dict, domain):
    """
    Transform the given QueryDict to a normal dict where each value has been
    converted from a string to a dict (if the value is JSON).
    Also add the domain to the dict.

    :param query_dict: a QueryDict
    :param domain:
    :return: a dict
    """
    request_dict = json_request(query_dict)
    request_dict['domain'] = domain
    return request_dict
Example #21
0
def query_dict_to_dict(query_dict, domain):
    """
    Transform the given QueryDict to a normal dict where each value has been
    converted from a string to a dict (if the value is JSON).
    Also add the domain to the dict.

    :param query_dict: a QueryDict
    :param domain:
    :return: a dict
    """
    request_dict = json_request(query_dict)
    request_dict['domain'] = domain
    return request_dict
Example #22
0
def toggle_diff(request, domain):
    params = json_request(request.GET)
    other_domain = params.get('domain')
    diff = []
    if Domain.get_by_name(other_domain):
        diff = [{
            'slug': t.slug,
            'label': t.label,
            'url': reverse(ToggleEditView.urlname, args=[t.slug])
        } for t in feature_previews.all_previews() + all_toggles()
                if t.enabled(request.domain, NAMESPACE_DOMAIN)
                and not t.enabled(other_domain, NAMESPACE_DOMAIN)]
        diff.sort(key=lambda x: x['label'])
    return json_response(diff)
Example #23
0
def edit_report_module(request, domain, app_id, module_unique_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    and sort_elements.
    """
    params = json_request(request.POST)
    app = get_app(domain, app_id)

    try:
        module = app.get_module_by_unique_id(module_unique_id)
    except ModuleNotFoundException:
        # temporary fallback
        module = app.get_module(module_unique_id)

    assert isinstance(module, ReportModule)
    module.name = params['name']

    try:
        module.report_configs = [ReportAppConfig.wrap(spec) for spec in params['reports']]
    except Exception:
        notify_exception(
            request,
            message="Something went wrong while editing report modules",
            details={'domain': domain, 'app_id': app_id, }
        )
        return HttpResponseBadRequest(_("There was a problem processing your request."))

    if app.enable_module_filtering:
        module['module_filter'] = request.POST.get('module_filter')

    module.media_image.update(params['multimedia']['mediaImage'])
    module.media_audio.update(params['multimedia']['mediaAudio'])

    if 'name_enum' in params:
        name_enum = json.loads(request.POST.get("name_enum"))
        module.name_enum = [MappingItem(i) for i in name_enum]

    try:
        app.save()
    except Exception:
        notify_exception(
            request,
            message="Something went wrong while saving app {} while editing report modules".format(app_id),
            details={'domain': domain, 'app_id': app_id, }
        )
        return HttpResponseBadRequest(_("There was a problem processing your request."))

    get_uuids_by_instance_id.clear(domain)
    return json_response('success')
Example #24
0
def edit_app_ui_translations(request, domain, app_id):
    params = json_request(request.POST)
    lang = params.get('lang')
    translations = params.get('translations')
    app = get_app(domain, app_id)

    # Workaround for https://github.com/dimagi/commcare-hq/pull/10951#issuecomment-203978552
    # auto-fill UI translations might have modules.m0 in the update originating from popular-translations docs
    # since module.m0 is not a UI string, don't update modules.m0 in UI translations
    translations.pop('modules.m0', None)

    app.set_translations(lang, translations)
    app.save(response_json={})  # Updates the app version without updating app properties
    return json_response({})
Example #25
0
def edit_report_module(request, domain, app_id, module_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    and sort_elements.
    """
    params = json_request(request.POST)
    app = get_app(domain, app_id)
    module = app.get_module(module_id)
    assert isinstance(module, ReportModule)
    module.name = params['name']
    module.report_configs = [ReportAppConfig.wrap(spec) for spec in params['reports']]
    app.save()
    return json_response('success')
Example #26
0
def edit_app_ui_translations(request, domain, app_id):
    params = json_request(request.POST)
    lang = params.get("lang")
    translations = params.get("translations")
    app = get_app(domain, app_id)

    # Workaround for https://github.com/dimagi/commcare-hq/pull/10951#issuecomment-203978552
    # auto-fill UI translations might have modules.m0 in the update originating from popular-translations docs
    # since module.m0 is not a UI string, don't update modules.m0 in UI translations
    translations.pop("modules.m0", None)

    app.set_translations(lang, translations)
    response = {}
    app.save(response)
    return json_response(response)
Example #27
0
def set_translations(request):
    params          = json_request(request.POST)
    doc_id          = params.get('doc_id')
    lang            = params.get('lang')
    translations    = params.get('translations')

    trans = TranslationMixin.get(doc_id)

    trans.set_translations(lang, translations)
    resp = {}
    try:
        trans.save(response_json=resp)
    except Exception:
        trans.save()
    return json_response(resp)
Example #28
0
def set_translations(request):
    params = json_request(request.POST)
    doc_id = params.get('doc_id')
    lang = params.get('lang')
    translations = params.get('translations')

    trans = TranslationMixin.get(doc_id)

    trans.set_translations(lang, translations)
    resp = {}
    try:
        trans.save(response_json=resp)
    except Exception:
        trans.save()
    return json_response(resp)
Example #29
0
def cases_json(request, domain):
    def query(stale="ok", **kwargs):
        subs = [dict(
            userID      = r['key'][1],
            username    = r['key'][2],
            deviceID    = r['key'][3],
            submissions = r['value']['count'],
            start       = r['value']['start'].split('T')[0],
            end         = r['value']['end'  ].split('T')[0]
        ) for r in get_db().view('cleanup/case_submissions',
             startkey=[domain],
             endkey=[domain, {}],
             group=True,
#             stale=stale
        )]
        subs.sort(key=lambda sub: (sub['userID'], sub['end']))

        # Try and help identify lost devices
        latest_start = defaultdict(lambda: None)
        for sub in subs:
            latest_start[sub['userID']] = max(sub['start'], latest_start[sub['userID']])
        for sub in subs:
            if sub['end'] < latest_start[sub['userID']]:
                sub['old'] = True
            else:
                sub['old'] = False


        # show the number of cases made by these xforms
#        for sub in subs:
#            cases = _get_cases(_get_submissions(domain, [sub]))
#            sub['cases'] = len([None for case in cases if not case.closed])

        open_cases = CommCareCase.view('hqcase/open_cases', startkey=[domain], endkey=[domain, {}], reduce=False, include_docs=True).all()
        xform_ids = [case.xform_ids[0] for case in open_cases]
        case_count = defaultdict(int)
        for xform_id in xform_ids:
            xform = XFormInstance.get(xform_id)
            meta = xform.form['meta']
            case_count[(meta['userID'], meta['username'], meta['deviceID'])] += 1
        for sub in subs:
            sub['cases'] = case_count[(sub['userID'], sub['username'], sub['deviceID'])]

        return json_response({
            "results": subs,
            "total": len(subs),
        })
    return query(**json_request(request.GET))
Example #30
0
def edit_report_module(request, domain, app_id, module_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    and sort_elements.
    """
    params = json_request(request.POST)
    app = get_app(domain, app_id)
    module = app.get_module(module_id)
    assert isinstance(module, ReportModule)
    module.name = params['name']
    module.report_configs = [ReportAppConfig.wrap(spec) for spec in params['reports']]
    if (feature_previews.MODULE_FILTER.enabled(domain) and
            app.enable_module_filtering):
        module['module_filter'] = request.POST.get('module_filter')
    module.media_image.update(params['multimedia']['mediaImage'])
    module.media_audio.update(params['multimedia']['mediaAudio'])
    app.save()
    return json_response('success')
Example #31
0
    def __init__(self, request, base_context=None, *args, **kwargs):
        if not self.name or not self.section_name or self.slug is None or not self.dispatcher:
            raise NotImplementedError("Missing a required parameter: (name: %(name)s, section_name: %(section_name)s,"
            " slug: %(slug)s, dispatcher: %(dispatcher)s" % dict(
                name=self.name,
                section_name=self.section_name,
                slug=self.slug,
                dispatcher=self.dispatcher
            ))

        from corehq.apps.reports.dispatcher import ReportDispatcher
        if isinstance(self.dispatcher, ReportDispatcher):
            raise ValueError("Class property dispatcher should point to a subclass of ReportDispatcher.")

        self.request = request
        self.request_params = json_request(self.request.GET)
        self.domain = kwargs.get('domain')
        self.context = base_context or {}
        self._update_initial_context()
Example #32
0
    def __init__(self, request, base_context=None, domain=None, **kwargs):
        if not self.name or not self.section_name or self.slug is None or not self.dispatcher:
            raise NotImplementedError(
                "Missing a required parameter: (name: %(name)s, section_name: %(section_name)s,"
                " slug: %(slug)s, dispatcher: %(dispatcher)s"
                % dict(name=self.name, section_name=self.section_name, slug=self.slug, dispatcher=self.dispatcher)
            )

        from corehq.apps.reports.dispatcher import ReportDispatcher

        if isinstance(self.dispatcher, ReportDispatcher):
            raise ValueError("Class property dispatcher should point to a subclass of ReportDispatcher.")

        self.request = request
        self.request_params = json_request(self.request.GET if self.request.method == "GET" else self.request.POST)
        self.domain = normalize_domain_name(domain)
        self.context = base_context or {}
        self._update_initial_context()
        self.is_rendered_as_email = False  # setting this to true in email_response
        self.override_template = "reports/async/email_report.html"
Example #33
0
def query_dict_to_dict(query_dict, domain, string_type_params):
    """
    Transform the given QueryDict to a normal dict where each value has been
    converted from a string to a dict (if the value is JSON). params with values 'true'
    or 'false' or numbers are casted to respective datatypes, unless the key is specified in string_type_params
    Also add the domain to the dict.

    :param query_dict: a QueryDict
    :param domain:
    :string_type_params: list of params that should not be autocasted to boolean/numbers
    :return: a dict
    """
    request_dict = json_request(query_dict)
    request_dict['domain'] = domain

    # json.loads casts strings 'true'/'false' to booleans, so undo it
    for key in string_type_params:
        u_key = six.text_type(key)  # QueryDict's key/values are unicode strings
        if u_key in query_dict:
            request_dict[key] = query_dict[u_key]  # json_request converts keys to strings
    return request_dict
Example #34
0
def query_dict_to_dict(query_dict, domain, string_type_params):
    """
    Transform the given QueryDict to a normal dict where each value has been
    converted from a string to a dict (if the value is JSON). params with values 'true'
    or 'false' or numbers are casted to respective datatypes, unless the key is specified in string_type_params
    Also add the domain to the dict.

    :param query_dict: a QueryDict
    :param domain:
    :string_type_params: list of params that should not be autocasted to boolean/numbers
    :return: a dict
    """
    request_dict = json_request(query_dict)
    request_dict['domain'] = domain

    # json.loads casts strings 'true'/'false' to booleans, so undo it
    for key in string_type_params:
        u_key = six.text_type(key)  # QueryDict's key/values are unicode strings
        if u_key in query_dict:
            request_dict[key] = query_dict[u_key]  # json_request converts keys to strings
    return request_dict
Example #35
0
def edit_report_module(request, domain, app_id, module_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    and sort_elements.
    """
    params = json_request(request.POST)
    app = get_app(domain, app_id)
    module = app.get_module(module_id)
    assert isinstance(module, ReportModule)
    module.name = params['name']

    try:
        module.report_configs = [ReportAppConfig.wrap(spec) for spec in params['reports']]
    except Exception:
        notify_exception(
            request,
            message="Something went wrong while editing report modules",
            details={'domain': domain, 'app_id': app_id, }
        )
        return HttpResponseBadRequest(_("There was a problem processing your request."))

    if (feature_previews.MODULE_FILTER.enabled(domain) and
            app.enable_module_filtering):
        module['module_filter'] = request.POST.get('module_filter')
    module.media_image.update(params['multimedia']['mediaImage'])
    module.media_audio.update(params['multimedia']['mediaAudio'])

    try:
        app.save()
    except Exception:
        notify_exception(
            request,
            message="Something went wrong while saving app {} while editing report modules".format(app_id),
            details={'domain': domain, 'app_id': app_id, }
        )
        return HttpResponseBadRequest(_("There was a problem processing your request."))

    return json_response('success')
Example #36
0
    def _export_report(self, emails, title):
        from corehq.apps.reports.standard.deployments import ApplicationStatusReport

        for report_config in self.configs:
            mock_request = HttpRequest()
            mock_request.couch_user = self.owner
            mock_request.user = self.owner.get_django_user()
            mock_request.domain = self.domain
            mock_request.couch_user.current_domain = self.domain
            mock_request.couch_user.language = self.language
            mock_request.method = 'GET'
            mock_request.bypass_two_factor = True

            mock_query_string_parts = [
                report_config.query_string, 'filterSet=true'
            ]
            mock_request.GET = QueryDict('&'.join(mock_query_string_parts))
            request_data = vars(mock_request)
            request_data['couch_user'] = mock_request.couch_user.userID
            if report_config.report_slug != ApplicationStatusReport.slug:
                # ApplicationStatusReport doesn't have date filter
                date_range = report_config.get_date_range()
                start_date = datetime.strptime(date_range['startdate'],
                                               '%Y-%m-%d')
                end_date = datetime.strptime(date_range['enddate'], '%Y-%m-%d')
                datespan = DateSpan(start_date, end_date)
                request_data['datespan'] = datespan

            full_request = {
                'request': request_data,
                'domain': request_data['domain'],
                'context': {},
                'request_params': json_request(request_data['GET'])
            }

            export_all_rows_task(report_config.report, full_request, emails,
                                 title)
Example #37
0
def query_dict_to_dict(query_dict, domain, string_type_params):
    """
    Transform the given QueryDict to a normal dict where each value has been
    converted from a string to a dict (if the value is JSON). params with values 'true'
    or 'false' or numbers are casted to respective datatypes, unless the key is specified in string_type_params
    Also add the domain to the dict.

    :param query_dict: a QueryDict
    :param domain:
    :string_type_params: list of params that should not be autocasted to boolean/numbers
    :return: a dict
    """
    request_dict = json_request(query_dict)
    request_dict['domain'] = domain

    # json.loads casts strings 'true'/'false' to booleans, so undo it
    for key in string_type_params:
        if key in query_dict:
            vals = query_dict.getlist(key)
            if len(vals) > 1:
                request_dict[key] = vals
            else:
                request_dict[key] = vals[0]
    return request_dict
Example #38
0
def edit_module_detail_screens(request, domain, app_id, module_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    fixture_select and sort_elements.
    """
    params = json_request(request.POST)
    detail_type = params.get('type')
    short = params.get('short', None)
    long = params.get('long', None)
    tabs = params.get('tabs', None)
    filter = params.get('filter', ())
    custom_xml = params.get('custom_xml', None)
    parent_select = params.get('parent_select', None)
    fixture_select = params.get('fixture_select', None)
    sort_elements = params.get('sort_elements', None)
    persist_case_context = params.get('persistCaseContext', None)
    persistent_case_context_xml = params.get('persistentCaseContextXML', None)
    use_case_tiles = params.get('useCaseTiles', None)
    persist_tile_on_forms = params.get("persistTileOnForms", None)
    pull_down_tile = params.get("enableTilePullDown", None)
    case_list_lookup = params.get("case_list_lookup", None)
    search_properties = params.get("search_properties")
    custom_variables = {
        'short': params.get("short_custom_variables", None),
        'long': params.get("long_custom_variables", None)
    }

    app = get_app(domain, app_id)
    module = app.get_module(module_id)

    if detail_type == 'case':
        detail = module.case_details
    elif detail_type == CAREPLAN_GOAL:
        detail = module.goal_details
    elif detail_type == CAREPLAN_TASK:
        detail = module.task_details
    else:
        try:
            detail = getattr(module, '{0}_details'.format(detail_type))
        except AttributeError:
            return HttpResponseBadRequest("Unknown detail type '%s'" %
                                          detail_type)

    lang = request.COOKIES.get('lang', app.langs[0])
    if short is not None:
        detail.short.columns = map(DetailColumn.from_json, short)
        if persist_case_context is not None:
            detail.short.persist_case_context = persist_case_context
            detail.short.persistent_case_context_xml = persistent_case_context_xml
        if use_case_tiles is not None:
            detail.short.use_case_tiles = use_case_tiles
        if persist_tile_on_forms is not None:
            detail.short.persist_tile_on_forms = persist_tile_on_forms
        if pull_down_tile is not None:
            detail.short.pull_down_tile = pull_down_tile
        if case_list_lookup is not None:
            _save_case_list_lookup_params(detail.short, case_list_lookup, lang)

    if long is not None:
        detail.long.columns = map(DetailColumn.from_json, long)
        if tabs is not None:
            detail.long.tabs = map(DetailTab.wrap, tabs)
    if filter != ():
        # Note that we use the empty tuple as the sentinel because a filter
        # value of None represents clearing the filter.
        detail.short.filter = filter
    if custom_xml is not None:
        detail.short.custom_xml = custom_xml

    if custom_variables['short'] is not None:
        try:
            etree.fromstring("<variables>{}</variables>".format(
                custom_variables['short']))
        except etree.XMLSyntaxError as error:
            return HttpResponseBadRequest(
                "There was an issue with your custom variables: {}".format(
                    error.message))
        detail.short.custom_variables = custom_variables['short']

    if custom_variables['long'] is not None:
        try:
            etree.fromstring("<variables>{}</variables>".format(
                custom_variables['long']))
        except etree.XMLSyntaxError as error:
            return HttpResponseBadRequest(
                "There was an issue with your custom variables: {}".format(
                    error.message))
        detail.long.custom_variables = custom_variables['long']

    if sort_elements is not None:
        detail.short.sort_elements = []
        for sort_element in sort_elements:
            item = SortElement()
            item.field = sort_element['field']
            item.type = sort_element['type']
            item.direction = sort_element['direction']
            item.display[lang] = sort_element['display']
            if toggles.SORT_CALCULATION_IN_CASE_LIST.enabled(domain):
                item.sort_calculation = sort_element['sort_calculation']
            else:
                item.sort_calculation = ""
            detail.short.sort_elements.append(item)
    if parent_select is not None:
        module.parent_select = ParentSelect.wrap(parent_select)
        if module_case_hierarchy_has_circular_reference(module):
            return HttpResponseBadRequest(
                _("The case hierarchy contains a circular reference."))
    if fixture_select is not None:
        module.fixture_select = FixtureSelect.wrap(fixture_select)
    if search_properties is not None:
        if search_properties.get('properties') is not None:
            module.search_config = CaseSearch(
                properties=[
                    CaseSearchProperty.wrap(p)
                    for p in _update_search_properties(
                        module, search_properties.get('properties'), lang)
                ],
                relevant=(search_properties.get('relevant')
                          if search_properties.get('relevant') is not None else
                          CLAIM_DEFAULT_RELEVANT_CONDITION),
                include_closed=bool(search_properties.get('include_closed')),
                default_properties=[
                    DefaultCaseSearchProperty.wrap(p)
                    for p in search_properties.get('default_properties')
                ])

    resp = {}
    app.save(resp)
    return json_response(resp)
Example #39
0
 def request_params(self):
     return json_request({})
Example #40
0
def send_email_report(self, recipient_emails, domain, report_slug, report_type,
                      request_data, once, cleaned_data):
    """
    Function invokes send_HTML_email to email the html text report.
    If the report is too large to fit into email then a download link is
    sent via email to download report
    :Parameter recipient_list:
            list of recipient to whom email is to be sent
    :Parameter domain:
            domain name
    :Parameter report_slug:
            report slug
    :Parameter report_type:
            type of the report
    :Parameter request_data:
            Dict containing request data
    :Parameter once
            boolean argument specifying whether the report is once off report
            or scheduled report
    :Parameter cleaned_data:
            Dict containing cleaned data from the submitted form
    """
    from corehq.apps.reports.views import _render_report_configs, render_full_report_notification

    user_id = request_data['couch_user']
    couch_user = CouchUser.get_by_user_id(user_id)
    mock_request = HttpRequest()

    mock_request.method = 'GET'
    mock_request.GET = request_data['GET']

    config = ReportConfig()

    # see ReportConfig.query_string()
    object.__setattr__(config, '_id', 'dummy')
    config.name = _("Emailed report")
    config.report_type = report_type
    config.report_slug = report_slug
    config.owner_id = user_id
    config.domain = domain

    config.start_date = request_data['datespan'].startdate.date()
    if request_data['datespan'].enddate:
        config.date_range = 'range'
        config.end_date = request_data['datespan'].enddate.date()
    else:
        config.date_range = 'since'

    GET = dict(six.iterlists(request_data['GET']))
    exclude = ['startdate', 'enddate', 'subject', 'send_to_owner', 'notes', 'recipient_emails']
    filters = {}
    for field in GET:
        if field not in exclude:
            filters[field] = GET.get(field)

    config.filters = filters

    subject = cleaned_data['subject'] or _("Email report from CommCare HQ")

    try:
        content = _render_report_configs(
            mock_request, [config], domain, user_id, couch_user, True, lang=couch_user.language,
            notes=cleaned_data['notes'], once=once
        )[0]
        body = render_full_report_notification(None, content).content

        for recipient in recipient_emails:
            send_HTML_email(subject, recipient,
                            body, email_from=settings.DEFAULT_FROM_EMAIL,
                            smtp_exception_skip_list=LARGE_FILE_SIZE_ERROR_CODES)

    except Exception as er:
        notify_exception(
            None,
            message="Encountered error while generating report or sending email",
            details={
                'subject': subject,
                'recipients': str(recipient_emails),
                'error': er,
            }
        )
        if getattr(er, 'smtp_code', None) in LARGE_FILE_SIZE_ERROR_CODES or type(er) == ESError:
            # If the email doesn't work because it is too large to fit in the HTML body,
            # send it as an excel attachment.
            report_state = {
                'request': request_data,
                'request_params': json_request(request_data['GET']),
                'domain': domain,
                'context': {},
            }
            export_all_rows_task(config.report, report_state, recipient_list=recipient_emails)
        else:
            self.retry(exc=er)
Example #41
0
def edit_module_detail_screens(request, domain, app_id, module_unique_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    fixture_select and sort_elements.
    """
    params = json_request(request.POST)
    detail_type = params.get('type')
    short = params.get('short', None)
    long_ = params.get('long', None)
    tabs = params.get('tabs', None)
    filter = params.get('filter', ())
    custom_xml = params.get('custom_xml', None)
    parent_select = params.get('parent_select', None)
    fixture_select = params.get('fixture_select', None)
    sort_elements = params.get('sort_elements', None)
    persist_case_context = params.get('persistCaseContext', None)
    persistent_case_context_xml = params.get('persistentCaseContextXML', None)
    use_case_tiles = params.get('useCaseTiles', None)
    persist_tile_on_forms = params.get("persistTileOnForms", None)
    persistent_case_tile_from_module = params.get("persistentCaseTileFromModule", None)
    pull_down_tile = params.get("enableTilePullDown", None)
    sort_nodeset_columns = params.get("sortNodesetColumns", None)
    print_template = params.get('printTemplate', None)
    case_list_lookup = params.get("case_list_lookup", None)
    search_properties = params.get("search_properties")
    custom_variables = {
        'short': params.get("short_custom_variables", None),
        'long': params.get("long_custom_variables", None)
    }

    app = get_app(domain, app_id)

    try:
        module = app.get_module_by_unique_id(module_unique_id)
    except ModuleNotFoundException:
        # temporary fallback
        module = app.get_module(module_unique_id)

    if detail_type == 'case':
        detail = module.case_details
    else:
        try:
            detail = getattr(module, '{0}_details'.format(detail_type))
        except AttributeError:
            return HttpResponseBadRequest("Unknown detail type '%s'" % detail_type)

    lang = request.COOKIES.get('lang', app.langs[0])
    if short is not None:
        detail.short.columns = list(map(DetailColumn.from_json, short))
        if persist_case_context is not None:
            detail.short.persist_case_context = persist_case_context
            detail.short.persistent_case_context_xml = persistent_case_context_xml
        if use_case_tiles is not None:
            detail.short.use_case_tiles = use_case_tiles
        if persist_tile_on_forms is not None:
            detail.short.persist_tile_on_forms = persist_tile_on_forms
        if persistent_case_tile_from_module is not None:
            detail.short.persistent_case_tile_from_module = persistent_case_tile_from_module
        if pull_down_tile is not None:
            detail.short.pull_down_tile = pull_down_tile
        if case_list_lookup is not None:
            _save_case_list_lookup_params(detail.short, case_list_lookup, lang)

    if long_ is not None:
        detail.long.columns = list(map(DetailColumn.from_json, long_))
        if tabs is not None:
            detail.long.tabs = list(map(DetailTab.wrap, tabs))
        if print_template is not None:
            detail.long.print_template = print_template
    if filter != ():
        # Note that we use the empty tuple as the sentinel because a filter
        # value of None represents clearing the filter.
        detail.short.filter = filter
    if custom_xml is not None:
        detail.short.custom_xml = custom_xml

    if custom_variables['short'] is not None:
        try:
            etree.fromstring("<variables>{}</variables>".format(custom_variables['short']))
        except etree.XMLSyntaxError as error:
            return HttpResponseBadRequest(
                "There was an issue with your custom variables: {}".format(error.message)
            )
        detail.short.custom_variables = custom_variables['short']

    if custom_variables['long'] is not None:
        try:
            etree.fromstring("<variables>{}</variables>".format(custom_variables['long']))
        except etree.XMLSyntaxError as error:
            return HttpResponseBadRequest(
                "There was an issue with your custom variables: {}".format(error.message)
            )
        detail.long.custom_variables = custom_variables['long']

    if sort_nodeset_columns is not None:
        detail.long.sort_nodeset_columns = sort_nodeset_columns

    if sort_elements is not None:
        # Attempt to map new elements to old so we don't lose translations
        # Imperfect because the same field may be used multiple times, or user may change field
        old_elements_by_field = {e['field']: e for e in detail.short.sort_elements}

        detail.short.sort_elements = []
        for sort_element in sort_elements:
            item = SortElement()
            item.field = sort_element['field']
            item.type = sort_element['type']
            item.direction = sort_element['direction']
            item.blanks = sort_element['blanks']
            if item.field in old_elements_by_field:
                item.display = old_elements_by_field[item.field].display
            item.display[lang] = sort_element['display']
            if toggles.SORT_CALCULATION_IN_CASE_LIST.enabled(domain):
                item.sort_calculation = sort_element['sort_calculation']
            else:
                item.sort_calculation = ""
            detail.short.sort_elements.append(item)
    if parent_select is not None:
        module.parent_select = ParentSelect.wrap(parent_select)
        if module_case_hierarchy_has_circular_reference(module):
            return HttpResponseBadRequest(_("The case hierarchy contains a circular reference."))
    if fixture_select is not None:
        module.fixture_select = FixtureSelect.wrap(fixture_select)
    if search_properties is not None:
        if (
                search_properties.get('properties') is not None
                or search_properties.get('default_properties') is not None
        ):
            module.search_config = CaseSearch(
                properties=[
                    CaseSearchProperty.wrap(p)
                    for p in _update_search_properties(
                        module,
                        search_properties.get('properties'), lang
                    )
                ],
                relevant=(
                    search_properties.get('relevant')
                    if search_properties.get('relevant') is not None
                    else CLAIM_DEFAULT_RELEVANT_CONDITION
                ),
                include_closed=bool(search_properties.get('include_closed')),
                search_button_display_condition=search_properties.get('search_button_display_condition', ""),
                blacklisted_owner_ids_expression=search_properties.get('blacklisted_owner_ids_expression', ""),
                default_properties=[
                    DefaultCaseSearchProperty.wrap(p)
                    for p in search_properties.get('default_properties')
                ]
            )

    resp = {}
    app.save(resp)
    return json_response(resp)
Example #42
0
    def _get_and_send_report(self, language, emails):
        from corehq.apps.reports.views import get_scheduled_report_response, render_full_report_notification

        with localize(language):
            title = (_(DEFAULT_REPORT_NOTIF_SUBJECT) if self.email_subject
                     == DEFAULT_REPORT_NOTIF_SUBJECT else self.email_subject)

            attach_excel = getattr(self, 'attach_excel', False)
            try:
                content, excel_files = get_scheduled_report_response(
                    self.owner,
                    self.domain,
                    self._id,
                    attach_excel=attach_excel,
                    send_only_active=True)

                # Will be False if ALL the ReportConfigs in the ReportNotification
                # have a start_date in the future.
                if content is False:
                    return

                for email in emails:
                    body = render_full_report_notification(
                        None, content, email, self).content
                    send_html_email_async(
                        title,
                        email,
                        body,
                        email_from=settings.DEFAULT_FROM_EMAIL,
                        file_attachments=excel_files,
                        smtp_exception_skip_list=LARGE_FILE_SIZE_ERROR_CODES)
            except Exception as er:
                notify_exception(
                    None,
                    message=
                    "Encountered error while generating report or sending email",
                    details={
                        'subject': title,
                        'recipients': str(emails),
                        'error': er,
                    })
                if getattr(er, 'smtp_code',
                           None) in LARGE_FILE_SIZE_ERROR_CODES or type(
                               er) == ESError:
                    # If the email doesn't work because it is too large to fit in the HTML body,
                    # send it as an excel attachment, by creating a mock request with the right data.

                    for report_config in self.configs:
                        mock_request = HttpRequest()
                        mock_request.couch_user = self.owner
                        mock_request.user = self.owner.get_django_user()
                        mock_request.domain = self.domain
                        mock_request.couch_user.current_domain = self.domain
                        mock_request.couch_user.language = self.language
                        mock_request.method = 'GET'
                        mock_request.bypass_two_factor = True

                        mock_query_string_parts = [
                            report_config.query_string, 'filterSet=true'
                        ]
                        if report_config.is_configurable_report:
                            mock_query_string_parts.append(
                                urlencode(report_config.filters, True))
                            mock_query_string_parts.append(
                                urlencode(report_config.get_date_range(),
                                          True))
                        mock_request.GET = QueryDict(
                            '&'.join(mock_query_string_parts))
                        date_range = report_config.get_date_range()
                        start_date = datetime.strptime(date_range['startdate'],
                                                       '%Y-%m-%d')
                        end_date = datetime.strptime(date_range['enddate'],
                                                     '%Y-%m-%d')

                        datespan = DateSpan(start_date, end_date)
                        request_data = vars(mock_request)
                        request_data[
                            'couch_user'] = mock_request.couch_user.userID
                        request_data['datespan'] = datespan

                        full_request = {
                            'request': request_data,
                            'domain': request_data['domain'],
                            'context': {},
                            'request_params': json_request(request_data['GET'])
                        }

                        export_all_rows_task(report_config.report,
                                             full_request, emails, title)
Example #43
0
 def request_dict(self):
     params = json_request(self.request.GET)
     params['domain'] = self.domain
     return params
Example #44
0
 def post(self, request, *args, **kwargs):
     request_json = json_request(request.POST)
     self.doc = request_json.get('doc')
     self.save_doc()
     return self.get(request, success=True, *args, **kwargs)
Example #45
0
def edit_module_detail_screens(request, domain, app_id, module_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    fixture_select and sort_elements.
    """
    params = json_request(request.POST)
    detail_type = params.get('type')
    short = params.get('short', None)
    long = params.get('long', None)
    tabs = params.get('tabs', None)
    filter = params.get('filter', ())
    custom_xml = params.get('custom_xml', None)
    parent_select = params.get('parent_select', None)
    fixture_select = params.get('fixture_select', None)
    sort_elements = params.get('sort_elements', None)
    persist_case_context = params.get('persistCaseContext', None)
    use_case_tiles = params.get('useCaseTiles', None)
    persist_tile_on_forms = params.get("persistTileOnForms", None)
    pull_down_tile = params.get("enableTilePullDown", None)
    case_list_lookup = params.get("case_list_lookup", None)

    app = get_app(domain, app_id)
    module = app.get_module(module_id)

    if detail_type == 'case':
        detail = module.case_details
    elif detail_type == CAREPLAN_GOAL:
        detail = module.goal_details
    elif detail_type == CAREPLAN_TASK:
        detail = module.task_details
    else:
        try:
            detail = getattr(module, '{0}_details'.format(detail_type))
        except AttributeError:
            return HttpResponseBadRequest("Unknown detail type '%s'" % detail_type)

    if short is not None:
        detail.short.columns = map(DetailColumn.wrap, short)
        if persist_case_context is not None:
            detail.short.persist_case_context = persist_case_context
        if use_case_tiles is not None:
            detail.short.use_case_tiles = use_case_tiles
        if persist_tile_on_forms is not None:
            detail.short.persist_tile_on_forms = persist_tile_on_forms
        if pull_down_tile is not None:
            detail.short.pull_down_tile = pull_down_tile
        if case_list_lookup is not None:
            _save_case_list_lookup_params(detail.short, case_list_lookup)

    if long is not None:
        detail.long.columns = map(DetailColumn.wrap, long)
        if tabs is not None:
            detail.long.tabs = map(DetailTab.wrap, tabs)
    if filter != ():
        # Note that we use the empty tuple as the sentinel because a filter
        # value of None represents clearing the filter.
        detail.short.filter = filter
    if custom_xml is not None:
        detail.short.custom_xml = custom_xml
    if sort_elements is not None:
        detail.short.sort_elements = []
        for sort_element in sort_elements:
            item = SortElement()
            item.field = sort_element['field']
            item.type = sort_element['type']
            item.direction = sort_element['direction']
            detail.short.sort_elements.append(item)
    if parent_select is not None:
        module.parent_select = ParentSelect.wrap(parent_select)
    if fixture_select is not None:
        module.fixture_select = FixtureSelect.wrap(fixture_select)

    resp = {}
    app.save(resp)
    return json_response(resp)
Example #46
0
def edit_module_detail_screens(request, domain, app_id, module_id):
    """
    Overwrite module case details. Only overwrites components that have been
    provided in the request. Components are short, long, filter, parent_select,
    fixture_select and sort_elements.
    """
    params = json_request(request.POST)
    detail_type = params.get('type')
    short = params.get('short', None)
    long = params.get('long', None)
    tabs = params.get('tabs', None)
    filter = params.get('filter', ())
    custom_xml = params.get('custom_xml', None)
    parent_select = params.get('parent_select', None)
    fixture_select = params.get('fixture_select', None)
    sort_elements = params.get('sort_elements', None)
    persist_case_context = params.get('persistCaseContext', None)
    persistent_case_context_xml = params.get('persistentCaseContextXML', None)
    use_case_tiles = params.get('useCaseTiles', None)
    persist_tile_on_forms = params.get("persistTileOnForms", None)
    pull_down_tile = params.get("enableTilePullDown", None)
    case_list_lookup = params.get("case_list_lookup", None)
    search_properties = params.get("search_properties")

    app = get_app(domain, app_id)
    module = app.get_module(module_id)

    if detail_type == 'case':
        detail = module.case_details
    elif detail_type == CAREPLAN_GOAL:
        detail = module.goal_details
    elif detail_type == CAREPLAN_TASK:
        detail = module.task_details
    else:
        try:
            detail = getattr(module, '{0}_details'.format(detail_type))
        except AttributeError:
            return HttpResponseBadRequest("Unknown detail type '%s'" %
                                          detail_type)

    lang = request.COOKIES.get('lang', app.langs[0])
    if short is not None:
        detail.short.columns = map(DetailColumn.from_json, short)
        if persist_case_context is not None:
            detail.short.persist_case_context = persist_case_context
            detail.short.persistent_case_context_xml = persistent_case_context_xml
        if use_case_tiles is not None:
            detail.short.use_case_tiles = use_case_tiles
        if persist_tile_on_forms is not None:
            detail.short.persist_tile_on_forms = persist_tile_on_forms
        if pull_down_tile is not None:
            detail.short.pull_down_tile = pull_down_tile
        if case_list_lookup is not None:
            _save_case_list_lookup_params(detail.short, case_list_lookup, lang)

    if long is not None:
        detail.long.columns = map(DetailColumn.from_json, long)
        if tabs is not None:
            detail.long.tabs = map(DetailTab.wrap, tabs)
    if filter != ():
        # Note that we use the empty tuple as the sentinel because a filter
        # value of None represents clearing the filter.
        detail.short.filter = filter
    if custom_xml is not None:
        detail.short.custom_xml = custom_xml
    if sort_elements is not None:
        detail.short.sort_elements = []
        for sort_element in sort_elements:
            item = SortElement()
            item.field = sort_element['field']
            item.type = sort_element['type']
            item.direction = sort_element['direction']
            item.display[lang] = sort_element['display']
            detail.short.sort_elements.append(item)
    if parent_select is not None:
        module.parent_select = ParentSelect.wrap(parent_select)
    if fixture_select is not None:
        module.fixture_select = FixtureSelect.wrap(fixture_select)
    if search_properties is not None:
        if search_properties.get('properties') is not None:
            module.search_config = CaseSearch(
                properties=[
                    CaseSearchProperty.wrap(p)
                    for p in _update_search_properties(
                        module, search_properties.get('properties'), lang)
                ],
                relevant=(search_properties.get('relevant')
                          if search_properties.get('relevant') is not None else
                          CLAIM_DEFAULT_RELEVANT_CONDITION))

    resp = {}
    app.save(resp)
    return json_response(resp)
Example #47
0
def get_translations(request):
    params = json_request(request.GET)
    lang = params.get('lang', 'en')
    key = params.get('key', None)
    one = params.get('one', False)
    return json_response(Translation.get_translations(lang, key, one))
Example #48
0
        open_cases = CommCareCase.view('hqcase/open_cases', startkey=[domain], endkey=[domain, {}], reduce=False, include_docs=True).all()
        xform_ids = [case.xform_ids[0] for case in open_cases]
        case_count = defaultdict(int)
        for xform_id in xform_ids:
            xform = XFormInstance.get(xform_id)
            meta = xform.form['meta']
            case_count[(meta['userID'], meta['username'], meta['deviceID'])] += 1
        for sub in subs:
            sub['cases'] = case_count[(sub['userID'], sub['username'], sub['deviceID'])]

        return json_response({
            "results": subs,
            "total": len(subs),
        })
    return query(**json_request(request.GET))

@require_can_cleanup
@require_POST
def close_cases(request, domain):
    data = json.loads(request.POST['data'])
    keys = data['submissions']
    def actually_close_cases(cases):
        for case in cases:
            for referral in case.referrals:
                case.force_close_referral(get_submit_url(domain), referral)
            case.force_close(get_submit_url(domain))
    xforms = _get_submissions(domain, keys)
    cases = _get_cases(xforms)
    actually_close_cases(cases)
    return HttpResponseRedirect(reverse('corehq.apps.cleanup.views.cases', args=[domain]))
Example #49
0
def submissions_json(request, domain):
    def query(limit=100, userID=None, group=False, username__exclude=["demo_user", "admin"], **kwargs):
        if group:
            if userID is None:
                key = [domain]
            else:
                key = [domain, userID]
            subs = [dict(
                userID = r['key'][1],
                username = r['key'][2],
                deviceID = r['key'][3],
                submissions = r['value'],
            ) for r in get_db().view('cleanup/submissions',
                startkey = key,
                endkey   = key + [{}],
                group    = True,
            )]
            total = len(subs)
        else:
            if userID is None:
                key = make_form_couch_key(domain)
                subs = XFormInstance.view('reports_forms/all_forms',
                    startkey=key+[{}],
                    endkey=key,
                    reduce=False,
                    include_docs=True,
                    descending=True,
                    limit=limit
                )
                total = get_db().view('reports_forms/all_forms',
                    startkey=key,
                    endkey=key+[{}],
                    group_level=1
                ).one()
                total = total['value'] if total else 0
            else:
                key = make_form_couch_key(domain, user_id=userID)
                subs = XFormInstance.view('reports_forms/all_forms',
                    startkey=key+[{}],
                    endkey=key,
                    reduce=False,
                    include_docs=True,
                    descending=True,
                    limit=limit
                )
                total = get_db().view('reports_forms/all_forms',
                    startkey=key,
                    endkey=key+[{}],
                    group_level=2
                ).one()
                total = total['value'] if total else 0
            _subs = []
            for s in subs:
                try:
                    _subs.append(dict(
                        username = s['form']['meta']['username'],
                        userID = s['form']['meta']['userID'],
                        received_on = unicode(s['received_on']),
                        deviceID = s['form']['meta']['deviceID'],
                    ))
                except:
                    continue
            subs = _subs
        if username__exclude:
            username__exclude = set(username__exclude)
            subs = filter(lambda sub: sub['username'] not in username__exclude, subs)
        return json_response({
            "results": subs,
            "total": total,
        })
    return query(**json_request(request.GET))
Example #50
0
def send_email_report(self, recipient_emails, domain, report_slug, report_type,
                      request_data, once, cleaned_data):
    """
    Function invokes send_HTML_email to email the html text report.
    If the report is too large to fit into email then a download link is
    sent via email to download report
    :Parameter recipient_list:
            list of recipient to whom email is to be sent
    :Parameter domain:
            domain name
    :Parameter report_slug:
            report slug
    :Parameter report_type:
            type of the report
    :Parameter request_data:
            Dict containing request data
    :Parameter once
            boolean argument specifying whether the report is once off report
            or scheduled report
    :Parameter cleaned_data:
            Dict containing cleaned data from the submitted form
    """
    from corehq.apps.reports.views import _render_report_configs, render_full_report_notification

    user_id = request_data['couch_user']
    couch_user = CouchUser.get_by_user_id(user_id)
    mock_request = HttpRequest()

    mock_request.method = 'GET'
    mock_request.GET = request_data['GET']

    config = ReportConfig()

    # see ReportConfig.query_string()
    object.__setattr__(config, '_id', 'dummy')
    config.name = _("Emailed report")
    config.report_type = report_type
    config.report_slug = report_slug
    config.owner_id = user_id
    config.domain = domain

    config.start_date = request_data['datespan'].startdate.date()
    if request_data['datespan'].enddate:
        config.date_range = 'range'
        config.end_date = request_data['datespan'].enddate.date()
    else:
        config.date_range = 'since'

    GET = dict(six.iterlists(request_data['GET']))
    exclude = [
        'startdate', 'enddate', 'subject', 'send_to_owner', 'notes',
        'recipient_emails'
    ]
    filters = {}
    for field in GET:
        if field not in exclude:
            filters[field] = GET.get(field)

    config.filters = filters

    subject = cleaned_data['subject'] or _("Email report from CommCare HQ")

    content = _render_report_configs(mock_request, [config],
                                     domain,
                                     user_id,
                                     couch_user,
                                     True,
                                     lang=couch_user.language,
                                     notes=cleaned_data['notes'],
                                     once=once)[0]
    body = render_full_report_notification(None, content).content

    try:
        for recipient in recipient_emails:
            send_HTML_email(
                subject,
                recipient,
                body,
                email_from=settings.DEFAULT_FROM_EMAIL,
                smtp_exception_skip_list=LARGE_FILE_SIZE_ERROR_CODES)

    except Exception as er:
        if getattr(er, 'smtp_code', None) in LARGE_FILE_SIZE_ERROR_CODES:
            # If the smtp server rejects the email because of its large size.
            # Then sends the report download link in the email.
            report_state = {
                'request': request_data,
                'request_params': json_request(request_data['GET']),
                'domain': domain,
                'context': {},
            }
            export_all_rows_task(config.report,
                                 report_state,
                                 recipient_list=recipient_emails)
        else:
            self.retry(exc=er)
Example #51
0
 def post(self, request, *args, **kwargs):
     request_json = json_request(request.POST)
     self.doc = request_json.get('doc')
     self.save_doc()
     return self.get(request, success=True, *args, **kwargs)
Example #52
0
 def _init_data_source(self, data_source, request, domain):
     config = json_request(request.GET)
     config['domain'] = domain.name
     return data_source(config)
Example #53
0
 def request_dict(self):
     params = json_request(self.request.GET)
     params['domain'] = self.domain
     return params
Example #54
0
 def _init_data_source(self, data_source, request, domain):
     config = json_request(request.GET)
     config['domain'] = domain.name
     return data_source(config)
Example #55
0
 def request_params(self):
     return json_request({})
Example #56
0
 def request_dict(self):
     request_dict = json_request(self.request.GET)
     request_dict['domain'] = self.domain
     return request_dict