Skip to content

Commit 50c35c6

Browse files
fix delete testcases
1 parent 1aa6cf6 commit 50c35c6

7 files changed

Lines changed: 214 additions & 54 deletions

File tree

dojo/endpoint/signals.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,40 @@ def endpoint_post_delete(sender, instance, using, origin, **kwargs):
1818
with contextlib.suppress(sender.DoesNotExist):
1919
if instance == origin:
2020
description = _('The endpoint "%(name)s" was deleted') % {"name": str(instance)}
21+
user = None
22+
2123
if settings.ENABLE_AUDITLOG:
22-
if le := LogEntry.objects.filter(
23-
action=LogEntry.Action.DELETE,
24-
content_type=ContentType.objects.get(app_label="dojo", model="endpoint"),
25-
object_id=instance.id,
26-
).order_by("-id").first():
24+
# First try to find deletion author in pghistory events
25+
from dojo.pghistory_models import DojoEvents
26+
# Look for delete events for this specific endpoint instance
27+
pghistory_delete_events = DojoEvents.objects.filter(
28+
pgh_obj_model="dojo.Endpoint",
29+
pgh_obj_id=instance.id,
30+
pgh_label="delete",
31+
).order_by("-pgh_created_at")
32+
33+
if pghistory_delete_events.exists():
34+
latest_delete = pghistory_delete_events.first()
35+
# Extract user from pghistory context
36+
if latest_delete.user:
37+
from django.contrib.auth import get_user_model
38+
User = get_user_model()
39+
with contextlib.suppress(User.DoesNotExist):
40+
user = User.objects.get(id=latest_delete.user)
41+
42+
# Fall back to django-auditlog if no user found in pghistory
43+
if not user:
44+
if le := LogEntry.objects.filter(
45+
action=LogEntry.Action.DELETE,
46+
content_type=ContentType.objects.get(app_label="dojo", model="endpoint"),
47+
object_id=instance.id,
48+
).order_by("-id").first():
49+
user = le.actor
50+
51+
# Update description with user if found
52+
if user:
2753
description = _('The endpoint "%(name)s" was deleted by %(user)s') % {
28-
"name": str(instance), "user": le.actor}
54+
"name": str(instance), "user": user}
2955
create_notification(event="endpoint_deleted", # template does not exists, it will default to "other" but this event name needs to stay because of unit testing
3056
title=_("Deletion of %(name)s") % {"name": str(instance)},
3157
description=description,

dojo/engagement/signals.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,40 @@ def engagement_post_delete(sender, instance, using, origin, **kwargs):
4545
with contextlib.suppress(sender.DoesNotExist, Product.DoesNotExist):
4646
if instance == origin:
4747
description = _('The engagement "%(name)s" was deleted') % {"name": instance.name}
48+
user = None
49+
4850
if settings.ENABLE_AUDITLOG:
49-
if le := LogEntry.objects.filter(
50-
action=LogEntry.Action.DELETE,
51-
content_type=ContentType.objects.get(app_label="dojo", model="engagement"),
52-
object_id=instance.id,
53-
).order_by("-id").first():
51+
# First try to find deletion author in pghistory events
52+
from dojo.pghistory_models import DojoEvents
53+
# Look for delete events for this specific engagement instance
54+
pghistory_delete_events = DojoEvents.objects.filter(
55+
pgh_obj_model="dojo.Engagement",
56+
pgh_obj_id=instance.id,
57+
pgh_label="delete",
58+
).order_by("-pgh_created_at")
59+
60+
if pghistory_delete_events.exists():
61+
latest_delete = pghistory_delete_events.first()
62+
# Extract user from pghistory context
63+
if latest_delete.user:
64+
from django.contrib.auth import get_user_model
65+
User = get_user_model()
66+
with contextlib.suppress(User.DoesNotExist):
67+
user = User.objects.get(id=latest_delete.user)
68+
69+
# Fall back to django-auditlog if no user found in pghistory
70+
if not user:
71+
if le := LogEntry.objects.filter(
72+
action=LogEntry.Action.DELETE,
73+
content_type=ContentType.objects.get(app_label="dojo", model="engagement"),
74+
object_id=instance.id,
75+
).order_by("-id").first():
76+
user = le.actor
77+
78+
# Update description with user if found
79+
if user:
5480
description = _('The engagement "%(name)s" was deleted by %(user)s') % {
55-
"name": instance.name, "user": le.actor}
81+
"name": instance.name, "user": user}
5682
create_notification(event="engagement_deleted", # template does not exists, it will default to "other" but this event name needs to stay because of unit testing
5783
title=_("Deletion of %(name)s") % {"name": instance.name},
5884
description=description,

dojo/finding_group/signals.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import contextlib
2+
13
from auditlog.models import LogEntry
24
from django.conf import settings
35
from django.contrib.contenttypes.models import ContentType
@@ -14,14 +16,40 @@
1416
def finding_group_post_delete(sender, instance, using, origin, **kwargs):
1517
if instance == origin:
1618
description = _('The finding group "%(name)s" was deleted') % {"name": instance.name}
19+
user = None
20+
1721
if settings.ENABLE_AUDITLOG:
18-
if le := LogEntry.objects.filter(
19-
action=LogEntry.Action.DELETE,
20-
content_type=ContentType.objects.get(app_label="dojo", model="finding_group"),
21-
object_id=instance.id,
22-
).order_by("-id").first():
22+
# First try to find deletion author in pghistory events
23+
from dojo.pghistory_models import DojoEvents
24+
# Look for delete events for this specific finding_group instance
25+
pghistory_delete_events = DojoEvents.objects.filter(
26+
pgh_obj_model="dojo.Finding_Group",
27+
pgh_obj_id=instance.id,
28+
pgh_label="delete",
29+
).order_by("-pgh_created_at")
30+
31+
if pghistory_delete_events.exists():
32+
latest_delete = pghistory_delete_events.first()
33+
# Extract user from pghistory context
34+
if latest_delete.user:
35+
from django.contrib.auth import get_user_model
36+
User = get_user_model()
37+
with contextlib.suppress(User.DoesNotExist):
38+
user = User.objects.get(id=latest_delete.user)
39+
40+
# Fall back to django-auditlog if no user found in pghistory
41+
if not user:
42+
if le := LogEntry.objects.filter(
43+
action=LogEntry.Action.DELETE,
44+
content_type=ContentType.objects.get(app_label="dojo", model="finding_group"),
45+
object_id=instance.id,
46+
).order_by("-id").first():
47+
user = le.actor
48+
49+
# Update description with user if found
50+
if user:
2351
description = _('The finding group "%(name)s" was deleted by %(user)s') % {
24-
"name": instance.name, "user": le.actor}
52+
"name": instance.name, "user": user}
2553
create_notification(event="finding_group_deleted", # template does not exists, it will default to "other" but this event name needs to stay because of unit testing
2654
title=_("Deletion of %(name)s") % {"name": instance.name},
2755
description=description,

dojo/product/signals.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,40 @@ def product_post_delete(sender, instance, **kwargs):
2828
# Catch instances in async delete where a single object is deleted more than once
2929
with contextlib.suppress(sender.DoesNotExist):
3030
description = _('The product "%(name)s" was deleted') % {"name": instance.name}
31+
user = None
32+
3133
if settings.ENABLE_AUDITLOG:
32-
if le := LogEntry.objects.filter(
33-
action=LogEntry.Action.DELETE,
34-
content_type=ContentType.objects.get(app_label="dojo", model="product"),
35-
object_id=instance.id,
36-
).order_by("-id").first():
34+
# First try to find deletion author in pghistory events
35+
from dojo.pghistory_models import DojoEvents
36+
# Look for delete events for this specific product instance
37+
pghistory_delete_events = DojoEvents.objects.filter(
38+
pgh_obj_model="dojo.Product",
39+
pgh_obj_id=instance.id,
40+
pgh_label="delete",
41+
).order_by("-pgh_created_at")
42+
43+
if pghistory_delete_events.exists():
44+
latest_delete = pghistory_delete_events.first()
45+
# Extract user from pghistory context
46+
if latest_delete.user:
47+
from django.contrib.auth import get_user_model
48+
User = get_user_model()
49+
with contextlib.suppress(User.DoesNotExist):
50+
user = User.objects.get(id=latest_delete.user)
51+
52+
# Fall back to django-auditlog if no user found in pghistory
53+
if not user:
54+
if le := LogEntry.objects.filter(
55+
action=LogEntry.Action.DELETE,
56+
content_type=ContentType.objects.get(app_label="dojo", model="product"),
57+
object_id=instance.id,
58+
).order_by("-id").first():
59+
user = le.actor
60+
61+
# Update description with user if found
62+
if user:
3763
description = _('The product "%(name)s" was deleted by %(user)s') % {
38-
"name": instance.name, "user": le.actor}
64+
"name": instance.name, "user": user}
3965
create_notification(event="product_deleted", # template does not exists, it will default to "other" but this event name needs to stay because of unit testing
4066
title=_("Deletion of %(name)s") % {"name": instance.name},
4167
description=description,

dojo/product_type/signals.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,40 @@ def product_type_post_delete(sender, instance, **kwargs):
2828
# Catch instances in async delete where a single object is deleted more than once
2929
with contextlib.suppress(sender.DoesNotExist):
3030
description = _('The product type "%(name)s" was deleted') % {"name": instance.name}
31+
user = None
32+
3133
if settings.ENABLE_AUDITLOG:
32-
if le := LogEntry.objects.filter(
33-
action=LogEntry.Action.DELETE,
34-
content_type=ContentType.objects.get(app_label="dojo", model="product_type"),
35-
object_id=instance.id,
36-
).order_by("-id").first():
34+
# First try to find deletion author in pghistory events
35+
from dojo.pghistory_models import DojoEvents
36+
# Look for delete events for this specific product_type instance
37+
pghistory_delete_events = DojoEvents.objects.filter(
38+
pgh_obj_model="dojo.Product_Type",
39+
pgh_obj_id=instance.id,
40+
pgh_label="delete",
41+
).order_by("-pgh_created_at")
42+
43+
if pghistory_delete_events.exists():
44+
latest_delete = pghistory_delete_events.first()
45+
# Extract user from pghistory context
46+
if latest_delete.user:
47+
from django.contrib.auth import get_user_model
48+
User = get_user_model()
49+
with contextlib.suppress(User.DoesNotExist):
50+
user = User.objects.get(id=latest_delete.user)
51+
52+
# Fall back to django-auditlog if no user found in pghistory
53+
if not user:
54+
if le := LogEntry.objects.filter(
55+
action=LogEntry.Action.DELETE,
56+
content_type=ContentType.objects.get(app_label="dojo", model="product_type"),
57+
object_id=instance.id,
58+
).order_by("-id").first():
59+
user = le.actor
60+
61+
# Update description with user if found
62+
if user:
3763
description = _('The product type "%(name)s" was deleted by %(user)s') % {
38-
"name": instance.name, "user": le.actor}
64+
"name": instance.name, "user": user}
3965
create_notification(event="product_type_deleted", # template does not exists, it will default to "other" but this event name needs to stay because of unit testing
4066
title=_("Deletion of %(name)s") % {"name": instance.name},
4167
description=description,

dojo/test/signals.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,41 @@ def test_post_delete(sender, instance, using, origin, **kwargs):
2020
with contextlib.suppress(sender.DoesNotExist, Engagement.DoesNotExist, Product.DoesNotExist):
2121
if instance == origin:
2222
description = _('The test "%(name)s" was deleted') % {"name": str(instance)}
23+
user = None
24+
2325
if settings.ENABLE_AUDITLOG:
24-
if le := LogEntry.objects.filter(
25-
action=LogEntry.Action.DELETE,
26-
content_type=ContentType.objects.get(app_label="dojo", model="test"),
27-
object_id=instance.id,
28-
).order_by("-id").first():
26+
# First try to find deletion author in pghistory events
27+
from dojo.pghistory_models import DojoEvents
28+
# Look for delete events for this specific test instance
29+
pghistory_delete_events = DojoEvents.objects.filter(
30+
pgh_obj_model="dojo.Test",
31+
pgh_obj_id=instance.id,
32+
pgh_label="delete",
33+
).order_by("-pgh_created_at")
34+
35+
if pghistory_delete_events.exists():
36+
latest_delete = pghistory_delete_events.first()
37+
# Extract user from pghistory context
38+
if latest_delete.user:
39+
from django.contrib.auth import get_user_model
40+
User = get_user_model()
41+
with contextlib.suppress(User.DoesNotExist):
42+
user = User.objects.get(id=latest_delete.user)
43+
44+
# Fall back to django-auditlog if no user found in pghistory
45+
if not user:
46+
if le := LogEntry.objects.filter(
47+
action=LogEntry.Action.DELETE,
48+
content_type=ContentType.objects.get(app_label="dojo", model="test"),
49+
object_id=instance.id,
50+
).order_by("-id").first():
51+
user = le.actor
52+
53+
# Update description with user if found
54+
if user:
2955
description = _('The test "%(name)s" was deleted by %(user)s') % {
30-
"name": str(instance), "user": le.actor}
56+
"name": str(instance), "user": user}
57+
3158
create_notification(event="test_deleted", # Template does not exist, it will default to "other" but this event name needs to stay because of unit testing
3259
title=_("Deletion of %(name)s") % {"name": str(instance)},
3360
description=description,

0 commit comments

Comments
 (0)