Skip to content

Commit e9fc1dc

Browse files
authored
feat(members): List global role members in Prod and ProdType (DefectDojo#10850)
1 parent 0d3e90f commit e9fc1dc

6 files changed

Lines changed: 89 additions & 14 deletions

File tree

dojo/product/queries.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
App_Analysis,
1414
DojoMeta,
1515
Engagement_Presets,
16+
Global_Role,
1617
Languages,
1718
Product,
1819
Product_API_Scan_Configuration,
@@ -71,8 +72,15 @@ def get_authorized_members_for_product(product, permission):
7172

7273
if user.is_superuser or user_has_permission(user, product, permission):
7374
return Product_Member.objects.filter(product=product).order_by("user__first_name", "user__last_name").select_related("role", "user")
74-
else:
75-
return None
75+
return Product_Member.objects.none()
76+
77+
78+
def get_authorized_global_members_for_product(product, permission):
79+
user = get_current_user()
80+
81+
if user.is_superuser or user_has_permission(user, product, permission):
82+
return Global_Role.objects.filter(group=None, role__isnull=False).order_by("user__first_name", "user__last_name").select_related("role", "user")
83+
return Global_Role.objects.none()
7684

7785

7886
def get_authorized_groups_for_product(product, permission):
@@ -81,8 +89,15 @@ def get_authorized_groups_for_product(product, permission):
8189
if user.is_superuser or user_has_permission(user, product, permission):
8290
authorized_groups = get_authorized_groups(Permissions.Group_View)
8391
return Product_Group.objects.filter(product=product, group__in=authorized_groups).order_by("group__name").select_related("role")
84-
else:
85-
return None
92+
return Product_Group.objects.none()
93+
94+
95+
def get_authorized_global_groups_for_product(product, permission):
96+
user = get_current_user()
97+
98+
if user.is_superuser or user_has_permission(user, product, permission):
99+
return Global_Role.objects.filter(user=None, role__isnull=False).order_by("group__name").select_related("role")
100+
return Global_Role.objects.none()
86101

87102

88103
def get_authorized_product_members(permission):

dojo/product/views.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@
9292
Test_Type,
9393
)
9494
from dojo.product.queries import (
95+
get_authorized_global_groups_for_product,
96+
get_authorized_global_members_for_product,
9597
get_authorized_groups_for_product,
9698
get_authorized_members_for_product,
9799
get_authorized_products,
@@ -213,8 +215,10 @@ def view_product(request, pid):
213215
.prefetch_related("prod_type__members")
214216
prod = get_object_or_404(prod_query, id=pid)
215217
product_members = get_authorized_members_for_product(prod, Permissions.Product_View)
218+
global_product_members = get_authorized_global_members_for_product(prod, Permissions.Product_View)
216219
product_type_members = get_authorized_members_for_product_type(prod.prod_type, Permissions.Product_Type_View)
217220
product_groups = get_authorized_groups_for_product(prod, Permissions.Product_View)
221+
global_product_groups = get_authorized_global_groups_for_product(prod, Permissions.Product_View)
218222
product_type_groups = get_authorized_groups_for_product_type(prod.prod_type, Permissions.Product_Type_View)
219223
personal_notifications_form = ProductNotificationsForm(
220224
instance=Notifications.objects.filter(user=request.user).filter(product=prod).first())
@@ -291,8 +295,10 @@ def view_product(request, pid):
291295
"benchmarks_percents": benchAndPercent,
292296
"benchmarks": benchmarks,
293297
"product_members": product_members,
298+
"global_product_members": global_product_members,
294299
"product_type_members": product_type_members,
295300
"product_groups": product_groups,
301+
"global_product_groups": global_product_groups,
296302
"product_type_groups": product_type_groups,
297303
"personal_notifications_form": personal_notifications_form,
298304
"enabled_notifications": get_enabled_notifications_list(),

dojo/product_type/queries.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
)
1010
from dojo.authorization.roles_permissions import Permissions
1111
from dojo.group.queries import get_authorized_groups
12-
from dojo.models import Product_Type, Product_Type_Group, Product_Type_Member
12+
from dojo.models import Global_Role, Product_Type, Product_Type_Group, Product_Type_Member
1313

1414

1515
def get_authorized_product_types(permission):
@@ -45,8 +45,15 @@ def get_authorized_members_for_product_type(product_type, permission):
4545

4646
if user.is_superuser or user_has_permission(user, product_type, permission):
4747
return Product_Type_Member.objects.filter(product_type=product_type).order_by("user__first_name", "user__last_name").select_related("role", "product_type", "user")
48-
else:
49-
return None
48+
return Product_Type_Member.objects.none()
49+
50+
51+
def get_authorized_global_members_for_product_type(product_type, permission):
52+
user = get_current_user()
53+
54+
if user.is_superuser or user_has_permission(user, product_type, permission):
55+
return Global_Role.objects.filter(group=None, role__isnull=False).order_by("user__first_name", "user__last_name").select_related("role", "user")
56+
return Global_Role.objects.none()
5057

5158

5259
def get_authorized_groups_for_product_type(product_type, permission):
@@ -55,8 +62,15 @@ def get_authorized_groups_for_product_type(product_type, permission):
5562
if user.is_superuser or user_has_permission(user, product_type, permission):
5663
authorized_groups = get_authorized_groups(Permissions.Group_View)
5764
return Product_Type_Group.objects.filter(product_type=product_type, group__in=authorized_groups).order_by("group__name").select_related("role", "group")
58-
else:
59-
return None
65+
return Product_Type_Group.objects.none()
66+
67+
68+
def get_authorized_global_groups_for_product_type(product_type, permission):
69+
user = get_current_user()
70+
71+
if user.is_superuser or user_has_permission(user, product_type, permission):
72+
return Global_Role.objects.filter(user=None, role__isnull=False).order_by("group__name").select_related("role", "group")
73+
return Global_Role.objects.none()
6074

