|
1 | 1 | from datetime import datetime, timedelta |
2 | 2 |
|
| 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 | + |
3 | 11 | from api import errors |
4 | 12 | from api.mixins import BaseViewSet |
5 | | -from api.serializers.job import ProjectJobSerializer, SpiderJobSerializer |
6 | 13 | from api.serializers.cronjob import ProjectCronJobSerializer, SpiderCronJobSerializer |
| 14 | +from api.serializers.job import ProjectJobSerializer, SpiderJobSerializer |
7 | 15 | from api.serializers.project import ( |
8 | 16 | ProjectSerializer, |
9 | 17 | ProjectUpdateSerializer, |
|
14 | 22 | Permission, |
15 | 23 | Project, |
16 | 24 | Spider, |
17 | | - SpiderJob, |
18 | 25 | SpiderCronJob, |
| 26 | + SpiderJob, |
19 | 27 | UsageRecord, |
20 | 28 | User, |
21 | 29 | ) |
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 |
29 | 30 |
|
30 | 31 |
|
31 | 32 | class ProjectViewSet(BaseViewSet, viewsets.ModelViewSet): |
@@ -83,42 +84,42 @@ def update(self, request, *args, **kwargs): |
83 | 84 |
|
84 | 85 | name = serializer.validated_data.get("name", "") |
85 | 86 | user_email = serializer.validated_data.pop("email", "") |
86 | | - user_permision = serializer.validated_data.pop("user", "") |
87 | 87 | action = serializer.validated_data.pop("action", "") |
88 | 88 | permission = serializer.validated_data.pop("permission", "") |
89 | | - |
90 | 89 | if name: |
91 | 90 | 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 | + |
93 | 100 | 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: |
121 | 102 | 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."}) |
122 | 123 | serializer.save() |
123 | 124 |
|
124 | 125 | headers = self.get_success_headers(serializer.data) |
@@ -219,7 +220,6 @@ def cronjobs(self, request, *args, **kwargs): |
219 | 220 | ) |
220 | 221 | @action(methods=["GET"], detail=True) |
221 | 222 | def current_usage(self, request, *args, **kwargs): |
222 | | - instance = self.get_object() |
223 | 223 | project = Project.objects.get(pid=kwargs["pid"]) |
224 | 224 | serializer = ProjectUsageSerializer( |
225 | 225 | UsageRecord.objects.filter(project=project).first() |
@@ -251,7 +251,6 @@ def current_usage(self, request, *args, **kwargs): |
251 | 251 | ) |
252 | 252 | @action(methods=["GET"], detail=True) |
253 | 253 | def usage(self, request, *args, **kwargs): |
254 | | - instance = self.get_object() |
255 | 254 | project = Project.objects.get(pid=kwargs["pid"]) |
256 | 255 | start_date = request.query_params.get( |
257 | 256 | "start_date", datetime.today().replace(day=1) |
|
0 commit comments