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,317 @@
1
+ from typing import Optional
2
+
3
+ from django.shortcuts import get_object_or_404
4
+ from django.utils.translation import gettext as _
5
+ from wbcompliance.models import (
6
+ ComplianceForm,
7
+ ComplianceFormSection,
8
+ ComplianceFormSignatureSection,
9
+ ComplianceFormType,
10
+ )
11
+ from wbcore.contrib.color.enums import WBColor
12
+ from wbcore.metadata.configs import display as dp
13
+ from wbcore.metadata.configs.display.instance_display.shortcuts import (
14
+ Display,
15
+ create_simple_display,
16
+ create_simple_section,
17
+ )
18
+ from wbcore.metadata.configs.display.instance_display.utils import repeat_field
19
+ from wbcore.metadata.configs.display.view_config import DisplayViewConfig
20
+
21
+
22
+ # TYPE OF THE COMPLIANCE FORM
23
+ class ComplianceFormTypeDisplayConfig(DisplayViewConfig):
24
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
25
+ fields = [
26
+ dp.Field(key="name", label=_("Name")),
27
+ dp.Field(key="type", label=_("Type")),
28
+ ]
29
+ return dp.ListDisplay(
30
+ fields=fields,
31
+ )
32
+
33
+ def get_instance_display(self) -> Display:
34
+ return create_simple_display([["name", "type"]])
35
+
36
+
37
+ # SECTION OF THE COMPLIANCE FORM
38
+ class ComplianceFormSectionDisplayConfig(DisplayViewConfig):
39
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
40
+ fields = [
41
+ dp.Field(key="name", label=_("Titles")),
42
+ ]
43
+ return dp.ListDisplay(
44
+ fields=fields,
45
+ )
46
+
47
+ def get_instance_display(self) -> Display:
48
+ return create_simple_display(
49
+ [["compliance_form", "name"], [repeat_field(2, "rules_section")]],
50
+ [create_simple_section("rules_section", _("Rules"), [["rules"]], "rules", collapsed=False)],
51
+ )
52
+
53
+
54
+ # RULES OF THE SECTION
55
+ class ComplianceFormRuleDisplayConfig(DisplayViewConfig):
56
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
57
+ fields = [
58
+ dp.Field(key="text", label=_("Text")),
59
+ dp.Field(key="ticked", label=_("Expected Answer")),
60
+ ]
61
+ return dp.ListDisplay(
62
+ fields=fields,
63
+ )
64
+
65
+ def get_instance_display(self) -> Display:
66
+ return create_simple_display([["ticked", repeat_field(2, "text")]])
67
+
68
+
69
+ # RULES OF THE SECTION OF THE COMPLIANCE FORM SIGNATURE
70
+ class ComplianceFormSignatureSectionRuleDisplayConfig(DisplayViewConfig):
71
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
72
+ fields = [
73
+ dp.Field(key="text", label=_("Text")),
74
+ dp.Field(
75
+ key="ticked", label=_("Answer"), formatting_rules=[dp.FormattingRule(style={"fontWeight": "bold"})]
76
+ ),
77
+ dp.Field(key="comments", label=_("Comments")),
78
+ ]
79
+ if self.request.user.has_perm("wbcompliance.administrate_compliance") and (
80
+ section_id := self.view.kwargs.get("section_id")
81
+ ):
82
+ section_signature = get_object_or_404(ComplianceFormSignatureSection, pk=section_id)
83
+ if section_signature.compliance_form_signature.person != self.request.user.profile:
84
+ fields = [
85
+ dp.Field(key="text", label=_("Text")),
86
+ dp.Field(key="expected_result", label=_("Expected Answer")),
87
+ dp.Field(
88
+ key="ticked",
89
+ label=_("Answer"),
90
+ formatting_rules=[dp.FormattingRule(style={"fontWeight": "bold"})],
91
+ ),
92
+ dp.Field(key="comments", label=_("Comments")),
93
+ ]
94
+ return dp.ListDisplay(
95
+ fields=fields,
96
+ formatting=[
97
+ dp.Formatting(
98
+ column="same_answer",
99
+ formatting_rules=[
100
+ dp.FormattingRule(
101
+ style={"backgroundColor": WBColor.YELLOW_LIGHT.value},
102
+ condition=("==", False),
103
+ ),
104
+ ],
105
+ ),
106
+ ],
107
+ )
108
+
109
+ def get_instance_display(self) -> Display:
110
+ grid_fields = [
111
+ ["section", "ticked"],
112
+ [repeat_field(2, "text")],
113
+ [repeat_field(2, "comments")],
114
+ ]
115
+ if self.request.user.has_perm("wbcompliance.administrate_compliance") and (
116
+ section_id := self.view.kwargs.get("section_id")
117
+ ):
118
+ section_signature = get_object_or_404(ComplianceFormSignatureSection, pk=section_id)
119
+ if section_signature.compliance_form_signature.person != self.request.user.profile:
120
+ grid_fields = [
121
+ ["section", "ticked", "expected_result"],
122
+ [repeat_field(3, "text")],
123
+ [repeat_field(3, "comments")],
124
+ ]
125
+ return create_simple_display(grid_fields)
126
+
127
+
128
+ # COMPLIANCE FORM
129
+ class ComplianceFormDisplayConfig(DisplayViewConfig):
130
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
131
+ fields = [
132
+ dp.Field(key="title", label=_("Title")),
133
+ dp.Field(key="creator", label=_("Creator")),
134
+ dp.Field(key="changer", label=_("Changer")),
135
+ dp.Field(key="changed", label=_("Changed")),
136
+ dp.Field(key="start", label=_("Start")),
137
+ dp.Field(key="end", label=_("End")),
138
+ dp.Field(key="version", label=_("Last Version")),
139
+ ]
140
+ if self.request.user.has_perm("wbcompliance.administrate_compliance"):
141
+ fields.append(dp.Field(key="current_signed", label=_("Current Signed")))
142
+ else:
143
+ fields.append(
144
+ dp.Field(
145
+ key="is_signed",
146
+ label=_("Is Signed"),
147
+ formatting_rules=[
148
+ dp.FormattingRule(
149
+ style={"color": WBColor.RED.value, "fontWeight": "bold"},
150
+ ),
151
+ ],
152
+ )
153
+ )
154
+
155
+ fields.append(dp.Field(key="form_type", label=_("Form Type")))
156
+ fields.append(dp.Field(key="compliance_type", label=_("Administrator")))
157
+
158
+ return dp.ListDisplay(
159
+ fields=fields,
160
+ formatting=[
161
+ dp.Formatting(
162
+ column="status",
163
+ formatting_rules=[
164
+ dp.FormattingRule(
165
+ style={"backgroundColor": WBColor.BLUE_LIGHT.value},
166
+ condition=("==", ComplianceForm.Status.DRAFT.name),
167
+ ),
168
+ dp.FormattingRule(
169
+ style={"backgroundColor": WBColor.YELLOW_LIGHT.value},
170
+ condition=("==", ComplianceForm.Status.ACTIVATION_REQUESTED.name),
171
+ ),
172
+ dp.FormattingRule(
173
+ style={"backgroundColor": WBColor.GREEN_LIGHT.value},
174
+ condition=("==", ComplianceForm.Status.ACTIVE.name),
175
+ ),
176
+ ],
177
+ ),
178
+ ],
179
+ legends=[
180
+ dp.Legend(
181
+ key="status",
182
+ items=[
183
+ dp.LegendItem(
184
+ icon=WBColor.BLUE_LIGHT.value,
185
+ label=ComplianceForm.Status.DRAFT.label,
186
+ value=ComplianceForm.Status.DRAFT.value,
187
+ ),
188
+ dp.LegendItem(
189
+ icon=WBColor.YELLOW_LIGHT.value,
190
+ label=ComplianceForm.Status.ACTIVATION_REQUESTED.label,
191
+ value=ComplianceForm.Status.ACTIVATION_REQUESTED.value,
192
+ ),
193
+ dp.LegendItem(
194
+ icon=WBColor.GREEN_LIGHT.value,
195
+ label=ComplianceForm.Status.ACTIVE.label,
196
+ value=ComplianceForm.Status.ACTIVE.value,
197
+ ),
198
+ ],
199
+ ),
200
+ ],
201
+ )
202
+
203
+ def get_instance_display(self) -> Display:
204
+ fields = [
205
+ ["form_type", "compliance_type"],
206
+ [repeat_field(2, "title")],
207
+ ["start", "end"],
208
+ ["version", "status"],
209
+ [repeat_field(2, "signers_section")],
210
+ ]
211
+ sections = [
212
+ create_simple_section(
213
+ "signers_section",
214
+ _("Signers"),
215
+ [["assigned_to", "assigned_to", "only_internal"]],
216
+ collapsed=True,
217
+ )
218
+ ]
219
+ if (obj_id := self.view.kwargs.get("pk", None)) and (instance := self.view.get_object()):
220
+ if instance.form_type.type == ComplianceFormType.Type.TEXT:
221
+ fields += [[repeat_field(2, "policy")]]
222
+
223
+ elif instance.form_type.type == ComplianceFormType.Type.FORM:
224
+ fields.append([repeat_field(2, "sections_section")])
225
+ sections.append(
226
+ create_simple_section(
227
+ "sections_section", _("Sections"), [["sections"]], "sections", collapsed=True
228
+ )
229
+ )
230
+
231
+ total = ComplianceFormSection.objects.filter(compliance_form=obj_id).count()
232
+ for count, section in enumerate(
233
+ ComplianceFormSection.objects.filter(compliance_form=obj_id).order_by("id")
234
+ ):
235
+ key = f"rules{section.id}"
236
+ fields.append([repeat_field(2, f"{key}_section")])
237
+ sections.append(
238
+ create_simple_section(
239
+ f"{key}_section", f"({count + 1}/{total}). {section.name}", [[key]], key, collapsed=True
240
+ )
241
+ )
242
+
243
+ return create_simple_display(fields, sections)
244
+
245
+
246
+ # COMPLIANCE FORM SIGNATURE
247
+ class ComplianceFormSignatureDisplayConfig(DisplayViewConfig):
248
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
249
+ fields = [
250
+ dp.Field(key="compliance_form", label=_("Compliance Form")),
251
+ dp.Field(key="version", label=_("Version")),
252
+ dp.Field(key="start", label=_("Start")),
253
+ dp.Field(key="end", label=_("End")),
254
+ dp.Field(key="signed", label=_("Signed")),
255
+ # dp.Field(key="is_signed", label=_("Is Signed"))
256
+ ]
257
+ if self.request.user.has_perm("wbcompliance.administrate_compliance"):
258
+ fields.append(dp.Field(key="person", label=_("Signer")))
259
+
260
+ return dp.ListDisplay(
261
+ fields=fields,
262
+ formatting=[
263
+ dp.Formatting(
264
+ column="is_signed",
265
+ formatting_rules=[
266
+ dp.FormattingRule(
267
+ style={"backgroundColor": WBColor.YELLOW_LIGHT.value},
268
+ condition=("==", False),
269
+ ),
270
+ dp.FormattingRule(
271
+ style={"backgroundColor": WBColor.GREEN_LIGHT.value},
272
+ condition=("==", True),
273
+ ),
274
+ ],
275
+ ),
276
+ ],
277
+ legends=[
278
+ dp.Legend(
279
+ # key="is_signed",
280
+ items=[
281
+ dp.LegendItem(
282
+ icon=WBColor.YELLOW_LIGHT.value,
283
+ label=_("Unsigned"),
284
+ # value=False,
285
+ ),
286
+ dp.LegendItem(
287
+ icon=WBColor.GREEN_LIGHT.value,
288
+ label=_("Signed"),
289
+ # value=True,
290
+ ),
291
+ ],
292
+ ),
293
+ ],
294
+ )
295
+
296
+ def get_instance_display(self) -> Display:
297
+ fields = [["compliance_form", "version"], ["person", "signed"], ["start", "end"]]
298
+ sections = []
299
+ if obj_id := self.view.kwargs.get("pk", None):
300
+ instance = self.view.get_object()
301
+ if instance.compliance_form.form_type.type == ComplianceFormType.Type.TEXT:
302
+ fields.append([repeat_field(2, "policy")])
303
+ elif instance.compliance_form.form_type.type == ComplianceFormType.Type.FORM:
304
+ total = ComplianceFormSignatureSection.objects.filter(compliance_form_signature=obj_id).count()
305
+ for count, section in enumerate(
306
+ ComplianceFormSignatureSection.objects.filter(compliance_form_signature=obj_id).order_by("id")
307
+ ):
308
+ key = f"rules{section.id}"
309
+ fields.append([repeat_field(2, f"{key}_section")])
310
+ sections.append(
311
+ create_simple_section(
312
+ f"{key}_section", f"({count + 1}/{total}). {section.name}", [[key]], key, collapsed=True
313
+ )
314
+ )
315
+
316
+ fields.append([repeat_field(2, "remark")])
317
+ return create_simple_display(fields, sections)