def edit_app_attr(request, domain, app_id, attr): """ Called to edit any (supported) app attribute, given by attr """ app = get_app(domain, app_id) lang = request.COOKIES.get('lang', (app.langs or ['en'])[0]) try: hq_settings = json.loads(request.body)['hq'] except ValueError: hq_settings = request.POST attributes = [ 'all', 'recipients', 'name', 'use_commcare_sense', 'text_input', 'platform', 'build_spec', 'show_user_registration', 'use_custom_suite', 'custom_suite', 'admin_password', # Application only 'cloudcare_enabled', 'application_version', 'case_sharing', 'translation_strategy', 'auto_gps_capture', # RemoteApp only 'profile_url', 'manage_urls' ] if attr not in attributes: return HttpResponseBadRequest() def should_edit(attribute): return attribute == attr or ('all' == attr and attribute in hq_settings) resp = {"update": {}} # For either type of app easy_attrs = ( ('application_version', None), ('build_spec', BuildSpec.from_string), ('case_sharing', None), ('cloudcare_enabled', None), ('commtrack_requisition_mode', lambda m: None if m == 'disabled' else m), ('manage_urls', None), ('name', None), ('platform', None), ('recipients', None), ('text_input', None), ('use_custom_suite', None), ('secure_submissions', None), ('translation_strategy', None), ('auto_gps_capture', None), ('amplifies_workers', None), ('amplifies_project', None), ('use_grid_menus', None), ) for attribute, transformation in easy_attrs: if should_edit(attribute): value = hq_settings[attribute] if transformation: value = transformation(value) setattr(app, attribute, value) if should_edit("name"): clear_app_cache(request, domain) name = hq_settings['name'] resp['update'].update({ '.variable-app_name': name, '[data-id="{id}"]'.format(id=app_id): ApplicationsTab.make_app_title(name, app.doc_type), }) if should_edit("build_spec"): resp['update']['commcare-version'] = app.commcare_minor_release if should_edit("admin_password"): admin_password = hq_settings.get('admin_password') if admin_password: app.set_admin_password(admin_password) # For Normal Apps if should_edit("cloudcare_enabled"): if app.get_doc_type() not in ("Application",): raise Exception("App type %s does not support cloudcare" % app.get_doc_type()) if not has_privilege(request, privileges.CLOUDCARE): app.cloudcare_enabled = False if should_edit('show_user_registration'): show_user_registration = hq_settings['show_user_registration'] app.show_user_registration = show_user_registration if show_user_registration: # load the form source and also set its unique_id app.get_user_registration() def require_remote_app(): if app.get_doc_type() not in ("RemoteApp",): raise Exception("App type %s does not support profile url" % app.get_doc_type()) # For RemoteApps if should_edit("profile_url"): require_remote_app() app['profile_url'] = hq_settings['profile_url'] if should_edit("manage_urls"): require_remote_app() app.save(resp) # this is a put_attachment, so it has to go after everything is saved if should_edit("custom_suite"): app.set_custom_suite(hq_settings['custom_suite']) return HttpResponse(json.dumps(resp))