Beispiel #1
0
def get_apps_base_context(request, domain, app):

    lang, langs = get_langs(request, app)

    if getattr(request, 'couch_user', None):
        timezone = get_timezone_for_user(request.couch_user, domain)
    else:
        timezone = None

    context = {
        'lang': lang,
        'langs': langs,
        'domain': domain,
        'app': app,
        'timezone': timezone,
    }

    if app and not app.is_remote_app():
        app.assert_app_v2()
        context.update({
            'show_care_plan':
            (not app.has_careplan_module
             and toggles.APP_BUILDER_CAREPLAN.enabled(request.user.username)),
            'show_advanced': (toggles.APP_BUILDER_ADVANCED.enabled(domain)
                              or getattr(app, 'commtrack_enabled', False)),
            'show_report_modules':
            toggles.MOBILE_UCR.enabled(domain),
            'show_shadow_modules':
            toggles.APP_BUILDER_SHADOW_MODULES.enabled(domain),
        })

    return context
Beispiel #2
0
def validate_form_for_build(request, domain, app_id, form_unique_id, ajax=True):
    app = get_app(domain, app_id)
    try:
        form = app.get_form(form_unique_id)
    except FormNotFoundException:
        # this can happen if you delete the form from another page
        raise Http404()
    errors = form.validate_for_build()
    lang, langs = get_langs(request, app)

    if ajax and "blank form" in [error.get('type') for error in errors] and not form.form_type == "shadow_form":
        response_html = ""
    else:
        if form.form_type == "shadow_form":
            # Don't display the blank form error if its a shadow form
            errors = [e for e in errors if e['type'] != "blank form"]
        response_html = render_to_string("app_manager/partials/build_errors.html", {
            'request': request,
            'app': app,
            'form': form,
            'build_errors': errors,
            'not_actual_build': True,
            'domain': domain,
            'langs': langs,
            'lang': lang
        })

    if ajax:
        return json_response({
            'error_html': response_html,
        })
    else:
        return HttpResponse(response_html)
Beispiel #3
0
def validate_module_for_build(request, domain, app_id, module_unique_id, ajax=True):
    app = get_app(domain, app_id)
    try:
        module = app.get_module_by_unique_id(module_unique_id)
    except ModuleNotFoundException:
        try:
            # temporary fallback
            module = app.get_module(module_unique_id)
        except ModuleNotFoundException:
            raise Http404()

    errors = module.validate_for_build()
    lang, langs = get_langs(request, app)

    response_html = render_to_string("app_manager/partials/build_errors.html", {
        'request': request,
        'app': app,
        'build_errors': errors,
        'not_actual_build': True,
        'domain': domain,
        'langs': langs,
        'lang': lang,
    })
    if ajax:
        return json_response({'error_html': response_html})
    return HttpResponse(response_html)
Beispiel #4
0
def validate_form_for_build(request, domain, app_id, unique_form_id, ajax=True):
    app = get_app(domain, app_id)
    try:
        form = app.get_form(unique_form_id)
    except FormNotFoundException:
        # this can happen if you delete the form from another page
        raise Http404()
    errors = form.validate_for_build()
    lang, langs = get_langs(request, app)

    if ajax and "blank form" in [error.get('type') for error in errors]:
        response_html = render_to_string('app_manager/partials/create_form_prompt.html')
    else:
        response_html = render_to_string('app_manager/partials/build_errors.html', {
            'app': app,
            'form': form,
            'build_errors': errors,
            'not_actual_build': True,
            'domain': domain,
            'langs': langs,
            'lang': lang
        })

    if ajax:
        return json_response({
            'error_html': response_html,
        })
    else:
        return HttpResponse(response_html)
Beispiel #5
0
def get_apps_base_context(request, domain, app):

    lang, langs = get_langs(request, app)

    if getattr(request, "couch_user", None):
        timezone = get_timezone_for_user(request.couch_user, domain)
    else:
        timezone = None

    context = {"lang": lang, "langs": langs, "domain": domain, "app": app, "timezone": timezone}

    if app and not app.is_remote_app():
        app.assert_app_v2()
        context.update(
            {
                "show_care_plan": (
                    not app.has_careplan_module and toggles.APP_BUILDER_CAREPLAN.enabled(request.user.username)
                ),
                "show_advanced": (
                    toggles.APP_BUILDER_ADVANCED.enabled(domain) or getattr(app, "commtrack_enabled", False)
                ),
                "show_report_modules": toggles.MOBILE_UCR.enabled(domain),
                "show_shadow_modules": toggles.APP_BUILDER_SHADOW_MODULES.enabled(domain),
            }
        )

    return context
