Skip to content

Commit 8162bfd

Browse files
committed
Merge remote-tracking branch 'upstream/dev' into perm-cleanup
# Conflicts: # dojo/forms.py # dojo/github/ui/views.py
2 parents b039303 + 7ea54d4 commit 8162bfd

128 files changed

Lines changed: 2012 additions & 1380 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Dockerfile.django-debian

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# Dockerfile.nginx to use the caching mechanism of Docker.
66

77
# Ref: https://devguide.python.org/#branchstatus
8-
FROM python:3.13.13-slim-trixie@sha256:9213d136547f0602c3337ff48291e937f9cc43060b3e123402cf2aaff1a08b75 AS base
8+
FROM python:3.13.13-slim-trixie@sha256:d2462a6bed37b4fc6cabecf5a2132ae70df772fe03c7393c4d98a0c2fb48aa2e AS base
99
FROM base AS build
1010
WORKDIR /app
1111
RUN \

Dockerfile.integration-tests-debian

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

22
# code: language=Dockerfile
33

4-
FROM openapitools/openapi-generator-cli:v7.21.0@sha256:ce308310f3c1f8761e65338b8ab87b651bf4862c6acb80de510f381fffc4510b AS openapitools
4+
FROM openapitools/openapi-generator-cli:v7.22.0@sha256:1f459499a7c794aa0ea769c3c9b0eb54806c5ad2f68510a0ebb9338d0a626ced AS openapitools
55
# currently only supports x64, no arm yet due to chrome and selenium dependencies
6-
FROM python:3.13.13-slim-trixie@sha256:9213d136547f0602c3337ff48291e937f9cc43060b3e123402cf2aaff1a08b75 AS build
6+
FROM python:3.13.13-slim-trixie@sha256:d2462a6bed37b4fc6cabecf5a2132ae70df772fe03c7393c4d98a0c2fb48aa2e AS build
77
WORKDIR /app
88
RUN \
99
apt-get -y update && \

components/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"chosen-bootstrap": "https://github.com/dbtek/chosen-bootstrap",
1313
"chosen-js": "^1.8.7",
1414
"clipboard": "^2.0.11",
15-
"datatables.net": "^2.3.7",
15+
"datatables.net": "^2.3.8",
1616
"datatables.net-buttons-bs": "^3.2.6",
1717
"datatables.net-colreorder": "^2.1.2",
1818
"drmonty-datatables-plugins": "^1.0.0",

components/yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,10 @@ datatables.net@2.3.2:
167167
dependencies:
168168
jquery ">=1.7"
169169

