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,1744 @@
1
+ # Generated by Django 4.1.7 on 2023-04-19 05:36
2
+
3
+ import django.contrib.postgres.fields.ranges
4
+ import django.core.validators
5
+ import django.db.models.deletion
6
+ import django.utils.timezone
7
+ import django_fsm
8
+ from django.conf import settings
9
+ from django.db import migrations, models
10
+
11
+
12
+ class Migration(migrations.Migration):
13
+ initial = True
14
+
15
+ dependencies = [
16
+ ("directory", "0001_initial"),
17
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
18
+ ("auth", "0012_alter_user_first_name_max_length"),
19
+ ("contenttypes", "0002_remove_content_type_name"),
20
+ ]
21
+
22
+ operations = [
23
+ migrations.CreateModel(
24
+ name="ComplianceForm",
25
+ fields=[
26
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
27
+ ("created", models.DateTimeField(auto_now_add=True, verbose_name="Created")),
28
+ ("changed", models.DateTimeField(blank=True, null=True)),
29
+ ("title", models.CharField(max_length=255, verbose_name="Title")),
30
+ ("policy", models.TextField(blank=True, default="", null=True)),
31
+ (
32
+ "status",
33
+ django_fsm.FSMField(
34
+ choices=[("DRAFT", "Draft"), ("PENDING", "Pending"), ("ACTIVE", "Active")],
35
+ default="DRAFT",
36
+ help_text="The Compliance Form status (default to Draft)",
37
+ max_length=50,
38
+ verbose_name="Status",
39
+ ),
40
+ ),
41
+ ("version", models.IntegerField(default=0)),
42
+ (
43
+ "only_send_to_internals",
44
+ models.BooleanField(
45
+ default=True,
46
+ help_text="Sent the Compliance Form only to internal employees of the departments",
47
+ ),
48
+ ),
49
+ ("end", models.DateField(blank=True, null=True, verbose_name="End")),
50
+ ("start", models.DateField(verbose_name="Start")),
51
+ (
52
+ "assigned_to",
53
+ models.ManyToManyField(
54
+ blank=True,
55
+ help_text="List of group to whom this Compliance Form applies. It is applied to all users if not specified",
56
+ related_name="compliance_forms",
57
+ to="auth.group",
58
+ verbose_name="Group to which the Compliance Form applies",
59
+ ),
60
+ ),
61
+ ],
62
+ options={
63
+ "verbose_name": "Compliance Form",
64
+ "verbose_name_plural": "Compliance Forms",
65
+ "permissions": [("admin_complianceform", "Can administer Compliance Forms")],
66
+ },
67
+ ),
68
+ migrations.CreateModel(
69
+ name="ComplianceFormSignature",
70
+ fields=[
71
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
72
+ ("version", models.IntegerField(default=0)),
73
+ ("policy_text", models.TextField(blank=True, default="", null=True)),
74
+ ("signed", models.DateTimeField(blank=True, null=True)),
75
+ ("personal_notes", models.TextField(blank=True, default="", null=True)),
76
+ (
77
+ "compliance_form",
78
+ models.ForeignKey(
79
+ on_delete=django.db.models.deletion.CASCADE,
80
+ related_name="complianceforms",
81
+ to="wbcompliance.complianceform",
82
+ ),
83
+ ),
84
+ ("end", models.DateField(blank=True, null=True, verbose_name="End")),
85
+ ("start", models.DateField(verbose_name="Start")),
86
+ ],
87
+ options={
88
+ "verbose_name": "Compliance Form Signature",
89
+ "verbose_name_plural": "Compliance Signatures",
90
+ },
91
+ ),
92
+ migrations.CreateModel(
93
+ name="ComplianceFormSection",
94
+ fields=[
95
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
96
+ ("name", models.CharField(max_length=255, verbose_name="Name section")),
97
+ (
98
+ "compliance_form",
99
+ models.ForeignKey(
100
+ on_delete=django.db.models.deletion.CASCADE,
101
+ related_name="compliance_forms",
102
+ to="wbcompliance.complianceform",
103
+ verbose_name="Compliance Form",
104
+ ),
105
+ ),
106
+ ],
107
+ options={
108
+ "verbose_name": "Section of the Compliance Form",
109
+ "verbose_name_plural": "Sections of the Compliance Form",
110
+ },
111
+ ),
112
+ migrations.CreateModel(
113
+ name="ComplianceFormRule",
114
+ fields=[
115
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
116
+ ("text", models.TextField(default="")),
117
+ ("ticked", models.BooleanField(default=False, verbose_name="Is applicable")),
118
+ (
119
+ "section",
120
+ models.ForeignKey(
121
+ on_delete=django.db.models.deletion.CASCADE,
122
+ related_name="rules",
123
+ to="wbcompliance.complianceformsection",
124
+ verbose_name="Section",
125
+ ),
126
+ ),
127
+ ],
128
+ options={
129
+ "verbose_name": "Rule of the section of the Compliance Form",
130
+ "verbose_name_plural": "Rules of the section of the Compliance Form",
131
+ },
132
+ ),
133
+ migrations.CreateModel(
134
+ name="ComplianceFormSignatureSection",
135
+ fields=[
136
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
137
+ ("name", models.CharField(max_length=255, verbose_name="Name section")),
138
+ (
139
+ "compliance_form_signature",
140
+ models.ForeignKey(
141
+ on_delete=django.db.models.deletion.CASCADE,
142
+ related_name="compliance_form_signatures",
143
+ to="wbcompliance.complianceformsignature",
144
+ verbose_name="Compliance Form Signature",
145
+ ),
146
+ ),
147
+ ],
148
+ options={
149
+ "verbose_name": "Section of the Compliance Form Signature",
150
+ "verbose_name_plural": "Sections of the Compliance Form Signature",
151
+ },
152
+ ),
153
+ migrations.CreateModel(
154
+ name="ComplianceFormSignatureRule",
155
+ fields=[
156
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
157
+ ("text", models.TextField(default="")),
158
+ ("ticked", models.BooleanField(default=False, verbose_name="Is applicable")),
159
+ ("comments", models.TextField(default="")),
160
+ (
161
+ "section",
162
+ models.ForeignKey(
163
+ on_delete=django.db.models.deletion.CASCADE,
164
+ related_name="rules",
165
+ to="wbcompliance.complianceformsignaturesection",
166
+ verbose_name="Section",
167
+ ),
168
+ ),
169
+ ],
170
+ options={
171
+ "verbose_name": "Rule of the section of the Compliance Form Signature",
172
+ "verbose_name_plural": "Rules of the section of the Compliance Form Signature",
173
+ },
174
+ ),
175
+ migrations.CreateModel(
176
+ name="ComplianceFormType",
177
+ fields=[
178
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
179
+ ("name", models.CharField(max_length=255, verbose_name="Name")),
180
+ (
181
+ "type",
182
+ models.CharField(
183
+ choices=[("TEXT", "Text"), ("FORM", "Form")],
184
+ default="TEXT",
185
+ max_length=32,
186
+ verbose_name="Type",
187
+ ),
188
+ ),
189
+ ],
190
+ options={
191
+ "verbose_name": "Compliance Form Type",
192
+ "verbose_name_plural": "Compliance Form Types",
193
+ },
194
+ ),
195
+ migrations.AddField(
196
+ model_name="complianceform",
197
+ name="type",
198
+ field=models.ForeignKey(
199
+ null=True,
200
+ on_delete=django.db.models.deletion.PROTECT,
201
+ to="wbcompliance.complianceformtype",
202
+ verbose_name="Type",
203
+ ),
204
+ ),
205
+ migrations.AlterField(
206
+ model_name="complianceform",
207
+ name="status",
208
+ field=django_fsm.FSMField(
209
+ choices=[("DRAFT", "Draft"), ("ACTIVATION_REQUESTED", "Activation Requested"), ("ACTIVE", "Active")],
210
+ default="DRAFT",
211
+ help_text="The Compliance Form status (default to Draft)",
212
+ max_length=50,
213
+ verbose_name="Status",
214
+ ),
215
+ ),
216
+ migrations.CreateModel(
217
+ name="ComplianceTaskGroup",
218
+ fields=[
219
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
220
+ ("name", models.CharField(max_length=255, verbose_name="Name")),
221
+ ("order", models.PositiveIntegerField(blank=True, null=True, verbose_name="Order")),
222
+ ],
223
+ options={
224
+ "verbose_name": "Compliance Task Group",
225
+ "verbose_name_plural": "Compliance Task Groups",
226
+ },
227
+ ),
228
+ migrations.CreateModel(
229
+ name="ComplianceType",
230
+ fields=[
231
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
232
+ ("name", models.CharField(max_length=255, verbose_name="Name")),
233
+ ("description", models.TextField(blank=True, default="", verbose_name="Description")),
234
+ ],
235
+ options={
236
+ "verbose_name": "Compliance Type",
237
+ "verbose_name_plural": "Compliance Types",
238
+ },
239
+ ),
240
+ migrations.CreateModel(
241
+ name="ComplianceAction",
242
+ fields=[
243
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
244
+ ("title", models.CharField(max_length=255, verbose_name="Title")),
245
+ ("description", models.TextField(blank=True, default="", verbose_name="Description")),
246
+ ("deadline", models.DateField(blank=True, null=True)),
247
+ (
248
+ "progress",
249
+ models.FloatField(
250
+ default=0,
251
+ validators=[
252
+ django.core.validators.MinValueValidator(0.0),
253
+ django.core.validators.MaxValueValidator(1.0),
254
+ ],
255
+ verbose_name="Progress",
256
+ ),
257
+ ),
258
+ (
259
+ "status",
260
+ models.CharField(
261
+ choices=[
262
+ ("TO_BE_DONE", "To be done"),
263
+ ("WORK_IN_PROGRESS", "Work in Progress"),
264
+ ("DONE", "Done"),
265
+ ],
266
+ default="TO_BE_DONE",
267
+ max_length=32,
268
+ verbose_name="Status",
269
+ ),
270
+ ),
271
+ (
272
+ "type",
273
+ models.ForeignKey(
274
+ null=True,
275
+ on_delete=django.db.models.deletion.PROTECT,
276
+ to="wbcompliance.compliancetype",
277
+ verbose_name="Type",
278
+ ),
279
+ ),
280
+ ("active", models.BooleanField(default=True)),
281
+ ("created", models.DateTimeField(auto_now_add=True, verbose_name="Created")),
282
+ ("last_modified", models.DateTimeField(auto_now=True, verbose_name="Last modified")),
283
+ (
284
+ "summary_description",
285
+ models.TextField(
286
+ blank=True,
287
+ help_text="Description for the Board of Directors",
288
+ null=True,
289
+ verbose_name="Summary Description",
290
+ ),
291
+ ),
292
+ ],
293
+ options={
294
+ "verbose_name": "Compliance Action",
295
+ "verbose_name_plural": "Compliance Actions",
296
+ },
297
+ ),
298
+ migrations.CreateModel(
299
+ name="ComplianceEvent",
300
+ fields=[
301
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
302
+ (
303
+ "type_event",
304
+ models.CharField(
305
+ choices=[("INCIDENT", "Incident"), ("INFO", "Info")],
306
+ default="INCIDENT",
307
+ max_length=32,
308
+ verbose_name="Type Event",
309
+ ),
310
+ ),
311
+ (
312
+ "level",
313
+ models.CharField(
314
+ choices=[("LOW", "Low"), ("MEDIUM", "Medium"), ("HIGH", "High")],
315
+ default="LOW",
316
+ max_length=32,
317
+ verbose_name="Level",
318
+ ),
319
+ ),
320
+ ("title", models.CharField(max_length=255, verbose_name="Title")),
321
+ ("exec_summary", models.TextField(blank=True, default="", verbose_name="Executive Summary")),
322
+ ("description", models.TextField(blank=True, default="", verbose_name="Description")),
323
+ ("actions_taken", models.TextField(blank=True, default="", verbose_name="Actions Taken")),
324
+ ("consequences", models.TextField(blank=True, default="", verbose_name="Consequences")),
325
+ ("future_suggestions", models.TextField(blank=True, default="", verbose_name="Future Suggestions")),
326
+ (
327
+ "type",
328
+ models.ForeignKey(
329
+ null=True,
330
+ on_delete=django.db.models.deletion.PROTECT,
331
+ to="wbcompliance.compliancetype",
332
+ verbose_name="Type",
333
+ ),
334
+ ),
335
+ ("active", models.BooleanField(default=True)),
336
+ ("created", models.DateTimeField(auto_now_add=True, verbose_name="Created")),
337
+ ("confidential", models.BooleanField(default=False)),
338
+ ("last_modified", models.DateTimeField(auto_now=True, verbose_name="Last modified")),
339
+ (
340
+ "exec_summary_board",
341
+ models.TextField(blank=True, null=True, verbose_name="Executive Summary for the Board"),
342
+ ),
343
+ ],
344
+ options={
345
+ "verbose_name": "Compliance Event",
346
+ "verbose_name_plural": "Compliance Events",
347
+ },
348
+ ),
349
+ migrations.CreateModel(
350
+ name="ReviewComplianceTask",
351
+ fields=[
352
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
353
+ ("title", models.CharField(max_length=255, verbose_name="Title")),
354
+ ("from_date", models.DateField(blank=True, null=True, verbose_name="From")),
355
+ ("to_date", models.DateField(blank=True, null=True, verbose_name="To")),
356
+ ("description", models.TextField(blank=True, default="", verbose_name="Description")),
357
+ (
358
+ "year",
359
+ models.IntegerField(
360
+ blank=True,
361
+ null=True,
362
+ validators=[
363
+ django.core.validators.MinValueValidator(1000),
364
+ django.core.validators.MaxValueValidator(9999),
365
+ ],
366
+ verbose_name="Year",
367
+ ),
368
+ ),
369
+ ("created", models.DateTimeField(auto_now_add=True, verbose_name="Created")),
370
+ ("changed", models.DateTimeField(auto_now=True, null=True)),
371
+ (
372
+ "status",
373
+ django_fsm.FSMField(
374
+ choices=[
375
+ ("DRAFT", "Draft"),
376
+ ("VALIDATION_REQUESTED", "Validation Requested"),
377
+ ("VALIDATED", "Validated"),
378
+ ],
379
+ default="DRAFT",
380
+ max_length=50,
381
+ verbose_name="Status",
382
+ ),
383
+ ),
384
+ (
385
+ "occurance",
386
+ models.CharField(
387
+ choices=[
388
+ ("YEARLY", "Yearly"),
389
+ ("QUARTERLY", "Quarterly"),
390
+ ("MONTHLY", "Monthly"),
391
+ ("NEVER", "Never"),
392
+ ],
393
+ default="MONTHLY",
394
+ max_length=32,
395
+ verbose_name="Occurance",
396
+ ),
397
+ ),
398
+ ("computed_str", models.CharField(blank=True, max_length=512, null=True)),
399
+ ("is_instance", models.BooleanField(default=False)),
400
+ (
401
+ "review_task",
402
+ models.ForeignKey(
403
+ blank=True,
404
+ null=True,
405
+ on_delete=django.db.models.deletion.SET_NULL,
406
+ related_name="review_tasks",
407
+ to="wbcompliance.reviewcompliancetask",
408
+ verbose_name="Linked Indicator Report",
409
+ ),
410
+ ),
411
+ ("occured", models.DateTimeField(blank=True, null=True, verbose_name="Occured Instance Report")),
412
+ ],
413
+ options={
414
+ "verbose_name": "Review Compliance Task",
415
+ "verbose_name_plural": "Review Compliance Tasks",
416
+ },
417
+ ),
418
+ migrations.CreateModel(
419
+ name="ComplianceTask",
420
+ fields=[
421
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
422
+ ("title", models.CharField(max_length=255, verbose_name="Title")),
423
+ ("description", models.TextField(blank=True, default="", verbose_name="Description")),
424
+ (
425
+ "occurance",
426
+ models.CharField(
427
+ choices=[
428
+ ("YEARLY", "Yearly"),
429
+ ("QUARTERLY", "Quarterly"),
430
+ ("MONTHLY", "Monthly"),
431
+ ("NEVER", "Never"),
432
+ ],
433
+ default="MONTHLY",
434
+ max_length=32,
435
+ verbose_name="Occurance",
436
+ ),
437
+ ),
438
+ ("active", models.BooleanField(default=True)),
439
+ (
440
+ "group",
441
+ models.ForeignKey(
442
+ blank=True,
443
+ null=True,
444
+ on_delete=django.db.models.deletion.SET_NULL,
445
+ related_name="tasks_related",
446
+ to="wbcompliance.compliancetaskgroup",
447
+ verbose_name="Group",
448
+ ),
449
+ ),
450
+ (
451
+ "type",
452
+ models.ForeignKey(
453
+ blank=True,
454
+ null=True,
455
+ on_delete=django.db.models.deletion.PROTECT,
456
+ to="wbcompliance.compliancetype",
457
+ verbose_name="Type",
458
+ ),
459
+ ),
460
+ (
461
+ "review",
462
+ models.ManyToManyField(
463
+ blank=True,
464
+ help_text="list of reports that contain this task",
465
+ related_name="tasks",
466
+ to="wbcompliance.reviewcompliancetask",
467
+ verbose_name="Indicator Reports",
468
+ ),
469
+ ),
470
+ ("remarks", models.TextField(blank=True, null=True, verbose_name="Remarks")),
471
+ (
472
+ "risk_level",
473
+ models.CharField(
474
+ blank=True,
475
+ choices=[("LOW", "Low"), ("MEDIUM", "Medium"), ("HIGH", "High")],
476
+ max_length=32,
477
+ null=True,
478
+ verbose_name="Risk Level",
479
+ ),
480
+ ),
481
+ ],
482
+ options={
483
+ "verbose_name": "Compliance Task",
484
+ "verbose_name_plural": "Compliance Tasks",
485
+ },
486
+ ),
487
+ migrations.CreateModel(
488
+ name="ComplianceTaskInstance",
489
+ fields=[
490
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
491
+ ("occured", models.DateField(auto_now_add=True)),
492
+ (
493
+ "status",
494
+ models.CharField(
495
+ choices=[
496
+ ("NOT_CHECKED", "Not Checked"),
497
+ ("WARNING", "Warning"),
498
+ ("FOR_INFO", "For Info"),
499
+ ("NOTHING_TO_REPORT", "Nothing to Report"),
500
+ ("BREACH", "Breach"),
501
+ ],
502
+ default="NOT_CHECKED",
503
+ max_length=32,
504
+ verbose_name="Status",
505
+ ),
506
+ ),
507
+ ("text", models.TextField(blank=True, default="", verbose_name="Text")),
508
+ (
509
+ "task",
510
+ models.ForeignKey(
511
+ on_delete=django.db.models.deletion.CASCADE,
512
+ related_name="task_instances_related",
513
+ to="wbcompliance.compliancetask",
514
+ verbose_name="Compliance Task",
515
+ ),
516
+ ),
517
+ (
518
+ "summary_text",
519
+ models.TextField(
520
+ blank=True,
521
+ help_text="Information for the Board of Directors",
522
+ null=True,
523
+ verbose_name="Summary Text",
524
+ ),
525
+ ),
526
+ (
527
+ "review",
528
+ models.ManyToManyField(
529
+ blank=True,
530
+ help_text="list of indicator instance reports that contain this task",
531
+ related_name="task_instances",
532
+ to="wbcompliance.reviewcompliancetask",
533
+ verbose_name="Indicator Instance Reports",
534
+ ),
535
+ ),
536
+ ],
537
+ options={
538
+ "verbose_name": "Compliance Task Instance",
539
+ "verbose_name_plural": "Compliance Task Instances",
540
+ },
541
+ ),
542
+ migrations.RemoveField(
543
+ model_name="complianceform",
544
+ name="assigned_to",
545
+ ),
546
+ migrations.AddField(
547
+ model_name="complianceform",
548
+ name="assigned_to",
549
+ field=models.ManyToManyField(
550
+ blank=True,
551
+ help_text="List of group to whom this Compliance Form applies. It is applied to all users if not specified",
552
+ related_name="compliance_forms",
553
+ to="auth.group",
554
+ verbose_name="Group to which the Compliance Form applies",
555
+ ),
556
+ ),
557
+ migrations.CreateModel(
558
+ name="RiskCheck",
559
+ fields=[
560
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
561
+ ("computed_str", models.CharField(blank=True, max_length=512, null=True)),
562
+ (
563
+ "creation_datetime",
564
+ models.DateTimeField(
565
+ auto_now_add=True,
566
+ help_text="Time at which the check was created/triggered",
567
+ verbose_name="Creation Date",
568
+ ),
569
+ ),
570
+ (
571
+ "evaluation_date",
572
+ models.DateField(
573
+ help_text="The date at which the rule was evaluated", verbose_name="Evaluation Date"
574
+ ),
575
+ ),
576
+ ],
577
+ options={
578
+ "verbose_name": "Risk Check",
579
+ "verbose_name_plural": "Risk Checks",
580
+ },
581
+ ),
582
+ migrations.CreateModel(
583
+ name="RiskIncident",
584
+ fields=[
585
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
586
+ ("computed_str", models.CharField(blank=True, max_length=512, null=True)),
587
+ (
588
+ "severity",
589
+ models.CharField(
590
+ choices=[("LOW", "Low"), ("MEDIUM", "Medium"), ("HIGH", "High")],
591
+ default="LOW",
592
+ help_text="The incident Severity",
593
+ max_length=8,
594
+ verbose_name="Severity",
595
+ ),
596
+ ),
597
+ ("comment", models.TextField(blank=True, null=True, verbose_name="Comment")),
598
+ (
599
+ "date_range",
600
+ django.contrib.postgres.fields.ranges.DateRangeField(
601
+ blank=True, help_text="The incident spans date interval", null=True
602
+ ),
603
+ ),
604
+ ("breached_object_id", models.PositiveIntegerField(blank=True, null=True)),
605
+ (
606
+ "breached_object_repr",
607
+ models.CharField(
608
+ blank=True,
609
+ help_text="String Representation of the breached object",
610
+ max_length=128,
611
+ null=True,
612
+ verbose_name="Breached Object Representation",
613
+ ),
614
+ ),
615
+ (
616
+ "status",
617
+ django_fsm.FSMField(
618
+ choices=[
619
+ ("OPEN", "Open"),
620
+ ("RESOLVED", "Resolved"),
621
+ ("IGNORED", "Ignored"),
622
+ ("CLOSED", "Closed"),
623
+ ],
624
+ default="OPEN",
625
+ max_length=50,
626
+ verbose_name="Status",
627
+ ),
628
+ ),
629
+ (
630
+ "breached_content_type",
631
+ models.ForeignKey(
632
+ blank=True,
633
+ null=True,
634
+ on_delete=django.db.models.deletion.CASCADE,
635
+ to="contenttypes.contenttype",
636
+ ),
637
+ ),
638
+ ],
639
+ options={
640
+ "verbose_name": "Risk Incident",
641
+ "verbose_name_plural": "Risk Incidents",
642
+ },
643
+ ),
644
+ migrations.CreateModel(
645
+ name="RiskRule",
646
+ fields=[
647
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
648
+ (
649
+ "permission_type",
650
+ models.CharField(
651
+ choices=[("INTERNAL", "Internal"), ("PUBLIC", "Public"), ("PRIVATE", "Private")],
652
+ default="PRIVATE",
653
+ max_length=8,
654
+ ),
655
+ ),
656
+ ("name", models.CharField(max_length=512)),
657
+ ("description", models.CharField(default="", max_length=516, verbose_name="Quick Description")),
658
+ ("is_enable", models.BooleanField(default=True, verbose_name="Enabled")),
659
+ (
660
+ "is_passive",
661
+ models.BooleanField(
662
+ default=True,
663
+ help_text="If False, This rule can only be triggered through signal",
664
+ verbose_name="Passive",
665
+ ),
666
+ ),
667
+ (
668
+ "is_silent",
669
+ models.BooleanField(
670
+ default=True, help_text="If true, the notification won't be send through System nor Mail"
671
+ ),
672
+ ),
673
+ (
674
+ "is_mandatory",
675
+ models.BooleanField(
676
+ default=False,
677
+ help_text="A mandatory rule cannot be modified by anyone other than the administrators",
678
+ ),
679
+ ),
680
+ ("parameters", models.JSONField(blank=True, default=dict)),
681
+ (
682
+ "creator",
683
+ models.ForeignKey(
684
+ blank=True,
685
+ null=True,
686
+ on_delete=django.db.models.deletion.SET_NULL,
687
+ related_name="created_%(app_label)s_%(class)s",
688
+ to=settings.AUTH_USER_MODEL,
689
+ ),
690
+ ),
691
+ ],
692
+ options={
693
+ "verbose_name": "Risk Rule",
694
+ "verbose_name_plural": "Risk Rules",
695
+ "abstract": False,
696
+ "default_permissions": ("add", "change", "delete", "view", "administrate"),
697
+ },
698
+ ),
699
+ migrations.AlterField(
700
+ model_name="complianceform",
701
+ name="only_send_to_internals",
702
+ field=models.BooleanField(default=True, help_text="Sent the Compliance Form only to internal users"),
703
+ ),
704
+ migrations.CreateModel(
705
+ name="TriggererIncidentRelationship",
706
+ fields=[
707
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
708
+ ("computed_str", models.CharField(blank=True, max_length=512, null=True)),
709
+ (
710
+ "severity",
711
+ models.CharField(
712
+ choices=[("LOW", "Low"), ("MEDIUM", "Medium"), ("HIGH", "High")],
713
+ default="LOW",
714
+ help_text="The incident Severity",
715
+ max_length=8,
716
+ verbose_name="Severity",
717
+ ),
718
+ ),
719
+ ("comment", models.TextField(blank=True, null=True, verbose_name="Comment")),
720
+ ("report", models.TextField(blank=True, null=True, verbose_name="Report")),
721
+ (
722
+ "status",
723
+ django_fsm.FSMField(
724
+ choices=[
725
+ ("OPEN", "Open"),
726
+ ("RESOLVED", "Resolved"),
727
+ ("IGNORED", "Ignored"),
728
+ ("CLOSED", "Closed"),
729
+ ],
730
+ default="OPEN",
731
+ max_length=50,
732
+ verbose_name="Status",
733
+ ),
734
+ ),
735
+ (
736
+ "incident",
737
+ models.ForeignKey(
738
+ on_delete=django.db.models.deletion.CASCADE,
739
+ related_name="triggerer_relationships",
740
+ to="wbcompliance.riskincident",
741
+ ),
742
+ ),
743
+ (
744
+ "rule_check",
745
+ models.ForeignKey(
746
+ help_text="The check that opened this incident",
747
+ on_delete=django.db.models.deletion.CASCADE,
748
+ related_name="incidents",
749
+ to="wbcompliance.riskcheck",
750
+ verbose_name="Check",
751
+ ),
752
+ ),
753
+ ],
754
+ options={
755
+ "verbose_name": "Incident to Triggerer relationship",
756
+ "verbose_name_plural": "Incident to Triggerer relationships",
757
+ },
758
+ ),
759
+ migrations.CreateModel(
760
+ name="RuleTriggererRelationship",
761
+ fields=[
762
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
763
+ ("computed_str", models.CharField(blank=True, max_length=512, null=True)),
764
+ ("triggerer_id", models.PositiveIntegerField()),
765
+ ("triggerer_repr", models.CharField(blank=True, max_length=256, null=True)),
766
+ (
767
+ "rule",
768
+ models.ForeignKey(
769
+ on_delete=django.db.models.deletion.CASCADE,
770
+ related_name="triggerer_relationships",
771
+ to="wbcompliance.riskrule",
772
+ ),
773
+ ),
774
+ (
775
+ "triggerer_content_type",
776
+ models.ForeignKey(
777
+ on_delete=django.db.models.deletion.CASCADE,
778
+ related_name="risk_management_triggerers",
779
+ to="contenttypes.contenttype",
780
+ ),
781
+ ),
782
+ ],
783
+ options={
784
+ "verbose_name": "Triggerer to Rule relationship",
785
+ "verbose_name_plural": "Triggerer to Rule relationships",
786
+ },
787
+ ),
788
+ migrations.CreateModel(
789
+ name="RuleThreshold",
790
+ fields=[
791
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
792
+ ("computed_str", models.CharField(blank=True, max_length=512, null=True)),
793
+ (
794
+ "range",
795
+ django.contrib.postgres.fields.ranges.DecimalRangeField(
796
+ help_text="The range which triggers the specified severity. null bound represent infinity",
797
+ verbose_name="Threshold range",
798
+ ),
799
+ ),
800
+ (
801
+ "severity",
802
+ models.CharField(
803
+ choices=[("LOW", "Low"), ("MEDIUM", "Medium"), ("HIGH", "High")],
804
+ default="LOW",
805
+ help_text="The Triggered Severity when the rule is within the threshold range",
806
+ max_length=8,
807
+ verbose_name="Triggered Severity",
808
+ ),
809
+ ),
810
+ (
811
+ "rule",
812
+ models.ForeignKey(
813
+ on_delete=django.db.models.deletion.CASCADE,
814
+ related_name="thresholds",
815
+ to="wbcompliance.riskrule",
816
+ ),
817
+ ),
818
+ ],
819
+ ),
820
+ migrations.CreateModel(
821
+ name="RuleBackend",
822
+ fields=[
823
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
824
+ ("name", models.CharField(max_length=128)),
825
+ ("backend_class_path", models.CharField(max_length=512)),
826
+ ("backend_class_name", models.CharField(default="RuleBackend", max_length=128)),
827
+ (
828
+ "allowed_triggerer_content_type",
829
+ models.ForeignKey(
830
+ blank=True,
831
+ null=True,
832
+ on_delete=django.db.models.deletion.CASCADE,
833
+ to="contenttypes.contenttype",
834
+ ),
835
+ ),
836
+ ],
837
+ options={
838
+ "verbose_name": "Rule Backend",
839
+ "verbose_name_plural": "Rule Backends",
840
+ },
841
+ ),
842
+ migrations.AddField(
843
+ model_name="riskrule",
844
+ name="rule_backend",
845
+ field=models.ForeignKey(
846
+ on_delete=django.db.models.deletion.CASCADE, related_name="rules", to="wbcompliance.rulebackend"
847
+ ),
848
+ ),
849
+ migrations.AddField(
850
+ model_name="riskincident",
851
+ name="rule",
852
+ field=models.ForeignKey(
853
+ help_text="The rule that opened this incident",
854
+ on_delete=django.db.models.deletion.CASCADE,
855
+ related_name="incidents",
856
+ to="wbcompliance.riskrule",
857
+ verbose_name="Rule",
858
+ ),
859
+ ),
860
+ migrations.AddField(
861
+ model_name="riskcheck",
862
+ name="rule_triggerer_relationship",
863
+ field=models.ForeignKey(
864
+ on_delete=django.db.models.deletion.CASCADE,
865
+ related_name="checks",
866
+ to="wbcompliance.ruletriggererrelationship",
867
+ verbose_name="Rule-Triggerer Relationship",
868
+ ),
869
+ ),
870
+ migrations.AddIndex(
871
+ model_name="triggererincidentrelationship",
872
+ index=models.Index(fields=["incident", "rule_check"], name="wbcomplianc_inciden_e01fa0_idx"),
873
+ ),
874
+ migrations.AlterUniqueTogether(
875
+ name="triggererincidentrelationship",
876
+ unique_together={("incident", "rule_check")},
877
+ ),
878
+ migrations.AddIndex(
879
+ model_name="ruletriggererrelationship",
880
+ index=models.Index(
881
+ fields=["rule", "triggerer_content_type", "triggerer_id"], name="wbcomplianc_rule_id_c5fc0f_idx"
882
+ ),
883
+ ),
884
+ migrations.AlterUniqueTogether(
885
+ name="rulethreshold",
886
+ unique_together={("rule", "severity")},
887
+ ),
888
+ migrations.AlterUniqueTogether(
889
+ name="riskrule",
890
+ unique_together={("rule_backend", "parameters")},
891
+ ),
892
+ migrations.AddField(
893
+ model_name="rulethreshold",
894
+ name="notifiable_groups",
895
+ field=models.ManyToManyField(
896
+ blank=True,
897
+ help_text="Notified Groups for this rule and severity",
898
+ related_name="notified_rule_thresholds",
899
+ to="auth.group",
900
+ verbose_name="Notifiable Groups",
901
+ ),
902
+ ),
903
+ migrations.AddField(
904
+ model_name="riskrule",
905
+ name="apply_to_all_active_relationships",
906
+ field=models.BooleanField(
907
+ default=False,
908
+ help_text="If True, will keep this rule syncrhonize with the backend definition of all active relationship",
909
+ ),
910
+ ),
911
+ migrations.AddField(
912
+ model_name="riskrule",
913
+ name="automatically_close_incident",
914
+ field=models.BooleanField(
915
+ default=False, help_text="If True, this rule will automatically close all encountered incidents"
916
+ ),
917
+ ),
918
+ migrations.AlterField(
919
+ model_name="reviewcompliancetask",
920
+ name="computed_str",
921
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
922
+ ),
923
+ migrations.AlterField(
924
+ model_name="riskcheck",
925
+ name="computed_str",
926
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
927
+ ),
928
+ migrations.AlterField(
929
+ model_name="riskincident",
930
+ name="computed_str",
931
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
932
+ ),
933
+ migrations.AlterField(
934
+ model_name="rulethreshold",
935
+ name="computed_str",
936
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
937
+ ),
938
+ migrations.AlterField(
939
+ model_name="ruletriggererrelationship",
940
+ name="computed_str",
941
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
942
+ ),
943
+ migrations.AlterField(
944
+ model_name="triggererincidentrelationship",
945
+ name="computed_str",
946
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
947
+ ),
948
+ migrations.CreateModel(
949
+ name="RiskIncidentType",
950
+ fields=[
951
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
952
+ ("name", models.CharField(max_length=128)),
953
+ ("severity_order", models.PositiveIntegerField(default=0, unique=True)),
954
+ ("color", models.CharField(default="rgb(247, 232, 113)", max_length=20, verbose_name="Color")),
955
+ ("is_ignorable", models.BooleanField(default=True, verbose_name="Can be ignored")),
956
+ ("is_automatically_closed", models.BooleanField(default=False, verbose_name="Automatically closed")),
957
+ (
958
+ "is_informational",
959
+ models.BooleanField(
960
+ default=False,
961
+ help_text="If true, the associated rule is not considered an incident",
962
+ verbose_name="Only Informational",
963
+ ),
964
+ ),
965
+ ],
966
+ options={
967
+ "verbose_name": "Risk Incident Type",
968
+ "verbose_name_plural": "Risk Incidents Type",
969
+ "ordering": ("severity_order",),
970
+ },
971
+ ),
972
+ migrations.AddField(
973
+ model_name="riskincident",
974
+ name="is_notified",
975
+ field=models.BooleanField(
976
+ default=False,
977
+ help_text="True if the incident is already notified to the users",
978
+ verbose_name="Notified",
979
+ ),
980
+ ),
981
+ migrations.AddField(
982
+ model_name="rulethreshold",
983
+ name="upgradable_after_days",
984
+ field=models.PositiveIntegerField(
985
+ blank=True,
986
+ help_text="If set to a positive integer, the resulting incident will be elevated to the next rule severity after an incident remains open this number of days",
987
+ null=True,
988
+ verbose_name="Upgradable to next severity after X Days",
989
+ ),
990
+ ),
991
+ migrations.RenameField(
992
+ model_name="riskincident",
993
+ old_name="severity",
994
+ new_name="old_severity",
995
+ ),
996
+ migrations.RenameField(
997
+ model_name="rulethreshold",
998
+ old_name="severity",
999
+ new_name="old_severity",
1000
+ ),
1001
+ migrations.RenameField(
1002
+ model_name="triggererincidentrelationship",
1003
+ old_name="severity",
1004
+ new_name="old_severity",
1005
+ ),
1006
+ migrations.AddField(
1007
+ model_name="rulethreshold",
1008
+ name="severity",
1009
+ field=models.ForeignKey(
1010
+ blank=True,
1011
+ help_text="The Triggered Severity when the rule is within the threshold range",
1012
+ null=True,
1013
+ on_delete=django.db.models.deletion.CASCADE,
1014
+ related_name="thresholds",
1015
+ to="wbcompliance.riskincidenttype",
1016
+ verbose_name="Triggered Severity",
1017
+ ),
1018
+ ),
1019
+ migrations.RemoveField(
1020
+ model_name="riskincident",
1021
+ name="old_severity",
1022
+ ),
1023
+ migrations.RemoveField(
1024
+ model_name="triggererincidentrelationship",
1025
+ name="old_severity",
1026
+ ),
1027
+ migrations.AlterUniqueTogether(
1028
+ name="rulethreshold",
1029
+ unique_together={("rule", "severity")},
1030
+ ),
1031
+ migrations.RemoveField(
1032
+ model_name="rulethreshold",
1033
+ name="old_severity",
1034
+ ),
1035
+ migrations.AddField(
1036
+ model_name="riskincident",
1037
+ name="severity",
1038
+ field=models.ForeignKey(
1039
+ default=None,
1040
+ on_delete=django.db.models.deletion.CASCADE,
1041
+ related_name="%(class)s",
1042
+ to="wbcompliance.riskincidenttype",
1043
+ verbose_name="Severity",
1044
+ ),
1045
+ ),
1046
+ migrations.AlterField(
1047
+ model_name="rulethreshold",
1048
+ name="severity",
1049
+ field=models.ForeignKey(
1050
+ default=None,
1051
+ help_text="The Triggered Severity when the rule is within the threshold range",
1052
+ on_delete=django.db.models.deletion.CASCADE,
1053
+ related_name="thresholds",
1054
+ to="wbcompliance.riskincidenttype",
1055
+ verbose_name="Triggered Severity",
1056
+ ),
1057
+ preserve_default=False,
1058
+ ),
1059
+ migrations.AddField(
1060
+ model_name="triggererincidentrelationship",
1061
+ name="severity",
1062
+ field=models.ForeignKey(
1063
+ default=None,
1064
+ on_delete=django.db.models.deletion.CASCADE,
1065
+ related_name="%(class)s",
1066
+ to="wbcompliance.riskincidenttype",
1067
+ verbose_name="Severity",
1068
+ ),
1069
+ ),
1070
+ migrations.AlterField(
1071
+ model_name="complianceform",
1072
+ name="assigned_to",
1073
+ field=models.ManyToManyField(
1074
+ blank=True,
1075
+ help_text="List of group to whom this Compliance Form applies. It is applied to all users if not specified",
1076
+ related_name="compliance_forms",
1077
+ to="auth.group",
1078
+ verbose_name="Group to which the Compliance Form applies",
1079
+ ),
1080
+ ),
1081
+ migrations.AddField(
1082
+ model_name="riskincident",
1083
+ name="ignore_duration",
1084
+ field=models.DurationField(
1085
+ blank=True,
1086
+ help_text="If set, will ignore the forthcoming incidents for the specified duration",
1087
+ null=True,
1088
+ ),
1089
+ ),
1090
+ migrations.AddField(
1091
+ model_name="riskincident",
1092
+ name="last_ignored_date",
1093
+ field=models.DateField(blank=True, null=True),
1094
+ ),
1095
+ migrations.AlterModelOptions(
1096
+ name="complianceform",
1097
+ options={"verbose_name": "Compliance Form", "verbose_name_plural": "Compliance Forms"},
1098
+ ),
1099
+ migrations.AlterModelOptions(
1100
+ name="compliancetype",
1101
+ options={
1102
+ "permissions": [("admin_compliance", "Can administer Compliance")],
1103
+ "verbose_name": "Compliance Type",
1104
+ "verbose_name_plural": "Compliance Types",
1105
+ },
1106
+ ),
1107
+ migrations.RenameField(
1108
+ model_name="complianceform",
1109
+ old_name="only_send_to_internals",
1110
+ new_name="only_internal",
1111
+ ),
1112
+ migrations.AlterField(
1113
+ model_name="complianceform",
1114
+ name="only_internal",
1115
+ field=models.BooleanField(
1116
+ default=True, help_text="Send the Form only to internal users", verbose_name="Only internal"
1117
+ ),
1118
+ ),
1119
+ migrations.RenameField(
1120
+ model_name="complianceformsignature",
1121
+ old_name="personal_notes",
1122
+ new_name="remark",
1123
+ ),
1124
+ migrations.AlterField(
1125
+ model_name="complianceformsignature",
1126
+ name="remark",
1127
+ field=models.TextField(blank=True, default="", null=True, verbose_name="Remark"),
1128
+ ),
1129
+ migrations.RenameField(
1130
+ model_name="complianceformsignature",
1131
+ old_name="policy_text",
1132
+ new_name="policy",
1133
+ ),
1134
+ migrations.AlterField(
1135
+ model_name="complianceformsignature",
1136
+ name="policy",
1137
+ field=models.TextField(blank=True, default="", null=True, verbose_name="Policy"),
1138
+ ),
1139
+ migrations.RenameField(
1140
+ model_name="compliancetask",
1141
+ old_name="occurance",
1142
+ new_name="occurrence",
1143
+ ),
1144
+ migrations.RenameField(
1145
+ model_name="reviewcompliancetask",
1146
+ old_name="occurance",
1147
+ new_name="occurrence",
1148
+ ),
1149
+ migrations.AlterField(
1150
+ model_name="compliancetask",
1151
+ name="occurrence",
1152
+ field=models.CharField(
1153
+ choices=[("YEARLY", "Yearly"), ("QUARTERLY", "Quarterly"), ("MONTHLY", "Monthly"), ("NEVER", "Never")],
1154
+ default="MONTHLY",
1155
+ max_length=32,
1156
+ verbose_name="Occurrence",
1157
+ ),
1158
+ ),
1159
+ migrations.AlterField(
1160
+ model_name="reviewcompliancetask",
1161
+ name="occurrence",
1162
+ field=models.CharField(
1163
+ choices=[("YEARLY", "Yearly"), ("QUARTERLY", "Quarterly"), ("MONTHLY", "Monthly"), ("NEVER", "Never")],
1164
+ default="MONTHLY",
1165
+ max_length=32,
1166
+ verbose_name="Occurrence",
1167
+ ),
1168
+ ),
1169
+ migrations.AlterField(
1170
+ model_name="complianceform",
1171
+ name="policy",
1172
+ field=models.TextField(blank=True, default="", null=True, verbose_name="Policy"),
1173
+ ),
1174
+ migrations.AlterField(
1175
+ model_name="complianceform",
1176
+ name="assigned_to",
1177
+ field=models.ManyToManyField(
1178
+ blank=True,
1179
+ related_name="forms_of_group",
1180
+ to="auth.group",
1181
+ verbose_name="Group to which the Form applies",
1182
+ ),
1183
+ ),
1184
+ migrations.AlterField(
1185
+ model_name="complianceform",
1186
+ name="changed",
1187
+ field=models.DateTimeField(auto_now=True, default=django.utils.timezone.now, verbose_name="Changed"),
1188
+ preserve_default=False,
1189
+ ),
1190
+ migrations.AlterField(
1191
+ model_name="complianceformsignature",
1192
+ name="version",
1193
+ field=models.IntegerField(default=0, verbose_name="Version"),
1194
+ ),
1195
+ migrations.AlterField(
1196
+ model_name="reviewcompliancetask",
1197
+ name="changed",
1198
+ field=models.DateTimeField(auto_now=True, default=django.utils.timezone.now, verbose_name="Changed"),
1199
+ preserve_default=False,
1200
+ ),
1201
+ migrations.AddField(
1202
+ model_name="compliancetype",
1203
+ name="in_charge",
1204
+ field=models.ManyToManyField(
1205
+ blank=True,
1206
+ help_text="groups responsible for managing this type of compliance",
1207
+ related_name="compliance_types",
1208
+ to="auth.group",
1209
+ verbose_name="Group of administrators",
1210
+ ),
1211
+ ),
1212
+ migrations.AlterField(
1213
+ model_name="complianceformsignature",
1214
+ name="compliance_form",
1215
+ field=models.ForeignKey(
1216
+ on_delete=django.db.models.deletion.CASCADE,
1217
+ related_name="complianceforms",
1218
+ to="wbcompliance.complianceform",
1219
+ verbose_name="Form",
1220
+ ),
1221
+ ),
1222
+ migrations.AlterField(
1223
+ model_name="complianceformsignature",
1224
+ name="signed",
1225
+ field=models.DateTimeField(blank=True, null=True, verbose_name="Signed"),
1226
+ ),
1227
+ migrations.RenameField(
1228
+ model_name="complianceform",
1229
+ old_name="type",
1230
+ new_name="form_type",
1231
+ ),
1232
+ migrations.AlterField(
1233
+ model_name="complianceform",
1234
+ name="form_type",
1235
+ field=models.ForeignKey(
1236
+ on_delete=django.db.models.deletion.PROTECT,
1237
+ to="wbcompliance.complianceformtype",
1238
+ verbose_name="Form Type",
1239
+ ),
1240
+ ),
1241
+ migrations.AlterField(
1242
+ model_name="reviewcompliancetask",
1243
+ name="is_instance",
1244
+ field=models.BooleanField(default=False, verbose_name="Is occurrence"),
1245
+ ),
1246
+ migrations.AlterField(
1247
+ model_name="reviewcompliancetask",
1248
+ name="review_task",
1249
+ field=models.ForeignKey(
1250
+ blank=True,
1251
+ null=True,
1252
+ on_delete=django.db.models.deletion.SET_NULL,
1253
+ related_name="review_tasks",
1254
+ to="wbcompliance.reviewcompliancetask",
1255
+ verbose_name="Parent Review",
1256
+ ),
1257
+ ),
1258
+ migrations.AlterField(
1259
+ model_name="complianceformrule",
1260
+ name="ticked",
1261
+ field=models.BooleanField(default=False, verbose_name="Expected Answer"),
1262
+ ),
1263
+ migrations.AlterField(
1264
+ model_name="complianceformsignaturerule",
1265
+ name="ticked",
1266
+ field=models.BooleanField(default=False, verbose_name="Answer"),
1267
+ ),
1268
+ migrations.AlterField(
1269
+ model_name="compliancetype",
1270
+ name="name",
1271
+ field=models.CharField(max_length=255, unique=True, verbose_name="Name"),
1272
+ ),
1273
+ migrations.AlterField(
1274
+ model_name="complianceaction",
1275
+ name="description",
1276
+ field=models.TextField(blank=True, default="", null=True, verbose_name="Description"),
1277
+ ),
1278
+ migrations.AlterField(
1279
+ model_name="complianceaction",
1280
+ name="summary_description",
1281
+ field=models.TextField(blank=True, null=True, verbose_name="Summary Description"),
1282
+ ),
1283
+ migrations.AlterField(
1284
+ model_name="complianceevent",
1285
+ name="exec_summary",
1286
+ field=models.TextField(blank=True, null=True, verbose_name="Executive Summary"),
1287
+ ),
1288
+ migrations.AlterField(
1289
+ model_name="complianceevent",
1290
+ name="exec_summary_board",
1291
+ field=models.TextField(blank=True, null=True, verbose_name="Executive Summary for the Board"),
1292
+ ),
1293
+ migrations.AlterField(
1294
+ model_name="complianceevent",
1295
+ name="confidential",
1296
+ field=models.BooleanField(default=False, verbose_name="Confidential"),
1297
+ ),
1298
+ migrations.AlterField(
1299
+ model_name="complianceaction",
1300
+ name="active",
1301
+ field=models.BooleanField(default=True, verbose_name="Active"),
1302
+ ),
1303
+ migrations.AlterField(
1304
+ model_name="reviewcompliancetask",
1305
+ name="occured",
1306
+ field=models.DateField(blank=True, null=True, verbose_name="Occured Instance"),
1307
+ ),
1308
+ migrations.AlterField(
1309
+ model_name="compliancetaskinstance",
1310
+ name="occured",
1311
+ field=models.DateField(auto_now_add=True, verbose_name="Occured"),
1312
+ ),
1313
+ migrations.AlterField(
1314
+ model_name="compliancetask",
1315
+ name="review",
1316
+ field=models.ManyToManyField(
1317
+ blank=True,
1318
+ help_text="list of reviews that contain this task",
1319
+ related_name="tasks",
1320
+ to="wbcompliance.reviewcompliancetask",
1321
+ verbose_name="Review",
1322
+ ),
1323
+ ),
1324
+ migrations.AlterField(
1325
+ model_name="compliancetaskinstance",
1326
+ name="review",
1327
+ field=models.ManyToManyField(
1328
+ blank=True,
1329
+ help_text="list of reviews that contain this task instance",
1330
+ related_name="task_instances",
1331
+ to="wbcompliance.reviewcompliancetask",
1332
+ verbose_name="Review",
1333
+ ),
1334
+ ),
1335
+ migrations.AlterField(
1336
+ model_name="compliancetaskinstance",
1337
+ name="summary_text",
1338
+ field=models.TextField(blank=True, null=True, verbose_name="Summary Text"),
1339
+ ),
1340
+ migrations.AlterField(
1341
+ model_name="complianceaction",
1342
+ name="deadline",
1343
+ field=models.DateField(blank=True, null=True, verbose_name="Deadline"),
1344
+ ),
1345
+ migrations.AddField(
1346
+ model_name="complianceform",
1347
+ name="compliance_type",
1348
+ field=models.ForeignKey(
1349
+ blank=True,
1350
+ null=True,
1351
+ on_delete=django.db.models.deletion.PROTECT,
1352
+ to="wbcompliance.compliancetype",
1353
+ verbose_name="Type",
1354
+ ),
1355
+ ),
1356
+ migrations.AddField(
1357
+ model_name="reviewcompliancetask",
1358
+ name="type",
1359
+ field=models.ForeignKey(
1360
+ blank=True,
1361
+ null=True,
1362
+ on_delete=django.db.models.deletion.PROTECT,
1363
+ to="wbcompliance.compliancetype",
1364
+ verbose_name="Type",
1365
+ ),
1366
+ ),
1367
+ migrations.RunSQL(
1368
+ sql="SET CONSTRAINTS ALL IMMEDIATE;",
1369
+ ),
1370
+ migrations.AlterField(
1371
+ model_name="complianceform",
1372
+ name="compliance_type",
1373
+ field=models.ForeignKey(
1374
+ on_delete=django.db.models.deletion.PROTECT, to="wbcompliance.compliancetype", verbose_name="Type"
1375
+ ),
1376
+ ),
1377
+ migrations.AlterField(
1378
+ model_name="complianceaction",
1379
+ name="type",
1380
+ field=models.ForeignKey(
1381
+ on_delete=django.db.models.deletion.PROTECT,
1382
+ related_name="actions_of_type",
1383
+ to="wbcompliance.compliancetype",
1384
+ verbose_name="Type",
1385
+ ),
1386
+ ),
1387
+ migrations.AlterField(
1388
+ model_name="complianceevent",
1389
+ name="type",
1390
+ field=models.ForeignKey(
1391
+ on_delete=django.db.models.deletion.PROTECT,
1392
+ related_name="events_of_type",
1393
+ to="wbcompliance.compliancetype",
1394
+ verbose_name="Type",
1395
+ ),
1396
+ ),
1397
+ migrations.AlterField(
1398
+ model_name="compliancetask",
1399
+ name="type",
1400
+ field=models.ForeignKey(
1401
+ on_delete=django.db.models.deletion.PROTECT,
1402
+ related_name="tasks_of_type",
1403
+ to="wbcompliance.compliancetype",
1404
+ verbose_name="Type",
1405
+ ),
1406
+ ),
1407
+ migrations.AlterField(
1408
+ model_name="reviewcompliancetask",
1409
+ name="type",
1410
+ field=models.ForeignKey(
1411
+ on_delete=django.db.models.deletion.PROTECT,
1412
+ related_name="reviewtask_of_type",
1413
+ to="wbcompliance.compliancetype",
1414
+ verbose_name="Type",
1415
+ ),
1416
+ ),
1417
+ migrations.RunSQL(
1418
+ sql="SET CONSTRAINTS ALL DEFERRED;",
1419
+ ),
1420
+ migrations.RemoveIndex(
1421
+ model_name="ruletriggererrelationship",
1422
+ name="wbcomplianc_rule_id_c5fc0f_idx",
1423
+ ),
1424
+ migrations.RenameField(
1425
+ model_name="riskcheck",
1426
+ old_name="rule_triggerer_relationship",
1427
+ new_name="rule_checked_object_relationship",
1428
+ ),
1429
+ migrations.RenameField(
1430
+ model_name="rulebackend",
1431
+ old_name="allowed_triggerer_content_type",
1432
+ new_name="allowed_checked_object_content_type",
1433
+ ),
1434
+ migrations.RenameField(
1435
+ model_name="ruletriggererrelationship",
1436
+ old_name="triggerer_id",
1437
+ new_name="checked_object_id",
1438
+ ),
1439
+ migrations.RenameField(
1440
+ model_name="ruletriggererrelationship",
1441
+ old_name="triggerer_repr",
1442
+ new_name="checked_object_repr",
1443
+ ),
1444
+ migrations.RenameField(
1445
+ model_name="ruletriggererrelationship",
1446
+ old_name="triggerer_content_type",
1447
+ new_name="checked_object_content_type",
1448
+ ),
1449
+ migrations.AddField(
1450
+ model_name="riskcheck",
1451
+ name="trigger_content_type",
1452
+ field=models.ForeignKey(
1453
+ blank=True,
1454
+ null=True,
1455
+ on_delete=django.db.models.deletion.CASCADE,
1456
+ related_name="triggered_checks",
1457
+ to="contenttypes.contenttype",
1458
+ ),
1459
+ ),
1460
+ migrations.AddField(
1461
+ model_name="riskcheck",
1462
+ name="trigger_id",
1463
+ field=models.PositiveIntegerField(blank=True, null=True),
1464
+ ),
1465
+ migrations.AlterField(
1466
+ model_name="ruletriggererrelationship",
1467
+ name="checked_object_content_type",
1468
+ field=models.ForeignKey(
1469
+ on_delete=django.db.models.deletion.CASCADE,
1470
+ related_name="risk_management_checked_objects",
1471
+ to="contenttypes.contenttype",
1472
+ ),
1473
+ ),
1474
+ migrations.AlterField(
1475
+ model_name="ruletriggererrelationship",
1476
+ name="rule",
1477
+ field=models.ForeignKey(
1478
+ on_delete=django.db.models.deletion.CASCADE,
1479
+ related_name="checked_object_relationships",
1480
+ to="wbcompliance.riskrule",
1481
+ ),
1482
+ ),
1483
+ migrations.AlterField(
1484
+ model_name="triggererincidentrelationship",
1485
+ name="incident",
1486
+ field=models.ForeignKey(
1487
+ blank=True,
1488
+ null=True,
1489
+ on_delete=django.db.models.deletion.SET_NULL,
1490
+ related_name="checked_object_relationships",
1491
+ to="wbcompliance.riskincident",
1492
+ ),
1493
+ ),
1494
+ migrations.AddIndex(
1495
+ model_name="ruletriggererrelationship",
1496
+ index=models.Index(
1497
+ fields=["rule", "checked_object_content_type", "checked_object_id"],
1498
+ name="wbcomplianc_rule_id_18dca9_idx",
1499
+ ),
1500
+ ),
1501
+ migrations.RenameModel(
1502
+ old_name="TriggererIncidentRelationship",
1503
+ new_name="CheckedObjectIncidentRelationship",
1504
+ ),
1505
+ migrations.RenameModel(
1506
+ old_name="RuleTriggererRelationship",
1507
+ new_name="RuleCheckedObjectRelationship",
1508
+ ),
1509
+ migrations.AlterModelOptions(
1510
+ name="checkedobjectincidentrelationship",
1511
+ options={
1512
+ "verbose_name": "Incident to Checked Object relationship",
1513
+ "verbose_name_plural": "Incident to Checked Object relationships",
1514
+ },
1515
+ ),
1516
+ migrations.AlterModelOptions(
1517
+ name="rulecheckedobjectrelationship",
1518
+ options={
1519
+ "verbose_name": "Checked Object to Rule relationship",
1520
+ "verbose_name_plural": "Checked Object to Rule relationships",
1521
+ },
1522
+ ),
1523
+ migrations.RenameIndex(
1524
+ model_name="checkedobjectincidentrelationship",
1525
+ new_name="wbcomplianc_inciden_f3db32_idx",
1526
+ old_name="wbcomplianc_inciden_e01fa0_idx",
1527
+ ),
1528
+ migrations.RenameIndex(
1529
+ model_name="rulecheckedobjectrelationship",
1530
+ new_name="wbcomplianc_rule_id_f0f369_idx",
1531
+ old_name="wbcomplianc_rule_id_18dca9_idx",
1532
+ ),
1533
+ migrations.AlterField(
1534
+ model_name="riskcheck",
1535
+ name="rule_checked_object_relationship",
1536
+ field=models.ForeignKey(
1537
+ on_delete=django.db.models.deletion.CASCADE,
1538
+ related_name="checks",
1539
+ to="wbcompliance.rulecheckedobjectrelationship",
1540
+ verbose_name="Rule-Checked Object Relationship",
1541
+ ),
1542
+ ),
1543
+ migrations.AlterField(
1544
+ model_name="riskcheck",
1545
+ name="rule_checked_object_relationship",
1546
+ field=models.ForeignKey(
1547
+ on_delete=django.db.models.deletion.CASCADE,
1548
+ related_name="checks",
1549
+ to="wbcompliance.rulecheckedobjectrelationship",
1550
+ verbose_name="Rule-Checked Object Relationship",
1551
+ ),
1552
+ ),
1553
+ migrations.RenameField(
1554
+ model_name="riskrule",
1555
+ old_name="is_passive",
1556
+ new_name="only_passive_check_allowed",
1557
+ ),
1558
+ migrations.AddField(
1559
+ model_name="riskcheck",
1560
+ name="status",
1561
+ field=models.CharField(
1562
+ choices=[
1563
+ ("PENDING", "Pending"),
1564
+ ("RUNNING", "Running"),
1565
+ ("FAILED", "Failed"),
1566
+ ("SUCCESS", "Success"),
1567
+ ("WARNING", "Warning"),
1568
+ ],
1569
+ default="PENDING",
1570
+ max_length=32,
1571
+ verbose_name="Status",
1572
+ ),
1573
+ ),
1574
+ migrations.AlterField(
1575
+ model_name="riskrule",
1576
+ name="only_passive_check_allowed",
1577
+ field=models.BooleanField(
1578
+ default=True,
1579
+ help_text="If False, This rule can only be triggered passively",
1580
+ verbose_name="Passive Only",
1581
+ ),
1582
+ ),
1583
+ migrations.AddField(
1584
+ model_name="checkedobjectincidentrelationship",
1585
+ name="resolved_by",
1586
+ field=models.ForeignKey(
1587
+ blank=True,
1588
+ help_text="The person that resolved or ignored this incident",
1589
+ null=True,
1590
+ on_delete=django.db.models.deletion.SET_NULL,
1591
+ related_name="%(class)s_handled",
1592
+ to="directory.person",
1593
+ verbose_name="Handled by",
1594
+ ),
1595
+ ),
1596
+ migrations.AddField(
1597
+ model_name="complianceaction",
1598
+ name="changer",
1599
+ field=models.ForeignKey(
1600
+ blank=True,
1601
+ null=True,
1602
+ on_delete=django.db.models.deletion.SET_NULL,
1603
+ related_name="updated_actions",
1604
+ to="directory.person",
1605
+ verbose_name="Changer",
1606
+ ),
1607
+ ),
1608
+ migrations.AddField(
1609
+ model_name="complianceaction",
1610
+ name="creator",
1611
+ field=models.ForeignKey(
1612
+ blank=True,
1613
+ null=True,
1614
+ on_delete=django.db.models.deletion.SET_NULL,
1615
+ related_name="compliance_actions",
1616
+ to="directory.person",
1617
+ verbose_name="Creator",
1618
+ ),
1619
+ ),
1620
+ migrations.AddField(
1621
+ model_name="complianceevent",
1622
+ name="changer",
1623
+ field=models.ForeignKey(
1624
+ blank=True,
1625
+ null=True,
1626
+ on_delete=django.db.models.deletion.SET_NULL,
1627
+ related_name="updated_events",
1628
+ to="directory.person",
1629
+ verbose_name="Changer",
1630
+ ),
1631
+ ),
1632
+ migrations.AddField(
1633
+ model_name="complianceevent",
1634
+ name="creator",
1635
+ field=models.ForeignKey(
1636
+ blank=True,
1637
+ null=True,
1638
+ on_delete=django.db.models.deletion.SET_NULL,
1639
+ related_name="compliance_events",
1640
+ to="directory.person",
1641
+ verbose_name="Creator",
1642
+ ),
1643
+ ),
1644
+ migrations.AddField(
1645
+ model_name="complianceform",
1646
+ name="changer",
1647
+ field=models.ForeignKey(
1648
+ blank=True,
1649
+ null=True,
1650
+ on_delete=django.db.models.deletion.SET_NULL,
1651
+ to="directory.person",
1652
+ verbose_name="Changer",
1653
+ ),
1654
+ ),
1655
+ migrations.AddField(
1656
+ model_name="complianceform",
1657
+ name="creator",
1658
+ field=models.ForeignKey(
1659
+ blank=True,
1660
+ null=True,
1661
+ on_delete=django.db.models.deletion.SET_NULL,
1662
+ related_name="compliance_forms",
1663
+ to="directory.person",
1664
+ verbose_name="Creator",
1665
+ ),
1666
+ ),
1667
+ migrations.AddField(
1668
+ model_name="complianceformsignature",
1669
+ name="person",
1670
+ field=models.ForeignKey(
1671
+ on_delete=django.db.models.deletion.CASCADE,
1672
+ related_name="signed_compliance_forms",
1673
+ to="directory.person",
1674
+ verbose_name="Signer",
1675
+ ),
1676
+ ),
1677
+ migrations.AddField(
1678
+ model_name="reviewcompliancetask",
1679
+ name="changer",
1680
+ field=models.ForeignKey(
1681
+ blank=True,
1682
+ null=True,
1683
+ on_delete=django.db.models.deletion.SET_NULL,
1684
+ to="directory.person",
1685
+ verbose_name="Changer",
1686
+ ),
1687
+ ),
1688
+ migrations.AddField(
1689
+ model_name="reviewcompliancetask",
1690
+ name="creator",
1691
+ field=models.ForeignKey(
1692
+ blank=True,
1693
+ null=True,
1694
+ on_delete=django.db.models.deletion.CASCADE,
1695
+ related_name="author_review_compliane_tasks",
1696
+ to="directory.person",
1697
+ verbose_name="Creator",
1698
+ ),
1699
+ ),
1700
+ migrations.AddField(
1701
+ model_name="riskincident",
1702
+ name="resolved_by",
1703
+ field=models.ForeignKey(
1704
+ blank=True,
1705
+ help_text="The person that resolved or ignored this incident",
1706
+ null=True,
1707
+ on_delete=django.db.models.deletion.SET_NULL,
1708
+ related_name="%(class)s_handled",
1709
+ to="directory.person",
1710
+ verbose_name="Handled by",
1711
+ ),
1712
+ ),
1713
+ migrations.AddField(
1714
+ model_name="rulethreshold",
1715
+ name="notifiable_users",
1716
+ field=models.ManyToManyField(
1717
+ blank=True,
1718
+ help_text="Notified Persons for this rule and severity",
1719
+ related_name="notified_rule_thresholds",
1720
+ to="directory.person",
1721
+ verbose_name="Notifiable Persons",
1722
+ ),
1723
+ ),
1724
+ migrations.AlterField(
1725
+ model_name="checkedobjectincidentrelationship",
1726
+ name="severity",
1727
+ field=models.ForeignKey(
1728
+ on_delete=django.db.models.deletion.CASCADE,
1729
+ related_name="%(class)s",
1730
+ to="wbcompliance.riskincidenttype",
1731
+ verbose_name="Severity",
1732
+ ),
1733
+ ),
1734
+ migrations.AlterField(
1735
+ model_name="riskincident",
1736
+ name="severity",
1737
+ field=models.ForeignKey(
1738
+ on_delete=django.db.models.deletion.CASCADE,
1739
+ related_name="%(class)s",
1740
+ to="wbcompliance.riskincidenttype",
1741
+ verbose_name="Severity",
1742
+ ),
1743
+ ),
1744
+ ]