Beispiel #6
0
def validate_form_for_build(request, domain, app_id, form_unique_id, ajax=True):
    app = get_app(domain, app_id)
    try:
        form = app.get_form(form_unique_id)
    except FormNotFoundException:
        # this can happen if you delete the form from another page
        raise Http404()
    errors = form.validate_for_build()
    lang, langs = get_langs(request, app)

    if ajax and "blank form" in [error.get('type') for error in errors] and not form.form_type == "shadow_form":
        response_html = ""
    else:
        if form.form_type == "shadow_form":
            # Don't display the blank form error if its a shadow form
            errors = [e for e in errors if e['type'] != "blank form"]
        response_html = render_to_string("app_manager/partials/build_errors.html", {
            'request': request,
            'app': app,
            'form': form,
            'build_errors': errors,
            'not_actual_build': True,
            'domain': domain,
            'langs': langs,
            'lang': lang
        })

    if ajax:
        return json_response({
            'error_html': response_html,
        })
    else:
        return HttpResponse(response_html)
Beispiel #7
0
def save_copy(request, domain, app_id):
    """
    Saves a copy of the app to a new doc.
    See VersionedDoc.save_copy

    """
    track_built_app_on_hubspot.delay(request.couch_user)
    comment = request.POST.get('comment')
    app = get_app(domain, app_id)
    try:
        errors = app.validate_app()
    except ModuleIdMissingException:
        # For apps (mainly Exchange apps) that lost unique_id attributes on Module
        app.ensure_module_unique_ids(should_save=True)
        errors = app.validate_app()

    if not errors:
        try:
            copy = app.make_build(
                comment=comment,
                user_id=request.couch_user.get_id,
                previous_version=app.get_latest_app(released_only=False))
            copy.save(increment_version=False)
        finally:
            # To make a RemoteApp always available for building
            if app.is_remote_app():
                app.save(increment_version=True)

        _track_build_for_app_preview(domain, request.couch_user, app_id,
                                     'User created a build')

    else:
        copy = None
    copy = copy and SavedAppBuild.wrap(copy.to_json()).to_saved_build_json(
        get_timezone_for_user(request.couch_user, domain))
    lang, langs = get_langs(request, app)
    if copy:
        # Set if build is supported for Java Phones
        j2me_enabled_configs = CommCareBuildConfig.j2me_enabled_config_labels()
        copy['j2me_enabled'] = copy['menu_item_label'] in j2me_enabled_configs

    template = get_app_manager_template(
        request.user,
        "app_manager/v1/partials/build_errors.html",
        "app_manager/v2/partials/build_errors.html",
    )
    return json_response({
        "saved_app":
        copy,
        "error_html":
        render_to_string(
            template, {
                'request': request,
                'app': get_app(domain, app_id),
                'build_errors': errors,
                'domain': domain,
                'langs': langs,
                'lang': lang
            }),
    })
Beispiel #8
0
def validate_form_for_build(request,
                            domain,
                            app_id,
                            unique_form_id,
                            ajax=True):
    app = get_app(domain, app_id)
    try:
        form = app.get_form(unique_form_id)
    except FormNotFoundException:
        # this can happen if you delete the form from another page
        raise Http404()
    errors = form.validate_for_build()
    lang, langs = get_langs(request, app)

    if ajax and "blank form" in [error.get('type') for error in errors]:
        response_html = render_to_string(
            'app_manager/partials/create_form_prompt.html')
    else:
        response_html = render_to_string(
            'app_manager/partials/build_errors.html', {
                'app': app,
                'form': form,
                'build_errors': errors,
                'not_actual_build': True,
                'domain': domain,
                'langs': langs,
                'lang': lang
            })

    if ajax:
        return json_response({
            'error_html': response_html,
        })
    else:
        return HttpResponse(response_html)
Beispiel #9
0
def save_copy(request, domain, app_id):
    """
    Saves a copy of the app to a new doc.
    See ApplicationBase.save_copy

    """
    track_built_app_on_hubspot.delay(request.couch_user)
    comment = request.POST.get('comment')
    app = get_app(domain, app_id)
    try:
        errors = app.validate_app()
    except ModuleIdMissingException:
        # For apps (mainly Exchange apps) that lost unique_id attributes on Module
        app.ensure_module_unique_ids(should_save=True)
        errors = app.validate_app()

    if not errors:
        try:
            user_id = request.couch_user.get_id
            timer = datadog_bucket_timer('commcare.app_build.new_release',
                                         tags=[],
                                         timing_buckets=(1, 10, 30, 60, 120,
                                                         240))
            with timer:
                copy = make_app_build(app, comment, user_id)
            CouchUser.get(user_id).set_has_built_app()
        except BuildConflictException:
            return JsonResponse(
                {
                    'error':
                    _("There is already a version build in progress. Please wait."
                      )
                },
                status=400)
        finally:
            # To make a RemoteApp always available for building
            if app.is_remote_app():
                app.save(increment_version=True)

        _track_build_for_app_preview(domain, request.couch_user, app_id,
                                     'User created a build')

    else:
        copy = None
    copy = copy and SavedAppBuild.wrap(copy.to_json()).releases_list_json(
        get_timezone_for_user(request.couch_user, domain))
    lang, langs = get_langs(request, app)

    return json_response({
        "saved_app":
        copy,
        "error_html":
        render_to_string(
            "app_manager/partials/build_errors.html", {
                'app': get_app(domain, app_id),
                'build_errors': errors,
                'domain': domain,
                'langs': langs,
            }),
    })