6175

6276
def get_authorized_product_type_members(permission):

dojo/product_type/views.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
from dojo.models import Product_Type, Product_Type_Group, Product_Type_Member, Role
2828
from dojo.product.queries import get_authorized_products
2929
from dojo.product_type.queries import (
30+
get_authorized_global_groups_for_product_type,
31+
get_authorized_global_members_for_product_type,
3032
get_authorized_groups_for_product_type,
3133
get_authorized_members_for_product_type,
3234
get_authorized_product_types,
@@ -117,7 +119,9 @@ def view_product_type(request, ptid):
117119
page_name = _("View Product Type")
118120
pt = get_object_or_404(Product_Type, pk=ptid)
119121
members = get_authorized_members_for_product_type(pt, Permissions.Product_Type_View)
122+
global_members = get_authorized_global_members_for_product_type(pt, Permissions.Product_Type_View)
120123
groups = get_authorized_groups_for_product_type(pt, Permissions.Product_Type_View)
124+
global_groups = get_authorized_global_groups_for_product_type(pt, Permissions.Product_Type_View)
121125
products = get_authorized_products(Permissions.Product_View).filter(prod_type=pt)
122126
products = get_page_items(request, products, 25)
123127
add_breadcrumb(title=page_name, top_level=False, request=request)
@@ -126,7 +130,10 @@ def view_product_type(request, ptid):
126130
"pt": pt,
127131
"products": products,
128132
"groups": groups,
129-
"members": members})
133+
"members": members,
134+
"global_groups": global_groups,
135+
"global_members": global_members,
136+
})
130137

131138

132139
@user_is_authorized(Product_Type, Permissions.Product_Type_Delete, "ptid")

dojo/templates/dojo/view_product_details.html

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ <h4 class="pull-left">{% trans "Members" %}</h4>
297297
{% endif %}
298298
</div>
299299
</div>
300-
{% if product_members or product_type_members %}
300+
{% if product_members or product_type_members or global_product_members %}
301301
<div class="table-responsive">
302302
<table class="tablesorter-bootstrap table table-condensed table-striped">
303303
<thead>
@@ -350,6 +350,15 @@ <h4 class="pull-left">{% trans "Members" %}</h4>
350350
<td>{{ member.role }}</td>
351351
</tr>
352352
{% endfor %}
353+
{% for member in global_product_members %}
354+
<tr>
355+
<td>
356+
</td>
357+
<td>{{ member.user.get_full_name }}</td>
358+
<td>Global role</td>
359+
<td>{{ member.role }}</td>
360+
</tr>
361+
{% endfor %}
353362
</tbody>
354363
</table>
355364
</div>
@@ -385,7 +394,7 @@ <h4 class="pull-left">{% trans "Groups" %}</h4>
385394
{% endif %}
386395
</div>
387396
</div>
388-
{% if product_groups or product_type_groups %}
397+
{% if product_groups or product_type_groups or global_product_groups %}
389398
<div class="table-responsive">
390399
<table class="tablesorter-bootstrap table table-condensed table-striped">
391400
<thead>
@@ -437,6 +446,14 @@ <h4 class="pull-left">{% trans "Groups" %}</h4>
437446
<td>{{ type_group.role }}</td>
438447
</tr>
439448
{% endfor %}
449+
{% for type_group in global_product_groups %}
450+
<tr>
451+
<td></td>
452+
<td>{{ type_group.group.name }}</td>
453+
<td>Global role</td>
454+
<td>{{ type_group.role }}</td>
455+
</tr>
456+
{% endfor %}
440457
</tbody>
441458
</table>
442459
</div>

dojo/templates/dojo/view_product_type.html

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ <h4 class="pull-left">{% trans "Members" %}</h4>
151151
{% endif %}
152152
</div>
153153
</div>
154-
{% if members %}
154+
{% if members or global_members %}
155155
<div class="table-responsive">
156156
<table class="tablesorter-bootstrap table table-condensed table-striped">
157157
<thead>
@@ -189,6 +189,14 @@ <h4 class="pull-left">{% trans "Members" %}</h4>
189189
<td name="member_role">{{ member.role }}</td>
190190
</tr>
191191
{% endfor %}
192+
{% for member in global_members %}
193+
<tr>
194+
<td>
195+
</td>
196+
<td name="member_global_user">{{ member.user.get_full_name }}</td>
197+
<td name="member_global_role">{{ member.role }} (Global role)</td>
198+
</tr>
199+
{% endfor %}
192200
</tbody>
193201
</table>
194202
</div>
@@ -224,7 +232,7 @@ <h4 class="pull-left">{% trans "Groups" %}</h4>
224232
{% endif %}
225233
</div>
226234
</div>
227-
{% if groups %}
235+
{% if groups or global_groups %}
228236
<div class="table-responsive">
229237
<table class="tablesorter-bootstrap table table-condensed table-striped">
230238
<thead>
@@ -262,6 +270,14 @@ <h4 class="pull-left">{% trans "Groups" %}</h4>
262270
<td name="product_type_group_role">{{ group.role }}</td>
263271
</tr>
264272
{% endfor %}
273+
{% for group in global_groups %}
274+
<tr>
275+
<td>
276+
</td>
277+
<td name="product_type_group_global_group">{{ group.group.name }}</td>
278+
<td name="product_type_group_global_role">{{ group.role }} (Global role)</td>
279+
</tr>
280+
{% endfor %}
265281
</tbody>
266282
</table>
267283
</div>

0 commit comments

Comments
 (0)