def test_get_flags_for_site(self): self.assertTrue(len(Flag.get_flags_for_site(self.site1)) == 0) name1 = "foo" Flag.objects.create(name=name1, everyone=True, site=self.site1) self.assertEqual([name1], [f.name for f in Flag.get_flags_for_site(self.site1)]) # by default sample is sites-global self.assertEqual([name1], [f.name for f in Flag.get_flags_for_site(self.site2)]) name2 = "bar" Flag.objects.create(name=name2, everyone=True, site=self.site2, all_sites_override=False) self.assertEqual({name1, name2}, set([f.name for f in Flag.get_flags_for_site(self.site2)])) self.assertEqual([name1], [f.name for f in Flag.get_flags_for_site(self.site1)])
def whoami(request): """ Return a JSON object representing the current user, either authenticated or anonymous. """ user = request.user if user.is_authenticated: data = { "username": user.username, "is_authenticated": True, "avatar_url": get_avatar_url(user), "email": user.email, "subscriber_number": user.subscriber_number, } if UserSubscription.objects.filter(user=user, canceled__isnull=True).exists(): data["is_subscriber"] = True if user.is_staff: data["is_staff"] = True if user.is_superuser: data["is_superuser"] = True if user.is_beta_tester: data["is_beta_tester"] = True else: data = {} data["waffle"] = { "flags": {}, "switches": {s.name: True for s in Switch.get_all() if s.is_active()}, } # Specifically and more smartly loop over the waffle Flag objects # to avoid unnecessary `cache.get(...)` calls within the `flag.is_active(request)`. for flag in Flag.get_all(): if not request.user.is_authenticated: # Majority of users are anonymous, so let's focus on that. # Let's see if there's a quick reason to bail the # expensive `flag.is_active(request)` call. if ( flag.authenticated or flag.staff or flag.superusers ) and not flag.everyone: continue if not (flag.languages or flag.percent or flag.everyone): continue if flag.languages: languages = [ln.strip() for ln in flag.languages.split(",")] if ( not hasattr(request, "LANGUAGE_CODE") or request.LANGUAGE_CODE not in languages ): continue if flag.is_active(request): data["waffle"]["flags"][flag.name] = True return JsonResponse(data)
def whoami(request): """ Return a JSON object representing the current user, either authenticated or anonymous. """ user = request.user if user.is_authenticated: data = { 'username': user.username, 'timezone': user.timezone, 'is_authenticated': True, 'is_staff': user.is_staff, 'is_superuser': user.is_superuser, 'is_beta_tester': user.is_beta_tester, 'gravatar_url': { 'small': gravatar_url(user.email, size=50), 'large': gravatar_url(user.email, size=200), } } else: data = { 'username': None, 'timezone': settings.TIME_ZONE, 'is_authenticated': False, 'is_staff': False, 'is_superuser': False, 'is_beta_tester': False, 'gravatar_url': { 'small': None, 'large': None, } } # Add waffle data to the dict we're going to be returning. # This is what the waffle.wafflejs() template tag does, but we're # doing it via an API instead of hardcoding the settings into # the HTML page. See also from waffle.views._generate_waffle_js. # # Note that if we upgrade django-waffle, version 15 introduces a # pluggable flag model, and the approved way to get all flag # objects will then become: # get_waffle_flag_model().get_all() # data['waffle'] = { 'flags': {f.name: f.is_active(request) for f in Flag.get_all()}, 'switches': {s.name: s.is_active() for s in Switch.get_all()}, 'samples': {s.name: s.is_active() for s in Sample.get_all()}, } return JsonResponse(data)
def save_model(self, request, obj, form, change): super(FeatureSubscriptionAdmin, self).save_model(request, obj, form, change) ''' #get waffle.flag for feature if not exist - create one iterate over organization list get all users belonging to this organization add users to waffle.flag entity users list - later - on post add / remove of user object, we need to update this list of waffle.flag # ''' flags = Flag.objects.filter(name=self.feature_name(obj))[:1] if flags: flag = flags[0] else: flag = Flag(name=self.feature_name(obj)) flag.save() flag.users.clear() user_ids = [] # reloaded_feature_subscription = FeatureSubscription.objects.get(id=obj.id) # org_ids = form.cleaned_data.get('organizations') org_ids = [ organization.org_id for organization in form.cleaned_data.get('organizations', []) ] # org_ids = [organization.org_id for organization in reloaded_feature_subscription.organizations.all()] for org_id in org_ids: user_profiles = NGOUserProfile.objects.filter(org_id=org_id) org_user_ids = [ user_profile.user_id for user_profile in user_profiles ] user_ids.extend(org_user_ids) for user_id in user_ids: flag.users.add(user_id)
def whoami(request): """ Return a JSON object representing the current user, either authenticated or anonymous. """ user = request.user if user.is_authenticated: data = { "username": user.username, "is_authenticated": True, "avatar_url": get_avatar_url(user), "email": user.email, "subscriber_number": user.subscriber_number, } if UserSubscription.objects.filter(user=user, canceled__isnull=True).exists(): data["is_subscriber"] = True if user.is_staff: data["is_staff"] = True if user.is_superuser: data["is_superuser"] = True if user.is_beta_tester: data["is_beta_tester"] = True # This is rather temporary field. Once we're off the Wiki and into Yari # this no longer makes sense to keep. data["wiki_contributions"] = user.created_revisions.count() else: data = {} # Add waffle data to the dict we're going to be returning. # This is what the waffle.wafflejs() template tag does, but we're # doing it via an API instead of hardcoding the settings into # the HTML page. See also from waffle.views._generate_waffle_js. # # Note that if we upgrade django-waffle, version 15 introduces a # pluggable flag model, and the approved way to get all flag # objects will then become: # get_waffle_flag_model().get_all() # data["waffle"] = { "flags": {f.name: True for f in Flag.get_all() if f.is_active(request)}, "switches": {s.name: True for s in Switch.get_all() if s.is_active()}, "samples": {s.name: True for s in Sample.get_all() if s.is_active()}, } return JsonResponse(data)
def whoami(request): """ Return a JSON object representing the current user, either authenticated or anonymous. """ user = request.user if user.is_authenticated: data = { "username": user.username, "timezone": user.timezone, "is_authenticated": True, "is_staff": user.is_staff, "is_superuser": user.is_superuser, "is_beta_tester": user.is_beta_tester, "avatar_url": get_avatar_url(user), "is_subscriber": UserSubscription.objects.filter( user=user, canceled__isnull=True ).exists(), } else: data = { "username": None, "timezone": settings.TIME_ZONE, "is_authenticated": False, "is_staff": False, "is_superuser": False, "is_beta_tester": False, "avatar_url": None, "is_subscriber": False, } # Add waffle data to the dict we're going to be returning. # This is what the waffle.wafflejs() template tag does, but we're # doing it via an API instead of hardcoding the settings into # the HTML page. See also from waffle.views._generate_waffle_js. # # Note that if we upgrade django-waffle, version 15 introduces a # pluggable flag model, and the approved way to get all flag # objects will then become: # get_waffle_flag_model().get_all() # data["waffle"] = { "flags": {f.name: f.is_active(request) for f in Flag.get_all()}, "switches": {s.name: s.is_active() for s in Switch.get_all()}, "samples": {s.name: s.is_active() for s in Sample.get_all()}, } return JsonResponse(data)
def _generate_waffle_js(request): flags = Flag.get_all() flag_values = [(f.name, f.is_active(request)) for f in flags] switches = Switch.get_all() switch_values = [(s.name, s.is_active()) for s in switches] samples = Sample.get_all() sample_values = [(s.name, s.is_active()) for s in samples] return loader.render_to_string('waffle/waffle.js', { 'flags': flag_values, 'switches': switch_values, 'samples': sample_values, 'flag_default': get_setting('FLAG_DEFAULT'), 'switch_default': get_setting('SWITCH_DEFAULT'), 'sample_default': get_setting('SAMPLE_DEFAULT'), })
def _give_me_waffles(*args, **kwargs): origvalue = None # Avoid circular imports from waffle.models import Flag try: flag = Flag.objects.filter(name=flagname)[0] origvalue = flag.everyone flag.everyone = flagvalue except waffle.Flag.DoesNotExist: flag = Flag(name=flagname, everyone=True) flag.save() try: return func(*args, **kwargs) except Exception: # FIXME: This breaks if saving the flag also # raises an exception, but that really shouldn't # happen in our test suite and if it does, we've # probably got other more serious issues to deal # with. if origvalue is not None: flag.everyone = origvalue flag.save() raise
def can_update_learning_achievement(learning_unit_year, person): flag = Flag.get('learning_achievement_update') return flag.is_active_for_user(person.user) and \ person.is_linked_to_entity_in_charge_of_learning_unit_year(learning_unit_year) and \ is_year_editable(learning_unit_year, raise_exception=False)
def can_edit_summary_locked_field(learning_unit_year, person): flag = Flag.get('educational_information_block_action') return flag.is_active_for_user(person.user) and \ person.is_faculty_manager and \ person.is_linked_to_entity_in_charge_of_learning_unit_year(learning_unit_year)
def can_update_learning_achievement(learning_unit_year, person): flag = Flag.get('learning_achievement_update') return flag.is_active_for_user(person.user) and \ person.is_linked_to_entity_in_charge_of_learning_unit_year(learning_unit_year)
def reverse_func(state, schema): flag = Flag(name='ember_support_page', everyone=False) flag.save()