Beispiel #10
0
def validate_module_for_build(request, domain, app_id, module_id, ajax=True):
    app = get_app(domain, app_id)
    try:
        module = app.get_module(module_id)
    except ModuleNotFoundException:
        raise Http404()
    errors = module.validate_for_build()
    lang, langs = get_langs(request, app)

    response_html = render_to_string(
        get_app_manager_template(
            domain,
            'app_manager/v1/partials/build_errors.html',
            'app_manager/v2/partials/build_errors.html',
        ), {
            'request': request,
            'app': app,
            'build_errors': errors,
            'not_actual_build': True,
            'domain': domain,
            'langs': langs,
            'lang': lang
        })
    if ajax:
        return json_response({'error_html': response_html})
    return HttpResponse(response_html)
Beispiel #11
0
def direct_ccz(request, domain):
    """
    You must specify an app_id, and you may specify either 'version' or 'latest'
    latest can be one of:
        release: Latest starred version
        build: Latest version regardless of star
        save: Latest saved version of the application (even without a build)
    If 'version' and 'latest' aren't specified it will default to latest save
    You may also set 'include_multimedia=true' if you need multimedia.
    """
    def error(msg, code=400):
        return JsonResponse({'status': 'error', 'message': msg}, status=code)

    def get_app(app_id, version, latest):
        if version:
            return get_build_doc_by_version(domain, app_id, version)
        elif latest == 'build':
            return get_latest_build_doc(domain, app_id)
        elif latest == 'release':
            return get_latest_released_app_doc(domain, app_id)
        else:
            # either latest=='save' or they didn't specify
            return get_current_app(domain, app_id)

    app_id = request.GET.get('app_id', None)
    version = request.GET.get('version', None)
    latest = request.GET.get('latest', None)
    include_multimedia = request.GET.get('include_multimedia',
                                         'false').lower() == 'true'

    # Make sure URL params make sense
    if not app_id:
        return error("You must specify `app_id` in your GET parameters")
    if version and latest:
        return error("You can't specify both 'version' and 'latest'")
    if latest not in (
            None,
            'release',
            'build',
            'save',
    ):
        return error("latest must be either 'release', 'build', or 'save'")
    if version:
        try:
            version = int(version)
        except ValueError:
            return error("'version' must be an integer")

    try:
        app = get_app(app_id, version, latest)
        if not app:
            raise ResourceNotFound()
        app = app if isinstance(app, Document) else wrap_app(app)
    except (ResourceNotFound, DocTypeError):
        return error("Application not found", code=404)

    lang, langs = get_langs(request, app)

    with report_build_time(domain, app._id, 'live_preview'):
        return get_direct_ccz(domain, app, langs, version, include_multimedia)
Beispiel #12
0
def get_apps_base_context(request, domain, app):

    lang, langs = get_langs(request, app)

    if getattr(request, 'couch_user', None):
        timezone = get_timezone_for_user(request.couch_user, domain)
    else:
        timezone = None

    context = {
        'lang': lang,
        'langs': langs,
        'domain': domain,
        'app': app,
        'app_subset': {
            'commcare_minor_release': app.commcare_minor_release,
            'doc_type': app.get_doc_type(),
            'form_counts_by_module': [len(m.forms) for m in app.modules] if not app.is_remote_app() else [],
            'version': app.version,
        } if app else {},
        'timezone': timezone,
    }

    if app and not app.is_remote_app():
        app.assert_app_v2()
        show_advanced = (
            toggles.APP_BUILDER_ADVANCED.enabled(domain)
            or getattr(app, 'commtrack_enabled', False)
        )

        disable_report_modules = (
            is_master_linked_domain(domain)
            and not toggles.MOBILE_UCR_LINKED_DOMAIN.enabled(domain)
        )

        # ideally this should be loaded on demand
        practice_users = []
        if app.enable_practice_users:
            try:
                practice_users = get_practice_mode_mobile_workers(request.domain)
            except ESError:
                notify_exception(request, 'Error getting practice mode mobile workers')

        latest_version_for_build_profiles = {}
        if toggles.RELEASE_BUILDS_PER_PROFILE.enabled(domain):
            latest_version_for_build_profiles = get_latest_enabled_versions_per_profile(app.get_id)

        context.update({
            'show_advanced': show_advanced,
            'show_report_modules': toggles.MOBILE_UCR.enabled(domain),
            'disable_report_modules': disable_report_modules,
            'show_shadow_modules': toggles.APP_BUILDER_SHADOW_MODULES.enabled(domain),
            'show_shadow_forms': show_advanced,
            'show_training_modules': toggles.TRAINING_MODULE.enabled(domain) and app.enable_training_modules,
            'practice_users': [{"id": u['_id'], "text": u["username"]} for u in practice_users],
            'latest_version_for_build_profiles': latest_version_for_build_profiles,
        })

    return context
