Skip to content

Commit 3faf5e1

Browse files
committed
remove orphaned OrganizationMember V3 API ViewSet, serializer, filter, and permission
Same shape as the AssetMember removal: organization_members was never registered with v2_api. The OrganizationMemberViewSet (with its destroy() owner-count guard), OrganizationMemberSerializer (with the last-owner check + Owner-add gate), OrganizationMemberFilterSet, and UserHasOrganizationMemberPermission classes have lived on as dead code that touches the Product_Type_Member RBAC model. Drop them and the get_authorized_product_type_members import that was their last consumer in this module.
1 parent 650af50 commit 3faf5e1

4 files changed

Lines changed: 0 additions & 129 deletions

File tree

dojo/authorization/api_permissions.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -571,25 +571,6 @@ def has_object_permission(self, request, view, obj):
571571
)
572572

573573

574-
class UserHasOrganizationMemberPermission(permissions.BasePermission):
575-
def has_permission(self, request, view):
576-
return check_post_permission(
577-
request,
578-
Product_Type,
579-
"organization",
580-
"staff_only",
581-
)
582-
583-
def has_object_permission(self, request, view, obj):
584-
return check_object_permission(
585-
request,
586-
obj,
587-
"view",
588-
"staff_only",
589-
"delete",
590-
)
591-
592-
593574
class UserHasOrganizationGroupPermission(permissions.BasePermission):
594575
def has_permission(self, request, view):
595576
return check_post_permission(

dojo/organization/api/filters.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from dojo.authorization.models import (
55
Product_Type_Group,
6-
Product_Type_Member,
76
)
87
from dojo.labels import get_labels
98
from dojo.models import Product_Type
@@ -20,14 +19,6 @@ class Meta:
2019
fields = ("id", "name", "created", "updated")
2120

2221

23-
class OrganizationMemberFilterSet(FilterSet):
24-
organization_id = NumberFilter(field_name="product_type_id")
25-
26-
class Meta:
27-
model = Product_Type_Member
28-
fields = ("id", "user_id")
29-
30-
3122
class OrganizationGroupFilterSet(FilterSet):
3223
asset_type_id = NumberFilter(field_name="product_type_id")
3324

dojo/organization/api/serializers.py

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from dojo.authorization.authorization import user_has_permission
55
from dojo.authorization.models import (
66
Product_Type_Group,
7-
Product_Type_Member,
87
)
98
from dojo.models import Product_Type
109
from dojo.product_type.queries import get_authorized_product_types
@@ -15,61 +14,6 @@ def get_queryset(self):
1514
return get_authorized_product_types("view")
1615

1716

18-
class OrganizationMemberSerializer(serializers.ModelSerializer):
19-
organization = RelatedOrganizationField(source="product_type")
20-
21-
class Meta:
22-
model = Product_Type_Member
23-
exclude = ("product_type",)
24-
25-
def validate(self, data):
26-
if (
27-
self.instance is not None
28-
and data.get("organization") != self.instance.product_type
29-
and not user_has_permission(
30-
self.context["request"].user,
31-
data.get("organization"),
32-
"staff_only",
33-
)
34-
):
35-
msg = "You are not permitted to add a member to this Organization"
36-
raise PermissionDenied(msg)
37-
38-
if (
39-
self.instance is None
40-
or data.get("organization") != self.instance.product_type
41-
or data.get("user") != self.instance.user
42-
):
43-
members = Product_Type_Member.objects.filter(
44-
product_type=data.get("organization"), user=data.get("user"),
45-
)
46-
if members.count() > 0:
47-
msg = "Organization Member already exists"
48-
raise ValidationError(msg)
49-
50-
if self.instance is not None and not data.get("role").is_owner:
51-
owners = (
52-
Product_Type_Member.objects.filter(
53-
product_type=data.get("organization", data.get("product_type")), role__is_owner=True,
54-
)
55-
.exclude(id=self.instance.id)
56-
.count()
57-
)
58-
if owners < 1:
59-
msg = "There must be at least one owner"
60-
raise ValidationError(msg)
61-
62-
if data.get("role").is_owner and not user_has_permission(
63-
self.context["request"].user,
64-
data.get("organization"),
65-
"staff_only",
66-
):
67-
msg = "You are not permitted to add a member as Owner to this Organization"
68-
raise PermissionDenied(msg)
69-
70-
return data
71-
72-
7317
class OrganizationGroupSerializer(serializers.ModelSerializer):
7418
organization = RelatedOrganizationField(source="product_type")
7519

dojo/organization/api/views.py

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,15 @@
1010
from dojo.authorization import api_permissions as permissions
1111
from dojo.authorization.models import (
1212
Product_Type_Group,
13-
Product_Type_Member,
1413
)
1514
from dojo.models import Product_Type
1615
from dojo.organization.api import serializers
1716
from dojo.organization.api.filters import (
1817
OrganizationFilterSet,
1918
OrganizationGroupFilterSet,
20-
OrganizationMemberFilterSet,
2119
)
2220
from dojo.product_type.queries import (
2321
get_authorized_product_type_groups,
24-
get_authorized_product_type_members,
2522
get_authorized_product_types,
2623
)
2724
from dojo.utils import async_delete, get_setting
@@ -93,48 +90,6 @@ def generate_report(self, request, pk=None):
9390
return Response(report.data)
9491

9592

96-
# Authorization: object-based
97-
@extend_schema_view(**schema_with_prefetch())
98-
class OrganizationMemberViewSet(
99-
PrefetchDojoModelViewSet,
100-
):
101-
serializer_class = serializers.OrganizationMemberSerializer
102-
queryset = Product_Type_Member.objects.none()
103-
filter_backends = (DjangoFilterBackend,)
104-
filterset_class = OrganizationMemberFilterSet
105-
permission_classes = (
106-
IsAuthenticated,
107-
permissions.UserHasOrganizationMemberPermission,
108-
)
109-
110-
def get_queryset(self):
111-
return get_authorized_product_type_members(
112-
"view",
113-
).distinct()
114-
115-
def destroy(self, request, *args, **kwargs):
116-
instance = self.get_object()
117-
if instance.role.is_owner:
118-
owners = Product_Type_Member.objects.filter(
119-
product_type=instance.product_type, role__is_owner=True,
120-
).count()
121-
if owners <= 1:
122-
return Response(
123-
"There must be at least one owner",
124-
status=status.HTTP_400_BAD_REQUEST,
125-
)
126-
self.perform_destroy(instance)
127-
return Response(status=status.HTTP_204_NO_CONTENT)
128-
129-
@extend_schema(
130-
exclude=True,
131-
)
132-
def partial_update(self, request, pk=None):
133-
# Object authorization won't work if not all data is provided
134-
response = {"message": "Patch function is not offered in this path."}
135-
return Response(response, status=status.HTTP_405_METHOD_NOT_ALLOWED)
136-
137-
13893
# Authorization: object-based
13994
@extend_schema_view(**schema_with_prefetch())
14095
class OrganizationGroupViewSet(

0 commit comments

Comments
 (0)