wbcompliance 2.2.1__py2.py3-none-any.whl

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 (129) hide show
  1. wbcompliance/__init__.py +1 -0
  2. wbcompliance/admin/__init__.py +16 -0
  3. wbcompliance/admin/compliance_form.py +56 -0
  4. wbcompliance/admin/compliance_task.py +135 -0
  5. wbcompliance/admin/compliance_type.py +8 -0
  6. wbcompliance/admin/risk_management/__init__.py +3 -0
  7. wbcompliance/admin/risk_management/checks.py +7 -0
  8. wbcompliance/admin/risk_management/incidents.py +50 -0
  9. wbcompliance/admin/risk_management/rules.py +63 -0
  10. wbcompliance/admin/utils.py +46 -0
  11. wbcompliance/apps.py +14 -0
  12. wbcompliance/factories/__init__.py +21 -0
  13. wbcompliance/factories/compliance.py +246 -0
  14. wbcompliance/factories/risk_management/__init__.py +12 -0
  15. wbcompliance/factories/risk_management/backends.py +42 -0
  16. wbcompliance/factories/risk_management/checks.py +12 -0
  17. wbcompliance/factories/risk_management/incidents.py +84 -0
  18. wbcompliance/factories/risk_management/rules.py +100 -0
  19. wbcompliance/filters/__init__.py +2 -0
  20. wbcompliance/filters/compliances.py +189 -0
  21. wbcompliance/filters/risk_management/__init__.py +3 -0
  22. wbcompliance/filters/risk_management/checks.py +22 -0
  23. wbcompliance/filters/risk_management/incidents.py +113 -0
  24. wbcompliance/filters/risk_management/rules.py +110 -0
  25. wbcompliance/filters/risk_management/tables.py +112 -0
  26. wbcompliance/filters/risk_management/utils.py +3 -0
  27. wbcompliance/management/__init__.py +10 -0
  28. wbcompliance/migrations/0001_initial_squashed_squashed_0010_alter_checkedobjectincidentrelationship_resolved_by_and_more.py +1744 -0
  29. wbcompliance/migrations/0011_alter_riskrule_parameters.py +21 -0
  30. wbcompliance/migrations/0012_alter_compliancetype_options.py +20 -0
  31. wbcompliance/migrations/0013_alter_riskrule_unique_together.py +16 -0
  32. wbcompliance/migrations/0014_alter_reviewcompliancetask_year.py +27 -0
  33. wbcompliance/migrations/0015_auto_20240103_0957.py +43 -0
  34. wbcompliance/migrations/0016_checkedobjectincidentrelationship_report_details_and_more.py +37 -0
  35. wbcompliance/migrations/0017_alter_rulebackend_incident_report_template.py +20 -0
  36. wbcompliance/migrations/0018_alter_rulecheckedobjectrelationship_unique_together.py +39 -0
  37. wbcompliance/migrations/0019_rulegroup_riskrule_activation_date_and_more.py +60 -0
  38. wbcompliance/migrations/__init__.py +0 -0
  39. wbcompliance/models/__init__.py +20 -0
  40. wbcompliance/models/compliance_form.py +626 -0
  41. wbcompliance/models/compliance_task.py +800 -0
  42. wbcompliance/models/compliance_type.py +133 -0
  43. wbcompliance/models/enums.py +13 -0
  44. wbcompliance/models/risk_management/__init__.py +4 -0
  45. wbcompliance/models/risk_management/backend.py +139 -0
  46. wbcompliance/models/risk_management/checks.py +194 -0
  47. wbcompliance/models/risk_management/dispatch.py +41 -0
  48. wbcompliance/models/risk_management/incidents.py +619 -0
  49. wbcompliance/models/risk_management/mixins.py +115 -0
  50. wbcompliance/models/risk_management/rules.py +654 -0
  51. wbcompliance/permissions.py +32 -0
  52. wbcompliance/serializers/__init__.py +30 -0
  53. wbcompliance/serializers/compliance_form.py +320 -0
  54. wbcompliance/serializers/compliance_task.py +463 -0
  55. wbcompliance/serializers/compliance_type.py +26 -0
  56. wbcompliance/serializers/risk_management/__init__.py +19 -0
  57. wbcompliance/serializers/risk_management/checks.py +53 -0
  58. wbcompliance/serializers/risk_management/incidents.py +227 -0
  59. wbcompliance/serializers/risk_management/rules.py +158 -0
  60. wbcompliance/tasks.py +112 -0
  61. wbcompliance/tests/__init__.py +0 -0
  62. wbcompliance/tests/conftest.py +63 -0
  63. wbcompliance/tests/disable_signals.py +82 -0
  64. wbcompliance/tests/mixins.py +17 -0
  65. wbcompliance/tests/risk_management/__init__.py +0 -0
  66. wbcompliance/tests/risk_management/models/__init__.py +0 -0
  67. wbcompliance/tests/risk_management/models/test_backends.py +0 -0
  68. wbcompliance/tests/risk_management/models/test_checks.py +55 -0
  69. wbcompliance/tests/risk_management/models/test_incidents.py +327 -0
  70. wbcompliance/tests/risk_management/models/test_rules.py +255 -0
  71. wbcompliance/tests/signals.py +89 -0
  72. wbcompliance/tests/test_filters.py +23 -0
  73. wbcompliance/tests/test_models.py +57 -0
  74. wbcompliance/tests/test_serializers.py +48 -0
  75. wbcompliance/tests/test_views.py +377 -0
  76. wbcompliance/tests/tests.py +21 -0
  77. wbcompliance/urls.py +238 -0
  78. wbcompliance/viewsets/__init__.py +40 -0
  79. wbcompliance/viewsets/buttons/__init__.py +9 -0
  80. wbcompliance/viewsets/buttons/compliance_form.py +78 -0
  81. wbcompliance/viewsets/buttons/compliance_task.py +149 -0
  82. wbcompliance/viewsets/buttons/risk_managment/__init__.py +3 -0
  83. wbcompliance/viewsets/buttons/risk_managment/checks.py +11 -0
  84. wbcompliance/viewsets/buttons/risk_managment/incidents.py +51 -0
  85. wbcompliance/viewsets/buttons/risk_managment/rules.py +35 -0
  86. wbcompliance/viewsets/compliance_form.py +425 -0
  87. wbcompliance/viewsets/compliance_task.py +513 -0
  88. wbcompliance/viewsets/compliance_type.py +38 -0
  89. wbcompliance/viewsets/display/__init__.py +22 -0
  90. wbcompliance/viewsets/display/compliance_form.py +317 -0
  91. wbcompliance/viewsets/display/compliance_task.py +453 -0
  92. wbcompliance/viewsets/display/compliance_type.py +22 -0
  93. wbcompliance/viewsets/display/risk_managment/__init__.py +11 -0
  94. wbcompliance/viewsets/display/risk_managment/checks.py +46 -0
  95. wbcompliance/viewsets/display/risk_managment/incidents.py +155 -0
  96. wbcompliance/viewsets/display/risk_managment/rules.py +146 -0
  97. wbcompliance/viewsets/display/risk_managment/tables.py +51 -0
  98. wbcompliance/viewsets/endpoints/__init__.py +27 -0
  99. wbcompliance/viewsets/endpoints/compliance_form.py +207 -0
  100. wbcompliance/viewsets/endpoints/compliance_task.py +193 -0
  101. wbcompliance/viewsets/endpoints/compliance_type.py +9 -0
  102. wbcompliance/viewsets/endpoints/risk_managment/__init__.py +12 -0
  103. wbcompliance/viewsets/endpoints/risk_managment/checks.py +16 -0
  104. wbcompliance/viewsets/endpoints/risk_managment/incidents.py +36 -0
  105. wbcompliance/viewsets/endpoints/risk_managment/rules.py +32 -0
  106. wbcompliance/viewsets/endpoints/risk_managment/tables.py +14 -0
  107. wbcompliance/viewsets/menu/__init__.py +17 -0
  108. wbcompliance/viewsets/menu/compliance_form.py +49 -0
  109. wbcompliance/viewsets/menu/compliance_task.py +130 -0
  110. wbcompliance/viewsets/menu/compliance_type.py +17 -0
  111. wbcompliance/viewsets/menu/risk_management.py +56 -0
  112. wbcompliance/viewsets/risk_management/__init__.py +21 -0
  113. wbcompliance/viewsets/risk_management/checks.py +49 -0
  114. wbcompliance/viewsets/risk_management/incidents.py +204 -0
  115. wbcompliance/viewsets/risk_management/mixins.py +52 -0
  116. wbcompliance/viewsets/risk_management/rules.py +179 -0
  117. wbcompliance/viewsets/risk_management/tables.py +96 -0
  118. wbcompliance/viewsets/titles/__init__.py +17 -0
  119. wbcompliance/viewsets/titles/compliance_form.py +101 -0
  120. wbcompliance/viewsets/titles/compliance_task.py +60 -0
  121. wbcompliance/viewsets/titles/compliance_type.py +13 -0
  122. wbcompliance/viewsets/titles/risk_managment/__init__.py +1 -0
  123. wbcompliance/viewsets/titles/risk_managment/checks.py +0 -0
  124. wbcompliance/viewsets/titles/risk_managment/incidents.py +0 -0
  125. wbcompliance/viewsets/titles/risk_managment/rules.py +0 -0
  126. wbcompliance/viewsets/titles/risk_managment/tables.py +7 -0
  127. wbcompliance-2.2.1.dist-info/METADATA +7 -0
  128. wbcompliance-2.2.1.dist-info/RECORD +129 -0
  129. wbcompliance-2.2.1.dist-info/WHEEL +5 -0
