Skip to content

Commit 5d307cd

Browse files
committed
remove OS UI for product members
Drop the classic /asset/<pid>/add_member, /asset/member/<mid>/{edit,delete} (and matching /product/* aliases) routes, the three view functions in dojo/product/views.py, and the Add_Product_MemberForm, Edit_Product_MemberForm, and Delete_Product_MemberForm classes. Both the Tailwind and Bootstrap (templates_classic) copies of the corresponding templates are removed. Pro takes ownership of these classic screens via pro/product_members/* (committed separately in dojo-pro). Drive-by fix in delete_technology: swap the misplaced Delete_Product_MemberForm for DeleteAppAnalysisForm. The existing line bound a Product_Member form to an App_Analysis instance, which only worked because the view never read the form's cleaned_data — it just deletes the instance. With Delete_Product_MemberForm removed, the form has to be the right one anyway.
1 parent 5361c3a commit 5d307cd

9 files changed

Lines changed: 2 additions & 250 deletions

File tree

dojo/asset/urls.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,6 @@
123123
views.delete_engagement_presets,
124124
name="delete_engagement_presets",
125125
),
126-
re_path(
127-
r"^asset/(?P<pid>\d+)/add_member$",
128-
views.add_product_member,
129-
name="add_product_member",
130-
),
131-
re_path(
132-
r"^asset/member/(?P<memberid>\d+)/edit$",
133-
views.edit_product_member,
134-
name="edit_product_member",
135-
),
136-
re_path(
137-
r"^asset/member/(?P<memberid>\d+)/delete$",
138-
views.delete_product_member,
139-
name="delete_product_member",
140-
),
141126
re_path(
142127
r"^asset/(?P<pid>\d+)/add_api_scan_configuration$",
143128
views.add_api_scan_configuration,
@@ -180,9 +165,6 @@
180165
re_path(r"^product/(?P<pid>\d+)/engagement_presets/(?P<eid>\d+)/edit$", redirect_view("edit_engagement_presets")),
181166
re_path(r"^product/(?P<pid>\d+)/engagement_presets/add$", redirect_view("add_engagement_presets")),
182167
re_path(r"^product/(?P<pid>\d+)/engagement_presets/(?P<eid>\d+)/delete$", redirect_view("delete_engagement_presets")),
183-
re_path(r"^product/(?P<pid>\d+)/add_member$", redirect_view("add_product_member")),
184-
re_path(r"^product/member/(?P<memberid>\d+)/edit$", redirect_view("edit_product_member")),
185-
re_path(r"^product/member/(?P<memberid>\d+)/delete$", redirect_view("delete_product_member")),
186168
re_path(r"^product/(?P<pid>\d+)/add_api_scan_configuration$", redirect_view("add_api_scan_configuration")),
187169
re_path(r"^product/(?P<pid>\d+)/view_api_scan_configurations$", redirect_view("view_api_scan_configurations")),
188170
re_path(r"^product/(?P<pid>\d+)/edit_api_scan_configuration/(?P<pascid>\d+)$", redirect_view("edit_api_scan_configuration")),
@@ -239,12 +221,6 @@
239221
name="add_engagement_presets"),
240222
re_path(r"^product/(?P<pid>\d+)/engagement_presets/(?P<eid>\d+)/delete$", views.delete_engagement_presets,
241223
name="delete_engagement_presets"),
242-
re_path(r"^product/(?P<pid>\d+)/add_member$", views.add_product_member,
243-
name="add_product_member"),
244-
re_path(r"^product/member/(?P<memberid>\d+)/edit$", views.edit_product_member,
245-
name="edit_product_member"),
246-
re_path(r"^product/member/(?P<memberid>\d+)/delete$", views.delete_product_member,
247-
name="delete_product_member"),
248224
re_path(r"^product/(?P<pid>\d+)/authorized_users/add$",
249225
views.add_product_authorized_users,
250226
name="add_product_authorized_users"),
@@ -284,9 +260,6 @@
284260
re_path(r"^asset/(?P<pid>\d+)/engagement_presets/add$", redirect_view("add_engagement_presets")),
285261
re_path(r"^asset/(?P<pid>\d+)/engagement_presets/(?P<eid>\d+)/delete$",
286262
redirect_view("delete_engagement_presets")),
287-
re_path(r"^asset/(?P<pid>\d+)/add_member$", redirect_view("add_product_member")),
288-
re_path(r"^asset/member/(?P<memberid>\d+)/edit$", redirect_view("edit_product_member")),
289-
re_path(r"^asset/member/(?P<memberid>\d+)/delete$", redirect_view("delete_product_member")),
290263
re_path(r"^asset/(?P<pid>\d+)/add_api_scan_configuration$", redirect_view("add_api_scan_configuration")),
291264
re_path(r"^asset/(?P<pid>\d+)/view_api_scan_configurations$", redirect_view("view_api_scan_configurations")),
292265
re_path(r"^asset/(?P<pid>\d+)/edit_api_scan_configuration/(?P<pascid>\d+)$",

dojo/forms.py

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -446,37 +446,6 @@ class Meta:
446446
fields = ["id"]
447447

448448

449-
class Edit_Product_MemberForm(forms.ModelForm):
450-
451-
def __init__(self, *args, **kwargs):
452-
super().__init__(*args, **kwargs)
453-
self.fields["product"].disabled = True
454-
self.fields["product"].label = labels.ASSET_LABEL
455-
self.fields["user"].queryset = Dojo_User.objects.order_by("first_name", "last_name")
456-
self.fields["user"].disabled = True
457-
458-
class Meta:
459-
model = Product_Member
460-
fields = ["product", "user", "role"]
461-
462-
463-
class Add_Product_MemberForm(forms.ModelForm):
464-
users = forms.ModelMultipleChoiceField(queryset=Dojo_User.objects.none(), required=True, label="Users")
465-
466-
def __init__(self, *args, **kwargs):
467-
super().__init__(*args, **kwargs)
468-
self.fields["product"].disabled = True
469-
self.fields["product"].label = labels.ASSET_LABEL
470-
current_members = Product_Member.objects.filter(product=self.initial["product"]).values_list("user", flat=True)
471-
self.fields["users"].queryset = Dojo_User.objects.exclude(
472-
Q(is_superuser=True)
473-
| Q(id__in=current_members)).exclude(is_active=False).order_by("first_name", "last_name")
474-
475-
class Meta:
476-
model = Product_Member
477-
fields = ["product", "users", "role"]
478-
479-
480449
class Add_Product_AuthorizedUsersForm(forms.Form):
481450
users = forms.ModelMultipleChoiceField(
482451
queryset=Dojo_User.objects.none(), required=True, label="Users",
@@ -521,12 +490,6 @@ def __init__(self, *args, user=None, **kwargs):
521490
)
522491

523492

524-
class Delete_Product_MemberForm(Edit_Product_MemberForm):
525-
def __init__(self, *args, **kwargs):
526-
super().__init__(*args, **kwargs)
527-
self.fields["role"].disabled = True
528-
529-
530493
class NoteTypeForm(forms.ModelForm):
531494
description = forms.CharField(widget=forms.Textarea(attrs={}),
532495
required=True)

dojo/product/views.py

Lines changed: 2 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@
2626
from github import Github
2727

2828
import dojo.finding.helper as finding_helper
29-
from dojo.authorization.authorization import user_has_permission, user_has_permission_or_403
30-
from dojo.authorization.models import (
31-
Product_Member,
32-
)
29+
from dojo.authorization.authorization import user_has_permission_or_403
3330
from dojo.authorization.roles_permissions import Permissions
3431
from dojo.components.sql_group_concat import Sql_GroupConcat
3532
from dojo.filters import (
@@ -47,16 +44,13 @@
4744
)
4845
from dojo.forms import (
4946
Add_Product_AuthorizedUsersForm,
50-
Add_Product_MemberForm,
5147
AdHocFindingForm,
5248
AppAnalysisForm,
53-
Delete_Product_MemberForm,
5449
DeleteAppAnalysisForm,
5550
DeleteEngagementPresetsForm,
5651
DeleteProduct_API_Scan_ConfigurationForm,
5752
DeleteProductForm,
5853
DojoMetaFormSet,
59-
Edit_Product_MemberForm,
6054
EngagementPresetsForm,
6155
EngForm,
6256
GITHUB_Product_Form,
@@ -1234,7 +1228,7 @@ def delete_technology(request, tid):
12341228
technology = get_object_or_404(App_Analysis, id=tid)
12351229
form = DeleteAppAnalysisForm(instance=technology)
12361230
if request.method == "POST":
1237-
form = Delete_Product_MemberForm(request.POST, instance=technology)
1231+
form = DeleteAppAnalysisForm(request.POST, instance=technology)
12381232
technology = form.instance
12391233
technology.delete()
12401234
messages.add_message(request,
@@ -1666,101 +1660,6 @@ def edit_notifications(request, pid):
16661660
return HttpResponseRedirect(reverse("view_product", args=(pid,)))
16671661

16681662

1669-
def add_product_member(request, pid):
1670-
product = get_object_or_404(Product, pk=pid)
1671-
memberform = Add_Product_MemberForm(initial={"product": product.id})
1672-
page_name = str(labels.ASSET_USERS_MEMBER_ADD_LABEL)
1673-
if request.method == "POST":
1674-
memberform = Add_Product_MemberForm(request.POST, initial={"product": product.id})
1675-
if memberform.is_valid():
1676-
if memberform.cleaned_data["role"].is_owner and not user_has_permission(request.user, product,
1677-
"staff_only"):
1678-
messages.add_message(request,
1679-
messages.WARNING,
1680-
_("You are not permitted to add users as owners."),
1681-
extra_tags="alert-warning")
1682-
else:
1683-
if "users" in memberform.cleaned_data and len(memberform.cleaned_data["users"]) > 0:
1684-
for user in memberform.cleaned_data["users"]:
1685-
existing_members = Product_Member.objects.filter(product=product, user=user)
1686-
if existing_members.count() == 0:
1687-
product_member = Product_Member()
1688-
product_member.product = product
1689-
product_member.user = user
1690-
product_member.role = memberform.cleaned_data["role"]
1691-
product_member.save()
1692-
messages.add_message(request,
1693-
messages.SUCCESS,
1694-
labels.ASSET_USERS_MEMBER_ADD_SUCCESS_MESSAGE,
1695-
extra_tags="alert-success")
1696-
return HttpResponseRedirect(reverse("view_product", args=(pid,)))
1697-
product_tab = Product_Tab(product, title=page_name, tab="settings")
1698-
return render(request, "dojo/new_product_member.html", {
1699-
"name": page_name,
1700-
"product": product,
1701-
"form": memberform,
1702-
"product_tab": product_tab,
1703-
})
1704-
1705-
1706-
def edit_product_member(request, memberid):
1707-
member = get_object_or_404(Product_Member, pk=memberid)
1708-
memberform = Edit_Product_MemberForm(instance=member)
1709-
page_name = str(labels.ASSET_USERS_MEMBER_UPDATE_LABEL)
1710-
if request.method == "POST":
1711-
memberform = Edit_Product_MemberForm(request.POST, instance=member)
1712-
if memberform.is_valid():
1713-
if member.role.is_owner and not user_has_permission(request.user, member.product,
1714-
"staff_only"):
1715-
messages.add_message(request,
1716-
messages.WARNING,
1717-
_("You are not permitted to make users to owners."),
1718-
extra_tags="alert-warning")
1719-
else:
1720-
memberform.save()
1721-
messages.add_message(request,
1722-
messages.SUCCESS,
1723-
labels.ASSET_USERS_MEMBER_UPDATE_SUCCESS_MESSAGE,
1724-
extra_tags="alert-success")
1725-
if is_title_in_breadcrumbs("View User"):
1726-
return HttpResponseRedirect(reverse("view_user", args=(member.user.id,)))
1727-
return HttpResponseRedirect(reverse("view_product", args=(member.product.id,)))
1728-
product_tab = Product_Tab(member.product, title=page_name, tab="settings")
1729-
return render(request, "dojo/edit_product_member.html", {
1730-
"name": page_name,
1731-
"memberid": memberid,
1732-
"form": memberform,
1733-
"product_tab": product_tab,
1734-
})
1735-
1736-
1737-
def delete_product_member(request, memberid):
1738-
member = get_object_or_404(Product_Member, pk=memberid)
1739-
memberform = Delete_Product_MemberForm(instance=member)
1740-
page_name = str(labels.ASSET_USERS_MEMBER_DELETE_LABEL)
1741-
if request.method == "POST":
1742-
memberform = Delete_Product_MemberForm(request.POST, instance=member)
1743-
member = memberform.instance
1744-
user = member.user
1745-
member.delete()
1746-
messages.add_message(request,
1747-
messages.SUCCESS,
1748-
labels.ASSET_USERS_MEMBER_DELETE_SUCCESS_MESSAGE,
1749-
extra_tags="alert-success")
1750-
if is_title_in_breadcrumbs("View User"):
1751-
return HttpResponseRedirect(reverse("view_user", args=(member.user.id,)))
1752-
if user == request.user:
1753-
return HttpResponseRedirect(reverse("product"))
1754-
return HttpResponseRedirect(reverse("view_product", args=(member.product.id,)))
1755-
product_tab = Product_Tab(member.product, title=page_name, tab="settings")
1756-
return render(request, "dojo/delete_product_member.html", {
1757-
"name": page_name,
1758-
"memberid": memberid,
1759-
"form": memberform,
1760-
"product_tab": product_tab,
1761-
})
1762-
1763-
17641663
def add_product_authorized_users(request, pid):
17651664
product = get_object_or_404(Product, pk=pid)
17661665
user_has_permission_or_403(request.user, product, Permissions.Product_Manage_Members)

dojo/templates/dojo/delete_product_member.html

Lines changed: 0 additions & 13 deletions
This file was deleted.

dojo/templates/dojo/edit_product_member.html

Lines changed: 0 additions & 13 deletions
This file was deleted.

dojo/templates/dojo/new_product_member.html

Lines changed: 0 additions & 13 deletions
This file was deleted.

dojo/templates_classic/dojo/delete_product_member.html

Lines changed: 0 additions & 13 deletions
This file was deleted.

dojo/templates_classic/dojo/edit_product_member.html

Lines changed: 0 additions & 13 deletions
This file was deleted.

dojo/templates_classic/dojo/new_product_member.html

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)