wbcompliance 1.54.17__tar.gz → 1.58.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/PKG-INFO +1 -1
  2. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/filters/risk_management/checks.py +8 -0
  3. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/compliance_task.py +5 -5
  4. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/enums.py +1 -1
  5. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/risk_management/checks.py +6 -3
  6. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/risk_management/incidents.py +8 -3
  7. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/risk_management/mixins.py +2 -2
  8. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/risk_management/rules.py +6 -3
  9. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/serializers/risk_management/checks.py +1 -1
  10. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/disable_signals.py +11 -10
  11. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/test_views.py +1 -1
  12. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/buttons/compliance_form.py +3 -3
  13. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/buttons/compliance_task.py +14 -14
  14. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/risk_management/checks.py +14 -3
  15. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/risk_management/mixins.py +1 -1
  16. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/.gitignore +0 -0
  17. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/pyproject.toml +0 -0
  18. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/__init__.py +0 -0
  19. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/__init__.py +0 -0
  20. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/compliance_form.py +0 -0
  21. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/compliance_task.py +0 -0
  22. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/compliance_type.py +0 -0
  23. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/risk_management/__init__.py +0 -0
  24. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/risk_management/checks.py +0 -0
  25. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/risk_management/incidents.py +0 -0
  26. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/risk_management/rules.py +0 -0
  27. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/admin/utils.py +0 -0
  28. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/apps.py +0 -0
  29. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/factories/__init__.py +0 -0
  30. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/factories/compliance.py +0 -0
  31. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/factories/risk_management/__init__.py +0 -0
  32. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/factories/risk_management/backends.py +0 -0
  33. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/factories/risk_management/checks.py +0 -0
  34. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/factories/risk_management/incidents.py +0 -0
  35. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/factories/risk_management/rules.py +0 -0
  36. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/filters/__init__.py +0 -0
  37. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/filters/compliances.py +0 -0
  38. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/filters/risk_management/__init__.py +0 -0
  39. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/filters/risk_management/incidents.py +0 -0
  40. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/filters/risk_management/rules.py +0 -0
  41. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/filters/risk_management/tables.py +0 -0
  42. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/filters/risk_management/utils.py +0 -0
  43. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/fixtures/compliance.yaml +0 -0
  44. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/locale/de/LC_MESSAGES/django.mo +0 -0
  45. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/locale/de/LC_MESSAGES/django.po +0 -0
  46. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/locale/en/LC_MESSAGES/django.mo +0 -0
  47. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/locale/en/LC_MESSAGES/django.po +0 -0
  48. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/locale/fr/LC_MESSAGES/django.mo +0 -0
  49. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/locale/fr/LC_MESSAGES/django.po +0 -0
  50. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/management/__init__.py +0 -0
  51. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0001_initial_squashed_squashed_0010_alter_checkedobjectincidentrelationship_resolved_by_and_more.py +0 -0
  52. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0011_alter_riskrule_parameters.py +0 -0
  53. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0012_alter_compliancetype_options.py +0 -0
  54. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0013_alter_riskrule_unique_together.py +0 -0
  55. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0014_alter_reviewcompliancetask_year.py +0 -0
  56. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0015_auto_20240103_0957.py +0 -0
  57. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0016_checkedobjectincidentrelationship_report_details_and_more.py +0 -0
  58. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0017_alter_rulebackend_incident_report_template.py +0 -0
  59. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0018_alter_rulecheckedobjectrelationship_unique_together.py +0 -0
  60. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0019_rulegroup_riskrule_activation_date_and_more.py +0 -0
  61. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0020_rename_trigger_content_type_riskcheck_checked_object_content_type_and_more.py +0 -0
  62. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/0021_riskcheck_passive_check.py +0 -0
  63. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/migrations/__init__.py +0 -0
  64. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/__init__.py +0 -0
  65. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/compliance_form.py +0 -0
  66. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/compliance_type.py +0 -0
  67. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/risk_management/__init__.py +0 -0
  68. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/risk_management/backend.py +0 -0
  69. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/models/risk_management/dispatch.py +0 -0
  70. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/permissions.py +0 -0
  71. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/serializers/__init__.py +0 -0
  72. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/serializers/compliance_form.py +0 -0
  73. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/serializers/compliance_task.py +0 -0
  74. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/serializers/compliance_type.py +0 -0
  75. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/serializers/risk_management/__init__.py +0 -0
  76. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/serializers/risk_management/incidents.py +0 -0
  77. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/serializers/risk_management/rules.py +0 -0
  78. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tasks.py +0 -0
  79. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/templates/compliance/compliance_form.html +0 -0
  80. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/templates/compliance/review_compliance_task_report.html +0 -0
  81. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/templates/risk_management/incident_notification.html +0 -0
  82. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/templates/risk_management/incident_report.html +0 -0
  83. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/__init__.py +0 -0
  84. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/conftest.py +0 -0
  85. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/mixins.py +0 -0
  86. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/risk_management/__init__.py +0 -0
  87. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/risk_management/models/__init__.py +0 -0
  88. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/risk_management/models/test_backends.py +0 -0
  89. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/risk_management/models/test_checks.py +0 -0
  90. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/risk_management/models/test_incidents.py +0 -0
  91. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/risk_management/models/test_rules.py +0 -0
  92. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/signals.py +0 -0
  93. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/test_filters.py +0 -0
  94. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/test_models.py +0 -0
  95. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/test_serializers.py +0 -0
  96. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/tests/tests.py +0 -0
  97. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/urls.py +0 -0
  98. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/__init__.py +0 -0
  99. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/buttons/__init__.py +0 -0
  100. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/buttons/risk_managment/__init__.py +0 -0
  101. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/buttons/risk_managment/checks.py +0 -0
  102. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/buttons/risk_managment/incidents.py +0 -0
  103. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/buttons/risk_managment/rules.py +0 -0
  104. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/compliance_form.py +0 -0
  105. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/compliance_task.py +0 -0
  106. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/compliance_type.py +0 -0
  107. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/__init__.py +0 -0
  108. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/compliance_form.py +0 -0
  109. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/compliance_task.py +0 -0
  110. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/compliance_type.py +0 -0
  111. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/risk_managment/__init__.py +0 -0
  112. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/risk_managment/checks.py +0 -0
  113. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/risk_managment/incidents.py +0 -0
  114. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/risk_managment/rules.py +0 -0
  115. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/display/risk_managment/tables.py +0 -0
  116. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/__init__.py +0 -0
  117. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/compliance_form.py +0 -0
  118. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/compliance_task.py +0 -0
  119. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/compliance_type.py +0 -0
  120. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/risk_managment/__init__.py +0 -0
  121. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/risk_managment/checks.py +0 -0
  122. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/risk_managment/incidents.py +0 -0
  123. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/risk_managment/rules.py +0 -0
  124. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/endpoints/risk_managment/tables.py +0 -0
  125. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/menu/__init__.py +0 -0
  126. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/menu/compliance_form.py +0 -0
  127. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/menu/compliance_task.py +0 -0
  128. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/menu/compliance_type.py +0 -0
  129. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/menu/risk_management.py +0 -0
  130. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/risk_management/__init__.py +0 -0
  131. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/risk_management/incidents.py +0 -0
  132. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/risk_management/rules.py +0 -0
  133. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/risk_management/tables.py +0 -0
  134. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/__init__.py +0 -0
  135. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/compliance_form.py +0 -0
  136. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/compliance_task.py +0 -0
  137. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/compliance_type.py +0 -0
  138. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/risk_managment/__init__.py +0 -0
  139. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/risk_managment/checks.py +0 -0
  140. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/risk_managment/incidents.py +0 -0
  141. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/risk_managment/rules.py +0 -0
  142. {wbcompliance-1.54.17 → wbcompliance-1.58.2}/wbcompliance/viewsets/titles/risk_managment/tables.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbcompliance
