def get_toggle(self): if not self.static_toggle: raise Http404() try: return Toggle.get(self.toggle_slug) except ResourceNotFound: return Toggle(slug=self.toggle_slug)
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 test_load_toggles(self): from toggle.models import Toggle mocked_toggles, expected_items = self._get_mocked_toggles() dumped_data = [ json.dumps(Toggle(slug=slug, enabled_users=items).to_json()) for slug, items in expected_items.items() ] existing_toggle_docs = [] for toggle in mocked_toggles.values(): doc_dict = toggle.to_json() expected = expected_items[toggle.slug] # leave only items that aren't in the dump doc_dict['enabled_users'] = [ item for item in doc_dict['enabled_users'] if item not in expected ] existing_toggle_docs.append(doc_dict) with mock_out_couch(docs=existing_toggle_docs): ToggleLoader().load_objects(dumped_data) for mocked_toggle in mocked_toggles.values(): loaded_toggle = Toggle.get(mocked_toggle.slug) self.assertItemsEqual(mocked_toggle.enabled_users, loaded_toggle.enabled_users)
def get_toggle(self): if not self.toggle_slug in [t.slug for t in self.all_toggles()]: raise Http404() try: return Toggle.get(self.toggle_slug) except ResourceNotFound: return Toggle(slug=self.toggle_slug)
def get_toggle(self, slug): if slug not in [f.slug for f, _ in self.features()]: raise Http404() try: return Toggle.get(slug) except ResourceNotFound: return Toggle(slug=slug)
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 _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 setUpClass(cls): super(TestFormsExpressionSpecWithFilterEsVersion, cls).setUpClass() # enable toggle to 100% db_toggle = Toggle(slug=ICDS_UCR_ELASTICSEARCH_DOC_LOADING.slug) setattr(db_toggle, DynamicallyPredictablyRandomToggle.RANDOMNESS_KEY, 1) db_toggle.save() assert ICDS_UCR_ELASTICSEARCH_DOC_LOADING.enabled(uuid.uuid4().hex, NAMESPACE_OTHER)
def handle(self, *args, **options): dry_run = options.get('dry_run', False) if dry_run: print("\n-------- DRY RUN --------\n") slug = CALLCENTER.slug try: toggle = Toggle.get(slug) except ResourceNotFound: toggle = Toggle(slug=slug) print("Current domains in toggle: {}".format(toggle.enabled_users)) domains = get_call_center_domains() print("Active call center domains: {}".format(domains)) items = [ namespaced_item(domain, NAMESPACE_DOMAIN) for domain in domains ] missing = set(items) - set(toggle.enabled_users) print("Domains missing from toggle: {}".format(missing)) toggle.enabled_users = items if not dry_run: toggle.save() for item in items: update_toggle_cache(slug, item, True)
def test_move_nonexistent_source(self): dsa = uuid.uuid4().hex try: Toggle(slug=dsa, enabled_users=['kieran']).save() move_toggles('missing-src', dsa) self.assertEqual(['kieran'], Toggle.get(dsa).enabled_users) finally: MigrationHelperTest._delete_toggles(dsa)
def test_move(self): moz, dsa = [uuid.uuid4().hex for i in range(2)] try: moz_users = ['marco', 'lauren', 'claire'] dsa_users = ['kieran', 'jolani', 'claire'] Toggle(slug=moz, enabled_users=moz_users).save() Toggle(slug=dsa, enabled_users=dsa_users).save() move_toggles(moz, dsa) # ensure original is delted with self.assertRaises(ResourceNotFound): Toggle.get(moz) dsa_toggle = Toggle.get(dsa) expected_users = set(moz_users) | set(dsa_users) self.assertEqual(len(expected_users), len(dsa_toggle.enabled_users)) self.assertEqual(expected_users, set(dsa_toggle.enabled_users)) finally: MigrationHelperTest._delete_toggles(moz, dsa)
def test_move_nonexistent_destination(self): moz, dsa = [uuid.uuid4().hex for i in range(2)] try: Toggle(slug=moz, enabled_users=['claire']).save() move_toggles(moz, dsa) dsa_toggle = Toggle.get(dsa) self.assertEqual(['claire'], dsa_toggle.enabled_users) with self.assertRaises(ResourceNotFound): Toggle.get(moz) finally: MigrationHelperTest._delete_toggles(moz, dsa)
def _migrate_linked_apps_toggle(apps, schema_editor): try: linked_apps_toggle = Toggle.get('linked_apps') except ResourceNotFound: pass else: try: Toggle.get(LINKED_DOMAINS.slug) except ResourceNotFound: linked_domains_toggle = Toggle( slug=LINKED_DOMAINS.slug, enabled_users=linked_apps_toggle.enabled_users) linked_domains_toggle.save()
def enable_vellum_beta(request): slug = "vellum_beta" try: toggle = Toggle.get(slug) except ResourceNotFound: toggle = Toggle(slug=slug) changed_entries = [] if request.user.username not in toggle.enabled_users: changed_entries.append(request.user.username) toggle.enabled_users.append(request.user.username) toggle.save() _call_save_fn_and_clear_cache(slug, changed_entries, toggle.enabled_users, _find_static_toggle(slug)) return HttpResponse(json.dumps({'success': True}), content_type="application/json")
def toggle_app_manager_v2(request): slug = "app_manager_v2" on_or_off = request.POST.get('on_or_off', 'on') try: toggle = Toggle.get(slug) except ResourceNotFound: toggle = Toggle(slug=slug) enable = on_or_off == "on" enabled = request.user.username in toggle.enabled_users if enable != enabled: changed_entries = [request.user.username] if enable: toggle.enabled_users.append(request.user.username) else: toggle.enabled_users.remove(request.user.username) toggle.save() _call_save_fn_and_clear_cache(slug, changed_entries, toggle.enabled_users, _find_static_toggle(slug)) return HttpResponse(json.dumps({'success': True}), content_type="application/json")
def move_toggles(from_toggle_id, to_toggle_id): """ Moves all enabled items from one toggle to another. """ try: from_toggle = Toggle.get(from_toggle_id) except ResourceNotFound: # if no source found this is a noop return try: to_toggle = Toggle.get(to_toggle_id) except ResourceNotFound: to_toggle = Toggle(slug=to_toggle_id, enabled_users=[]) for item in from_toggle.enabled_users: if item not in to_toggle.enabled_users: to_toggle.enabled_users.append(item) update_toggle_cache(to_toggle_id, item, True) to_toggle.save() from_toggle.delete()