Skip to content

Commit c6bcf35

Browse files
raymond1242Raymond Negronmgonnav
authored
BITMAKER-2716 Fix control flow when adding, removing, or updating project members (#166)
* Fix control flow when adding, removing, or updating project members. --------- Co-authored-by: Raymond Negron <raymond1242@Raymonds-MacBook-Air.local> Co-authored-by: emegona <mateo@emegona.com>
1 parent 56a24f1 commit c6bcf35

5 files changed

Lines changed: 44 additions & 65 deletions

File tree

estela-api/api/serializers/project.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,7 @@ class ProjectUpdateSerializer(serializers.ModelSerializer):
101101
pid = serializers.UUIDField(
102102
read_only=True, help_text="A UUID identifying this project."
103103
)
104-
users = UserDetailSerializer(many=True, required=False, help_text="Afected users.")
105-
user = serializers.EmailField(
106-
write_only=True, required=False, help_text="User email address."
107-
)
104+
users = UserDetailSerializer(many=True, required=False, help_text="Affected users.")
108105
email = serializers.EmailField(
109106
write_only=True, required=False, help_text="Email address."
110107
)
@@ -123,4 +120,4 @@ class ProjectUpdateSerializer(serializers.ModelSerializer):
123120

124121
class Meta:
125122
model = Project
126-
fields = ("pid", "name", "users", "user", "email", "action", "permission")
123+
fields = ("pid", "name", "users", "email", "action", "permission")

estela-api/api/views/project.py

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
from datetime import datetime, timedelta
22

3+
from django.core.paginator import Paginator
4+
from drf_yasg import openapi
5+
from drf_yasg.utils import swagger_auto_schema
6+
from rest_framework import status, viewsets
7+
from rest_framework.decorators import action
8+
from rest_framework.exceptions import NotFound, ParseError, PermissionDenied
9+
from rest_framework.response import Response
10+
311
from api import errors
412
from api.mixins import BaseViewSet
5-
from api.serializers.job import ProjectJobSerializer, SpiderJobSerializer
613
from api.serializers.cronjob import ProjectCronJobSerializer, SpiderCronJobSerializer
14+
from api.serializers.job import ProjectJobSerializer, SpiderJobSerializer
715
from api.serializers.project import (
816
ProjectSerializer,
917
ProjectUpdateSerializer,
@@ -14,18 +22,11 @@
1422
Permission,
1523
Project,
1624
Spider,
17-
SpiderJob,
1825
SpiderCronJob,
26+
SpiderJob,
1927
UsageRecord,
2028
User,
2129
)
22-
from django.core.paginator import Paginator
23-
from drf_yasg import openapi
24-
from drf_yasg.utils import swagger_auto_schema
25-
from rest_framework import status, viewsets
26-
from rest_framework.decorators import action
27-
from rest_framework.response import Response
28-
from rest_framework.exceptions import NotFound, ParseError
2930

3031

3132
class ProjectViewSet(BaseViewSet, viewsets.ModelViewSet):
@@ -83,42 +84,42 @@ def update(self, request, *args, **kwargs):
8384

8485
name = serializer.validated_data.get("name", "")
8586
user_email = serializer.validated_data.pop("email", "")
86-
user_permision = serializer.validated_data.pop("user", "")
8787
action = serializer.validated_data.pop("action", "")
8888
permission = serializer.validated_data.pop("permission", "")
89-
9089
if name:
9190
instance.name = name
92-
if user_email and user_email != user_permision:
91+
if user_email and user_email != request.user.email:
92+
if not (
93+
request.user.permission_set.get(project=instance).permission
94+
in [Permission.ADMIN_PERMISSION, Permission.OWNER_PERMISSION]
95+
):
96+
raise PermissionDenied(
97+
{"permission": "You do not have permission to do this."}
98+
)
99+
93100
user = User.objects.filter(email=user_email)
94-
user_instance = User.objects.filter(email=user_permision)
95-
if user:
96-
user = user.get()
97-
user_instance = user_instance.get()
98-
if (
99-
user_instance.permission_set.get(project=instance).permission
100-
in [Permission.ADMIN_PERMISSION, Permission.OWNER_PERMISSION]
101-
) and permission != Permission.OWNER_PERMISSION:
102-
if action == "add":
103-
instance.users.add(
104-
user, through_defaults={"permission": permission}
105-
)
106-
elif action == "remove" and (
107-
user.permission_set.get(project=instance).permission
108-
!= Permission.OWNER_PERMISSION
109-
):
110-
instance.users.remove(user)
111-
elif action == "update":
112-
instance.users.remove(user)
113-
instance.users.add(
114-
user, through_defaults={"permission": permission}
115-
)
116-
else:
117-
raise ParseError({"error": "Action not supported."})
118-
else:
119-
raise ParseError({"error": "Action not supported."})
120-
else:
101+
if not user:
121102
raise NotFound({"email": "User does not exist."})
103+
104+
user = user.get()
105+
existing_permission = user.permission_set.filter(project=instance).first()
106+
if (
107+
existing_permission
108+
and existing_permission.permission == Permission.OWNER_PERMISSION
109+
):
110+
raise ParseError(
111+
{"error": "You cannot modify the permissions of an owner user."}
112+
)
113+
114+
if action == "add":
115+
instance.users.add(user, through_defaults={"permission": permission})
116+
elif action == "remove":
117+
instance.users.remove(user)
118+
elif action == "update":
119+
instance.users.remove(user)
120+
instance.users.add(user, through_defaults={"permission": permission})
121+
else:
122+
raise ParseError({"error": "Action not supported."})
122123
serializer.save()
123124

124125
headers = self.get_success_headers(serializer.data)
@@ -219,7 +220,6 @@ def cronjobs(self, request, *args, **kwargs):
219220
)
220221
@action(methods=["GET"], detail=True)
221222
def current_usage(self, request, *args, **kwargs):
222-
instance = self.get_object()
223223
project = Project.objects.get(pid=kwargs["pid"])
224224
serializer = ProjectUsageSerializer(
225225
UsageRecord.objects.filter(project=project).first()
@@ -251,7 +251,6 @@ def current_usage(self, request, *args, **kwargs):
251251
)
252252
@action(methods=["GET"], detail=True)
253253
def usage(self, request, *args, **kwargs):
254-
instance = self.get_object()
255254
project = Project.objects.get(pid=kwargs["pid"])
256255
start_date = request.query_params.get(
257256
"start_date", datetime.today().replace(day=1)

estela-api/docs/api.yaml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,16 +1287,10 @@ definitions:
12871287
maxLength: 1000
12881288
minLength: 1
12891289
users:
1290-
description: Afected users.
1290+
description: Affected users.
12911291
type: array
12921292
items:
12931293
$ref: '#/definitions/UserDetail'
1294-
user:
1295-
title: User
1296-
description: User email address.
1297-
type: string
1298-
format: email
1299-
minLength: 1
13001294
email:
13011295
title: Email
13021296
description: Email address.

estela-web/src/components/ProjectMemberPage/index.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,7 @@ export class ProjectMemberPage extends Component<RouteComponentProps<RouteParams
127127
: option == 1
128128
? ProjectUpdateActionEnum.Add
129129
: ProjectUpdateActionEnum.Update;
130-
const user_email = this.state.users.find((item) => item.user?.username === AuthService.getUserUsername())?.user
131-
?.email;
132130
const requestData: ProjectUpdate = {
133-
user: user_email,
134131
email: email,
135132
action: action,
136133
permission: this.state.permission,

estela-web/src/services/api/generated-api/models/ProjectUpdate.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,11 @@ export interface ProjectUpdate {
3939
*/
4040
name: string;
4141
/**
42-
* Afected users.
42+
* Affected users.
4343
* @type {Array<UserDetail>}
4444
* @memberof ProjectUpdate
4545
*/
4646
users?: Array<UserDetail>;
47-
/**
48-
* User email address.
49-
* @type {string}
50-
* @memberof ProjectUpdate
51-
*/
52-
user?: string;
5347
/**
5448
* Email address.
5549
* @type {string}
@@ -101,7 +95,6 @@ export function ProjectUpdateFromJSONTyped(json: any, ignoreDiscriminator: boole
10195
'pid': !exists(json, 'pid') ? undefined : json['pid'],
10296
'name': json['name'],
10397
'users': !exists(json, 'users') ? undefined : ((json['users'] as Array<any>).map(UserDetailFromJSON)),
104-
'user': !exists(json, 'user') ? undefined : json['user'],
10598
'email': !exists(json, 'email') ? undefined : json['email'],
10699
'action': !exists(json, 'action') ? undefined : json['action'],
107100
'permission': !exists(json, 'permission') ? undefined : json['permission'],
@@ -119,7 +112,6 @@ export function ProjectUpdateToJSON(value?: ProjectUpdate | null): any {
119112

120113
'name': value.name,
121114
'users': value.users === undefined ? undefined : ((value.users as Array<any>).map(UserDetailToJSON)),
122-
'user': value.user,
123115
'email': value.email,
124116
'action': value.action,
125117
'permission': value.permission,

0 commit comments

Comments
 (0)