3
- Version: 1.54.17
3
+ Version: 1.58.2
4
4
  Summary: A workbench module for managing compliance.
5
5
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
6
6
  Requires-Dist: wbcore
@@ -12,6 +12,14 @@ class RiskCheckFilterSet(wb_filters.FilterSet):
12
12
  distinct=True,
13
13
  hidden=True,
14
14
  )
15
+ activators = wb_filters.MultipleChoiceContentTypeFilter(
16
+ label="Activators",
17
+ field_name="activators",
18
+ object_id_label="activator_id",
19
+ content_type_label="activator_content_type",
20
+ distinct=True,
21
+ hidden=True,
22
+ )
15
23
  passive_check = wb_filters.BooleanFilter(initial=True, required=True, label="Passive")
16
24
 
17
25
  class Meta:
@@ -75,7 +75,7 @@ class ComplianceTask(WBModel):
75
75
  @classmethod
76
76
  def get_color_map(cls) -> list:
77
77
  colors = [WBColor.GREEN_LIGHT.value, WBColor.YELLOW_LIGHT.value, WBColor.RED_LIGHT.value]
78
- return [choice for choice in zip(cls, colors)]
78
+ return [choice for choice in zip(cls, colors, strict=False)]
79
79
 
80
80
  title = models.CharField(max_length=255, verbose_name=_("Title"))