@@ -0,0 +1,193 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcompliance.models import ComplianceType, ReviewComplianceTask
3
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
4
+
5
+
6
+ class ComplianceTaskGroupEndpointConfig(EndpointViewConfig):
7
+ def get_endpoint(self, **kwargs):
8
+ if ComplianceType.is_administrator(self.request.user):
9
+ return super().get_endpoint()
10
+ return None
11
+
12
+
13
+ class ComplianceTaskEndpointConfig(EndpointViewConfig):
14
+ def get_endpoint(self, **kwargs):
15
+ if ComplianceType.is_administrator(self.request.user):
16
+ return super().get_endpoint()
17
+ return None
18
+
19
+
20
+ class ComplianceTaskComplianceTaskGroupEndpointConfig(ComplianceTaskEndpointConfig):
21
+ def get_endpoint(self, **kwargs):
22
+ if group_id := self.view.kwargs.get("group_id", None):
23
+ return reverse(
24
+ "wbcompliance:compliancetaskgroup-compliancetask-list", args=[group_id], request=self.request
25
+ )
26
+ return None
27
+
28
+
29
+ class ComplianceTaskInstanceEndpointConfig(EndpointViewConfig):
30
+ def get_endpoint(self, **kwargs):
31
+ if ComplianceType.is_administrator(self.request.user):
32
+ return super().get_endpoint()
33
+ return None
34
+
35
+ def get_create_endpoint(self, **kwargs):
36
+ return None
37
+
38
+ def get_delete_endpoint(self, **kwargs):
39
+ if self.request.user.is_superuser:
40
+ return super().get_delete_endpoint()
41
+ return None
42
+
43
+
44
+ class ComplianceTaskInstanceComplianceTaskEndpointConfig(ComplianceTaskInstanceEndpointConfig):
45
+ def get_endpoint(self, **kwargs):
46
+ if ComplianceType.is_administrator(self.request.user):
47
+ return reverse(
48
+ "wbcompliance:compliancetask-compliancetaskinstance-list",
49
+ args=[self.view.kwargs["task_id"]],
50
+ request=self.request,
51
+ )
52
+ return None
53
+
54
+
55
+ class ComplianceTaskMatrixEndpointConfig(EndpointViewConfig):
56
+ def get_endpoint(self, **kwargs):
57
+ if ComplianceType.is_administrator(self.request.user):
58
+ return reverse("wbcompliance:compliancetaskmatrix-list", [], request=self.request)
59
+ return None
60
+
61
+ def get_create_endpoint(self, **kwargs):
62
+ return None
63
+
64
+ def get_instance_endpoint(self, **kwargs):
65
+ return None
66
+
67
+
68
+ class ComplianceActionEndpointConfig(EndpointViewConfig):
69
+ def get_endpoint(self, **kwargs):
70
+ if ComplianceType.is_administrator(self.request.user):
71
+ return super().get_endpoint()
72
+ return None
73
+
74
+
75
+ class ComplianceEventEndpointConfig(EndpointViewConfig):
76
+ def get_endpoint(self, **kwargs):
77
+ return super().get_endpoint()
78
+
79
+ def get_instance_endpoint(self, **kwargs):
80
+ if self.instance:
81
+ obj = self.view.get_object()
82
+ if not ComplianceType.is_administrator(self.request.user) and obj.creator != self.request.user.profile:
83
+ return None
84
+ return super().get_instance_endpoint()
85
+
86
+ def get_delete_endpoint(self, **kwargs):
87
+ if ComplianceType.is_administrator(self.request.user):
88
+ return super().get_delete_endpoint()
89
+ return None
90
+
91
+
92
+ class ReviewComplianceTaskEndpointConfig(EndpointViewConfig):
93
+ def get_endpoint(self, **kwargs):
94
+ if ComplianceType.is_administrator(self.request.user):
95
+ return super().get_endpoint()
96
+ return None
97
+
98
+ def get_instance_endpoint(self, **kwargs):
99
+ if self.instance:
100
+ if not ComplianceType.is_administrator(self.request.user):
101
+ return None
102
+ if obj_id := self.view.kwargs.get("pk", None):
103
+ obj = ReviewComplianceTask.objects.get(id=obj_id)
104
+ if obj.status != ReviewComplianceTask.Status.DRAFT:
105
+ return None
106
+ return super().get_instance_endpoint()
107
+
108
+ def get_delete_endpoint(self, **kwargs):
109
+ if not ComplianceType.is_administrator(self.request.user):
110
+ return None
111
+ if obj_id := self.view.kwargs.get("pk", None):
112
+ obj = ReviewComplianceTask.objects.get(id=obj_id)
113
+ if obj.status != ReviewComplianceTask.Status.DRAFT or obj.is_instance:
114
+ return None
115
+ return super().get_delete_endpoint()
116
+
117
+
118
+ class AbstractComplianceTaskReviewEndpointConfig(EndpointViewConfig):
119
+ def get_instance_endpoint(self, **kwargs):
120
+ if self.instance:
121
+ if not ComplianceType.is_administrator(self.request.user):
122
+ return None
123
+ if review_id := self.view.kwargs.get("review_id", None):
124
+ obj = ReviewComplianceTask.objects.get(id=review_id)
125
+ if obj.status != ReviewComplianceTask.Status.DRAFT:
126
+ return None
127
+ return super().get_instance_endpoint()
128
+
129
+ def get_create_endpoint(self, **kwargs):
130
+ if not ComplianceType.is_administrator(self.request.user):
131
+ return None
132
+ if review_id := self.view.kwargs.get("review_id", None):
133
+ obj = ReviewComplianceTask.objects.get(id=review_id)
134
+ if obj.status != ReviewComplianceTask.Status.DRAFT:
135
+ return None
136
+ return super().get_create_endpoint()
137
+
138
+ def get_delete_endpoint(self, **kwargs):
139
+ if not ComplianceType.is_administrator(self.request.user):
140
+ return None
141
+ if review_id := self.view.kwargs.get("review_id", None):
142
+ obj = ReviewComplianceTask.objects.get(id=review_id)
143
+ if obj.status != ReviewComplianceTask.Status.DRAFT:
144
+ return None
145
+ return super().get_delete_endpoint()
146
+
147
+
148
+ class ComplianceTaskReviewNoGroupEndpointConfig(AbstractComplianceTaskReviewEndpointConfig):
149
+ def get_endpoint(self, **kwargs):
150
+ if ComplianceType.is_administrator(self.request.user):
151
+ if review_id := self.view.kwargs.get("review_id", None):
152
+ return reverse(
153
+ "wbcompliance:review-compliancetasknogroup-list", args=[review_id], request=self.request
154
+ )
155
+ return None
156
+
157
+
158
+ class ComplianceTaskReviewGroupEndpointConfig(AbstractComplianceTaskReviewEndpointConfig):
159
+ def get_endpoint(self, **kwargs):
160
+ if (
161
+ ComplianceType.is_administrator(self.request.user)
162
+ and (review_id := self.view.kwargs.get("review_id", None))
163
+ and (group_id := self.view.kwargs.get("group_id", None))
164
+ ):
165
+ return reverse(
166
+ "wbcompliance:review-compliancetaskgroup-list", args=[review_id, group_id], request=self.request
167
+ )
168
+ return None
169
+
170
+
171
+ class ComplianceTaskInstanceReviewNoGroupEndpointConfig(ComplianceTaskInstanceEndpointConfig):
172
+ def get_endpoint(self, **kwargs):
173
+ if ComplianceType.is_administrator(self.request.user) and (
174
+ review_id := self.view.kwargs.get("review_id", None)
175
+ ):
176
+ return reverse(
177
+ "wbcompliance:review-compliancetaskinstancenogroup-list", args=[review_id], request=self.request
178
+ )
179
+ return None
180
+
181
+
182
+ class ComplianceTaskInstanceReviewGroupEndpointConfig(ComplianceTaskInstanceEndpointConfig):
183
+ def get_endpoint(self, **kwargs):
184
+ if ComplianceType.is_administrator(self.request.user):
185
+ if (review_id := self.view.kwargs.get("review_id", None)) and (
186
+ group_id := self.view.kwargs.get("group_id", None)
187
+ ):
188
+ return reverse(
189
+ "wbcompliance:review-compliancetaskinstancegroup-list",
190
+ args=[review_id, group_id],
191
+ request=self.request,
192
+ )
193
+ return None
@@ -0,0 +1,9 @@
1
+ from wbcompliance.models import ComplianceType
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class ComplianceTypeEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ if ComplianceType.is_administrator(self.request.user):
8
+ return super().get_endpoint()
9
+ return None
@@ -0,0 +1,12 @@
1
+ from .checks import RiskCheckEndpointConfig
2
+ from .incidents import (
3
+ CheckedObjectIncidentRelationshipEndpointConfig,
4
+ CheckedObjectIncidentRelationshipRiskRuleEndpointConfig,
5
+ RiskIncidentEndpointConfig,
6
+ )
7
+ from .rules import (
8
+ RiskRuleEndpointConfig,
9
+ RuleCheckedObjectRelationshipRiskRuleEndpointConfig,
10
+ RuleThresholdRiskRuleEndpointConfig,
11
+ )
12
+ from .tables import RiskManagementIncidentTableEndpointConfig
@@ -0,0 +1,16 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class RiskCheckEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return None
8
+
9
+ def get_list_endpoint(self, **kwargs):
10
+ if rule_id := self.view.kwargs.get("rule_id"):
11
+ return reverse(
12
+ "wbcompliance:riskrule-check-list",
13
+ args=[rule_id],
14
+ request=self.request,
15
+ )
16
+ return super().get_endpoint(**kwargs)
@@ -0,0 +1,36 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class RiskIncidentEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ if rule_id := self.view.kwargs.get("rule_id"):
8
+ return reverse(
9
+ "wbcompliance:riskrule-incident-list",
10
+ args=[rule_id],
11
+ request=self.request,
12
+ )
13
+ return super().get_endpoint(**kwargs)
14
+
15
+ def get_create_endpoint(self, **kwargs):
16
+ return None
17
+
18
+ def get_delete_endpoint(self, **kwargs):
19
+ return None
20
+
21
+
22
+ class CheckedObjectIncidentRelationshipEndpointConfig(EndpointViewConfig):
23
+ def get_endpoint(self, **kwargs):
24
+ return None
25
+
26
+ def get_list_endpoint(self, **kwargs):
27
+ return reverse("wbcompliance:checkedobjectincidentrelationship-list", request=self.request)
28
+
29
+
30
+ class CheckedObjectIncidentRelationshipRiskRuleEndpointConfig(CheckedObjectIncidentRelationshipEndpointConfig):
31
+ def get_list_endpoint(self, **kwargs):
32
+ return reverse(
33
+ "wbcompliance:riskincident-relationship-list",
34
+ args=[self.view.kwargs["incident_id"]],
35
+ request=self.request,
36
+ )
@@ -0,0 +1,32 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class RuleThresholdRiskRuleEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ if rule_id := self.view.kwargs.get("rule_id"):
8
+ return reverse(
9
+ "wbcompliance:riskrule-threshold-list",
10
+ args=[rule_id],
11
+ request=self.request,
12
+ )
13
+ return super().get_endpoint(**kwargs)
14
+
15
+
16
+ class RuleCheckedObjectRelationshipRiskRuleEndpointConfig(EndpointViewConfig):
17
+ def get_endpoint(self, **kwargs):
18
+ if rule_id := self.view.kwargs.get("rule_id"):
19
+ return reverse(
20
+ "wbcompliance:riskrule-relationship-list",
21
+ args=[rule_id],
22
+ request=self.request,
23
+ )
24
+ return super().get_endpoint(**kwargs)
25
+
26
+
27
+ class RiskRuleEndpointConfig(EndpointViewConfig):
28
+ def get_endpoint(self, **kwargs):
29
+ return super().get_endpoint(**kwargs)
30
+
31
+ def get_delete_endpoint(self, **kwargs):
32
+ return None
@@ -0,0 +1,14 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class RiskManagementIncidentTableEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return None
8
+
9
+ def get_list_endpoint(self, **kwargs):
10
+ return reverse(
11
+ "wbcompliance:riskmanagementincidenttable-list",
12
+ args=[],
13
+ request=self.request,
14
+ )
@@ -0,0 +1,17 @@
1
+ from wbcompliance.permissions import (
2
+ is_admin_compliance,
3
+ is_internal_employee_compliance,
4
+ )
5
+
6
+ from .compliance_form import COMPLIANCEFORM_MENU, COMPLIANCEFORMSIGNATURE_MENUITEM
7
+ from .compliance_task import (
8
+ COMPLIANCE_SETTINGS_MENU,
9
+ COMPLIANCEEVENT_MENUITEM,
10
+ COMPLIANCEREPORT_MENU,
11
+ )
12
+ from .compliance_type import COMPLIANCETYPE_MENUITEM
13
+ from .risk_management import (
14
+ RISK_INCIDENT_MENUITEM,
15
+ RISKINCIDENTTABLE_MENUITEM,
16
+ RULE_MENUITEM,
17
+ )
@@ -0,0 +1,49 @@
1
+ from django.utils.translation import gettext as _
2
+ from wbcompliance.permissions import is_admin_compliance
3
+ from wbcore.menus import ItemPermission, Menu, MenuItem
4
+
5
+ COMPLIANCEFORM_MENUITEM = MenuItem(
6
+ label=_("Forms"),
7
+ endpoint="wbcompliance:complianceform-list",
8
+ permission=ItemPermission(
9
+ method=is_admin_compliance,
10
+ permissions=["wbcompliance.view_complianceform", "wbcompliance.administrate_compliance"],
11
+ ),
12
+ add=MenuItem(
13
+ label=_("Add Form"),
14
+ endpoint="wbcompliance:complianceform-list",
15
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.administrate_compliance"]),
16
+ ),
17
+ )
18
+
19
+
20
+ COMPLIANCEFORMSIGNATURE_MENUITEM = MenuItem(
21
+ label=_("Form Signatures"),
22
+ endpoint="wbcompliance:complianceformsignature-list",
23
+ permission=ItemPermission(permissions=["wbcompliance.view_complianceformsignature"]),
24
+ )
25
+
26
+ ADMIN_COMPLIANCEFORMSIGNATURE_MENUITEM = MenuItem(
27
+ label=_("Form Signatures"),
28
+ endpoint="wbcompliance:complianceformsignature-list",
29
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.view_complianceformsignature"]),
30
+ )
31
+
32
+ COMPLIANCEFORMTYPE_MENUITEM = MenuItem(
33
+ label=_("Form Types"),
34
+ endpoint="wbcompliance:complianceformtype-list",
35
+ permission=ItemPermission(
36
+ method=is_admin_compliance,
37
+ permissions=["wbcompliance.view_complianceformtype", "wbcompliance.administrate_compliance"],
38
+ ),
39
+ add=MenuItem(
40
+ label=_("Add Form Type"),
41
+ endpoint="wbcompliance:complianceformtype-list",
42
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.administrate_compliance"]),
43
+ ),
44
+ )
45
+
46
+ COMPLIANCEFORM_MENU = Menu(
47
+ label=_("Forms"),
48
+ items=[COMPLIANCEFORM_MENUITEM, ADMIN_COMPLIANCEFORMSIGNATURE_MENUITEM, COMPLIANCEFORMTYPE_MENUITEM],
49
+ )
@@ -0,0 +1,130 @@
1
+ from django.utils.translation import gettext as _
2
+ from wbcompliance.permissions import (
3
+ is_admin_compliance,
4
+ is_internal_employee_compliance,
5
+ )
6
+ from wbcore.menus import ItemPermission, Menu, MenuItem
7
+
8
+ from .compliance_type import COMPLIANCETYPE_MENUITEM
9
+
10
+ COMPLIANCETASKGROUP_MENUITEM = MenuItem(
11
+ label=_("Groups Indicator"),
12
+ endpoint="wbcompliance:compliancetaskgroup-list",
13
+ permission=ItemPermission(
14
+ method=is_admin_compliance,
15
+ permissions=["wbcompliance.view_compliancetaskgroup", "wbcompliance.administrate_compliance"],
16
+ ),
17
+ add=MenuItem(
18
+ label=_("Add Group Indicator"),
19
+ endpoint="wbcompliance:compliancetaskgroup-list",
20
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.administrate_compliance"]),
21
+ ),
22
+ )
23
+
24
+ COMPLIANCETASK_MENUITEM = MenuItem(
25
+ label=_("Indicators"),
26
+ endpoint="wbcompliance:compliancetask-list",
27
+ permission=ItemPermission(
28
+ method=is_admin_compliance,
29
+ permissions=["wbcompliance.view_compliancetask", "wbcompliance.administrate_compliance"],
30
+ ),
31
+ add=MenuItem(
32
+ label=_("Add Indicator"),
33
+ endpoint="wbcompliance:compliancetask-list",
34
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.administrate_compliance"]),
35
+ ),
36
+ )
37
+
38
+ COMPLIANCETASKINSTANCE_MENUITEM = MenuItem(
39
+ label=_("Instances Indicator"),
40
+ endpoint="wbcompliance:compliancetaskinstance-list",
41
+ permission=ItemPermission(
42
+ method=lambda request: request.user.is_superuser,
43
+ permissions=["wbcompliance.view_compliancetaskinstance", "wbcompliance.administrate_compliance"],
44
+ ),
45
+ )
46
+
47
+ COMPLIANCETASKMATRIX_MENUITEM = MenuItem(
48
+ label=_("Indicator Matrix"),
49
+ endpoint="wbcompliance:compliancetaskmatrix-list",
50
+ permission=ItemPermission(
51
+ method=is_admin_compliance,
52
+ permissions=[
53
+ "wbcompliance.view_compliancetaskinstance",
54
+ "wbcompliance.view_compliancetask",
55
+ "wbcompliance.administrate_compliance",
56
+ ],
57
+ ),
58
+ )
59
+
60
+ COMPLIANCEACTION_MENUITEM = MenuItem(
61
+ label=_("Actions"),
62
+ endpoint="wbcompliance:complianceaction-list",
63
+ permission=ItemPermission(
64
+ method=is_admin_compliance,
65
+ permissions=["wbcompliance.view_complianceaction", "wbcompliance.administrate_compliance"],
66
+ ),
67
+ add=MenuItem(
68
+ label=_("Add Compliance Action"),
69
+ endpoint="wbcompliance:complianceaction-list",
70
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.administrate_compliance"]),
71
+ ),
72
+ )
73
+
74
+ COMPLIANCEEVENT_MENUITEM = MenuItem(
75
+ label=_("Events"),
76
+ endpoint="wbcompliance:complianceevent-list",
77
+ permission=ItemPermission(
78
+ method=is_internal_employee_compliance, permissions=["wbcompliance.view_complianceevent"]
79
+ ),
80
+ add=MenuItem(
81
+ label=_("Add Compliance Event"),
82
+ endpoint="wbcompliance:complianceevent-list",
83
+ permission=ItemPermission(
84
+ method=is_internal_employee_compliance, permissions=["wbcompliance.add_complianceevent"]
85
+ ),
86
+ ),
87
+ )
88
+
89
+ ADMIN_COMPLIANCEEVENT_MENUITEM = MenuItem(
90
+ label=_("Events"),
91
+ endpoint="wbcompliance:complianceevent-list",
92
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.view_complianceevent"]),
93
+ add=MenuItem(
94
+ label=_("Add Compliance Event"),
95
+ endpoint="wbcompliance:complianceevent-list",
96
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.add_complianceevent"]),
97
+ ),
98
+ )
99
+
100
+ REVIEWCOMPLIANCETASK_MENUITEM = MenuItem(
101
+ label=_("Reports"),
102
+ endpoint="wbcompliance:reviewcompliancetask-list",
103
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.view_reviewcompliancetask"]),
104
+ add=MenuItem(
105
+ label=_("Add Report Indicator"),
106
+ endpoint="wbcompliance:reviewcompliancetask-list",
107
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.add_reviewcompliancetask"]),
108
+ ),
109
+ )
110
+
111
+
112
+ COMPLIANCEREPORT_MENU = Menu(
113
+ label=_("Reports"),
114
+ items=[
115
+ REVIEWCOMPLIANCETASK_MENUITEM,
116
+ COMPLIANCEACTION_MENUITEM,
117
+ ADMIN_COMPLIANCEEVENT_MENUITEM,
118
+ COMPLIANCETASKMATRIX_MENUITEM,
119
+ ],
120
+ )
121
+
122
+ COMPLIANCE_SETTINGS_MENU = Menu(
123
+ label=_("Settings"),
124
+ items=[
125
+ COMPLIANCETYPE_MENUITEM,
126
+ COMPLIANCETASKGROUP_MENUITEM,
127
+ COMPLIANCETASK_MENUITEM,
128
+ COMPLIANCETASKINSTANCE_MENUITEM,
129
+ ],
130
+ )
@@ -0,0 +1,17 @@
1
+ from django.utils.translation import gettext as _
2
+ from wbcompliance.permissions import is_admin_compliance
3
+ from wbcore.menus import ItemPermission, MenuItem
4
+
5
+ COMPLIANCETYPE_MENUITEM = MenuItem(
6
+ label=_("Administrators"),
7
+ endpoint="wbcompliance:compliancetype-list",
8
+ permission=ItemPermission(
9
+ method=is_admin_compliance,
10
+ permissions=["wbcompliance.view_compliancetype", "wbcompliance.administrate_compliance"],
11
+ ),
12
+ add=MenuItem(
13
+ label=_("Add Compliance Type"),
14
+ endpoint="wbcompliance:compliancetype-list",
15
+ permission=ItemPermission(method=is_admin_compliance, permissions=["wbcompliance.administrate_compliance"]),
16
+ ),
17
+ )
@@ -0,0 +1,56 @@
1
+ from contextlib import suppress
2
+
3
+ from django.utils.translation import gettext as _
4
+ from wbcompliance.models.risk_management.rules import RuleGroup
5
+ from wbcore.menus import ItemPermission, Menu, MenuItem
6
+ from wbcore.permissions.shortcuts import is_internal_user
7
+
8
+ RULE_MENUITEM = MenuItem(
9
+ label=_("Rules"),
10
+ endpoint="wbcompliance:riskrule-list",
11
+ permission=ItemPermission(
12
+ method=lambda request: is_internal_user(request.user), permissions=["wbcompliance.view_riskrule"]
13
+ ),
14
+ add=MenuItem(
15
+ label=_("Add Rule"),
16
+ endpoint="wbcompliance:riskrule-list",
17
+ permission=ItemPermission(
18
+ method=lambda request: is_internal_user(request.user), permissions=["wbcompliance.add_riskrule"]
19
+ ),
20
+ ),
21
+ )
22
+
23
+
24
+ def _get_incident_menu():
25
+ items = []
26
+ with suppress(Exception):
27
+ for rule_group in RuleGroup.objects.all():
28
+ items.append(
29
+ MenuItem(
30
+ label=rule_group.name,
31
+ endpoint="wbcompliance:riskincident-list",
32
+ permission=ItemPermission(
33
+ method=lambda request: is_internal_user(request.user),
34
+ permissions=["wbcompliance.view_riskincident"],
35
+ ),
36
+ endpoint_get_parameters={"rule_group": rule_group.id},
37
+ )
38
+ )
39
+ if items:
40
+ return Menu(label=_("Incidents"), items=items)
41
+ return MenuItem(
42
+ label=_("Incidents"),
43
+ endpoint="wbcompliance:riskincident-list",
44
+ permission=ItemPermission(
45
+ method=lambda request: is_internal_user(request.user), permissions=["wbcompliance.view_riskincident"]
46
+ ),
47
+ )
48
+
49
+
50
+ RISK_INCIDENT_MENUITEM = _get_incident_menu()
51
+
52
+ RISKINCIDENTTABLE_MENUITEM = MenuItem(
53
+ label=_("Incident Table"),
54
+ endpoint="wbcompliance:riskmanagementincidenttable-list",
55
+ permission=ItemPermission(permissions=["wbcompliance.administrate_riskrule"]),
56
+ )
@@ -0,0 +1,21 @@
1
+ from .checks import RiskCheckModelViewSet, RiskCheckRepresentationViewSet
2
+ from .incidents import (
3
+ CheckedObjectIncidentRelationshipModelViewSet,
4
+ CheckedObjectIncidentRelationshipRepresentationViewSet,
5
+ CheckedObjectIncidentRelationshipRiskRuleModelViewSet,
6
+ RiskIncidentModelViewSet,
7
+ RiskIncidentRepresentationViewSet,
8
+ RiskIncidentRiskRuleModelViewSet,
9
+ RiskIncidentTypeRepresentationViewSet,
10
+ )
11
+ from .rules import (
12
+ RuleGroupRepresentationViewSet,
13
+ RiskRuleModelViewSet,
14
+ RiskRuleRepresentationViewSet,
15
+ RuleBackendRepresentationViewSet,
16
+ RuleCheckedObjectRelationshipRepresentationViewSet,
17
+ RuleCheckedObjectRelationshipRiskRuleModelViewSet,
18
+ RuleThresholdRepresentationViewSet,
19
+ RuleThresholdRiskRuleModelViewSet,
20
+ )
21
+ from .tables import RiskManagementIncidentTableView
@@ -0,0 +1,49 @@
1
+ from django.contrib.auth import get_user_model
2
+ from django.db import models
3
+ from django.db.models import F
4
+ from wbcompliance.filters.risk_management.checks import RiskCheckFilterSet
5
+ from wbcompliance.models.risk_management import RiskCheck
6
+ from wbcompliance.serializers import (
7
+ RiskCheckModelSerializer,
8
+ RiskCheckRepresentationSerializer,
9
+ )
10
+ from wbcompliance.viewsets.buttons import RiskCheckButtonConfig
11
+ from wbcompliance.viewsets.display import RiskCheckDisplayConfig
12
+ from wbcompliance.viewsets.endpoints import RiskCheckEndpointConfig
13
+ from wbcore import viewsets
14
+
15
+ User = get_user_model()
16
+
17
+
18
+ class RiskCheckRepresentationViewSet(viewsets.RepresentationViewSet):
19
+ queryset = RiskCheck.objects.all()
20
+ serializer_class = RiskCheckRepresentationSerializer
21
+
22
+
23
+ class RiskCheckModelViewSet(viewsets.ModelViewSet):
24
+ button_config_class = RiskCheckButtonConfig
25
+ display_config_class = RiskCheckDisplayConfig
26
+ endpoint_config_class = RiskCheckEndpointConfig
27
+ queryset = RiskCheck.objects.all()
28
+ serializer_class = RiskCheckModelSerializer
29
+
30
+ filterset_class = RiskCheckFilterSet
31
+
32
+ def get_queryset(self):
33
+ return (
34
+ RiskCheck.objects.annotate(
35
+ rule_repr=F("rule_checked_object_relationship__rule__name"),
36
+ status_icon=models.Case(
37
+ *[
38
+ models.When(status=value, then=models.Value(RiskCheck.CheckStatus[value].icon))
39
+ for value in RiskCheck.CheckStatus.values
40
+ ],
41
+ default=models.Value("none")
42
+ ),
43
+ )
44
+ .select_related(
45
+ "rule_checked_object_relationship",
46
+ "trigger_content_type",
47
+ )
48
+ .prefetch_related("incidents")
49
+ )