Skip to content

Commit 5c715be

Browse files
acraftydevclintonb
authored andcommitted
Added --users option to waffle_flag management command
Administrators may pass the `--users` option to activate a flag for a set of users, identified by their usernames and/or email addresses.
1 parent 06f98e2 commit 5c715be

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-2
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ dist
66
*test.db
77
.coverage
88
.idea/
9+
*.iml
910
.project
1011
.pydevproject
1112
.settings

waffle/management/commands/waffle_flag.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
from __future__ import print_function
22

3+
from django.contrib.auth import get_user_model
34
from django.contrib.auth.models import Group
45
from django.core.management.base import BaseCommand, CommandError
6+
from django.db.models import Q
57

68
from waffle import get_waffle_flag_model
79

10+
UserModel = get_user_model()
11+
812

913
class Command(BaseCommand):
1014
def add_arguments(self, parser):
@@ -60,6 +64,13 @@ def add_arguments(self, parser):
6064
help='Turn on the flag for listed group names (use flag more '
6165
'than once for multiple groups). WARNING: This will remove '
6266
'any currently associated groups unless --append is used!')
67+
parser.add_argument(
68+
'--user', '-u',
69+
action='append',
70+
default=list(),
71+
help='Turn on the flag for listed usernames (use flag more '
72+
'than once for multiple users). WARNING: This will remove '
73+
'any currently associated users unless --append is used!')
6374
parser.add_argument(
6475
'--append',
6576
action='store_true',
@@ -97,6 +108,9 @@ def handle(self, *args, **options):
97108
self.stdout.write('GROUPS: %s' % list(
98109
flag.groups.values_list('name', flat=True))
99110
)
111+
self.stdout.write('USERS: %s' % list(
112+
flag.users.values_list(UserModel.USERNAME_FIELD, flat=True))
113+
)
100114
self.stdout.write('')
101115
return
102116

@@ -137,6 +151,23 @@ def handle(self, *args, **options):
137151
)
138152
for group_name, group_id in group_hash.items():
139153
flag.groups.add(group_id)
154+
elif option == 'user':
155+
user_hash = set()
156+
for username in options['user']:
157+
try:
158+
user_instance = UserModel.objects.get(
159+
Q(**{UserModel.USERNAME_FIELD: username}) |
160+
Q(**{UserModel.EMAIL_FIELD: username})
161+
)
162+
user_hash.add(user_instance)
163+
except UserModel.DoesNotExist:
164+
raise CommandError('User %s does not exist' % username)
165+
# If 'append' was not passed, we clear related users
166+
if not options['append']:
167+
flag.users.clear()
168+
self.stdout.write('Setting user(s): %s' % user_hash)
169+
# for user in user_hash:
170+
flag.users.add(*[user.id for user in user_hash])
140171
elif hasattr(flag, option):
141172
self.stdout.write('Setting %s: %s' % (option, options[option]))
142173
setattr(flag, option, options[option])

waffle/tests/test_management.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import six
44
from django.core.management import call_command, CommandError
5-
from django.contrib.auth.models import Group
5+
from django.contrib.auth.models import Group, User
66

77
from waffle import get_waffle_flag_model
88
from waffle.models import Sample, Switch
@@ -120,7 +120,7 @@ def test_list(self):
120120
call_command('waffle_flag', list_flags=True, stdout=stdout)
121121
expected = 'Flags:\nNAME: test\nSUPERUSERS: True\nEVERYONE: None\n' \
122122
'AUTHENTICATED: False\nPERCENT: None\nTESTING: False\n' \
123-
'ROLLOUT: False\nSTAFF: False\nGROUPS: []'
123+
'ROLLOUT: False\nSTAFF: False\nGROUPS: []\nUSERS: []'
124124
actual = stdout.getvalue().strip()
125125
self.assertEqual(actual, expected)
126126

@@ -143,6 +143,52 @@ def test_group_append(self):
143143
['waffle_group', 'append_group'])
144144
self.assertIsNone(flag.everyone)
145145

146+
def test_user(self):
147+
""" The command should replace a user to a flag."""
148+
original_user = User.objects.create_user('waffle_test')
149+
User.objects.create_user('add_user')
150+
flag = get_waffle_flag_model().objects.create(name='test')
151+
flag.users.add(original_user)
152+
flag.refresh_from_db()
153+
154+
self.assertEqual(list(flag.users.values_list('username', flat=True)),
155+
['waffle_test'])
156+
157+
call_command('waffle_flag', 'test', user=['add_user'])
158+
159+
flag.refresh_from_db()
160+
self.assertEqual(list(flag.users.values_list('username', flat=True)),
161+
['add_user'])
162+
self.assertIsNone(flag.everyone)
163+
164+
def test_user_append(self):
165+
""" The command should append a user to a flag."""
166+
original_user = User.objects.create_user('waffle_test')
167+
User.objects.create_user('append_user')
168+
User.objects.create_user('append_user_email', email='[email protected]')
169+
flag = get_waffle_flag_model().objects.create(name='test')
170+
flag.users.add(original_user)
171+
flag.refresh_from_db()
172+
173+
self.assertEqual(list(flag.users.values_list('username', flat=True)),
174+
['waffle_test'])
175+
176+
call_command('waffle_flag', 'test', user=['append_user'],
177+
append=True)
178+
179+
flag.refresh_from_db()
180+
self.assertEqual(list(flag.users.values_list('username', flat=True)),
181+
['waffle_test', 'append_user'])
182+
self.assertIsNone(flag.everyone)
183+
184+
call_command('waffle_flag', 'test', user=['[email protected]'],
185+
append=True)
186+
187+
flag.refresh_from_db()
188+
self.assertEqual(list(flag.users.values_list('username', flat=True)),
189+
['waffle_test', 'append_user', 'append_user_email'])
190+
self.assertIsNone(flag.everyone)
191+
146192

147193
class WaffleSampleManagementCommandTests(TestCase):
148194
def test_create(self):

0 commit comments

Comments
 (0)