81
81
  description = models.TextField(default="", blank=True, verbose_name=_("Description"))
@@ -171,7 +171,7 @@ class ComplianceTaskInstance(models.Model):
171
171
  WBColor.BLUE_LIGHT.value,
172
172
  WBColor.RED_LIGHT.value,
173
173
  ]
174
- return [choice for choice in zip(cls, colors)]
174
+ return [choice for choice in zip(cls, colors, strict=False)]
175
175
 
176
176
  task = models.ForeignKey(
177
177
  on_delete=models.CASCADE,
@@ -235,7 +235,7 @@ class ComplianceAction(models.Model):
235
235
  @classmethod
236
236
  def get_color_map(cls) -> list:
237
237
  colors = [WBColor.GREY.value, WBColor.YELLOW_LIGHT.value, WBColor.GREEN_LIGHT.value]
238
- return [choice for choice in zip(cls, colors)]
238
+ return [choice for choice in zip(cls, colors, strict=False)]
239
239
 
240
240
  title = models.CharField(max_length=255, verbose_name=_("Title"))
241
241
  description = models.TextField(
@@ -310,7 +310,7 @@ class ComplianceEvent(models.Model):
310
310
  @classmethod
311
311
  def get_color_map(cls) -> list:
312
312
  colors = [WBColor.GREY.value, WBColor.BLUE_LIGHT.value]
313
- return [choice for choice in zip(cls, colors)]
313
+ return [choice for choice in zip(cls, colors, strict=False)]
314
314
 
315
315
  type_event = models.CharField(
316
316
  max_length=32,
@@ -414,7 +414,7 @@ class ReviewComplianceTask(ComplianceDocumentMixin, ComplexToStringMixin, WBMode
414
414
  WBColor.YELLOW_LIGHT.value,
415
415
  WBColor.GREEN_LIGHT.value,
416
416
  ]
417
- return [choice for choice in zip(cls, colors)]
417
+ return [choice for choice in zip(cls, colors, strict=False)]
418
418
 
419
419
  class Meta:
420
420
  verbose_name = "Review Compliance Task"
@@ -10,4 +10,4 @@ class IncidentSeverity(models.TextChoices):
10
10
  @classmethod
11
11
  def get_color_map(cls) -> list:
12
12
  colors = [WBColor.GREEN_LIGHT.value, WBColor.YELLOW_LIGHT.value, WBColor.RED_LIGHT.value]
13
- return [choice for choice in zip(cls, colors)]
13
+ return [choice for choice in zip(cls, colors, strict=False)]
@@ -99,9 +99,12 @@ class RiskCheck(ComplexToStringMixin, WBModel):
99
99
  @property
100
100
  def needs_incident(self) -> bool:
101
101
  # if the there is a similar checked object relationship, we needs to create a general incident if the check evaluates to a breach
102
- return self.rule.checked_object_relationships.filter(
103
- checked_object_content_type=self.checked_object_content_type, checked_object_id=self.checked_object_id
104
- ).exists()
102
+ return (
103
+ self.rule.checked_object_relationships.filter(
104
+ checked_object_content_type=self.checked_object_content_type, checked_object_id=self.checked_object_id
105
+ ).exists()
106
+ or self.activator_id is not None
107
+ )
105
108
 
106
109
  @property
107
110
  def previous_check(self) -> Self | None:
@@ -29,7 +29,6 @@ from wbcore.metadata.configs.buttons import ActionButton, ButtonDefaultColor
29
29
  from wbcore.metadata.configs.display.instance_display.shortcuts import (
30
30
  create_simple_display,
31
31
  )
32
- from wbcore.models import WBModel
33
32
  from wbcore.utils.models import ComplexToStringMixin
34
33
 
35
34
  User: BaseUser = get_user_model()
@@ -109,7 +108,7 @@ class RiskIncidentMixin(models.Model):
109
108
  abstract = True
110
109
 
111
110
 
112
- class CheckedObjectIncidentRelationship(ComplexToStringMixin, RiskIncidentMixin, WBModel):
111
+ class CheckedObjectIncidentRelationship(ComplexToStringMixin, RiskIncidentMixin):
113
112
  incident = models.ForeignKey(
114
113
  to="wbcompliance.RiskIncident",
115
114
  related_name="checked_object_relationships",
@@ -229,6 +228,9 @@ class CheckedObjectIncidentRelationship(ComplexToStringMixin, RiskIncidentMixin,
229
228
  models.Index(fields=["incident", "rule_check"]),
230
229
  ]
231
230
 
231
+ def __str__(self) -> str:
232
+ return super().__str__()
233
+
232
234
  def compute_str(self) -> str:
233
235
  return _("{} {} Sub Incident for checked_object {}").format(self.status, self.severity, self.rule_check)
234
236
 
@@ -259,7 +261,7 @@ class RiskIncidentDefaultManager(models.Manager):
259
261
  )
260
262
 
261
263
 
262
- class RiskIncident(ComplexToStringMixin, RiskIncidentMixin, WBModel):
264
+ class RiskIncident(ComplexToStringMixin, RiskIncidentMixin):
263
265
  """
264
266
  Instance defining the incident that has happened during a check initiated by a certain rule
265
267
  """
@@ -382,6 +384,9 @@ class RiskIncident(ComplexToStringMixin, RiskIncidentMixin, WBModel):
382
384
  )
383
385
  ]
384
386
 
387
+ def __str__(self) -> str:
388
+ return super().__str__()
389
+
385
390
  def save(self, *args, **kwargs):
386
391
  if not self.breached_object_repr:
387
392
  self.breached_object_repr = str(self.breached_content_object)
@@ -97,8 +97,8 @@ class RiskCheckMixin(models.Model):
97
97
  )[0]
