diff --git a/docker-compose.yml b/docker-compose.yml index ada66ba1a57..19e475a6f34 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -57,6 +57,7 @@ services: - type: bind source: ./docker/extra_settings target: /app/docker/extra_settings + - "defectdojo_media:${DD_MEDIA_ROOT:-/app/media}" celerybeat: image: "defectdojo/defectdojo-django:${DJANGO_VERSION:-latest}" diff --git a/dojo/engagement/views.py b/dojo/engagement/views.py index 706210b569c..10708bccdae 100644 --- a/dojo/engagement/views.py +++ b/dojo/engagement/views.py @@ -360,7 +360,7 @@ def delete_engagement(request, eid): messages.SUCCESS, message, extra_tags="alert-success") - return HttpResponseRedirect(reverse("view_engagements", args=(product.id, ))) + return HttpResponseRedirect(reverse("view_product", args=(product.id, ))) rels = ["Previewing the relationships has been disabled.", ""] display_preview = get_setting("DELETE_PREVIEW") diff --git a/dojo/models.py b/dojo/models.py index 282a8c4d667..32375bdb058 100644 --- a/dojo/models.py +++ b/dojo/models.py @@ -1580,6 +1580,13 @@ def __str__(self): def get_absolute_url(self): return reverse("view_engagement", args=[str(self.id)]) + @property + def engagement_id(self): + try: + return f"ENG-{self.id:03d}" + except Exception: + return str(self.id) + def copy(self): copy = copy_model_util(self) # Save the necessary ManyToMany relationships diff --git a/dojo/settings/settings.dist.py b/dojo/settings/settings.dist.py index f13696c586b..ef02fc5defb 100644 --- a/dojo/settings/settings.dist.py +++ b/dojo/settings/settings.dist.py @@ -1846,6 +1846,10 @@ def saml2_attrib_map_format(din): # Maximum size of a scan file in MB SCAN_FILE_MAX_SIZE = env("DD_SCAN_FILE_MAX_SIZE") +# Engagement ID format +# Example: "ENG-{id:04d}" +ENGAGEMENT_ID_FORMAT = env("DD_ENGAGEMENT_ID_FORMAT", default="ENG-{id:04d}") + # Apply a severity level to "Security Weaknesses" in Qualys WAS QUALYS_WAS_WEAKNESS_IS_VULN = env("DD_QUALYS_WAS_WEAKNESS_IS_VULN") diff --git a/dojo/templates/dojo/engagement.html b/dojo/templates/dojo/engagement.html index 684b0777a73..cdda4bea561 100644 --- a/dojo/templates/dojo/engagement.html +++ b/dojo/templates/dojo/engagement.html @@ -4,202 +4,217 @@ {% load authorization_tags %} {% block content %} - {{ block.super }} -
| - | {{ labels.ASSET_LABEL }} | -{{ labels.ASSET_LABEL }} | -Engagement Name | - {% if system_settings.enable_jira %} -JIRA | - {% endif %} -Status | -Period | -Lead | -Tests | -Engagement | -
|---|
| + | {{ labels.ASSET_LABEL }} | +{{ labels.ASSET_LABEL }} | + +Engagement Name | + {% if system_settings.enable_jira %} +JIRA | + {% endif %} +Status | +Period | +Lead | +Tests | +Engagement | +
|---|---|---|---|---|---|---|---|---|---|
| - | -{{ p.name }} - {% include "dojo/snippets/tags.html" with tags=p.tags.all %} - | -- {{ p.prod_type.name }} - | -
- {% if e.name %}{{ e.name }}{% endif %}
- {% include "dojo/snippets/tags.html" with tags=e.tags.all %}
- - |
- {% if system_settings.enable_jira %}
- - {{ e|jira_project_tag }} - | - {% endif %} -{{ e.status }} | - {{ e.target_start }} - {{ e.target_end }}
- {% if e.is_overdue and e.active and e.status != 'Completed' %}
- {{ e.target_end|overdue }} overdue
+ | |||
| + | -{{ e.lead.first_name }} {{ e.lead.last_name }} | -- - {{ e.test_count }} - - | -
- {% if p|has_object_permission:"Engagement_Add" %}
-
- Add
-
+ {% if e|has_object_permission:"Test_Add" %}
+ |
- {{ p.name }} + {% include "dojo/snippets/tags.html" with tags=p.tags.all %} + | ++ {{ p.prod_type.name }} + | + +
+ {% if e.name %}{{ e.name }}{%
+ endif %}
+ {% include "dojo/snippets/tags.html" with tags=e.tags.all %}
+ + |
+ {% if system_settings.enable_jira %}
+ + {{ e|jira_project_tag }} + | + {% endif %} +{{ e.status }} | + {{ e.target_start }} - {{ e.target_end }}
+ {% if e.is_overdue and e.active and e.status != 'Completed' %}
+
+ {{ e.target_end|overdue }} overdue
+
+ {% endif %}
+ |
+ {{ e.lead.first_name }} {{ e.lead.last_name }} | ++ + {{ e.test_count }} + + | ++ {% if p|has_object_permission:"Engagement_Add" %} + + Add + + {% endif %} + | + - {% endfor %} - {% endfor %} - -
| - | Name | -Type | -Lead | -Date | -Length | - {% if system_settings.enable_jira %} -JIRA | - {% endif %} -Tests | -Active (Verified / Fixable) | -Mitigated | -Accepted | -All | -Duplicates | - {% if status == "paused" or status == "closed" %} -Status | - {% endif %} -||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| - | -- - {{ eng.name|truncatechars_html:35|default:"N/A" }} - {% if eng.version %} - - - {{ eng.version }} - - {% endif %} - {% include "dojo/snippets/tags.html" with tags=eng.tags.all %} - | -{{ eng.engagement_type }} | -- {% if eng.lead.get_full_name and eng.lead.get_full_name.strip %} - {{ eng.lead.get_full_name }} - {% else %} - {{ eng.lead |default_if_none:""}} - {% endif %} - | -
-
- {{ eng.target_start|date:"jS F" }} {% if eng.target_start|datediff_time:eng.target_end != "1 day" %} - {{ eng.target_end|date:"jS F" }}{% endif %}
+
+ {% include "dojo/paging_snippet.html" with page=engs prefix=prefix page_size=True %}
+
+ {% if engs %}
+
-
+ {% else %}
+ {{ eng.count_tests }}
+ {% endif %}
- {% endif %}
+ No {% if status == "open" %}active{% elif status == "paused" %}paused{% else %}closed{% endif %} engagements found. + (last {{recent_test_day_count}} day{{recent_test_day_count|pluralize}}) + + + {% for test in eng.test_set.all %} + |
+ {{ eng.count_findings_open }} ({{ + eng.count_findings_open_verified}}/{{ eng.count_findings_fix_available}}) | +{{ eng.count_findings_close }} | +{{ eng.count_findings_accepted }} | +{{ eng.count_findings_all }} | +{{ eng.count_findings_duplicate }} | + {% if status == "paused" or status == "closed" %} ++ {% if eng.status == "Blocked" %} + + {% elif eng.status == "On Hold" %} + + {% else %} + + {% endif %} + {{ eng.status }} + + | + {% endif %} + {% endfor %} +
No {% if status == "open" %}active{% elif status == "paused" %}paused{% else %}closed{% + endif %} engagements found.
+