Beispiel #13
0
def direct_ccz(request, domain):
    """
    You must specify an app_id, and you may specify either 'version' or 'latest'
    latest can be one of:
        release: Latest starred version
        build: Latest version regardless of star
        save: Latest saved version of the application (even without a build)
    If 'version' and 'latest' aren't specified it will default to latest save
    You may also set 'include_multimedia=true' if you need multimedia.
    """

    def error(msg, code=400):
        return json_response({'status': 'error', 'message': msg}, status_code=code)

    def get_app(app_id, version, latest):
        if version:
            return get_build_doc_by_version(domain, app_id, version)
        elif latest == 'build':
            return get_latest_build_doc(domain, app_id)
        elif latest == 'release':
            return get_latest_released_app_doc(domain, app_id)
        else:
            # either latest=='save' or they didn't specify
            return get_current_app(domain, app_id)

    app_id = request.GET.get('app_id', None)
    version = request.GET.get('version', None)
    latest = request.GET.get('latest', None)
    include_multimedia = request.GET.get('include_multimedia', 'false').lower() == 'true'
    visit_scheduler_enabled = toggles.VISIT_SCHEDULER.enabled_for_request(request)

    # Make sure URL params make sense
    if not app_id:
        return error("You must specify `app_id` in your GET parameters")
    if version and latest:
        return error("You can't specify both 'version' and 'latest'")
    if latest not in (None, 'release', 'build', 'save',):
        return error("latest must be either 'release', 'build', or 'save'")
    if version:
        try:
            version = int(version)
        except ValueError:
            return error("'version' must be an integer")

    try:
        app = get_app(app_id, version, latest)
        if not app:
            raise ResourceNotFound()
        app = app if isinstance(app, Document) else wrap_app(app)
    except (ResourceNotFound, DocTypeError):
        return error("Application not found", code=404)

    lang, langs = get_langs(request, app)

    timer = datadog_bucket_timer('commcare.app_build.live_preview', tags=[],
                                 timing_buckets=(1, 10, 30, 60, 120, 240))
    with timer:
        return get_direct_ccz(domain, app, lang, langs, version, include_multimedia, visit_scheduler_enabled)
Beispiel #14
0
def save_copy(request, domain, app_id):
    """
    Saves a copy of the app to a new doc.
    See VersionedDoc.save_copy

    """
    track_built_app_on_hubspot_v2.delay(request.couch_user)
    comment = request.POST.get('comment')
    app = get_app(domain, app_id)
    try:
        errors = app.validate_app()
    except ModuleIdMissingException:
        # For apps (mainly Exchange apps) that lost unique_id attributes on Module
        app.ensure_module_unique_ids(should_save=True)
        errors = app.validate_app()

    if not errors:
        try:
            user_id = request.couch_user.get_id
            timer = datadog_bucket_timer('commcare.app_build.new_release', tags=[],
                                         timing_buckets=(1, 10, 30, 60, 120, 240))
            with timer:
                copy = app.make_build(
                    comment=comment,
                    user_id=user_id,
                )
                copy.save(increment_version=False)
            CouchUser.get(user_id).set_has_built_app()
        finally:
            # To make a RemoteApp always available for building
            if app.is_remote_app():
                app.save(increment_version=True)

        _track_build_for_app_preview(domain, request.couch_user, app_id, 'User created a build')

    else:
        copy = None
    copy = copy and SavedAppBuild.wrap(copy.to_json()).releases_list_json(
        get_timezone_for_user(request.couch_user, domain)
    )
    lang, langs = get_langs(request, app)
    if copy:
        # Set if build is supported for Java Phones
        j2me_enabled_configs = CommCareBuildConfig.j2me_enabled_config_labels()
        copy['j2me_enabled'] = copy['menu_item_label'] in j2me_enabled_configs

    return json_response({
        "saved_app": copy,
        "error_html": render_to_string("app_manager/partials/build_errors.html", {
            'request': request,
            'app': get_app(domain, app_id),
            'build_errors': errors,
            'domain': domain,
            'langs': langs,
            'lang': lang
        }),
    })
