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
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)
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)
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)
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
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 }), })
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)
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, }), })
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)
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)
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
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)
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 }), })
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)
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": "", })
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
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
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, }
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, }
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', }
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)
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, }
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
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()
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
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()