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,21 @@
1
+ # Generated by Django 4.2.7 on 2023-11-06 13:30
2
+
3
+ import django.core.serializers.json
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ (
10
+ "wbcompliance",
11
+ "0001_initial_squashed_squashed_0010_alter_checkedobjectincidentrelationship_resolved_by_and_more",
12
+ ),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterField(
17
+ model_name="riskrule",
18
+ name="parameters",
19
+ field=models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder),
20
+ ),
21
+ ]
@@ -0,0 +1,20 @@
1
+ # Generated by Django 4.2.9 on 2024-02-20 10:08
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ dependencies = [
8
+ ("wbcompliance", "0011_alter_riskrule_parameters"),
9
+ ]
10
+
11
+ operations = [
12
+ migrations.AlterModelOptions(
13
+ name="compliancetype",
14
+ options={
15
+ "permissions": [("administrate_compliance", "Can Administrate Compliance")],
16
+ "verbose_name": "Compliance Type",
17
+ "verbose_name_plural": "Compliance Types",
18
+ },
19
+ ),
20
+ ]
@@ -0,0 +1,16 @@
1
+ # Generated by Django 4.2.9 on 2024-02-26 13:47
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ dependencies = [
8
+ ("wbcompliance", "0012_alter_compliancetype_options"),
9
+ ]
10
+
11
+ operations = [
12
+ migrations.AlterUniqueTogether(
13
+ name="riskrule",
14
+ unique_together=set(), # we cannot have a uniqueness on these two fields because when the rule is created, it set the parameters with the default value until it is changed in a second step by the user. Furthermore, we kind of want user to be able to create similar rule but with different threashold and notifiee policy
15
+ ),
16
+ ]
@@ -0,0 +1,27 @@
1
+ # Generated by Django 4.2.10 on 2024-03-06 09:29
2
+
3
+ import django.core.validators
4
+ import wbcore.models.fields
5
+ from django.db import migrations
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+ dependencies = [
10
+ ("wbcompliance", "0013_alter_riskrule_unique_together"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="reviewcompliancetask",
16
+ name="year",
17
+ field=wbcore.models.fields.YearField(
18
+ blank=True,
19
+ null=True,
20
+ validators=[
21
+ django.core.validators.MinValueValidator(1000),
22
+ django.core.validators.MaxValueValidator(9999),
23
+ ],
24
+ verbose_name="Year",
25
+ ),
26
+ ),
27
+ ]
@@ -0,0 +1,43 @@
1
+ # Generated by Django 4.2.8 on 2024-01-03 08:57
2
+
3
+ from contextlib import suppress
4
+
5
+ from django.apps import apps
6
+ from django.contrib.contenttypes.models import ContentType
7
+ from django.db import migrations
8
+
9
+
10
+ def migrate_content_type(apps, schema_editor):
11
+ RiskIncident = apps.get_model("wbcompliance", "RiskIncident")
12
+
13
+ for model_name in [
14
+ "Classification",
15
+ "Instrument",
16
+ "ClassificationGroup",
17
+ "Deal",
18
+ "Exchange",
19
+ "InstrumentClassificationRelatedInstrument",
20
+ "InstrumentClassificationThroughModel",
21
+ "InstrumentFavoriteGroup",
22
+ "InstrumentList",
23
+ "InstrumentListThroughModel",
24
+ "InstrumentRequest",
25
+ "RelatedInstrumentThroughModel",
26
+ "InstrumentPrice",
27
+ ]:
28
+ with suppress(ContentType.DoesNotExist):
29
+ old_ct = ContentType.objects.get(app_label="wbportfolio", model=model_name.lower())
30
+ new_ct = ContentType.objects.get(app_label="wbfdm", model=model_name.lower())
31
+ RiskIncident.objects.filter(breached_content_type_id=old_ct.id).update(breached_content_type_id=new_ct.id)
32
+
33
+
34
+ class Migration(migrations.Migration):
35
+ dependencies = (
36
+ [
37
+ ("wbcompliance", "0014_alter_reviewcompliancetask_year"),
38
+ ("wbfdm", "0012_instrumentprice_created_instrumentprice_modified"),
39
+ ]
40
+ if apps.is_installed("wbfdm")
41
+ else [("wbcompliance", "0014_alter_reviewcompliancetask_year")]
42
+ )
43
+ operations = [migrations.RunPython(migrate_content_type)]
@@ -0,0 +1,37 @@
1
+ # Generated by Django 5.0.8 on 2024-08-28 11:32
2
+
3
+ import django.core.serializers.json
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("wbcompliance", "0015_auto_20240103_0957"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="checkedobjectincidentrelationship",
15
+ name="report_details",
16
+ field=models.JSONField(default=dict, blank=True, encoder=django.core.serializers.json.DjangoJSONEncoder),
17
+ ),
18
+ migrations.AddField(
19
+ model_name="rulebackend",
20
+ name="incident_report_template",
21
+ field=models.TextField(
22
+ default="<ul>\n {% for key, value in report_details.items %}\n <li><strong>{{ key }}: </strong> {{ value }}</li>\n {% endfor %}\n</ul>\n",
23
+ verbose_name="Incident Template",
24
+ ),
25
+ ),
26
+ migrations.AddField(
27
+ model_name="checkedobjectincidentrelationship",
28
+ name="breached_value",
29
+ field=models.CharField(
30
+ blank=True,
31
+ help_text="The value that breached the rule threshold, can be None",
32
+ max_length=128,
33
+ null=True,
34
+ verbose_name="Breached Value",
35
+ ),
36
+ ),
37
+ ]
@@ -0,0 +1,20 @@
1
+ # Generated by Django 5.0.9 on 2024-10-11 11:47
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ dependencies = [
8
+ ("wbcompliance", "0016_checkedobjectincidentrelationship_report_details_and_more"),
9
+ ]
10
+
11
+ operations = [
12
+ migrations.AlterField(
13
+ model_name="rulebackend",
14
+ name="incident_report_template",
15
+ field=models.TextField(
16
+ default='<ul style="line-height: 13px; text-align: left; margin: 0; padding: 10px;">\n {% for key, value in report_details.items %}\n <li><strong>{{ key }}: </strong> {{ value | safe }}</li>\n {% endfor %}\n</ul>\n',
17
+ verbose_name="Incident Template",
18
+ ),
19
+ ),
20
+ ]
@@ -0,0 +1,39 @@
1
+ # Generated by Django 5.0.9 on 2024-10-17 07:58
2
+
3
+ from django.db import migrations
4
+ from django.db.models import Count
5
+
6
+
7
+ def remove_duplicates(apps, schema_editor):
8
+ RuleCheckedObjectRelationship = apps.get_model("wbcompliance", "RuleCheckedObjectRelationship")
9
+ for row in (
10
+ RuleCheckedObjectRelationship.objects.values("rule", "checked_object_content_type", "checked_object_id")
11
+ .annotate(c=Count("*"))
12
+ .filter(c__gt=1)
13
+ ):
14
+ qs = RuleCheckedObjectRelationship.objects.filter(
15
+ rule=row["rule"],
16
+ checked_object_content_type=row["checked_object_content_type"],
17
+ checked_object_id=row["checked_object_id"],
18
+ )
19
+ base = qs.first()
20
+ for rel in qs.exclude(id=base.id):
21
+ rel.checks.update(rule_checked_object_relationship=rel)
22
+ rel.delete()
23
+
24
+
25
+ class Migration(migrations.Migration):
26
+ dependencies = [
27
+ ("contenttypes", "0002_remove_content_type_name"),
28
+ ("wbcompliance", "0017_alter_rulebackend_incident_report_template"),
29
+ ]
30
+
31
+ operations = [
32
+ migrations.RunSQL(sql="SET CONSTRAINTS ALL IMMEDIATE;"),
33
+ migrations.RunPython(remove_duplicates),
34
+ migrations.RunSQL(sql="SET CONSTRAINTS ALL DEFERRED;"),
35
+ migrations.AlterUniqueTogether(
36
+ name="rulecheckedobjectrelationship",
37
+ unique_together={("rule", "checked_object_content_type", "checked_object_id")},
38
+ ),
39
+ ]
@@ -0,0 +1,60 @@
1
+ # Generated by Django 5.0.9 on 2024-11-27 15:14
2
+
3
+ from contextlib import suppress
4
+
5
+ import django.db.models.deletion
6
+ from django.db import migrations, models
7
+
8
+
9
+ def set_activation_date(*args):
10
+ from wbcompliance.models.risk_management import RiskCheck, RiskRule
11
+
12
+ for rule in RiskRule.objects.filter(activation_date__isnull=True):
13
+ with suppress(RiskCheck.DoesNotExist):
14
+ rule.activation_date = rule.checks.earliest("evaluation_date").evaluation_date
15
+ rule.save()
16
+
17
+
18
+ class Migration(migrations.Migration):
19
+ dependencies = [
20
+ ("wbcompliance", "0018_alter_rulecheckedobjectrelationship_unique_together"),
21
+ ]
22
+
23
+ operations = [
24
+ migrations.CreateModel(
25
+ name="RuleGroup",
26
+ fields=[
27
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
28
+ ("key", models.CharField(max_length=255, unique=True)),
29
+ ("name", models.CharField(max_length=255)),
30
+ ],
31
+ ),
32
+ migrations.AddField(
33
+ model_name="riskrule",
34
+ name="activation_date",
35
+ field=models.DateField(blank=True, null=True, verbose_name="Activation Date"),
36
+ ),
37
+ migrations.AddField(
38
+ model_name="riskrule",
39
+ name="frequency",
40
+ field=models.CharField(
41
+ blank=True,
42
+ help_text="The Evaluation Frequency in RRULE format",
43
+ max_length=56,
44
+ null=True,
45
+ verbose_name="Evaluation Frequency",
46
+ ),
47
+ ),
48
+ migrations.AddField(
49
+ model_name="rulebackend",
50
+ name="rule_group",
51
+ field=models.ForeignKey(
52
+ blank=True,
53
+ null=True,
54
+ on_delete=django.db.models.deletion.SET_NULL,
55
+ related_name="rules",
56
+ to="wbcompliance.rulegroup",
57
+ ),
58
+ ),
59
+ migrations.RunPython(set_activation_date),
60
+ ]
File without changes
@@ -0,0 +1,20 @@
1
+ from .compliance_form import (
2
+ ComplianceForm,
3
+ ComplianceFormRule,
4
+ ComplianceFormSection,
5
+ ComplianceFormSignature,
6
+ ComplianceFormSignatureRule,
7
+ ComplianceFormSignatureSection,
8
+ ComplianceFormType,
9
+ )
10
+ from .compliance_task import (
11
+ ComplianceAction,
12
+ ComplianceEvent,
13
+ ComplianceTask,
14
+ ComplianceTaskGroup,
15
+ ComplianceTaskInstance,
16
+ ComplianceType,
17
+ ReviewComplianceTask,
18
+ )
19
+ from .compliance_type import ComplianceType, update_or_create_compliance_document
20
+ from .risk_management import *