Beispiel #15
0
def get_form_questions(request, domain, app_id):
    module_id = request.GET.get('module_id')
    form_id = request.GET.get('form_id')
    try:
        app = get_app(domain, app_id)
        form = app.get_module(module_id).get_form(form_id)
        lang, langs = get_langs(request, app)
    except (ModuleNotFoundException, IndexError):
        raise Http404()
    xform_questions = form.get_questions(langs, include_triggers=True)
    return json_response(xform_questions)
Beispiel #16
0
def get_form_questions(request, domain, app_id):
    module_id = request.GET.get('module_id')
    form_id = request.GET.get('form_id')
    try:
        app = get_app(domain, app_id)
        form = app.get_module(module_id).get_form(form_id)
        lang, langs = get_langs(request, app)
    except (ModuleNotFoundException, IndexError):
        raise Http404()
    xform_questions = form.get_questions(langs, include_triggers=True)
    return json_response(xform_questions)
Beispiel #17
0
def save_copy(request, domain, app_id):
    """
    Saves a copy of the app to a new doc.
    """
    track_built_app_on_hubspot.delay(request.couch_user.get_id)
    comment = request.POST.get('comment')
    app = get_app(domain, app_id)
    try:
        user_id = request.couch_user.get_id
        with report_build_time(domain, app._id, 'new_release'):
            copy = make_app_build(app, comment, user_id)
        CouchUser.get(user_id).set_has_built_app()
    except AppValidationError as e:
        lang, langs = get_langs(request, app)
        return JsonResponse({
            "saved_app":
            None,
            "error_html":
            render_to_string(
                "app_manager/partials/build_errors.html", {
                    'app': get_app(domain, app_id),
                    'build_errors': e.errors,
                    'domain': domain,
                    'langs': langs,
                    'toggles': toggles_enabled_for_request(request),
                }),
        })
    except BuildConflictException:
        return JsonResponse(
            {
                'error':
                _("There is already a version build in progress. Please wait.")
            },
            status=400)
    except XFormValidationFailed:
        return JsonResponse({'error': _("Unable to validate forms.")},
                            status=400)
    finally:
        # To make a RemoteApp always available for building
        if app.is_remote_app():
            app.save(increment_version=True)

    _track_build_for_app_preview(domain, request.couch_user, app_id,
                                 'User created a build')

    copy_json = copy and SavedAppBuild.wrap(copy.to_json()).releases_list_json(
        get_timezone_for_user(request.couch_user, domain))

    return JsonResponse({
        "saved_app": copy_json,
        "error_html": "",
    })
Beispiel #18
0
def get_apps_base_context(request, domain, app):

    lang, langs = get_langs(request, app)

    if getattr(request, 'couch_user', None):
        timezone = get_timezone_for_user(request.couch_user, domain)
    else:
        timezone = None

    context = {
        'lang': lang,
        'langs': langs,
        'domain': domain,
        'app': app,
        'app_subset': {
            'commcare_minor_release':
            app.commcare_minor_release,
            'doc_type':
            app.get_doc_type(),
            'form_counts_by_module':
            [len(m.forms)
             for m in app.modules] if not app.is_remote_app() else [],
            'version':
            app.version,
        } if app else {},
        'timezone': timezone,
    }

    if app and not app.is_remote_app():
        app.assert_app_v2()
        show_advanced = (toggles.APP_BUILDER_ADVANCED.enabled(domain)
                         or getattr(app, 'commtrack_enabled', False))
        context.update({
            'show_care_plan':
            (not app.has_careplan_module
             and toggles.APP_BUILDER_CAREPLAN.enabled(request.user.username)),
            'show_advanced':
            show_advanced,
            'show_report_modules':
            toggles.MOBILE_UCR.enabled(domain),
            'show_shadow_modules':
            toggles.APP_BUILDER_SHADOW_MODULES.enabled(domain),
            'show_shadow_forms':
            show_advanced,
        })

    if toggles.APP_MANAGER_V2.enabled(request.user.username):
        rollout = toggles.APP_MANAGER_V2.enabled_for_new_users_after
        if not toggles.was_user_created_after(request.user.username, rollout):
            context.update({'allow_v2_opt_out': True})

    return context
Beispiel #19
0
def get_apps_base_context(request, domain, app):

    lang, langs = get_langs(request, app)

    if getattr(request, 'couch_user', None):
        timezone = get_timezone_for_user(request.couch_user, domain)
    else:
        timezone = None

    context = {
        'lang': lang,
        'langs': langs,
        'domain': domain,
        'app': app,
        'app_subset': {
            'commcare_minor_release':
            app.commcare_minor_release,
            'doc_type':
            app.get_doc_type(),
            'form_counts_by_module':
            [len(m.forms)
             for m in app.modules] if not app.is_remote_app() else [],
            'version':
            app.version,
        } if app else {},
        'timezone': timezone,
    }

    if app and not app.is_remote_app():
        app.assert_app_v2()
        show_advanced = (toggles.APP_BUILDER_ADVANCED.enabled(domain)
                         or getattr(app, 'commtrack_enabled', False))
        context.update({
            'show_advanced':
            show_advanced,
            'show_report_modules':
            toggles.MOBILE_UCR.enabled(domain),
            'show_shadow_modules':
            toggles.APP_BUILDER_SHADOW_MODULES.enabled(domain),
            'show_shadow_forms':
            show_advanced,
            'show_training_modules':
            toggles.TRAINING_MODULE.enabled(domain)
            and app.enable_training_modules,
            'practice_users': [{
                "id": u['_id'],
                "text": u["username"]
            } for u in get_practice_mode_mobile_workers(domain)],
        })

    return context
