wbcompliance 1.59.16__py2.py3-none-any.whl → 1.60.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 (29) hide show
  1. wbcompliance/factories/risk_management/backends.py +1 -2
  2. wbcompliance/factories/risk_management/checks.py +2 -2
  3. wbcompliance/factories/risk_management/rules.py +2 -2
  4. wbcompliance/filters/risk_management/checks.py +3 -2
  5. wbcompliance/filters/risk_management/incidents.py +3 -2
  6. wbcompliance/filters/risk_management/rules.py +2 -1
  7. wbcompliance/filters/risk_management/tables.py +1 -1
  8. wbcompliance/locale/de/LC_MESSAGES/django.po +195 -189
  9. wbcompliance/locale/en/LC_MESSAGES/django.po +195 -188
  10. wbcompliance/locale/fr/LC_MESSAGES/django.po +195 -189
  11. wbcompliance/models/compliance_form.py +1 -3
  12. wbcompliance/models/compliance_task.py +1 -3
  13. wbcompliance/models/compliance_type.py +6 -11
  14. wbcompliance/models/risk_management/incidents.py +2 -5
  15. wbcompliance/models/risk_management/rules.py +2 -2
  16. wbcompliance/serializers/risk_management/checks.py +2 -2
  17. wbcompliance/serializers/risk_management/incidents.py +1 -1
  18. wbcompliance/serializers/risk_management/rules.py +2 -2
  19. wbcompliance/tasks.py +27 -1
  20. wbcompliance/tests/mixins.py +0 -2
  21. wbcompliance/tests/risk_management/models/test_incidents.py +0 -3
  22. wbcompliance/tests/test_tasks.py +28 -0
  23. wbcompliance/viewsets/compliance_form.py +1 -3
  24. wbcompliance/viewsets/risk_management/checks.py +0 -3
  25. wbcompliance/viewsets/risk_management/incidents.py +1 -4
  26. wbcompliance/viewsets/risk_management/rules.py +0 -3
  27. {wbcompliance-1.59.16.dist-info → wbcompliance-1.60.1.dist-info}/METADATA +1 -1
  28. {wbcompliance-1.59.16.dist-info → wbcompliance-1.60.1.dist-info}/RECORD +29 -28
  29. {wbcompliance-1.59.16.dist-info → wbcompliance-1.60.1.dist-info}/WHEEL +0 -0
@@ -1,6 +1,5 @@
1
1
  from django.apps import apps
2
2
  from django.conf import settings
3
- from django.contrib.auth import get_user_model
4
3
  from django.contrib.auth.models import Group
5
4
  from django.db import models