170-
datatables.net@^2, datatables.net@^2.3.7:
171-
version "2.3.7"
172-
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.7.tgz#3cd34f6f5d1f40a46b5a20a4ba32604bdbcd6738"
173-
integrity sha512-AvsjG/Nkp6OxeyBKYZauemuzQCPogE1kOtKwG4sYjvdqGCSLiGaJagQwXv4YxG+ts5vaJr6qKGG9ec3g6vTo3w==
170+
datatables.net@^2, datatables.net@^2.3.8:
171+
version "2.3.8"
172+
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.8.tgz#55a8dbe3bd2196951c498ab79bf44602a2bf3229"
173+
integrity sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg==
174174
dependencies:
175175
jquery ">=1.7"
176176

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
title: 'Upgrading to DefectDojo Version 2.58.x'
3+
toc_hide: true
4+
weight: -20260504
5+
description: Notification .tpl templates relocated under dojo/notifications/
6+
---
7+
8+
## Notification `.tpl` templates relocated
9+
10+
The notification domain has been consolidated under a new `dojo/notifications/` package, and the 62 channel `.tpl` templates that drive alert, mail, MS Teams, Slack, and webhook notifications have moved on disk. The Django template lookup name (e.g. `notifications/mail/scan_added.tpl`) is unchanged, so most customizations keep working without any edits — but operators who override `.tpl` files by mounting them into the source tree need to update their paths.
11+
12+
### What moved
13+
14+
The channel templates under `alert/`, `mail/`, `msteams/`, `slack/`, `webhooks/`, and `webhooks_summary/` have been relocated:
15+
16+
| Old on-disk location | New on-disk location |
17+
| --- | --- |
18+
| `dojo/templates/notifications/{channel}/{event}.tpl` | `dojo/notifications/templates/notifications/{channel}/{event}.tpl` |
19+
20+
For example, `dojo/templates/notifications/mail/scan_added.tpl` now lives at `dojo/notifications/templates/notifications/mail/scan_added.tpl`. A new `TEMPLATES["DIRS"]` entry pointing at `dojo/notifications/templates/` is registered automatically, so the lookup path used by `render_to_string()` (e.g. `notifications/slack/sla_breach.tpl`) resolves exactly as before.
21+
22+
### Required actions
23+
24+
- **Customizing `.tpl` files via your own templates directory (recommended pattern):** No action required. Overrides resolved by lookup name continue to take precedence.
25+
- **Customizing `.tpl` files via a Docker volume mount or in-tree patch at the old `dojo/templates/notifications/...` path:** Update the mount/patch target to the new `dojo/notifications/templates/notifications/...` path, or move your override into a project-level templates directory keyed by the lookup name.
26+
- **No customizations:** No action required.
27+
28+
For more information, check the [Release Notes](https://github.com/DefectDojo/django-DefectDojo/releases/tag/2.58.0).

docs/package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dojo/api_v2/serializers.py

Lines changed: 3 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from rest_framework import serializers
2222
from rest_framework.exceptions import NotFound
2323
from rest_framework.exceptions import ValidationError as RestFrameworkValidationError
24-
from rest_framework.fields import DictField, MultipleChoiceField
24+
from rest_framework.fields import DictField
2525

2626
import dojo.finding.helper as finding_helper
2727
import dojo.risk_acceptance.helper as ra_helper
@@ -52,9 +52,7 @@
5252
from dojo.jira import services as jira_services
5353
from dojo.location.models import Location, LocationFindingReference
5454
from dojo.models import (
55-
DEFAULT_NOTIFICATION,
5655
IMPORT_ACTIONS,
57-
NOTIFICATION_CHOICES,
5856
SEVERITIES,
5957
SEVERITY_CHOICES,
6058
STATS_FIELDS,
@@ -89,8 +87,6 @@
8987
Note_Type,
9088
NoteHistory,
9189
Notes,
92-
Notification_Webhooks,
93-
Notifications,
9490
Product,
9591
Product_API_Scan_Configuration,
9692
Product_Type,
@@ -3071,110 +3067,7 @@ class FindingNoteSerializer(serializers.Serializer):
30713067
note_id = serializers.IntegerField()
30723068

30733069

3074-
class NotificationsSerializer(serializers.ModelSerializer):
3075-
product = serializers.PrimaryKeyRelatedField(
3076-
queryset=Product.objects.all(),
3077-
required=False,
3078-
default=None,
3079-
allow_null=True,
3080-
)
3081-
user = serializers.PrimaryKeyRelatedField(
3082-
queryset=Dojo_User.objects.all(),
3083-
required=False,
3084-
default=None,
3085-
allow_null=True,
3086-
)
3087-
product_type_added = MultipleChoiceField(
3088-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3089-
)
3090-
product_added = MultipleChoiceField(
3091-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3092-
)
3093-
engagement_added = MultipleChoiceField(
3094-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3095-
)
3096-
test_added = MultipleChoiceField(
3097-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3098-
)
3099-
scan_added = MultipleChoiceField(
3100-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3101-
)
3102-
jira_update = MultipleChoiceField(
3103-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3104-
)
3105-
upcoming_engagement = MultipleChoiceField(
3106-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3107-
)
3108-
stale_engagement = MultipleChoiceField(
3109-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3110-
)
3111-
auto_close_engagement = MultipleChoiceField(
3112-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3113-
)
3114-
close_engagement = MultipleChoiceField(
3115-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3116-
)
3117-
user_mentioned = MultipleChoiceField(
3118-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3119-
)
3120-
code_review = MultipleChoiceField(
3121-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3122-
)
3123-
review_requested = MultipleChoiceField(
3124-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3125-
)
3126-
other = MultipleChoiceField(
3127-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3128-
)
3129-
sla_breach = MultipleChoiceField(
3130-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3131-
)
3132-
sla_breach_combined = MultipleChoiceField(
3133-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3134-
)
3135-
risk_acceptance_expiration = MultipleChoiceField(
3136-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3137-
)
3138-
template = serializers.BooleanField(default=False)
3139-
3140-
class Meta:
3141-
model = Notifications
3142-
fields = "__all__"
3143-
3144-
def validate(self, data):
3145-
user = None
3146-
product = None
3147-
template = False
3148-
3149-
if self.instance is not None:
3150-
user = self.instance.user
3151-
product = self.instance.product
3152-
3153-
if "user" in data:
3154-
user = data.get("user")
3155-
if "product" in data:
3156-
product = data.get("product")
3157-
if "template" in data:
3158-
template = data.get("template")
3159-
3160-
if (
3161-
template
3162-
and Notifications.objects.filter(template=True).count() > 0
3163-
):
3164-
msg = "Notification template already exists"
3165-
raise ValidationError(msg)
3166-
if (
3167-
self.instance is None
3168-
or user != self.instance.user
3169-
or product != self.instance.product
3170-
):
3171-
notifications = Notifications.objects.filter(
3172-
user=user, product=product, template=template,
3173-
).count()
3174-
if notifications > 0:
3175-
msg = "Notification for user and product already exists"
3176-
raise ValidationError(msg)
3177-
return data
3070+
from dojo.notifications.api.serializer import NotificationsSerializer # noqa: E402, F401 -- backward compat
31783071

31793072

31803073
class EngagementPresetsSerializer(serializers.ModelSerializer):
@@ -3351,7 +3244,4 @@ def create(self, validated_data):
33513244
raise
33523245

33533246

3354-
class NotificationWebhooksSerializer(serializers.ModelSerializer):
3355-
class Meta:
3356-
model = Notification_Webhooks
3357-
fields = "__all__"
3247+
from dojo.notifications.api.serializer import NotificationWebhooksSerializer # noqa: E402, F401 -- backward compat

dojo/api_v2/views.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,6 @@
126126
Note_Type,
127127
NoteHistory,
128128
Notes,
129-
Notification_Webhooks,
130-
Notifications,
131129
Product,
132130
Product_API_Scan_Configuration,
133131
Product_Type,
@@ -3408,21 +3406,6 @@ def queue_task_purge(self, request):
34083406
return Response({"purged": purged})
34093407

34103408

3411-
# Authorization: superuser
3412-
@extend_schema_view(**schema_with_prefetch())
3413-
class NotificationsViewSet(
3414-
PrefetchDojoModelViewSet,
3415-
):
3416-
serializer_class = serializers.NotificationsSerializer
3417-
queryset = Notifications.objects.none()
3418-
filter_backends = (DjangoFilterBackend,)
3419-
filterset_fields = ["id", "user", "product", "template"]
3420-
permission_classes = (permissions.IsSuperUser, DjangoModelPermissions)
3421-
3422-
def get_queryset(self):
3423-
return Notifications.objects.all().order_by("id")
3424-
3425-
34263409
@extend_schema_view(**schema_with_prefetch())
34273410
class EngagementPresetsViewset(
34283411
PrefetchDojoModelViewSet,
@@ -3685,13 +3668,3 @@ class AnnouncementViewSet(
36853668

36863669
def get_queryset(self):
36873670
return Announcement.objects.all().order_by("id")
3688-
3689-
3690-
class NotificationWebhooksViewSet(
3691-
PrefetchDojoModelViewSet,
3692-
):
3693-
serializer_class = serializers.NotificationWebhooksSerializer
3694-
queryset = Notification_Webhooks.objects.all()
3695-
filter_backends = (DjangoFilterBackend,)
3696-
filterset_fields = "__all__"
3697-
permission_classes = (permissions.IsSuperUser, DjangoModelPermissions) # TODO: add permission also for other users

dojo/apps.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ def ready(self):
8484
import dojo.file_uploads.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8585
import dojo.finding_group.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8686
import dojo.notes.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
87+
import dojo.notifications.admin # noqa: PLC0415, F401 raised: AppRegistryNotReady
88+
import dojo.notifications.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8789
import dojo.product.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8890
import dojo.product_type.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8991
import dojo.risk_acceptance.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady

dojo/authorization/url_permissions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@
324324
"edit_dev_env": [("config", "dojo.change_development_environment")],
325325

326326
# -----------------------------------------------------------------------
327-
# GitHub Issue Link (dojo/github_issue_link/views.py)
327+
# GitHub Issue Link (dojo/github/ui/views.py)
328328
# -----------------------------------------------------------------------
329329
"add_github": [("config", "dojo.add_github_conf")],
330330
"github": [("config", "dojo.view_github_conf")],

0 commit comments

Comments
 (0)