Beispiel #20
0
 def _app_dict(self, app):
     lang, langs = get_langs(self.request, app)
     return {
         'VELLUM_TYPES': VELLUM_TYPES,
         'form_name_map': _get_name_map(app),
         'lang': lang,
         'langs': langs,
         'app_langs': app.langs,
         'app_id': app.id,
         'app_name': app.name,
         'read_only': is_linked_app(app) or app.id != app.origin_id,
         'app_version': app.version,
         'latest_app_id': app.origin_id,
     }
Beispiel #21
0
 def _app_dict(self, app):
     lang, langs = get_langs(self.request, app)
     return {
         'VELLUM_TYPES': VELLUM_TYPES,
         'form_name_map': _get_name_map(app),
         'lang': lang,
         'langs': langs,
         'app_langs': app.langs,
         'app_id': app.id,
         'app_name': app.name,
         'read_only': app.doc_type == 'LinkedApplication' or app.id != app.master_id,
         'app_version': app.version,
         'latest_app_id': app.master_id,
     }
Beispiel #22
0
def save_copy(request, domain, app_id):
    """
    Saves a copy of the app to a new doc.
    See VersionedDoc.save_copy

    """
    track_built_app_on_hubspot.delay(request.couch_user)
    comment = request.POST.get("comment")
    app = get_app(domain, app_id)
    try:
        errors = app.validate_app()
    except ModuleIdMissingException:
        # For apps (mainly Exchange apps) that lost unique_id attributes on Module
        app.ensure_module_unique_ids(should_save=True)
        errors = app.validate_app()

    if not errors:
        try:
            copy = app.make_build(
                comment=comment,
                user_id=request.couch_user.get_id,
                previous_version=app.get_latest_app(released_only=False),
            )
            copy.save(increment_version=False)
        finally:
            # To make a RemoteApp always available for building
            if app.is_remote_app():
                app.save(increment_version=True)
    else:
        copy = None
    copy = copy and SavedAppBuild.wrap(copy.to_json()).to_saved_build_json(
        get_timezone_for_user(request.couch_user, domain)
    )
    lang, langs = get_langs(request, app)
    return json_response(
        {
            "saved_app": copy,
            "error_html": render_to_string(
                "app_manager/partials/build_errors.html",
                {
                    "app": get_app(domain, app_id),
                    "build_errors": errors,
                    "domain": domain,
                    "langs": langs,
                    "lang": lang,
                },
            ),
        }
    )
    def page_context(self):
        if not self.app or self.app.doc_type == 'RemoteApp':
            raise Http404()

        lang, langs = get_langs(self.request, self.app)
        return {
            'VELLUM_TYPES': VELLUM_TYPES,
            'form_name_map': _get_name_map(self.app),
            'lang': lang,
            'langs': langs,
            'app_langs': self.app.langs,
            'app_id': self.app.id,
            'app_name': self.app.name,
            'read_only': self.app.doc_type == 'LinkedApplication',
        }
Beispiel #24
0
def get_form_questions(request, domain, app_id):
    form_unique_id = request.GET.get('form_unique_id')
    module_id_temp = request.GET.get('module_id')
    form_id_temp = request.GET.get('form_id')
    try:
        app = get_app(domain, app_id)
        if module_id_temp is not None and form_id_temp is not None:
            # temporary fallback
            form = app.get_module(module_id_temp).get_form(form_id_temp)
        else:
            form = app.get_form(form_unique_id)
        lang, langs = get_langs(request, app)
    except FormNotFoundException:
        raise Http404()
    xform_questions = form.get_questions(langs, include_triggers=True)
    return json_response(xform_questions)
Beispiel #25
0
def get_form_questions(request, domain, app_id):
    form_unique_id = request.GET.get('form_unique_id')
    module_id_temp = request.GET.get('module_id')
    form_id_temp = request.GET.get('form_id')
    try:
        app = get_app(domain, app_id)
        if module_id_temp is not None and form_id_temp is not None:
            # temporary fallback
            form = app.get_module(module_id_temp).get_form(form_id_temp)
        else:
            form = app.get_form(form_unique_id)
        lang, langs = get_langs(request, app)
    except FormNotFoundException:
        raise Http404()
    xform_questions = form.get_questions(langs, include_triggers=True)
    return json_response(xform_questions)