6
5
  from django.db.models import (
@@ -22,6 +21,7 @@ from django.utils import timezone
22
21
  from django.utils.translation import gettext_lazy as _
23
22
  from django_fsm import FSMField, transition
24
23
  from rest_framework.reverse import reverse
24
+ from wbcore.contrib.authentication.models.users import User
25
25
  from wbcore.contrib.icons import WBIcon
26
26
  from wbcore.contrib.notifications.dispatch import send_notification
27
27
  from wbcore.contrib.notifications.utils import create_notification_type
@@ -34,8 +34,6 @@ from weasyprint import HTML
34
34
 
35
35
  from .compliance_type import ComplianceDocumentMixin, ComplianceType, can_active_request
36
36
 
37
- User = get_user_model()
38
-
39
37
 
40
38
  class ComplianceFormType(WBModel):
41
39
  class Type(models.TextChoices):
@@ -2,7 +2,6 @@ import re
2
2
  from datetime import date, datetime, timedelta
3
3
 
4
4
  from django.conf import settings
5
- from django.contrib.auth import get_user_model
6
5
  from django.core.validators import MaxValueValidator, MinValueValidator
7
6
  from django.db import models
8
7
  from django.db.models import Count, Max, Q, QuerySet
@@ -13,6 +12,7 @@ from django.utils import timezone
13
12
  from django.utils.translation import gettext_lazy as _
14
13
  from django_fsm import FSMField, transition
15
14
  from pandas.tseries.offsets import MonthEnd, YearEnd
15
+ from wbcore.contrib.authentication.models.users import User
16
16
  from wbcore.contrib.color.enums import WBColor
17
17
  from wbcore.contrib.icons import WBIcon
18
18
  from wbcore.contrib.notifications.dispatch import send_notification
@@ -28,8 +28,6 @@ from weasyprint import HTML
28
28
  from .compliance_type import ComplianceDocumentMixin, ComplianceType, can_active_request
29
29
  from .enums import IncidentSeverity
30
30
 
31
- User = get_user_model()
32
-
33
31
 
34
32
  def can_draft_request(instance, user: "User") -> bool:
35
33
  if instance.is_instance:
@@ -2,7 +2,6 @@ import logging
2
2
  from typing import TypeVar
3
3
 
4
4
  from celery import shared_task
5
- from django.contrib.auth import get_user_model
6
5
  from django.contrib.auth.models import Group
7
6
  from django.contrib.contenttypes.models import ContentType
8
7
  from django.core.files.base import ContentFile
@@ -10,12 +9,12 @@ from django.db import models
10
9
  from django.db.models import Q
11
10
  from django.utils.translation import gettext_lazy as _
12
11
  from slugify import slugify
12
+ from wbcore.contrib.authentication.models.users import User
13
13
  from wbcore.contrib.documents.models import Document, DocumentType
14
14
  from wbcore.contrib.documents.models.mixins import DocumentMixin
15
15
  from wbcore.models import WBModel
16
16
  from wbcore.workers import Queue
17
17
 
18
- User = get_user_model()
19
18
  SelfComplianceType = TypeVar("SelfComplianceType", bound="ComplianceType")
20
19
 
21
20
 
@@ -67,14 +66,10 @@ class ComplianceType(WBModel):
67
66
 
68
67
  @classmethod
69
68
  def get_administrators(cls, type: SelfComplianceType | None = None) -> models.QuerySet["User"]:
70
- administrators = (
71
- get_user_model()
72
- .objects.filter(
73
- Q(groups__permissions__codename="administrate_compliance")
74
- | Q(user_permissions__codename="administrate_compliance")
75
- )
76
- .distinct()
77
- )
69
+ administrators = User.objects.filter(
70
+ Q(groups__permissions__codename="administrate_compliance")
71
+ | Q(user_permissions__codename="administrate_compliance")
72
+ ).distinct()
78
73
  if type:
79
74
  administrators = administrators.filter(groups__in=type.in_charge.all())
80
75
  return administrators
@@ -86,7 +81,7 @@ class ComplianceType(WBModel):
86
81
 
87
82
  @shared_task(queue=Queue.DEFAULT.value)
88
83
  def update_or_create_compliance_document(user_id: int, content_type_id: int, object_id: int, send_email: bool = True):
89
- user = get_user_model().objects.get(id=user_id)
84
+ user = User.objects.get(id=user_id)
90
85
  content_type = ContentType.objects.get(id=content_type_id)
91
86
  content_object = content_type.model_class().objects.get(id=object_id)
92
87
 
@@ -3,8 +3,6 @@ from typing import TYPE_CHECKING, Any, Optional
3
3
 
4
4
  import pandas as pd
5
5
  from celery import shared_task
6
- from django.contrib.auth import get_user_model
7
- from django.contrib.auth.models import User as BaseUser
8
6
  from django.contrib.contenttypes.fields import GenericForeignKey
9
7
  from django.contrib.contenttypes.models import ContentType
10
8
  from django.contrib.postgres.fields import DateRangeField
@@ -19,8 +17,9 @@ from django.utils.translation import gettext as _
19
17
  from django_fsm import FSMField, transition
20
18
  from guardian.core import ObjectPermissionChecker
21
19
  from psycopg.types.range import DateRange
22
- from wbcore.content_type.utils import get_ancestors_content_type
20
+ from wbcore.contrib.authentication.models.users import User
23
21
  from wbcore.contrib.color.enums import WBColor
22
+ from wbcore.contrib.content_type.utils import get_ancestors_content_type
24
23
  from wbcore.contrib.directory.models import Person
25
24
  from wbcore.contrib.icons import WBIcon
26
25
  from wbcore.contrib.notifications.utils import create_notification_type
@@ -32,8 +31,6 @@ from wbcore.metadata.configs.display.instance_display.shortcuts import (
32
31
  from wbcore.utils.models import ComplexToStringMixin
33
32
  from wbcore.workers import Queue
34
33
 
35
- User: BaseUser = get_user_model()
36
-
37
34
  if TYPE_CHECKING:
38
35
  from wbcompliance.models import RiskCheck
39
36
 
@@ -6,7 +6,6 @@ from typing import Any, Dict, Generator, Iterable, Iterator, Optional, Type
6
6
  import pandas as pd
7
7
  from celery import shared_task
8
8
  from dateutil import rrule
9
- from django.contrib.auth import get_user_model
10
9
  from django.contrib.auth.models import Group
11
10
  from django.contrib.auth.models import User as BaseUser
12
11
  from django.contrib.contenttypes.fields import GenericForeignKey
@@ -23,6 +22,7 @@ from django.utils.functional import cached_property
23
22
  from django.utils.translation import gettext_lazy as _
24
23
  from pandas.tseries.offsets import BDay
25
24
  from rest_framework.reverse import reverse
25
+ from wbcore.contrib.authentication.models.users import User
26
26
  from wbcore.contrib.directory.models import Person
27
27
  from wbcore.contrib.guardian.models.mixins import PermissionObjectModelMixin
28
28
  from wbcore.contrib.notifications.dispatch import send_notification
@@ -35,7 +35,7 @@ from .backend import AbstractRuleBackend
35
35
  from .checks import RiskCheck
36
36
  from .incidents import CheckedObjectIncidentRelationship, RiskIncident
37
37
 
38
- User: BaseUser = get_user_model()
38
+ User: BaseUser = User
39
39
 
40
40
 
41
41
  class RuleGroup(models.Model):
@@ -1,6 +1,6 @@
1
1
  from rest_framework.reverse import reverse
2
2
  from wbcore import serializers as wb_serializers
3
- from wbcore.content_type.serializers import ContentTypeRepresentationSerializer
3
+ from wbcore.contrib.content_type.serializers import ContentTypeRepresentationSerializer
4
4
  from wbcore.contrib.icons.serializers import IconSelectField
5
5
 
6
6
  from wbcompliance.models.risk_management import RiskCheck
@@ -25,7 +25,7 @@ class RiskCheckModelSerializer(wb_serializers.ModelSerializer):
25
25
  res = {}
26
26
  if instance.incidents.exists():
27
27
  res["incidents"] = (
28
- f'{reverse("wbcompliance:checkedobjectincidentrelationship-list", args=[], request=request)}?rule_check={instance.id}'
28
+ f"{reverse('wbcompliance:checkedobjectincidentrelationship-list', args=[], request=request)}?rule_check={instance.id}"
29
29
  )
30
30
 
31
31
  return res
@@ -5,8 +5,8 @@ from psycopg.types.range import NumericRange
5
5
  from rest_framework import serializers
6
6
  from rest_framework.reverse import reverse
7
7
  from wbcore import serializers as wb_serializers
8
- from wbcore.content_type.serializers import ContentTypeRepresentationSerializer
9
8
  from wbcore.contrib.authentication.serializers import GroupRepresentationSerializer
9
+ from wbcore.contrib.content_type.serializers import ContentTypeRepresentationSerializer
10
10
  from wbcore.contrib.directory.serializers import PersonRepresentationSerializer
11
11
 
12
12
  from wbcompliance.models.risk_management import (
@@ -1,11 +1,11 @@
1
1
  from django.contrib.contenttypes.models import ContentType
2
2
  from rest_framework.reverse import reverse
3
3
  from wbcore import serializers as wb_serializers
4
- from wbcore.content_type.serializers import (
4
+ from wbcore.contrib.authentication.serializers import UserRepresentationSerializer
5
+ from wbcore.contrib.content_type.serializers import (
5
6
  ContentTypeRepresentationSerializer,
6
7
  DynamicObjectIDRepresentationSerializer,
7
8
  )
8
- from wbcore.contrib.authentication.serializers import UserRepresentationSerializer
9
9
 
10
10
  from wbcompliance.models.risk_management import (
11
11
  RiskRule,
wbcompliance/tasks.py CHANGED
@@ -2,12 +2,13 @@ from collections import defaultdict
2
2
  from datetime import date, datetime
3
3
 
4
4
  from celery import shared_task
5
+ from django.contrib.auth import get_user_model
5
6
  from django.contrib.contenttypes.models import ContentType
6
7
  from django.db.models import Q
7
8
  from tqdm import tqdm
8
9
  from wbcore.workers import Queue
9
10
 
10
- from wbcompliance.models import ComplianceTask, ReviewComplianceTask
11
+ from wbcompliance.models import ComplianceForm, ComplianceFormSignature, ComplianceTask, ReviewComplianceTask
11
12
  from wbcompliance.models.risk_management.rules import (
12
13
  RiskRule,
13
14
  RuleCheckedObjectRelationship,
@@ -112,3 +113,28 @@ def periodic_quaterly_or_monthly_compliance_task():
112
113
 
113
114
  for task in qs:
114
115
  task.generate_compliance_task_instance(link_instance_review=True)
116
+
117
+
118
+ @shared_task
119
+ def send_reminder_of_unsigned_compliance_form(compliance_form_ids: list[int] | None = None) -> None:
120
+ """
121
+ Send a reminder to the user to sign the compliance form.
122
+ """
123
+
124
+ compliance_forms = (
125
+ ComplianceForm.objects.filter(id__in=compliance_form_ids)
126
+ if compliance_form_ids
127
+ else ComplianceForm.objects.filter(status=ComplianceForm.Status.ACTIVE)
128
+ )
129
+
130
+ for compliance_form in compliance_forms:
131
+ signatures = ComplianceFormSignature.objects.filter(
132
+ compliance_form=compliance_form, version=compliance_form.version, signed=None
133
+ )
134
+ recipients = get_user_model().objects.filter(profile__id__in=signatures.values("person"))
135
+ if recipients.exists():
136
+ msg = f"<p>{compliance_form.changer} has activated a {compliance_form.title} {compliance_form.form_type} version {compliance_form.version} </p>"
137
+ if compliance_form.policy and compliance_form.policy != "<p></p>" and compliance_form.policy != "null":
138
+ msg += f"</br><p><b>User's ComplianceForm:</b></p><i>{compliance_form.policy}</i>"
139
+ title = f"Unsigned Compliance Form - {compliance_form.form_type} Reminder : {compliance_form.title}"
140
+ compliance_form.notify(title, msg, recipients=recipients)
@@ -1,11 +1,9 @@
1
1
  import pytest
2
- from django.contrib.auth import get_user_model
3
2
  from django.contrib.auth.models import Group
4
3
  from faker import Faker
5
4
  from wbcore.contrib.authentication.factories import InternalUserFactory
6
5
 
7
6
  fake = Faker()
8
- User = get_user_model()
9
7
 
10
8
 
11
9
  class UserTestMixin:
@@ -2,7 +2,6 @@ from datetime import timedelta
2
2
  from unittest.mock import patch
3
3
 
4
4
  import pytest
5
- from django.contrib.auth import get_user_model
6
5
  from django.contrib.auth.models import Permission
7
6
  from django.contrib.contenttypes.models import ContentType
8
7
  from django.core.exceptions import ValidationError
@@ -17,8 +16,6 @@ from wbcompliance.models.risk_management.incidents import (
17
16
  )
18
17
  from wbcompliance.models.risk_management.rules import RiskRule
19
18
 
20
- User = get_user_model()
21
-
22
19
  fake = Faker()
23
20
 
24
21
 
@@ -0,0 +1,28 @@
1
+ import pytest
2
+ from wbcore.contrib.notifications.models import Notification
3
+
4
+ from wbcompliance.tasks import send_reminder_of_unsigned_compliance_form
5
+
6
+
7
+ @pytest.mark.django_db
8
+ class TestComplianceForm:
9
+ def test_send_reminder_of_unsigned_compliance_form(
10
+ self, compliance_form_factory, compliance_form_signature_factory
11
+ ):
12
+ cf1 = compliance_form_factory.create()
13
+ cf2 = compliance_form_factory.create()
14
+ cf3 = compliance_form_factory.create()
15
+
16
+ compliance_form_signature_factory.create(compliance_form=cf1, signed=None)
17
+ compliance_form_signature_factory.create(compliance_form=cf1, version=1, signed=None)
18
+ compliance_form_signature_factory.create(compliance_form=cf2)
19
+ compliance_form_signature_factory.create(compliance_form=cf3, signed=None)
20
+
21
+ assert Notification.objects.count() == 0
22
+ send_reminder_of_unsigned_compliance_form(compliance_form_ids=[cf1.id, cf2.id])
23
+ assert Notification.objects.filter(
24
+ title=f"Unsigned Compliance Form - {cf1.form_type} Reminder : {cf1.title}"
25
+ ).exists()
26
+ assert Notification.objects.filter(
27
+ title=f"Unsigned Compliance Form - {cf2.form_type} Reminder : {cf2.title}"
28
+ ).exists()
@@ -1,4 +1,3 @@
1
- from django.contrib.auth import get_user_model
2
1
  from django.contrib.contenttypes.models import ContentType
3
2
  from django.db.models import (
4
3
  BooleanField,
@@ -21,6 +20,7 @@ from rest_framework.response import Response
21
20
  from reversion.views import RevisionMixin
22
21
  from wbcore import viewsets
23
22
  from wbcore.contrib.authentication.authentication import JWTCookieAuthentication
23
+ from wbcore.contrib.authentication.models.users import User
24
24
  from wbcore.contrib.notifications.dispatch import send_notification
25
25
  from wbcore.filters import DjangoFilterBackend
26
26
 
@@ -76,8 +76,6 @@ from .titles import (
76
76
  ComplianceFormTitleConfig,
77
77
  )
78
78
 
79
- User = get_user_model()
80
-
81
79
 
82
80
  class ComplianceFormRepresentationViewSet(viewsets.RepresentationViewSet):
83
81
  IDENTIFIER = "wbcompliance:complianceformrepresentation"
@@ -1,4 +1,3 @@
1
- from django.contrib.auth import get_user_model
2
1
  from django.contrib.postgres.aggregates import StringAgg
3
2
  from django.db import models
4
3
  from django.db.models import F, OuterRef, Subquery, Value
@@ -16,8 +15,6 @@ from wbcompliance.viewsets.buttons import RiskCheckButtonConfig
16
15
  from wbcompliance.viewsets.display import RiskCheckDisplayConfig
17
16
  from wbcompliance.viewsets.endpoints import RiskCheckEndpointConfig
18
17
 
19
- User = get_user_model()
20
-
21
18
 
22
19
  class RiskCheckRepresentationViewSet(viewsets.RepresentationViewSet):
23
20
  queryset = RiskCheck.objects.all()
@@ -1,4 +1,3 @@
1
- from django.contrib.auth import get_user_model
2
1
  from django.contrib.auth.models import Permission
3
2
  from django.contrib.contenttypes.models import ContentType
4
3
  from django.contrib.messages.api import warning
@@ -56,8 +55,6 @@ from wbcompliance.viewsets.endpoints import (
56
55
  RiskIncidentEndpointConfig,
57
56
  )
58
57
 
59
- User = get_user_model()
60
-
61
58
 
62
59
  class RiskIncidentTypeRepresentationViewSet(viewsets.RepresentationViewSet):
63
60
  queryset = RiskIncidentType.objects.all()
@@ -188,7 +185,7 @@ class CheckedObjectIncidentRelationshipModelViewSet(viewsets.ModelViewSet):
188
185
  object_repr=F("rule_check__checked_object_repr"),
189
186
  checked_date=F("rule_check__evaluation_date"),
190
187
  date_range=Cast(
191
- Concat(Value("["), F("checked_date"), Value(","), F("checked_date"), Value("]")),
188
+ Concat(Value("["), F("checked_date"), Value(","), F("checked_date"), Value("]"), output_field=CharField()),
192
189
  output_field=DateRangeField(),
193
190
  ),
194
191
  threshold_repr=Subquery(
@@ -1,5 +1,4 @@
1
1
  import pandas as pd
2
- from django.contrib.auth import get_user_model
3
2
  from django.db.models import Case, CharField, Count, OuterRef, Q, Subquery, Value, When
4
3
  from django.db.models.functions import Coalesce
5
4
  from django.http import HttpResponse
@@ -43,8 +42,6 @@ from wbcompliance.viewsets.endpoints import (
43
42
  RuleThresholdRiskRuleEndpointConfig,
44
43
  )
45
44
 
46
- User = get_user_model()
47
-
48
45
 
49
46
  class RuleGroupRepresentationViewSet(viewsets.RepresentationViewSet):
50
47
  queryset = RuleGroup.objects.all()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbcompliance
3
- Version: 1.59.16
3
+ Version: 1.60.1
4
4
  Summary: A workbench module for managing compliance.
5
5
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
6
6
  Requires-Dist: wbcore
@@ -1,7 +1,7 @@
1
1
  wbcompliance/__init__.py,sha256=J-j-u0itpEFT6irdmWmixQqYMadNl1X91TxUmoiLHMI,22
2
2
  wbcompliance/apps.py,sha256=YtNYwXg6t_XiLQf0TxCiXYRs1tvUYtGrENay-8tztyI,415
3
3
  wbcompliance/permissions.py,sha256=rb63hJ4pQHZ4QZjTIDCnqFh1LI2m_evXC7loG3B53lE,1391
4
- wbcompliance/tasks.py,sha256=oZq_LeIYbXjOouCPhLeHQJTbQ_GnnH31xHbmzshRCeA,4458
4
+ wbcompliance/tasks.py,sha256=1yF2C1gxB-phXbYbsKqMkhYUa_Jlc1awnlcXMOFxnVA,5840
5
5
  wbcompliance/urls.py,sha256=-190MsA5_DDPeZujun0BGCrqWOJop6EjO3NYXcv3y_o,8659
6
6
  wbcompliance/admin/__init__.py,sha256=JiVPFKVgMQArksYuol4WMkl6BcfOBv75zJWpLmLyqV0,458
7
7
  wbcompliance/admin/compliance_form.py,sha256=PwWYY1cvXcbKOjq0Mfkg6UCEFySJSELHYC4fls0WAhA,1632
@@ -15,25 +15,25 @@ wbcompliance/admin/risk_management/rules.py,sha256=CKWD3QvMGvD8AlDBxIeB9yH_l61T1
15
15
  wbcompliance/factories/__init__.py,sha256=gpxfoKBAzYuawPSthg_z8BWh10UpS7beqB8SgjWZOM4,685
16
16
  wbcompliance/factories/compliance.py,sha256=7saot-dJ4NvzVKdZCc9G007fsPPoMUa1QtlFnXW98hQ,8824
17
17
  wbcompliance/factories/risk_management/__init__.py,sha256=A47UKvowLB_aZ-A21yxkuFJWvtTzBothPcOLX-p1q7A,300
18
- wbcompliance/factories/risk_management/backends.py,sha256=2PKs1hrjKqeebr4LG7hY6IFxMrK7nSjwwNmHoKY54GI,1554
19
- wbcompliance/factories/risk_management/checks.py,sha256=2imxsW_bbsx4dMUyv9WtifqkXXU-MS5B2F5tR2rEUwo,1001
18
+ wbcompliance/factories/risk_management/backends.py,sha256=ifYRGhZMgjzJCOubJQyZHNaHRiilgewaxRPCE1aGoQs,1543
19
+ wbcompliance/factories/risk_management/checks.py,sha256=9vxSNnP6C1ufV2bfbA3T3P51tqkeAdArDWk--w5prk0,1002
20
20
  wbcompliance/factories/risk_management/incidents.py,sha256=5B44w5iPdXm_dv_R0biO55Pt1hXGlmzSIu9hGMAgrZg,2961
21
- wbcompliance/factories/risk_management/rules.py,sha256=kUfgL6k2yiZq_nOGi1zmh_SO-JCxKjbcBjJQO4qDm_E,3447
21
+ wbcompliance/factories/risk_management/rules.py,sha256=BKu90nl6HqNT2_iHIBXR_qmgE-BkblkEdU-UCUHYYDw,3448
22
22
  wbcompliance/filters/__init__.py,sha256=CBh2V4uX97KCmXX9P3M5BkBqBgIjVe74w05MNJ7NRQg,58
23
23
  wbcompliance/filters/compliances.py,sha256=dKJcoPqW5aWlyPriBHLwsZnYY94GiIswK-E9pI2TYbA,6238
24
24
  wbcompliance/filters/risk_management/__init__.py,sha256=2GbEGT87eA3_zP3zZ8OKZ11nbmf3rMfPVTg3dxxb1Zk,175
25
- wbcompliance/filters/risk_management/checks.py,sha256=457LvfIwlPYrPi0gdoX3xtHwzYDzUnLRSU5yaLzQHp0,1028
26
- wbcompliance/filters/risk_management/incidents.py,sha256=sklJzji_7t6OoBMhpw0XTL7Pz9GG2uHfTalO-dAqlLw,3918
27
- wbcompliance/filters/risk_management/rules.py,sha256=rFL5QEhEhZUfy78aLLFuBGIyObp19LHgTbdcFnnfGIs,4420
28
- wbcompliance/filters/risk_management/tables.py,sha256=jWt1JU7TgziIzwgVH59-mLsu_SPJn6DmYxIx94h94AU,4239
25
+ wbcompliance/filters/risk_management/checks.py,sha256=xag_pyn5nUyb5hWuYnSToEctI8jtOUMmA8wjCtJAAFw,1086
26
+ wbcompliance/filters/risk_management/incidents.py,sha256=au3b1rSEroOwaFztSET5Tm3rqgi79RHBHQivFa4Odok,3976
27
+ wbcompliance/filters/risk_management/rules.py,sha256=FLUTbHqwesFmxBsMW_OVZRV2pMqvSrs9iPl_5MlBd7w,4489
28
+ wbcompliance/filters/risk_management/tables.py,sha256=oYOm3yLwCgKiQOLedezBrixPGEFpY4SjW74ZAPBuLmw,4252
29
29
  wbcompliance/filters/risk_management/utils.py,sha256=8RSTURxpHfK3DstFS5nuPoa53rHWpAtggrq-Z4DmaNg,159
30
30
  wbcompliance/fixtures/compliance.yaml,sha256=LrOTfJaQRQNIxwr_u1xGacy6gMfJSs-uT-96EGNSG-I,282
31
31
  wbcompliance/locale/de/LC_MESSAGES/django.mo,sha256=FfQ5HV2xg7ZrJASidRJ4L-gCAbPNeQnFm940aRbb0js,378
32
- wbcompliance/locale/de/LC_MESSAGES/django.po,sha256=-7ih38xgusKopdZMOI8xNNMPnSyAgaWzNnW5zZiVFCo,38822
32
+ wbcompliance/locale/de/LC_MESSAGES/django.po,sha256=DFpab9ItMf-HBdyd7l-QrCPLx26OS1Lxdi2B0fj42WY,38944
33
33
  wbcompliance/locale/en/LC_MESSAGES/django.mo,sha256=UXCQbz2AxBvh-IQ7bGgjoBnijo8h9DfE9107A-2Mgkk,337
34
- wbcompliance/locale/en/LC_MESSAGES/django.po,sha256=AhwrC90OpxhCkHLRfyHrJKao2HAMzU_0TNi8h2U2P58,38796
34
+ wbcompliance/locale/en/LC_MESSAGES/django.po,sha256=88E5LBfvN0VkvvHPL4ZMyjh9KWchRncHS6hrF7qlMh8,38927
35
35
  wbcompliance/locale/fr/LC_MESSAGES/django.mo,sha256=t4lh3zX7kshbDAFzXa5HU_YGPXkPzKqODNXL2MeZ5KQ,429
36
- wbcompliance/locale/fr/LC_MESSAGES/django.po,sha256=RggqkeYo4emaCDyD7VZAyDZpfg4PDYLMhN3RjXScD4I,38873
36
+ wbcompliance/locale/fr/LC_MESSAGES/django.po,sha256=PxjH5xsgB5HxG9VRM-x_zmyiGgvjHfQfEfjsKAQL7zQ,38995
37
37
  wbcompliance/management/__init__.py,sha256=m66tbr6kx54PaHk0uGXZFHpn_9IJo65aJGaJKrdAgV4,429
38
38
  wbcompliance/migrations/0001_initial_squashed_squashed_0010_alter_checkedobjectincidentrelationship_resolved_by_and_more.py,sha256=6wosnFvOHhvMhF9iD_FxnA04NhLoSB3xfahGhXgn3Rg,71200
39
39
  wbcompliance/migrations/0011_alter_riskrule_parameters.py,sha256=RIRsuA_9B98xA7mySwJQDbISRpjOHCBCUMpYlj6WebI,607
@@ -51,25 +51,25 @@ wbcompliance/migrations/0022_riskincident_precheck.py,sha256=H2l9REAsogn7EsUMWcE
51
51
  wbcompliance/migrations/0023_alter_checkedobjectincidentrelationship_unique_together_and_more.py,sha256=dSgzBAWvIs1tsegPgpr0GtBXEVKsHgtX5djuihQg93w,1486
52
52
  wbcompliance/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  wbcompliance/models/__init__.py,sha256=gk3D0yZ3ZpJh1Nl-Kyc1PWm67t0Gj7t47Jl2xm9Lisk,534
54
- wbcompliance/models/compliance_form.py,sha256=6xWJ5cEt0mfNsZjLYXI8GcP1Jb4MsFsvPhtVITmE0yI,24879
55
- wbcompliance/models/compliance_task.py,sha256=V0gFzkmBlLk2lA0CuMbvObn31M1QL11fZGRcUAPDYjc,30806
56
- wbcompliance/models/compliance_type.py,sha256=uf48Nl-dqyXOse8pAO7Rq7uzPNvtk955HPHRCKX4m-c,4830
54
+ wbcompliance/models/compliance_form.py,sha256=uyU8DhMuEp1uXcMyE1fdPZ0mxHO0H0Ecc0I7XDPR2Dc,24867
55
+ wbcompliance/models/compliance_task.py,sha256=cwX7KA681yneK5xw2I8YFYjK8ODnoalo0AAudBYjkYQ,30794
56
+ wbcompliance/models/compliance_type.py,sha256=_v5HDbzDN8b1bRGpTBI2ppAL0PjXjKeSC3PVI2Q-eZw,4733
57
57
  wbcompliance/models/enums.py,sha256=id1m8trG7b6Sw3Sa9VrLgD104GC2nG9A8ngJzaRqIIQ,424
58
58
  wbcompliance/models/risk_management/__init__.py,sha256=DJXoHheA5REDpPYP0uyRmFWyNKP-ir_z5YB61CN6N-E,247
59
59
  wbcompliance/models/risk_management/backend.py,sha256=EsGOlBIDTVJdZzCYtFmRiL8sUc0LDQJebHq9mwR_Xm4,5061
60
60
  wbcompliance/models/risk_management/checks.py,sha256=drBNhT7kj7TA1EclKX9jpPp-IycNcHvjj3xZsbKqB2E,12670
61
61
  wbcompliance/models/risk_management/dispatch.py,sha256=cLi63vSGbk9xhCoVgr4UmVk2kfYmGiyohKINSvCodb0,1423
62
- wbcompliance/models/risk_management/incidents.py,sha256=9BJP6N2Qbpach7ObymZ1Pz5ih0cLqrzXI9fLfYGb-d4,24382
62
+ wbcompliance/models/risk_management/incidents.py,sha256=bDSW34HJMKy1flbYxHI7XEjkJY9rc3FqKoK-9RYagEQ,24312
63
63
  wbcompliance/models/risk_management/mixins.py,sha256=vitLClx1QwmhooXselB_MqNoLbxMRp-uNQKsvHDooj8,4449
64
- wbcompliance/models/risk_management/rules.py,sha256=26zanw7maoi-ODJoDj2FLu8PCN5i2dI9J6RU5QsJ9uU,25917
64
+ wbcompliance/models/risk_management/rules.py,sha256=fDjHoI7A6CudRHP_8j3Wr0UgZFuhHk2dkKIKyGvY9nc,25918
65
65
  wbcompliance/serializers/__init__.py,sha256=OhRIuUrexqQePCISpu-BKry9dfioYGfpO8RwlcwhHtI,1122
66
66
  wbcompliance/serializers/compliance_form.py,sha256=OxPILlup_CP4Qwvu864oMqz7QUZsk2QOkOGFifWP3gM,11615
67
67
  wbcompliance/serializers/compliance_task.py,sha256=euTQya2LdexoRblew9zMkv40kU7wkW9nU2uLTI-lwow,17035
68
68
  wbcompliance/serializers/compliance_type.py,sha256=kxQTLS9JfGStJ1dJYmU_TlZh7Jqn3_9h_ZMAjiL61lA,1048
69
69
  wbcompliance/serializers/risk_management/__init__.py,sha256=_95Z1L6f7muQ0UvbEY1P3ROK3nqwkjhgYf3onRhWmv0,733
70
- wbcompliance/serializers/risk_management/checks.py,sha256=ARnpvZWfn-6wfrYt1dRasofyiZcQOmMjRGyrClmy_Vc,1756
71
- wbcompliance/serializers/risk_management/incidents.py,sha256=WHxeBn0VnLTrMJVULgCeCs-upKqEj-4rN4h8lYvcIQA,8475
72
- wbcompliance/serializers/risk_management/rules.py,sha256=ztvFiBKi2o50e_EmPygDd0RjEWk5bdexFouhPp9uj4o,5504
70
+ wbcompliance/serializers/risk_management/checks.py,sha256=wMG_z84nZ2d5lqWaW4XEDrgeqs0__Yyu_Cvam04iEUs,1764
71
+ wbcompliance/serializers/risk_management/incidents.py,sha256=SrNJ5fU7XHZX4CEWF8y7kJ99f_BANLocTHO0th1GpKk,8483
72
+ wbcompliance/serializers/risk_management/rules.py,sha256=mxxMzTYt65Hdkn6EAVZWcUh_igTNa0VjApkNPv0P5YY,5512
73
73
  wbcompliance/templates/compliance/compliance_form.html,sha256=IR71gVnKlUZNalS63D4v18uwNg2GtbOWtqX4bCAON08,11943
74
74
  wbcompliance/templates/compliance/review_compliance_task_report.html,sha256=-YPsQNS8N0eFhKd1cQ_8o5Exw3MdFgrh4muUMFcg-Aw,7819
75
75
  wbcompliance/templates/risk_management/incident_notification.html,sha256=zg4cnfWq5gV60b5ZtDDXL-rElBtdr5RwQL0DO4XVnbY,1506
@@ -77,21 +77,22 @@ wbcompliance/templates/risk_management/incident_report.html,sha256=1Npuale82RfS-
77
77
  wbcompliance/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
78
  wbcompliance/tests/conftest.py,sha256=uoxRfVmFK3VDQsu_TQrn5-RxUhDfBCd4dijrKL2uvfs,1953
79
79
  wbcompliance/tests/disable_signals.py,sha256=N3nosCNpUDdauokoWTOLOpqXgZo7BD52OCE9uUUcXyA,2386
80
- wbcompliance/tests/mixins.py,sha256=2-xAXMcTEl5N7VSGkpeQrRwLcs7bm2wUYhyRnNyafaU,467
80
+ wbcompliance/tests/mixins.py,sha256=mfCd0Ul_YsRx_SQCv-ybqkXWQGT7QTU341cdKv-wDzc,396
81
81
  wbcompliance/tests/signals.py,sha256=nCQBFcZNrkTuMxmVyY_fFrbj3C7b94i0s_MYlr-KKoU,4010
82
82
  wbcompliance/tests/test_filters.py,sha256=LV9lma5c_16TWjyKohR-1Qs7Z9Fd_p6lhnswceVQuI8,1017
83
83
  wbcompliance/tests/test_models.py,sha256=zoEK44J8ZfcKYm65ZZYj_wRWhMEGqdURnuDSYOSedFs,2604
84
84
  wbcompliance/tests/test_serializers.py,sha256=JxlLGAxnOHu2etULUN4uy1Q3AFD8K4ZPTLcU1rBMZww,1881
85
+ wbcompliance/tests/test_tasks.py,sha256=ynsspQCJoB6wnRDn1vWdRKMmNtToF1L5EIyEP4Ndxpo,1246
85
86
  wbcompliance/tests/test_views.py,sha256=nZIpfttDP-BedwYA-Y6Wkeh43lAJBNEb9tnhfdByrzw,16839
86
87
  wbcompliance/tests/tests.py,sha256=5AwXagOkUAF_ahHBQTHzYOpUZEEOxEjuK_bZL4sdJCo,635
87
88
  wbcompliance/tests/risk_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
89
  wbcompliance/tests/risk_management/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
90
  wbcompliance/tests/risk_management/models/test_backends.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
91
  wbcompliance/tests/risk_management/models/test_checks.py,sha256=F4Pbn7q4PBmWx5fjvkwEclioG1mEt2M53maegSI9hYU,2467
91
- wbcompliance/tests/risk_management/models/test_incidents.py,sha256=BYhBbD6M83poo5VrLzULG9xXpbtOlw9ObhzLwm31KAE,15107
92
+ wbcompliance/tests/risk_management/models/test_incidents.py,sha256=kBDZ1LqaUY592g1_nexV5ye9Wz7AoKppAJhGv_qj00s,15035
92
93
  wbcompliance/tests/risk_management/models/test_rules.py,sha256=j3g2gK6SV0F9a7U2eh2bEzPLI2wtZZoueQpzH6NTxpw,11177
93
94
  wbcompliance/viewsets/__init__.py,sha256=JVv3mT5i-9dSYIC_lrvJqcFCPI92KQp9AZ21lR-eqEg,1498
94
- wbcompliance/viewsets/compliance_form.py,sha256=0Rknp9bq3CM4oeskauJckQerF3EKQndkeG3DPFte-vY,17310
95
+ wbcompliance/viewsets/compliance_form.py,sha256=_oAG5zkPHQ4g_IVy_MSQamk_gk1XBlgX6CDU8YHhHFE,17298
95
96
  wbcompliance/viewsets/compliance_task.py,sha256=gz071EDL3kctR_pv38m_vaNplw-6Rdvuq5W6CYLV_4Y,19213
96
97
  wbcompliance/viewsets/compliance_type.py,sha256=XtPyVe6szzzpXEWA_F9JRSaI8YSxe--eydouCx1oTKM,1294
97
98
  wbcompliance/viewsets/buttons/__init__.py,sha256=rL54B0c3GQiqowqEzc0d9BOneeQ39XblPssRZ-vwiwA,239
@@ -125,10 +126,10 @@ wbcompliance/viewsets/menu/compliance_task.py,sha256=SsB9wrP13VBdxFBYYOT2Dh0isRk
125
126
  wbcompliance/viewsets/menu/compliance_type.py,sha256=8jvu9dFhTeYqJy0lhx4BD_rOeVi4iz073BPKYbnkuFY,684
126
127
  wbcompliance/viewsets/menu/risk_management.py,sha256=3rxNrWw9sET7BqulxXWjAehg5NRIKmNoyTrBLOHx4g8,1969
127
128
  wbcompliance/viewsets/risk_management/__init__.py,sha256=Gu2vavnClUg9RKpGMhwqo_DOv-FLAGlBf7BbYNyEkJM,821
128
- wbcompliance/viewsets/risk_management/checks.py,sha256=LPePqnrJ1alhSgGyMPfh_-13AE_-KLicZN-OEXx6qgg,2449
129
- wbcompliance/viewsets/risk_management/incidents.py,sha256=WauVZq2QVB07rTxC-Bz4SUbNbQIJxe2r3jKs_ubrdPI,8230
129
+ wbcompliance/viewsets/risk_management/checks.py,sha256=kCitq6tlqW_z_oGGiRqRKft3XDlLq0gEGDRIuT4wYlI,2377
130
+ wbcompliance/viewsets/risk_management/incidents.py,sha256=XLxcmcbIvUEPwIm2R2T5Z_XErFbWEWNjEihHF6p2Gv0,8184
130
131
  wbcompliance/viewsets/risk_management/mixins.py,sha256=g8gF7Glzc36bKfKng9jlb9CCXAqsVZsGfHc6SjDHGlY,1559
131
- wbcompliance/viewsets/risk_management/rules.py,sha256=2YYST-uULbJt1Y6IwK2GPmVTetXQCTt64Zrj4UEnHzo,6960
132
+ wbcompliance/viewsets/risk_management/rules.py,sha256=IDb4YSfcSLeMugkIh-7m4q2B-FKKTtF92LXX_RtNRIE,6888
132
133
  wbcompliance/viewsets/risk_management/tables.py,sha256=Yj_oJXjh-9trPmRs2pFRAVAe15TnA9542fdXkX8xeq4,3896
133
134
  wbcompliance/viewsets/titles/__init__.py,sha256=bzKjQrFzqTUSH8OxBAeI7Cc6HHGAIae0gBp8fzzgpfw,589
134
135
  wbcompliance/viewsets/titles/compliance_form.py,sha256=9LdQf54U6cAJwdjNxuaxFKEXkLXA8EloeR9baziqLkA,4256
@@ -139,6 +140,6 @@ wbcompliance/viewsets/titles/risk_managment/checks.py,sha256=47DEQpj8HBSa-_TImW-
139
140
  wbcompliance/viewsets/titles/risk_managment/incidents.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
141
  wbcompliance/viewsets/titles/risk_managment/rules.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
142
  wbcompliance/viewsets/titles/risk_managment/tables.py,sha256=x_9mr6JWZ9GVNAEvfdNCeFZtGGYSG0-sXrR9pwTyocU,256
142
- wbcompliance-1.59.16.dist-info/METADATA,sha256=zk3ffHodN6DDXI-BEOOTICk4WE3xhOHlpKcW3pZvrjs,197
143
- wbcompliance-1.59.16.dist-info/WHEEL,sha256=aha0VrrYvgDJ3Xxl3db_g_MDIW-ZexDdrc_m-Hk8YY4,105
144
- wbcompliance-1.59.16.dist-info/RECORD,,
143
+ wbcompliance-1.60.1.dist-info/METADATA,sha256=sa3biD3E90E--2CgVYA2ZrB5jt78uElKoq8DT4R8pM0,196
144
+ wbcompliance-1.60.1.dist-info/WHEEL,sha256=aha0VrrYvgDJ3Xxl3db_g_MDIW-ZexDdrc_m-Hk8YY4,105
145
+ wbcompliance-1.60.1.dist-info/RECORD,,