Skip to content

Commit 8e21d5f

Browse files
Replace 'isSuperUser' with specific roles required for frontend
1 parent d602fc7 commit 8e21d5f

File tree

11 files changed

+215
-146
lines changed

11 files changed

+215
-146
lines changed

app/api/models.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.dispatch import receiver
55
from django.db.models.signals import post_save, pre_save, pre_delete
66
from django.urls import reverse
7+
from django.conf import settings
78
from django.contrib.auth.models import User
89
from django.contrib.staticfiles.storage import staticfiles_storage
910
from django.core.exceptions import ValidationError
@@ -270,15 +271,44 @@ class Meta:
270271

271272
@receiver(post_save, sender=RoleMapping)
272273
def add_linked_project(sender, instance, created, **kwargs):
274+
if not created:
275+
return
273276
userInstance = instance.user
274277
projectInstance = instance.project
275-
if created and userInstance and projectInstance:
278+
if userInstance and projectInstance:
276279
user = User.objects.get(pk=userInstance.pk)
277280
project = Project.objects.get(pk=projectInstance.pk)
278281
user.projects.add(project)
279282
user.save()
280283

281284

285+
@receiver(post_save)
286+
def add_superusers_to_project(sender, instance, created, **kwargs):
287+
if not created:
288+
return
289+
if sender not in Project.__subclasses__():
290+
return
291+
superusers = User.objects.filter(is_superuser=True)
292+
admin_role = Role.objects.filter(name=settings.ROLE_PROJECT_ADMIN).first()
293+
if superusers and admin_role:
294+
RoleMapping.objects.bulk_create(
295+
[RoleMapping(role_id=admin_role.id, user_id=superuser.id, project_id=instance.id)
296+
for superuser in superusers]
297+
)
298+
299+
300+
@receiver(post_save, sender=User)
301+
def add_new_superuser_to_projects(sender, instance, created, **kwargs):
302+
if created and instance.is_superuser:
303+
admin_role = Role.objects.filter(name=settings.ROLE_PROJECT_ADMIN).first()
304+
projects = Project.objects.all()
305+
if admin_role and projects:
306+
RoleMapping.objects.bulk_create(
307+
[RoleMapping(role_id=admin_role.id, user_id=instance.id, project_id=project.id)
308+
for project in projects]
309+
)
310+
311+
282312
@receiver(pre_delete, sender=RoleMapping)
283313
def delete_linked_project(sender, instance, using, **kwargs):
284314
userInstance = instance.user

app/api/permissions.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@ def get_project_id(self, request, view):
1212
return view.kwargs.get('project_id') or request.query_params.get('project_id')
1313

1414

15-
class IsProjectUser(ProjectMixin, BasePermission):
16-
17-
def has_permission(self, request, view):
18-
project = get_object_or_404(Project, pk=self.get_project_id(request, view))
19-
return user in project.users.all()
20-
21-
2215
class IsAdminUserAndWriteOnly(BasePermission):
2316

2417
def has_permission(self, request, view):
@@ -74,19 +67,20 @@ class IsProjectAdmin(RolePermission):
7467
role_name = settings.ROLE_PROJECT_ADMIN
7568

7669

77-
class IsAnnotatorAndCreator(RolePermission):
78-
unsafe_methods_check = False
70+
class IsAnnotatorAndReadOnly(RolePermission):
7971
role_name = settings.ROLE_ANNOTATOR
8072

81-
8273
class IsAnnotator(RolePermission):
74+
unsafe_methods_check = False
8375
role_name = settings.ROLE_ANNOTATOR
8476

77+
class IsAnnotationApproverAndReadOnly(RolePermission):
78+
role_name = settings.ROLE_ANNOTATION_APPROVER
8579

8680
class IsAnnotationApprover(RolePermission):
81+
unsafe_methods_check = False
8782
role_name = settings.ROLE_ANNOTATION_APPROVER
8883