Beispiel #26
0
    def page_context(self):
        if not self.app or self.app.doc_type == 'RemoteApp':
            raise Http404()

        lang, langs = get_langs(self.request, self.app)
        return {
            'VELLUM_TYPES': VELLUM_TYPES,
            'form_name_map': _get_name_map(self.app),
            'lang': lang,
            'langs': langs,
            'app_langs': self.app.langs,
            'app_id': self.app.id,
            'app_name': self.app.name,
            'read_only': self.app.doc_type == 'LinkedApplication',
            'app_version': self.app.version,
            'latest_app_id': self.app.master_id,
        }
Beispiel #27
0
def get_apps_base_context(request, domain, app):

    lang, langs = get_langs(request, app)

    if getattr(request, 'couch_user', None):
        timezone = get_timezone_for_user(request.couch_user, domain)
    else:
        timezone = None

    context = {
        'lang': lang,
        'langs': langs,
        'domain': domain,
        'app': app,
        'URL_BASE': get_url_base(),
        'timezone': timezone,
    }

    if app:
        v2_app = app.application_version == APP_V2
        context.update({
            'show_care_plan': (
                v2_app
                and not app.has_careplan_module
                and toggles.APP_BUILDER_CAREPLAN.enabled(request.user.username)
            ),
            'show_advanced': (
                v2_app
                and (
                    toggles.APP_BUILDER_ADVANCED.enabled(request.user.username)
                    or getattr(app, 'commtrack_enabled', False)
                )
            ),
            'show_shadow_modules': (
                v2_app
                and toggles.APP_BUILDER_SHADOW_MODULES.enabled(domain)
            ),
        })

    return context
Beispiel #28
0
def direct_ccz(request, domain):
    """
    You must specify an app_id, and you may specify either 'version' or 'latest'
    latest can be one of:
        release: Latest starred version
        build: Latest version regardless of star
        save: Latest saved version of the application (even without a build)
    If 'version' and 'latest' aren't specified it will default to latest save
    You may also set 'include_multimedia=true' if you need multimedia.
    """
    def error(msg, code=400):
        return json_response({
            'status': 'error',
            'message': msg
        },
                             status_code=code)

    def get_app(app_id, version, latest):
        if version:
            return get_build_doc_by_version(domain, app_id, version)
        elif latest == 'build':
            return get_latest_build_doc(domain, app_id)
        elif latest == 'release':
            return get_latest_released_app_doc(domain, app_id)
        else:
            # either latest=='save' or they didn't specify
            return get_current_app(domain, app_id)

    app_id = request.GET.get('app_id', None)
    version = request.GET.get('version', None)
    latest = request.GET.get('latest', None)
    include_multimedia = request.GET.get('include_multimedia',
                                         'false').lower() == 'true'

    # Make sure URL params make sense
    if not app_id:
        return error("You must specify `app_id` in your GET parameters")
    if version and latest:
        return error("You can't specify both 'version' and 'latest'")
    if latest not in (
            None,
            'release',
            'build',
            'save',
    ):
        return error("latest must be either 'release', 'build', or 'save'")
    if version:
        try:
            version = int(version)
        except ValueError:
            return error("'version' must be an integer")

    try:
        app = get_app(app_id, version, latest)
        if not app:
            raise ResourceNotFound()
        app = app if isinstance(app, Document) else wrap_app(app)
    except (ResourceNotFound, DocTypeError):
        return error("Application not found", code=404)

    if not app.copy_of:
        errors = app.validate_app()
    else:
        errors = None

    if errors:
        lang, langs = get_langs(request, app)
        template = get_app_manager_template(
            domain, 'app_manager/v1/partials/build_errors.html',
            'app_manager/v2/partials/build_errors.html')
        error_html = render_to_string(
            template, {
                'request': request,
                'app': app,
                'build_errors': errors,
                'domain': domain,
                'langs': langs,
                'lang': lang
            })
        return json_response(
            {'error_html': error_html},
            status_code=400,
        )

    app.set_media_versions(None)
    download = DownloadBase()
    errors = build_application_zip(
        include_multimedia_files=include_multimedia,
        include_index_files=True,
        app=app,
        download_id=download.download_id,
        compress_zip=True,
        filename='{}.ccz'.format(slugify(app.name)),
    )

    if errors is not None and errors['errors']:
        return json_response(
            errors,
            status_code=400,
        )
    return DownloadBase.get(download.download_id).toHttpResponse()