98
98
  if asynchronously:
99
99
  transaction.on_commit(
100
- lambda: evaluate_as_task.delay(
101
- check.id, *dto, override_incident=True, ignore_informational_threshold=True
100
+ lambda check_id=check.id: evaluate_as_task.delay(
101
+ check_id, *dto, override_incident=True, ignore_informational_threshold=True
102
102
  )
103
103
  )
104
104
  else:
@@ -47,6 +47,9 @@ class RuleGroup(models.Model):
47
47
  self.name = self.key.title()
48
48
  super().save(*args, **kwargs)
49
49
 
50
+ def __str__(self) -> str:
51
+ return self.name
52
+
50
53
  @classmethod
51
54
  def get_representation_endpoint(cls) -> str:
52
55
  return "wbcompliance:rulegrouprepresentation-list"
@@ -60,7 +63,7 @@ class RuleGroup(models.Model):
60
63
  return "{{name}}"
61
64
 
62
65
 
63
- class RuleCheckedObjectRelationship(ComplexToStringMixin, models.Model):
66
+ class RuleCheckedObjectRelationship(ComplexToStringMixin):
64
67
  rule = models.ForeignKey(
65
68
  to="wbcompliance.RiskRule", related_name="checked_object_relationships", on_delete=models.CASCADE
66
69
  )
@@ -261,7 +264,7 @@ class RuleBackend(models.Model):
261
264
  return "{{name}}"
262
265
 
263
266
 
264
- class RuleThreshold(ComplexToStringMixin, models.Model):
267
+ class RuleThreshold(ComplexToStringMixin):
265
268
  """
266
269
  Represent the list of threshold and its associated severity link to a certain rule
267
270
  """
@@ -447,7 +450,7 @@ class RiskRule(PermissionObjectModelMixin, WBModel):
447
450
  def checked_object_representation(self) -> str:
448
451
  try:
449
452
  backend_class = self.rule_backend.backend_class
450
- checked_object_repr = getattr(backend_class, "OBJECT_FIELD_NAME").title()
453
+ checked_object_repr = backend_class.OBJECT_FIELD_NAME.title()
451
454
  except AttributeError:
452
455
  checked_object_repr = "Object"
453
456
  return checked_object_repr
@@ -17,7 +17,7 @@ class RiskCheckModelSerializer(wb_serializers.ModelSerializer):
17
17
  _rule = RiskRuleRepresentationSerializer(source="rule")
18
18
  _checked_object_content_type = ContentTypeRepresentationSerializer(source="checked_object_content_type")
19
19
 
20
- incident_reports = wb_serializers.TextField()
20
+ incident_reports = wb_serializers.TextField(read_only=True)
21
21
  status_icon = IconSelectField(read_only=True)
22
22
 
23
23
  @wb_serializers.register_resource()
@@ -1,6 +1,15 @@
1
1
  from collections import defaultdict
2
2
 
3
- from django.db.models.signals import *
3
+ from django.db.models.signals import (
4
+ post_delete,
5
+ post_init,
6
+ post_migrate,
7
+ post_save,
8
+ pre_delete,
9
+ pre_init,
10
+ pre_migrate,
11
+ pre_save,
12
+ )
4
13
 
5
14
 
6
15
  class DisableSignals(object):
@@ -50,7 +59,7 @@ class DisableSignals(object):
50
59
  # self.disconnect(signal)
51
60
 
52
61
 
53
- class temp_disconnect_signal:
62
+ class TempDisconnectSignal:
54
63
  """Temporarily disconnect a model from a signal"""
55
64
 
56
65
  def __init__(self, signal, receiver, sender, dispatch_uid=None):
@@ -72,11 +81,3 @@ class temp_disconnect_signal:
72
81
  sender=self.sender,
73
82
  dispatch_uid=self.dispatch_uid,
74
83
  )
