def test_session_details_view_toggles(self): toggles.all_toggles() data = json.dumps({'sessionId': self.session_key, 'domain': 'domain'}) response = Client().post(self.url, data, content_type="application/json") self.assertEqual(200, response.status_code) expected_response = self.expected_response.copy() expected_response['enabled_toggles'] = ['FORM_LINK_WORKFLOW'] expected_response['enabled_previews'] = ['CALC_XPATHS'] self.assertJSONEqual(response.content, expected_response)
def _get_toggles_to_migrate(self): from corehq.toggles import all_toggles, NAMESPACE_DOMAIN from toggle.models import Toggle from toggle.shortcuts import namespaced_item all_user_ids = self._user_ids_in_domain() toggles_to_migrate = [] domain_item = namespaced_item(self.domain, NAMESPACE_DOMAIN) for toggle in all_toggles() + all_previews(): try: current_toggle = Toggle.get(toggle.slug) except ResourceNotFound: continue enabled_for = set(current_toggle.enabled_users) new_toggle = Toggle(slug=toggle.slug, enabled_users=[]) if domain_item in enabled_for: new_toggle.enabled_users.append(domain_item) enabled_users = enabled_for & all_user_ids new_toggle.enabled_users.extend(list(enabled_users)) if new_toggle.enabled_users: toggles_to_migrate.append(new_toggle.to_json()) return toggles_to_migrate
def static_toggle(self): """ Returns the corresponding toggle definition from corehq/toggles.py """ for toggle in all_toggles(): if toggle.slug == self.toggle_slug: return toggle
def _get_mocked_toggles(self): from toggle.models import generate_toggle_id from toggle.models import Toggle from toggle.shortcuts import namespaced_item mocked_toggles = { toggle.slug: Toggle(_id=generate_toggle_id(toggle.slug), slug=toggle.slug) for toggle in random.sample(all_toggles(), 3) } toggles = mocked_toggles.values() domain_item = namespaced_item(self.domain_name, NAMESPACE_DOMAIN) toggles[0].enabled_users = [domain_item] toggles[1].enabled_users = ['user1', 'other-user', 'user2'] toggles[2].enabled_users = [ 'user1', domain_item, namespaced_item('other_domain', NAMESPACE_DOMAIN) ] expected_items = { toggles[0].slug: [domain_item], toggles[1].slug: ['user1', 'user2'], toggles[2].slug: ['user1', domain_item], } return mocked_toggles, expected_items
def page_context(self): toggles = list(all_toggles()) domain_counts = {} user_counts = {} if self.show_usage: for t in toggles: counter = Counter() try: usage = Toggle.get(t.slug) except ResourceNotFound: domain_counts[t.slug] = 0 user_counts[t.slug] = 0 else: for u in usage.enabled_users: namespace = u.split(":", 1)[0] if u.find(":") != -1 else NAMESPACE_USER counter[namespace] += 1 domain_counts[t.slug] = counter.get(NAMESPACE_DOMAIN, 0) user_counts[t.slug] = counter.get(NAMESPACE_USER, 0) return { 'domain_counts': domain_counts, 'page_url': self.page_url, 'show_usage': self.show_usage, 'toggles': toggles, 'tags': ALL_TAGS, 'user_counts': user_counts, }
def get_toggle(self): if not self.toggle_slug in [t.slug for t in all_toggles()]: raise Http404() try: return Toggle.get(self.toggle_slug) except ResourceNotFound: return Toggle(slug=self.toggle_slug)
def _get_toggles(self): def _sort_key(toggle): return (not (toggle['domain_enabled'] or toggle['user_enabled']), toggle['tag_index'], toggle['label']) unsorted_toggles = [{ 'slug': toggle.slug, 'label': toggle.label, 'description': toggle.description, 'help_link': toggle.help_link, 'tag': toggle.tag.name, 'tag_index': toggle.tag.index, 'tag_description': toggle.tag.description, 'tag_css_class': toggle.tag.css_class, 'has_domain_namespace': toggles.NAMESPACE_DOMAIN in toggle.namespaces, 'domain_enabled': toggle.enabled(self.domain, namespace=toggles.NAMESPACE_DOMAIN), 'user_enabled': toggle.enabled(self.request.couch_user.username, namespace=toggles.NAMESPACE_USER), } for toggle in toggles.all_toggles()] return sorted(unsorted_toggles, key=_sort_key)
def set_toggle(slug, item, enabled, namespace=None): """ Sets a toggle value explicitly. Should only save anything if the value needed to be changed. """ if toggle_enabled(slug, item, namespace=namespace) != enabled: ns_item = namespaced_item(item, namespace) try: toggle_doc = Toggle.get(slug) except ResourceNotFound: toggle_doc = Toggle(slug=slug, enabled_users=[]) if enabled: toggle_doc.add(ns_item) else: toggle_doc.remove(ns_item) from corehq.feature_previews import all_previews from corehq.toggles import all_toggles, NAMESPACE_DOMAIN static_toggles_by_slug = { t.slug: t for t in all_toggles() + all_previews() } if namespace == NAMESPACE_DOMAIN and slug in static_toggles_by_slug: static_toggle = static_toggles_by_slug[slug] if static_toggle.save_fn: static_toggle.save_fn(item, enabled) update_toggle_cache(slug, item, enabled, namespace)
def _get_toggles_to_migrate(domain): from corehq.toggles import all_toggles, NAMESPACE_DOMAIN from toggle.models import Toggle from toggle.shortcuts import namespaced_item domain_item = namespaced_item(domain, NAMESPACE_DOMAIN) usernames = set(get_all_usernames_by_domain(domain)) for toggle in all_toggles() + all_previews(): try: current_toggle = Toggle.get(toggle.slug) except ResourceNotFound: continue enabled_for = set(current_toggle.enabled_users) new_toggle = Toggle(slug=toggle.slug, enabled_users=[]) if domain_item in enabled_for: new_toggle.enabled_users.append(domain_item) enabled_users = enabled_for & usernames new_toggle.enabled_users.extend(list(enabled_users)) if new_toggle.enabled_users: yield new_toggle.to_json()
def handle(self, *args, **options): toggle_map = dict([(t.slug, t) for t in all_toggles()]) domains = [row['key'] for row in Domain.get_all(include_docs=False)] for domain in domains: if toggle_map['rich_text'].enabled(domain) or toggle_map['experimental_ui'].enabled(domain): #logger.info('migrating domain {}'.format(domain)) apps = get_apps_in_domain(domain, include_remote=False) for app in apps: app_dirty = False builder = ParentCasePropertyBuilder(app) relationships = builder.get_parent_type_map(app.get_case_types(), allow_multiple_parents=True) for module in app.modules: for form in module.forms: if form.doc_type == 'Form' and form.requires_case(): #logger.info('migrating form {}'.format(form.name.get('en', form.name))) base_case_type = form.get_module().case_type self._replace_in_form(form, relationships, base_case_type, 0) prefixes = re.findall(r'#case/\w+/', form.source) prefixes = set(prefixes) for p in prefixes: if p != "#case/parent/" and p != "#case/grandparent/": self._form_error(form, "Unknown prefix remaining: {}".format(p)) if options['save']: try: save_xform(form.get_app(), form, form.source) app_dirty = True except: self._form_error(form, "Form xml invalid") if app_dirty: app.save() logger.info('done with cmitfb_migrate_syntax')
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)
def enabled_flags(self): def _sort_key(toggle_enabled_tuple): return (not toggle_enabled_tuple[1], not toggle_enabled_tuple[2], toggle_enabled_tuple[0].label) unsorted_toggles = [( toggle, toggle.enabled(self.domain, namespace=NAMESPACE_DOMAIN), toggle.enabled(self.request.couch_user.username, namespace=NAMESPACE_USER) ) for toggle in all_toggles()] return sorted(unsorted_toggles, key=_sort_key)
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)
def enabled_flags(self): def _sort_key(toggle_enabled_tuple): return (not toggle_enabled_tuple[1], not toggle_enabled_tuple[2], toggle_enabled_tuple[0].label) unsorted_toggles = [(toggle, toggle.enabled(self.domain, namespace=NAMESPACE_DOMAIN), toggle.enabled(self.request.couch_user.username, namespace=NAMESPACE_USER)) for toggle in all_toggles()] return sorted(unsorted_toggles, key=_sort_key)
def test_toggle_properties(): """ Check toggle properties """ for toggle in toggles.all_toggles(): assert toggle.slug assert toggle.label, 'Toggle "{}" label missing'.format(toggle.slug) assert toggle.tag, 'Toggle "{}" tag missing'.format(toggle.slug) assert toggle.tag in ALL_TAGS, 'Toggle "{}" tag "{}" unrecognized'.format( toggle.slug, toggle.tag) assert toggle.namespaces, 'Toggle "{}" namespaces missing'.format( toggle.slug)
def handle(self, *args, **options): toggle_map = dict([(t.slug, t) for t in all_toggles()]) domains = [row['key'] for row in Domain.get_all(include_docs=False)] for domain in domains: if toggle_map['rich_text'].enabled(domain) or toggle_map['experimental_ui'].enabled(domain): logger.info('migrating domain {}'.format(domain)) apps = get_apps_in_domain(domain, include_remote=False) for app in apps: call_command('migrate_app_to_cmitfb', app.id) toggle_map['rich_text'].set(domain, False, NAMESPACE_DOMAIN) toggle_map['experimental_ui'].set(domain, False, NAMESPACE_DOMAIN) logger.info('done with cmitfb_toggle_to_flag')
def handle(self, *args, **options): toggle_map = dict([(t.slug, t) for t in all_toggles()]) domains = [row['key'] for row in Domain.get_all(include_docs=False)] for domain in domains: if toggle_map['rich_text'].enabled( domain) or toggle_map['experimental_ui'].enabled(domain): logger.info('migrating domain {}'.format(domain)) apps = get_apps_in_domain(domain, include_remote=False) for app in apps: call_command('migrate_app_to_cmitfb', app.id) toggle_map['rich_text'].set(domain, False, NAMESPACE_DOMAIN) toggle_map['experimental_ui'].set(domain, False, NAMESPACE_DOMAIN) logger.info('done with cmitfb_toggle_to_flag')
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)
def set_flags(self): from corehq.toggles import all_toggles, NAMESPACE_DOMAIN from corehq.feature_previews import all_previews for toggle in all_toggles(): if toggle.enabled(self.existing_domain, NAMESPACE_DOMAIN): self.stdout.write('Setting flag: {}'.format(toggle.slug)) if not self.no_commit: toggle.set(self.new_domain, True, NAMESPACE_DOMAIN) for preview in all_previews(): if preview.enabled(self.existing_domain): self.stdout.write('Setting preview: {}'.format(preview.slug)) if not self.no_commit: preview.set(self.new_domain, True, NAMESPACE_DOMAIN) if preview.save_fn is not None: preview.save_fn(self.new_domain, True)
def set_flags(self): from corehq.toggles import all_toggles, NAMESPACE_DOMAIN from corehq.feature_previews import all_previews from corehq.apps.hqwebapp.templatetags.hq_shared_tags import toggle_js_domain_cachebuster for toggle in all_toggles(): if toggle.enabled(self.existing_domain): self.stdout.write("Setting flag: {}".format(toggle.slug)) if not self.no_commmit: toggle.set(self.new_domain, True, NAMESPACE_DOMAIN) for preview in all_previews(): if preview.enabled(self.existing_domain): self.stdout.write("Setting preview: {}".format(preview.slug)) if not self.no_commmit: preview.set(self.new_domain, True, NAMESPACE_DOMAIN) if preview.save_fn is not None: preview.save_fn(self.new_domain, True) toggle_js_domain_cachebuster.clear(self.new_domain)
def set_flags(self): from corehq.toggles import all_toggles, NAMESPACE_DOMAIN from corehq.feature_previews import all_previews from corehq.apps.hqwebapp.templatetags.hq_shared_tags import toggle_js_domain_cachebuster for toggle in all_toggles(): if toggle.enabled(self.existing_domain): self.stdout.write('Setting flag: {}'.format(toggle.slug)) if not self.no_commmit: toggle.set(self.new_domain, True, NAMESPACE_DOMAIN) for preview in all_previews(): if preview.enabled(self.existing_domain): self.stdout.write('Setting preview: {}'.format(preview.slug)) if not self.no_commmit: preview.set(self.new_domain, True, NAMESPACE_DOMAIN) if preview.save_fn is not None: preview.save_fn(self.new_domain, True) toggle_js_domain_cachebuster.clear(self.new_domain)
def handle(self, *args, **options): toggle_map = dict([(t.slug, t) for t in all_toggles()]) domains = [row['key'] for row in Domain.get_all(include_docs=False)] for domain in domains: if toggle_map['rich_text'].enabled( domain) or toggle_map['experimental_ui'].enabled(domain): #logger.info('migrating domain {}'.format(domain)) apps = get_apps_in_domain(domain, include_remote=False) for app in apps: app_dirty = False builder = ParentCasePropertyBuilder(app) relationships = builder.get_parent_type_map( app.get_case_types(), allow_multiple_parents=True) for module in app.modules: for form in module.forms: if form.doc_type == 'Form' and form.requires_case( ): #logger.info('migrating form {}'.format(form.name.get('en', form.name))) base_case_type = form.get_module().case_type self._replace_in_form(form, relationships, base_case_type, 0) prefixes = re.findall(r'#case/\w+/', form.source) prefixes = set(prefixes) for p in prefixes: if p != "#case/parent/" and p != "#case/grandparent/": self._form_error( form, "Unknown prefix remaining: {}". format(p)) if options['save']: try: save_xform(form.get_app(), form, form.source) app_dirty = True except: self._form_error( form, "Form xml invalid") if app_dirty: app.save() logger.info('done with cmitfb_migrate_syntax')
def set_toggle(slug, item, enabled, namespace=None): """ Sets a toggle value explicitly. Should only save anything if the value needed to be changed. """ if toggle_enabled(slug, item, namespace=namespace) != enabled: ns_item = namespaced_item(item, namespace) try: toggle_doc = Toggle.get(slug) except ResourceNotFound: toggle_doc = Toggle(slug=slug, enabled_users=[]) if enabled: toggle_doc.add(ns_item) else: toggle_doc.remove(ns_item) from corehq.feature_previews import all_previews from corehq.toggles import all_toggles, NAMESPACE_DOMAIN static_toggles_by_slug = {t.slug: t for t in all_toggles() + all_previews()} if namespace == NAMESPACE_DOMAIN and slug in static_toggles_by_slug: static_toggle = static_toggles_by_slug[slug] if static_toggle.save_fn: static_toggle.save_fn(item, enabled)
def _get_mocked_toggles(self): from toggle.models import generate_toggle_id from toggle.models import Toggle from toggle.shortcuts import namespaced_item mocked_toggles = { toggle.slug: Toggle(_id=generate_toggle_id(toggle.slug), slug=toggle.slug) for toggle in random.sample(all_toggles(), 3) } toggles = mocked_toggles.values() domain_item = namespaced_item(self.domain_name, NAMESPACE_DOMAIN) toggles[0].enabled_users = [domain_item] toggles[1].enabled_users = ['user1', 'other-user', 'user2'] toggles[2].enabled_users = ['user1', domain_item, namespaced_item('other_domain', NAMESPACE_DOMAIN)] expected_items = { toggles[0].slug: [domain_item], toggles[1].slug: ['user1', 'user2'], toggles[2].slug: ['user1', domain_item], } return mocked_toggles, expected_items
def _get_toggles(self): def _sort_key(toggle): return (not (toggle['domain_enabled'] or toggle['user_enabled']), [t.name for t in toggles.ALL_TAGS].index(toggle['tag']), toggle['label']) unsorted_toggles = [{ 'slug': toggle.slug, 'label': toggle.label, 'description': toggle.description, 'help_link': toggle.help_link, 'tag': toggle.tag.name, 'tag_description': toggle.tag.description, 'tag_css_class': toggle.tag.css_class, 'has_domain_namespace': toggles.NAMESPACE_DOMAIN in toggle.namespaces, 'domain_enabled': toggle.enabled(self.domain, namespace=toggles.NAMESPACE_DOMAIN), 'user_enabled': toggle.enabled(self.request.couch_user.username, namespace=toggles.NAMESPACE_USER), } for toggle in toggles.all_toggles()] return sorted(unsorted_toggles, key=_sort_key)
def page_context(self): toggles = list(all_toggles()) domain_counts = {} active_domain_count = {} user_counts = {} last_used = {} last_modified = {} if self.show_usage: for t in toggles: counter = Counter() try: usage = Toggle.get(t.slug) except ResourceNotFound: domain_counts[t.slug] = 0 user_counts[t.slug] = 0 active_domain_count[t.slug] = 0 else: for u in usage.enabled_users: namespace = u.split( ":", 1)[0] if u.find(":") != -1 else NAMESPACE_USER counter[namespace] += 1 usage_info = _get_usage_info(usage) domain_counts[t.slug] = counter.get(NAMESPACE_DOMAIN, 0) active_domain_count[t.slug] = usage_info["_active_domains"] user_counts[t.slug] = counter.get(NAMESPACE_USER, 0) last_used[t.slug] = usage_info["_latest"] last_modified[t.slug] = usage.last_modified return { 'domain_counts': domain_counts, 'active_domain_count': active_domain_count, 'page_url': self.page_url, 'show_usage': self.show_usage, 'toggles': toggles, 'tags': ALL_TAGS, 'user_counts': user_counts, 'last_used': last_used, 'last_modified': last_modified, }
def page_context(self): toggles = list(all_toggles()) domain_counts = {} active_domain_count = {} user_counts = {} last_used = {} last_modified = {} if self.show_usage: for t in toggles: counter = Counter() try: usage = Toggle.get(t.slug) except ResourceNotFound: domain_counts[t.slug] = 0 user_counts[t.slug] = 0 active_domain_count[t.slug] = 0 else: for u in usage.enabled_users: namespace = u.split(":", 1)[0] if u.find(":") != -1 else NAMESPACE_USER counter[namespace] += 1 usage_info = _get_usage_info(usage) domain_counts[t.slug] = counter.get(NAMESPACE_DOMAIN, 0) active_domain_count[t.slug] = usage_info["_active_domains"] user_counts[t.slug] = counter.get(NAMESPACE_USER, 0) last_used[t.slug] = usage_info["_latest"] last_modified[t.slug] = usage.last_modified return { 'domain_counts': domain_counts, 'active_domain_count': active_domain_count, 'page_url': self.page_url, 'show_usage': self.show_usage, 'toggles': toggles, 'tags': ALL_TAGS, 'user_counts': user_counts, 'last_used': last_used, 'last_modified': last_modified, }
def find_static_toggle(slug): for toggle in all_toggles(): if toggle.slug == slug: return toggle
def page_context(self): return { 'toggles': all_toggles(), 'tags': ALL_TAGS }
def toggle_map(self): return dict([(t.slug, t) for t in all_toggles()])
def _find_static_toggle(slug): for toggle in all_toggles(): if toggle.slug == slug: return toggle
def _get_toggles_with_tag(tag=None): toggles = [] for toggle in all_toggles(): if not tag or tag in toggle.tag.name: toggles.append(toggle) return toggles
def page_context(self): return { 'toggles': all_toggles(), }
def show_toggles(self): counts = Counter(t.tag.name for t in all_toggles() + all_previews()) for tag, count in counts.items(): self.logger.log("commcare.static_analysis.toggle_count", count, [f"toggle_tag:{tag}"])
def page_context(self): return {'toggles': all_toggles(), 'tags': ALL_TAGS}