Skip to content

Commit 900f42c

Browse files
committed
Fix for Prefix management and groups
Changes to be committed: modified: api/models.py add group creation to listener for prefix creation modified: api/permissions.py linting modified: api/scripts/method_specific/POST_api_groups_create.py fix 'rq' variable modified: api/scripts/method_specific/POST_api_groups_delete.py fix 'rq' variable modified: api/scripts/method_specific/POST_api_groups_modify.py fix 'rq' variable add function to save edits to groups modified: api/scripts/method_specific/POST_api_objects_drafts_create.py linting modified: api/scripts/method_specific/POST_api_prefixes_create.py linting modified: api/scripts/utilities/UserUtils.py linting modified: api/signals.py linting
1 parent 4a3f80b commit 900f42c

File tree

9 files changed

+112
-191
lines changed

9 files changed

+112
-191
lines changed

bco_api/api/models.py

Lines changed: 75 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -240,81 +240,74 @@ def associate_user_group(
240240
User.objects.get(username=instance).groups.add(Group.objects.get(name='bco_drafter'))
241241
User.objects.get(username=instance).groups.add(Group.objects.get(name='bco_publisher'))
242242

243-
# Link user creation to token generation.
244-
# Source: https://www.django-rest-framework.org/api-guide/authentication/#generating-tokens
245-
@receiver(
246-
post_save,
247-
sender=User
248-
)
249-
def create_auth_token(
250-
sender,
251-
instance=None,
252-
created=False,
253-
**kwargs
254-
):
255-
if created:
256243

244+
@receiver(post_save, sender=User)
245+
def create_auth_token(sender, instance=None, created=False, **kwargs):
246+
"""Link user creation to token generation.
247+
Source: https://www.django-rest-framework.org/api-guide/authentication/#generating-tokens
248+
"""
249+
if created:
257250
# The anonymous user's token is hard-coded
258251
# in server.conf.
259252
if instance.username == 'anon':
260-
261253
# Create anon's record with the hard-coded key.
262-
Token.objects.create(
263-
user=instance,
264-
key=settings.ANON_KEY
265-
)
266-
254+
Token.objects.create(user=instance, key=settings.ANON_KEY)
267255
else:
268-
269256
# Create a normal user's record.
270-
Token.objects.create(
271-
user=instance
272-
)
257+
Token.objects.create(user=instance)
273258

274259

275260
# --- Group --- #
276-
277-
278-
# Link group deletion to permissions deletion.
279-
280-
# pre_delete and NOT post_delete because we need
281-
# to get the Group's information before deleting it.
282-
@receiver(
283-
pre_delete,
284-
sender=Group
285-
)
286-
def delete_group_perms(
287-
sender,
288-
instance=None,
289-
**kwargs
290-
):
261+
@receiver(pre_delete, sender=Group)
262+
def delete_group_perms(sender, instance=None, **kwargs):
263+
"""
264+
Link group deletion to permissions deletion.
265+
pre_delete and NOT post_delete because we need
266+
to get the Group's information before deleting it.
267+
"""
291268
for perm in ['add_members_' + instance.name, 'delete_members_' + instance.name]:
292-
Permission.objects.filter(
293-
codename=perm
294-
).delete()
269+
Permission.objects.filter(codename=perm).delete()
295270

296271

297272
# --- Prefix --- #
273+
@receiver(post_save, sender=prefixes)
274+
def create_permissions_for_prefix(sender, instance=None, created=False, **kwargs):
275+
"""Link prefix creation to permissions creation.
276+
Check to see whether or not the permissions
277+
have already been created for this prefix.
278+
Create the macro-level, draft, and publish permissions.
279+
Give FULL permissions to the prefix user owner
280+
and their group.
298281
282+
No try/except necessary here as the user's existence
283+
has already been verified upstream.
284+
285+
Source: https://stackoverflow.com/a/20361273
286+
"""
299287

300-
# Link prefix creation to permissions creation.
301-
@receiver(
302-
post_save,
303-
sender=prefixes
304-
)
305-
def create_permissions_for_prefix(
306-
sender,
307-
instance=None,
308-
created=False,
309-
**kwargs
310-
):
311288
if created:
289+
user = User.objects.get(username=instance.owner_user)
290+
user_group = Group.objects.get(name=instance.owner_user)
291+
draft = instance.prefix.lower() + '_drafters'
292+
publish = instance.prefix.lower() + '_publishers'
293+
294+
if len(Group.objects.filter(name=draft)) != 0:
295+
drafters = Group.objects.get(name=draft)
296+
user.groups.add(drafters)
297+
else:
298+
Group.objects.create(name=draft)
299+
drafters = Group.objects.get(name=draft)
300+
user.groups.add(drafters)
312301

313-
# Check to see whether or not the permissions
314-
# have already been created for this prefix.
315-
try:
302+
if len(Group.objects.filter(name=publish)) != 0:
303+
publishers = Group.objects.get(name=publish)
304+
user.groups.add(publishers)
305+
else:
306+
Group.objects.create(name=publish)
307+
publishers = Group.objects.get(name=publish)
308+
user.groups.add(publishers)
316309

317-
# Create the macro-level, draft, and publish permissions.
310+
try:
318311
for perm in ['add', 'change', 'delete', 'view', 'draft', 'publish']:
319312
Permission.objects.create(
320313
name='Can ' + perm + ' BCOs with prefix ' + instance.prefix,
@@ -324,102 +317,56 @@ def create_permissions_for_prefix(
324317
),
325318
codename=perm + '_' + instance.prefix
326319
)
327-
328-
# Give FULL permissions to the prefix user owner
329-
# and their group.
330-
331-
# No try/except necessary here as the user's existence
332-
# has already been verified upstream.
333-
334-
# Source: https://stackoverflow.com/a/20361273
335-
336-
User.objects.get(
337-
username=instance.owner_user
338-
).user_permissions.add(
339-
Permission.objects.get(
340-
codename=perm + '_' + instance.prefix
341-
)
342-
)
343-
344-
Group.objects.get(
345-
name=instance.owner_user
346-
).permissions.add(
347-
Permission.objects.get(
348-
codename=perm + '_' + instance.prefix
349-
)
350-
)
351-
320+
new_perm = Permission.objects.get(
321+
codename=perm + '_' + instance.prefix)
322+
user.user_permissions.add(new_perm)
323+
user_group.permissions.add(new_perm)
324+
publishers.permissions.add(new_perm)
325+
if perm == 'publish':
326+
pass
327+
else:
328+
drafters.permissions.add(new_perm)
329+
352330
except PermErrors.IntegrityError:
353-
354331
# The permissions already exist.
355332
pass
356333

357334

358-
# Link prefix deletion to permissions deletion.
359-
@receiver(
360-
post_delete,
361-
sender=prefixes
362-
)
363-
def delete_permissions_for_prefix(
364-
sender,
365-
instance=None,
366-
**kwargs
367-
):
368-
# No risk of raising an error when using
369-
# a filter.
370-
Permission.objects.filter(
371-
codename='add_' + instance.prefix
372-
).delete()
373-
374-
Permission.objects.filter(
375-
codename='change_' + instance.prefix
376-
).delete()
377-
378-
Permission.objects.filter(
379-
codename='delete_' + instance.prefix
380-
).delete()
381-
382-
Permission.objects.filter(
383-
codename='view_' + instance.prefix
384-
).delete()
335+
@receiver(post_delete, sender=prefixes)
336+
def delete_permissions_for_prefix(sender, instance=None, **kwargs):
337+
"""Link prefix deletion to permissions deletion.
338+
No risk of raising an error when using
339+
a filter.
340+
"""
385341

386-
Permission.objects.filter(
387-
codename='draft_' + instance.prefix
388-
).delete()
389-
390-
Permission.objects.filter(
391-
codename='publish_' + instance.prefix
392-
).delete()
342+
Permission.objects.filter(codename='add_' + instance.prefix).delete()
343+
Permission.objects.filter(codename='change_' + instance.prefix).delete()
344+
Permission.objects.filter(codename='delete_' + instance.prefix).delete()
345+
Permission.objects.filter(codename='view_' + instance.prefix).delete()
346+
Permission.objects.filter(codename='draft_' + instance.prefix).delete()
347+
Permission.objects.filter(codename='publish_' + instance.prefix).delete()
393348

394349

395350
# --- Group info --- #
396-
397-
398351
# Link group creation to permission creation.
399352
@receiver(post_save, sender=group_info)
400-
def create_group_perms(
401-
sender,
402-
instance=None,
403-
created=False,
404-
**kwargs
405-
):
353+
def create_group_perms(sender, instance=None, created=False, **kwargs):
406354
if created:
407355
# Check to see whether or not the permissions
408356
# have already been created for this prefix.
409357
try:
410358
# Create the permissions, then use group_info to give the group admin
411359
# the admin permissions.
412360
# Create the administrative permissions for the group.
413-
for perm in ['add_members_' + Group.objects.get(id=instance.group_id).name,
414-
'delete_members_' + Group.objects.get(id=instance.group_id).name]:
361+
for perm in ['add_members_' + instance.group_id,
362+
'delete_members_' + instance.group_id]:
415363
Permission.objects.create(
416364
name='Can ' + perm,
417365
content_type=ContentType.objects.get(app_label='auth', model='group'),
418366
codename=perm)
419367
# Give the administrative permissions to the user
420368
# creating this group.
421-
import pdb; pdb.set_trace()
422-
User.objects.get(id=instance.owner_user_id).user_permissions.add(Permission.objects.get(codename=perm))
369+
User.objects.get(id=instance.id).user_permissions.add(Permission.objects.get(codename=perm))
423370

424371
except PermErrors.IntegrityError:
425372

@@ -428,8 +375,6 @@ def create_group_perms(
428375

429376

430377
# --- BCO --- #
431-
432-
433378
# Link draft creation to permission creation
434379
@receiver(
435380
post_save,

bco_api/api/permissions.py

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -60,40 +60,31 @@ def has_permission(
6060

6161

6262

63-
class RequestorInPrefixAdminsGroup(
64-
permissions.BasePermission
65-
):
66-
67-
def has_permission(
68-
self,
69-
request,
70-
view
71-
):
72-
73-
# Check to see if the requester is in the prefix admins group.
63+
class RequestorInPrefixAdminsGroup(permissions.BasePermission):
64+
"""
65+
Check to see if the requester is in the prefix admins group.
7466
75-
# Get the groups for this token (user).
76-
77-
# Slight tweak in case the proper headers were not provided...
78-
# In particular, Swagger will cause an Internal Error 500
79-
# if this logic is not here AND a view uses non-object-level
80-
# permissions (i.e. RequestorInPrefixAdminsGroup, see
81-
# ApiPrefixesPermissionsSet in views.py)
67+
Get the groups for this token (user).
68+
69+
Slight tweak in case the proper headers were not provided...
70+
In particular, Swagger will cause an Internal Error 500
71+
if this logic is not here AND a view uses non-object-level
72+
permissions (i.e. RequestorInPrefixAdminsGroup, see
73+
ApiPrefixesPermissionsSet in views.py)
74+
"""
75+
def has_permission(self, request, view):
76+
"""
77+
This means getting the user ID for the token,
78+
then the username.
79+
Get the prefix admins.
80+
"""
8281
if 'HTTP_AUTHORIZATION' in request.META:
83-
84-
# This means getting the user ID for the token,
85-
# then the username.
8682
user_id = Token.objects.get(
87-
key = request.META.get(
88-
'HTTP_AUTHORIZATION'
89-
).split(' ')[1]
83+
key = request.META.get('HTTP_AUTHORIZATION').split(' ')[1]
9084
).user_id
9185

92-
username = User.objects.get(
93-
id = user_id
94-
)
95-
96-
# Get the prefix admins.
86+
username = User.objects.get(id = user_id)
87+
9788
prefix_admins = Group.objects.filter(
9889
user = username,
9990
name = 'prefix_admins'
@@ -102,7 +93,6 @@ def has_permission(
10293
return len(prefix_admins) > 0
10394

10495
else:
105-
10696
return False
10797

10898

bco_api/api/scripts/method_specific/POST_api_groups_create.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def POST_api_groups_create(request):
2424
bulk_request = request.data['POST_api_groups_create']
2525

2626
# Establish who is the group administrator.
27-
group_admin = uu.user_from_request(rq=request)
27+
group_admin = uu.user_from_request(request=request)
2828

2929
# Get all group names.
3030

bco_api/api/scripts/method_specific/POST_api_groups_delete.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def POST_api_groups_delete(request):
2424
bulk_request = request.data['POST_api_groups_delete']['names']
2525

2626
# Establish who has made the request.
27-
requestor_info = uu.user_from_request(rq=request)
27+
requestor_info = uu.user_from_request(request=request)
2828

2929
# Get all group names.
3030

@@ -69,6 +69,7 @@ def POST_api_groups_delete(request):
6969
any_failed = True
7070
continue
7171
elif deleted_count > 1:
72+
print(deleted_count, 'deleted_count')
7273
# We don't expect there to be duplicates, so while this was successful it should throw a warning
7374
returning.append(db.messages(parameters={
7475
'group': grouped.name })['418_too_many_deleted'])

0 commit comments

Comments
 (0)