75
-
76
-
77
- class DisableSignalsNotification(temp_disconnect_signal):
78
- def __init__(self, dispatch_uid=None):
79
- self.signal = post_save
80
- self.receiver = post_create_notification
81
- self.sender = Notification
82
- self.dispatch_uid = dispatch_uid
@@ -342,7 +342,7 @@ class TestSpecificViewsets(UserTestMixin):
342
342
  assert response.data.get("results")
343
343
 
344
344
  @pytest.mark.parametrize("mvs", [ComplianceTaskMatrixPandasViewSet])
345
- def test_PandasAPIView(self, mvs, compliance_task_factory, compliance_task_instance_factory):
345
+ def test_pandasapiview(self, mvs, compliance_task_factory, compliance_task_instance_factory):
346
346
  request = APIRequestFactory().get("")
347
347
  request.user = get_or_create_superuser()
348
348
 
@@ -20,9 +20,9 @@ class AbstractComplianceDocumentButtonConfig:
20
20
  return bt.ActionButton(
21
21
  method=RequestType.PATCH,
22
22
  key="regenerate_document",
23
- action_label=_("Regenerate Document"),
24
- title=_("Regenerate Document"),
25
- label=_("Regenerate Document"),
23
+ action_label=_("PDF Document is being generated"),
24
+ title=_("Generate PDF Document"),
25
+ label=_("Generate PDF Document"),
26
26
  icon=WBIcon.DOCUMENT.icon,
27
27
  serializer=ComplianceDocumentSerializer,
28
28
  instance_display=create_simple_display([["send_email"]]),
@@ -22,12 +22,12 @@ def get_custom_report(_request, review: ReviewComplianceTask):
22
22
  try:
23
23
  content_type = ContentType.objects.get(app_label="wbcompliance", model="reviewcompliancetask")
24
24
  ReportVersion = apps.get_model("wbreport", "ReportVersion")
25
- BUTTTONS = []
25
+ buttons = []
26
26
  versions = ReportVersion.objects.filter(
27
27
  version_date=review.to_date, report__content_type=content_type, report__is_active=True
28
28
  ).filter(Q(parameters__type=review.type.name) | Q(parameters__type=review.type.id))
29
29
  for version in versions:
30
- BUTTTONS.append(
30
+ buttons.append(
31
31
  bt.HyperlinkButton(
32
32
  endpoint=reverse("report:reportversion-html", args=[version.id], request=_request),
33
33
  label=_("Show {}").format(version.title),
@@ -35,7 +35,7 @@ def get_custom_report(_request, review: ReviewComplianceTask):
35
35
  )
36
36
  )
37
37
  if not version.lock:
38
- BUTTTONS.append(
38
+ buttons.append(
39
39
  bt.ActionButton(
40
40
  method=RequestType.GET,
41
41
  identifiers=("wbreport:reportversion",),
@@ -51,12 +51,12 @@ def get_custom_report(_request, review: ReviewComplianceTask):
51
51
  title=_("Update {}").format(version.title),
52
52
  ),
53
53
  )
54
- if BUTTTONS:
54
+ if buttons:
55
55
  return {
56
56
  bt.DropDownButton(
57
57
  label=_("Report"),
58
58
  icon=WBIcon.UNFOLD.icon,
59
- buttons=tuple(BUTTTONS),
59
+ buttons=tuple(buttons),
60
60
  ),
61
61
  }
62
62
  except LookupError:
@@ -70,11 +70,11 @@ class ComplianceTaskButtonConfig(ButtonViewConfig):
70
70
  class OccuredSerializer(wb_serializers.Serializer):
71
71
  occured = wb_serializers.DateField(required=True)
72
72
 
73
- BUTTONS = []
73
+ buttons = []
74
74
  if self.view.kwargs.get("pk", None) and self.request.user.is_superuser:
75
75
  review = self.view.get_object()
76
76
  if review.active:
77
- BUTTONS += [
77
+ buttons += [
78
78
  bt.ActionButton(
79
79
  method=RequestType.PATCH,
80
80
  identifiers=("wbcompliance:compliancetask",),
@@ -87,7 +87,7 @@ class ComplianceTaskButtonConfig(ButtonViewConfig):
87
87
  instance_display=create_simple_display([["occured"]]),
88
88
  )
89
89
  ]
90
- return {*BUTTONS}
90
+ return {*buttons}
91
91
 
92
92
 
93
93
  class ReviewComplianceTaskButtonConfig(ButtonViewConfig):
@@ -100,17 +100,17 @@ class ReviewComplianceTaskButtonConfig(ButtonViewConfig):
100
100
  choices=[("ADD", "Add existing indicators"), ("REMOVE", "Remove existing Indicators")],
101
101
  )
102
102
 
103
- BUTTONS = []
103
+ buttons = []
104
104
  if self.view.kwargs.get("pk", None) and self.request.user.has_perm("wbcompliance.administrate_compliance"):
105
105
  review = self.view.get_object()
106
106
  if review.is_instance:
107
- BUTTONS = get_custom_report(_request=self.request, review=review)
107
+ buttons = get_custom_report(_request=self.request, review=review)
108
108
  else:
109
109
  if review.status == ReviewComplianceTask.Status.VALIDATED:
110
- BUTTONS += [AbstractComplianceDocumentButtonConfig._get_compliance_document_button()]
110
+ buttons += [AbstractComplianceDocumentButtonConfig._get_compliance_document_button()]
111
111
 
112
112
  if self.request.user.has_perm("wbcompliance.administrate_compliance"):
113
- BUTTONS += [
113
+ buttons += [
114
114
  bt.ActionButton(
115
115
  method=RequestType.PATCH,
116
116
  identifiers=("wbcompliance:reviewcompliancetask",),
@@ -125,7 +125,7 @@ class ReviewComplianceTaskButtonConfig(ButtonViewConfig):
125
125
  ]
126
126
 
127
127
  if review.status == ReviewComplianceTask.Status.DRAFT and self.request.user.is_superuser:
128
- BUTTONS += [
128
+ buttons += [
129
129
  bt.ActionButton(
130
130
  method=RequestType.PATCH,
131
131
  identifiers=("wbcompliance:reviewcompliancetask",),
@@ -147,4 +147,4 @@ class ReviewComplianceTaskButtonConfig(ButtonViewConfig):
147
147
  ),
148
148
  ]
149
149
 
150
- return {*BUTTONS}
150
+ return {*buttons}
@@ -1,10 +1,12 @@
1
1
  from django.contrib.auth import get_user_model
2
2
  from django.contrib.postgres.aggregates import StringAgg
3
3
  from django.db import models
4
- from django.db.models import F
4
+ from django.db.models import F, OuterRef, Subquery, Value
5
+ from django.db.models.functions import Concat
5
6
  from wbcore import viewsets
6
7
 
7
8
  from wbcompliance.filters.risk_management.checks import RiskCheckFilterSet
9
+ from wbcompliance.models import CheckedObjectIncidentRelationship
8
10
  from wbcompliance.models.risk_management import RiskCheck
9
11
  from wbcompliance.serializers import (
10
12
  RiskCheckModelSerializer,
@@ -35,8 +37,17 @@ class RiskCheckModelViewSet(viewsets.ModelViewSet):
35
37
  filterset_class = RiskCheckFilterSet
36
38
 
37
39
  def get_queryset(self):
40
+ rel = (
41
+ CheckedObjectIncidentRelationship.objects.filter(rule_check=OuterRef("id"))
42
+ .annotate(
43
+ title=Concat(F("incident__breached_object_repr"), Value(" ( "), F("breached_value"), Value(" ) "))
44
+ )
45
+ .values("rule_check")
46
+ .annotate(incident_reports=StringAgg("title", delimiter="<br>"))
47
+ .values("incident_reports")
48
+ )
38
49
  return (
39
- RiskCheck.objects.annotate(
50
+ RiskCheck.all_objects.annotate(
40
51
  status_icon=models.Case(
41
52
  *[
42
53
  models.When(status=value, then=models.Value(RiskCheck.CheckStatus[value].icon))
@@ -44,7 +55,7 @@ class RiskCheckModelViewSet(viewsets.ModelViewSet):
44
55
  ],
45
56
  default=models.Value("none"),
46
57
  ),
47
- incident_reports=StringAgg(F("incidents__report"), delimiter="<br>"),
58
+ incident_reports=Subquery(rel),
48
59
  )
49
60
  .select_related(
50
61
  "rule",
@@ -18,7 +18,7 @@ class RiskCheckViewSetMixin:
18
18
  icon = RiskCheck.CheckStatus[instance.get_worst_check_status()].icon
19
19
  if instance.checks.exists():
20
20
  return bt.WidgetButton(
21
- endpoint=f'{reverse("wbcompliance:riskcheck-list", args=[], request=self.request)}?checked_objects=[[{instance.checked_object_content_type.id},{instance.checked_object.id}]]',
21
+ endpoint=f'{reverse("wbcompliance:riskcheck-list", args=[], request=self.request)}?checked_objects=[[{instance.checked_object_content_type.id},{instance.checked_object.id}]]&evaluation_date={instance.check_evaluation_date}&activators=[[{instance.activator_content_type.id},{instance.activator_id}]]&passive_check=False',
22
22
  label=self._get_risk_checks_button_title(),
23
23
  icon=icon,
24
24
  )
File without changes