Beispiel #29
0
def get_apps_base_context(request, domain, app):

    lang, langs = get_langs(request, app)

    if getattr(request, 'couch_user', None):
        timezone = get_timezone_for_user(request.couch_user, domain)
    else:
        timezone = None

    context = {
        'lang': lang,
        'langs': langs,
        'domain': domain,
        'app': app,
        'app_subset': {
            'commcare_minor_release':
            app.commcare_minor_release,
            'doc_type':
            app.get_doc_type(),
            'form_counts_by_module':
            [len(m.forms)
             for m in app.modules] if not app.is_remote_app() else [],
            'version':
            app.version,
        } if app else {},
        'timezone': timezone,
    }

    if app and not app.is_remote_app():
        app.assert_app_v2()
        show_advanced = (toggles.APP_BUILDER_ADVANCED.enabled(domain)
                         or getattr(app, 'commtrack_enabled', False))

        show_biometric = (toggles.BIOMETRIC_INTEGRATION.enabled(domain)
                          and app.is_biometric_enabled)

        disable_report_modules = (
            is_master_linked_domain(domain)
            and not toggles.MOBILE_UCR_LINKED_DOMAIN.enabled(domain))

        # ideally this should be loaded on demand
        practice_users = []
        if app.enable_practice_users:
            try:
                practice_users = get_practice_mode_mobile_workers(
                    request.domain)
            except ESError:
                notify_exception(request,
                                 'Error getting practice mode mobile workers')

        latest_version_for_build_profiles = {}
        if toggles.RELEASE_BUILDS_PER_PROFILE.enabled(domain):
            latest_version_for_build_profiles = get_latest_enabled_versions_per_profile(
                app.get_id)

        context.update({
            'show_advanced':
            show_advanced,
            'show_biometric':
            show_biometric,
            'show_report_modules':
            toggles.MOBILE_UCR.enabled(domain),
            'disable_report_modules':
            disable_report_modules,
            'show_shadow_modules':
            toggles.APP_BUILDER_SHADOW_MODULES.enabled(domain),
            'show_shadow_forms':
            show_advanced,
            'show_training_modules':
            toggles.TRAINING_MODULE.enabled(domain)
            and app.enable_training_modules,
            'practice_users': [{
                "id": u['_id'],
                "text": u["username"]
            } for u in practice_users],
            'latest_version_for_build_profiles':
            latest_version_for_build_profiles,
        })

    return context
Beispiel #30
0
def direct_ccz(request, domain):
    """
    You must specify an app_id, and you may specify either 'version' or 'latest'
    latest can be one of:
        release: Latest starred version
        build: Latest version regardless of star
        save: Latest saved version of the application (even without a build)
    If 'version' and 'latest' aren't specified it will default to latest save
    You may also set 'include_multimedia=true' if you need multimedia.
    """
    def error(msg, code=400):
        return json_response({'status': 'error', 'message': msg}, status_code=code)

    def get_app(app_id, version, latest):
        if version:
            return get_build_doc_by_version(domain, app_id, version)
        elif latest == 'build':
            return get_latest_build_doc(domain, app_id)
        elif latest == 'release':
            return get_latest_released_app_doc(domain, app_id)
        else:
            # either latest=='save' or they didn't specify
            return get_current_app(domain, app_id)

    app_id = request.GET.get('app_id', None)
    version = request.GET.get('version', None)
    latest = request.GET.get('latest', None)
    include_multimedia = request.GET.get('include_multimedia', 'false').lower() == 'true'

    # Make sure URL params make sense
    if not app_id:
        return error("You must specify `app_id` in your GET parameters")
    if version and latest:
        return error("You can't specify both 'version' and 'latest'")
    if latest not in (None, 'release', 'build', 'save',):
        return error("latest must be either 'release', 'build', or 'save'")
    if version:
        try:
            version = int(version)
        except ValueError:
            return error("'version' must be an integer")

    try:
        app = get_app(app_id, version, latest)
        if not app:
            raise ResourceNotFound()
        app = app if isinstance(app, Document) else wrap_app(app)
    except (ResourceNotFound, DocTypeError):
        return error("Application not found", code=404)

    errors = app.validate_app()
    if errors:
        lang, langs = get_langs(request, app)
        error_html = render_to_string('app_manager/v1/partials/build_errors.html', {
            'request': request,
            'app': app,
            'build_errors': errors,
            'domain': domain,
            'langs': langs,
            'lang': lang
        })
        return json_response(
            {'error_html': error_html},
            status_code=400,
        )

    app.set_media_versions(None)
    download = DownloadBase()
    errors = build_application_zip(
        include_multimedia_files=include_multimedia,
        include_index_files=True,
        app=app,
        download_id=download.download_id,
        compress_zip=True,
        filename='{}.ccz'.format(slugify(app.name)),
    )

    if errors['errors']:
        return json_response(
            errors,
            status_code=400,
        )
    return DownloadBase.get(download.download_id).toHttpResponse()