89-
9084
def is_in_role(role_name, user_id, project_id):
9185
return RoleMapping.objects.filter(
9286
user_id=user_id,

app/api/serializers.py

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
from django.conf import settings
12
from django.contrib.auth import get_user_model
3+
from django.shortcuts import get_object_or_404
24
from rest_framework import serializers
35
from rest_polymorphic.serializers import PolymorphicSerializer
46
from rest_framework.exceptions import ValidationError
@@ -77,39 +79,56 @@ class Meta:
7779

7880

7981
class ProjectSerializer(serializers.ModelSerializer):
82+
current_users_role = serializers.SerializerMethodField()
83+
84+
def get_current_users_role(self, instance):
85+
role_abstractor = {
86+
"is_project_admin": settings.ROLE_PROJECT_ADMIN,
87+
"is_annotator": settings.ROLE_ANNOTATOR,
88+
"is_annotation_approver": settings.ROLE_ANNOTATION_APPROVER,
89+
}
90+
queryset = RoleMapping.objects.values("role_id__name")
91+
if queryset:
92+
users_role = get_object_or_404(
93+
queryset, project=instance.id, user=self.context.get("request").user.id
94+
)
95+
for key, val in role_abstractor.items():
96+
role_abstractor[key] = users_role["role_id__name"] == val
97+
return role_abstractor
8098

8199
class Meta:
82100
model = Project
83-
fields = ('id', 'name', 'description', 'guideline', 'users', 'project_type', 'image', 'updated_at',
84-
'randomize_document_order', 'collaborative_annotation')
85-
read_only_fields = ('image', 'updated_at')
101+
fields = ('id', 'name', 'description', 'guideline', 'users', 'current_users_role', 'project_type', 'image',
102+
'updated_at', 'randomize_document_order', 'collaborative_annotation')
103+
read_only_fields = ('image', 'updated_at', 'current_users_role')
86104

87105

88-
class TextClassificationProjectSerializer(serializers.ModelSerializer):
106+
class TextClassificationProjectSerializer(ProjectSerializer):
89107

90108
class Meta:
91109
model = TextClassificationProject
92-
fields = ('id', 'name', 'description', 'guideline', 'users', 'project_type', 'image', 'updated_at',
93-
'randomize_document_order')
94-
read_only_fields = ('image', 'updated_at', 'users')
110+
fields = ('id', 'name', 'description', 'guideline', 'users', 'current_users_role', 'project_type', 'image',
111+
'updated_at', 'randomize_document_order')
112+
read_only_fields = ('image', 'updated_at', 'users', 'current_users_role')
95113

96114

97-
class SequenceLabelingProjectSerializer(serializers.ModelSerializer):
115+
class SequenceLabelingProjectSerializer(ProjectSerializer):
116+
98117

99118
class Meta:
100119
model = SequenceLabelingProject
101-
fields = ('id', 'name', 'description', 'guideline', 'users', 'project_type', 'image', 'updated_at',
102-
'randomize_document_order')
103-
read_only_fields = ('image', 'updated_at', 'users')
120+
fields = ('id', 'name', 'description', 'guideline', 'users', 'current_users_role', 'project_type', 'image',
121+
'updated_at', 'randomize_document_order')
122+
read_only_fields = ('image', 'updated_at', 'users', 'current_users_role')
104123

105124

106-
class Seq2seqProjectSerializer(serializers.ModelSerializer):
125+
class Seq2seqProjectSerializer(ProjectSerializer):
107126

108127
class Meta:
109128
model = Seq2seqProject
110-
fields = ('id', 'name', 'description', 'guideline', 'users', 'project_type', 'image', 'updated_at',
111-
'randomize_document_order')
112-
read_only_fields = ('image', 'updated_at', 'users')
129+
fields = ('id', 'name', 'description', 'guideline', 'users', 'current_users_role', 'project_type', 'image',
130+
'updated_at', 'randomize_document_order')
131+
read_only_fields = ('image', 'updated_at', 'users', 'current_users_role')
113132

114133

115134
class ProjectPolymorphicSerializer(PolymorphicSerializer):

0 commit comments

Comments
 (0)