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.
- wbcompliance/__init__.py +1 -0
- wbcompliance/admin/__init__.py +16 -0
- wbcompliance/admin/compliance_form.py +56 -0
- wbcompliance/admin/compliance_task.py +135 -0
- wbcompliance/admin/compliance_type.py +8 -0
- wbcompliance/admin/risk_management/__init__.py +3 -0
- wbcompliance/admin/risk_management/checks.py +7 -0
- wbcompliance/admin/risk_management/incidents.py +50 -0
- wbcompliance/admin/risk_management/rules.py +63 -0
- wbcompliance/admin/utils.py +46 -0
- wbcompliance/apps.py +14 -0
- wbcompliance/factories/__init__.py +21 -0
- wbcompliance/factories/compliance.py +246 -0
- wbcompliance/factories/risk_management/__init__.py +12 -0
- wbcompliance/factories/risk_management/backends.py +42 -0
- wbcompliance/factories/risk_management/checks.py +12 -0
- wbcompliance/factories/risk_management/incidents.py +84 -0
- wbcompliance/factories/risk_management/rules.py +100 -0
- wbcompliance/filters/__init__.py +2 -0
- wbcompliance/filters/compliances.py +189 -0
- wbcompliance/filters/risk_management/__init__.py +3 -0
- wbcompliance/filters/risk_management/checks.py +22 -0
- wbcompliance/filters/risk_management/incidents.py +113 -0
- wbcompliance/filters/risk_management/rules.py +110 -0
- wbcompliance/filters/risk_management/tables.py +112 -0
- wbcompliance/filters/risk_management/utils.py +3 -0
- wbcompliance/management/__init__.py +10 -0
- wbcompliance/migrations/0001_initial_squashed_squashed_0010_alter_checkedobjectincidentrelationship_resolved_by_and_more.py +1744 -0
- wbcompliance/migrations/0011_alter_riskrule_parameters.py +21 -0
- wbcompliance/migrations/0012_alter_compliancetype_options.py +20 -0
- wbcompliance/migrations/0013_alter_riskrule_unique_together.py +16 -0
- wbcompliance/migrations/0014_alter_reviewcompliancetask_year.py +27 -0
- wbcompliance/migrations/0015_auto_20240103_0957.py +43 -0
- wbcompliance/migrations/0016_checkedobjectincidentrelationship_report_details_and_more.py +37 -0
- wbcompliance/migrations/0017_alter_rulebackend_incident_report_template.py +20 -0
- wbcompliance/migrations/0018_alter_rulecheckedobjectrelationship_unique_together.py +39 -0
- wbcompliance/migrations/0019_rulegroup_riskrule_activation_date_and_more.py +60 -0
- wbcompliance/migrations/__init__.py +0 -0
- wbcompliance/models/__init__.py +20 -0
- wbcompliance/models/compliance_form.py +626 -0
- wbcompliance/models/compliance_task.py +800 -0
- wbcompliance/models/compliance_type.py +133 -0
- wbcompliance/models/enums.py +13 -0
- wbcompliance/models/risk_management/__init__.py +4 -0
- wbcompliance/models/risk_management/backend.py +139 -0
- wbcompliance/models/risk_management/checks.py +194 -0
- wbcompliance/models/risk_management/dispatch.py +41 -0
- wbcompliance/models/risk_management/incidents.py +619 -0
- wbcompliance/models/risk_management/mixins.py +115 -0
- wbcompliance/models/risk_management/rules.py +654 -0
- wbcompliance/permissions.py +32 -0
- wbcompliance/serializers/__init__.py +30 -0
- wbcompliance/serializers/compliance_form.py +320 -0
- wbcompliance/serializers/compliance_task.py +463 -0
- wbcompliance/serializers/compliance_type.py +26 -0
- wbcompliance/serializers/risk_management/__init__.py +19 -0
- wbcompliance/serializers/risk_management/checks.py +53 -0
- wbcompliance/serializers/risk_management/incidents.py +227 -0
- wbcompliance/serializers/risk_management/rules.py +158 -0
- wbcompliance/tasks.py +112 -0
- wbcompliance/tests/__init__.py +0 -0
- wbcompliance/tests/conftest.py +63 -0
- wbcompliance/tests/disable_signals.py +82 -0
- wbcompliance/tests/mixins.py +17 -0
- wbcompliance/tests/risk_management/__init__.py +0 -0
- wbcompliance/tests/risk_management/models/__init__.py +0 -0
- wbcompliance/tests/risk_management/models/test_backends.py +0 -0
- wbcompliance/tests/risk_management/models/test_checks.py +55 -0
- wbcompliance/tests/risk_management/models/test_incidents.py +327 -0
- wbcompliance/tests/risk_management/models/test_rules.py +255 -0
- wbcompliance/tests/signals.py +89 -0
- wbcompliance/tests/test_filters.py +23 -0
- wbcompliance/tests/test_models.py +57 -0
- wbcompliance/tests/test_serializers.py +48 -0
- wbcompliance/tests/test_views.py +377 -0
- wbcompliance/tests/tests.py +21 -0
- wbcompliance/urls.py +238 -0
- wbcompliance/viewsets/__init__.py +40 -0
- wbcompliance/viewsets/buttons/__init__.py +9 -0
- wbcompliance/viewsets/buttons/compliance_form.py +78 -0
- wbcompliance/viewsets/buttons/compliance_task.py +149 -0
- wbcompliance/viewsets/buttons/risk_managment/__init__.py +3 -0
- wbcompliance/viewsets/buttons/risk_managment/checks.py +11 -0
- wbcompliance/viewsets/buttons/risk_managment/incidents.py +51 -0
- wbcompliance/viewsets/buttons/risk_managment/rules.py +35 -0
- wbcompliance/viewsets/compliance_form.py +425 -0
- wbcompliance/viewsets/compliance_task.py +513 -0
- wbcompliance/viewsets/compliance_type.py +38 -0
- wbcompliance/viewsets/display/__init__.py +22 -0
- wbcompliance/viewsets/display/compliance_form.py +317 -0
- wbcompliance/viewsets/display/compliance_task.py +453 -0
- wbcompliance/viewsets/display/compliance_type.py +22 -0
- wbcompliance/viewsets/display/risk_managment/__init__.py +11 -0
- wbcompliance/viewsets/display/risk_managment/checks.py +46 -0
- wbcompliance/viewsets/display/risk_managment/incidents.py +155 -0
- wbcompliance/viewsets/display/risk_managment/rules.py +146 -0
- wbcompliance/viewsets/display/risk_managment/tables.py +51 -0
- wbcompliance/viewsets/endpoints/__init__.py +27 -0
- wbcompliance/viewsets/endpoints/compliance_form.py +207 -0
- wbcompliance/viewsets/endpoints/compliance_task.py +193 -0
- wbcompliance/viewsets/endpoints/compliance_type.py +9 -0
- wbcompliance/viewsets/endpoints/risk_managment/__init__.py +12 -0
- wbcompliance/viewsets/endpoints/risk_managment/checks.py +16 -0
- wbcompliance/viewsets/endpoints/risk_managment/incidents.py +36 -0
- wbcompliance/viewsets/endpoints/risk_managment/rules.py +32 -0
- wbcompliance/viewsets/endpoints/risk_managment/tables.py +14 -0
- wbcompliance/viewsets/menu/__init__.py +17 -0
- wbcompliance/viewsets/menu/compliance_form.py +49 -0
- wbcompliance/viewsets/menu/compliance_task.py +130 -0
- wbcompliance/viewsets/menu/compliance_type.py +17 -0
- wbcompliance/viewsets/menu/risk_management.py +56 -0
- wbcompliance/viewsets/risk_management/__init__.py +21 -0
- wbcompliance/viewsets/risk_management/checks.py +49 -0
- wbcompliance/viewsets/risk_management/incidents.py +204 -0
- wbcompliance/viewsets/risk_management/mixins.py +52 -0
- wbcompliance/viewsets/risk_management/rules.py +179 -0
- wbcompliance/viewsets/risk_management/tables.py +96 -0
- wbcompliance/viewsets/titles/__init__.py +17 -0
- wbcompliance/viewsets/titles/compliance_form.py +101 -0
- wbcompliance/viewsets/titles/compliance_task.py +60 -0
- wbcompliance/viewsets/titles/compliance_type.py +13 -0
- wbcompliance/viewsets/titles/risk_managment/__init__.py +1 -0
- wbcompliance/viewsets/titles/risk_managment/checks.py +0 -0
- wbcompliance/viewsets/titles/risk_managment/incidents.py +0 -0
- wbcompliance/viewsets/titles/risk_managment/rules.py +0 -0
- wbcompliance/viewsets/titles/risk_managment/tables.py +7 -0
- wbcompliance-2.2.1.dist-info/METADATA +7 -0
- wbcompliance-2.2.1.dist-info/RECORD +129 -0
- wbcompliance-2.2.1.dist-info/WHEEL +5 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from django.dispatch import receiver
|
|
2
|
+
from wbcompliance.factories import (
|
|
3
|
+
ComplianceTaskInstanceReviewFactory,
|
|
4
|
+
ComplianceTaskInstanceReviewNoGroupFactory,
|
|
5
|
+
ComplianceTaskReviewFactory,
|
|
6
|
+
ComplianceTaskReviewNoGroupFactory,
|
|
7
|
+
)
|
|
8
|
+
from wbcompliance.viewsets import (
|
|
9
|
+
CFComplianceFormSignatureModelViewSet,
|
|
10
|
+
ComplianceFormSignatureModelViewSet,
|
|
11
|
+
ComplianceFormSignatureSectionRuleViewSet,
|
|
12
|
+
ComplianceTaskInstanceReviewGroupModelViewSet,
|
|
13
|
+
ComplianceTaskInstanceReviewNoGroupModelViewSet,
|
|
14
|
+
ComplianceTaskReviewGroupModelViewSet,
|
|
15
|
+
ComplianceTaskReviewNoGroupModelViewSet,
|
|
16
|
+
)
|
|
17
|
+
from wbcore.test.signals import (
|
|
18
|
+
custom_update_data_from_factory,
|
|
19
|
+
custom_update_kwargs,
|
|
20
|
+
get_custom_factory,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
# =================================================================================================================
|
|
24
|
+
# CUSTOM FACTORY
|
|
25
|
+
# =================================================================================================================
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@receiver(get_custom_factory, sender=ComplianceTaskReviewNoGroupModelViewSet)
|
|
29
|
+
def receive_factory_compliance_task_review_no_group(sender, *args, **kwargs):
|
|
30
|
+
return ComplianceTaskReviewNoGroupFactory
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@receiver(get_custom_factory, sender=ComplianceTaskReviewGroupModelViewSet)
|
|
34
|
+
def receive_factory_compliance_task_review(sender, *args, **kwargs):
|
|
35
|
+
return ComplianceTaskReviewFactory
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@receiver(get_custom_factory, sender=ComplianceTaskInstanceReviewNoGroupModelViewSet)
|
|
39
|
+
def receive_factory_compliance_task_instance_review_no_group(sender, *args, **kwargs):
|
|
40
|
+
return ComplianceTaskInstanceReviewNoGroupFactory
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@receiver(get_custom_factory, sender=ComplianceTaskInstanceReviewGroupModelViewSet)
|
|
44
|
+
def receive_factory_compliance_task_review_group(sender, *args, **kwargs):
|
|
45
|
+
return ComplianceTaskInstanceReviewFactory
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# =================================================================================================================
|
|
49
|
+
# UPDATE DATA
|
|
50
|
+
# =================================================================================================================
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@receiver(custom_update_data_from_factory, sender=ComplianceFormSignatureSectionRuleViewSet)
|
|
54
|
+
def receive_data_compliance_form_signature_section(sender, *args, **kwargs):
|
|
55
|
+
if (obj := kwargs.get("obj_factory")) and (user := kwargs.get("user")):
|
|
56
|
+
obj.section.compliance_form_signature.person = user.profile
|
|
57
|
+
obj.section.compliance_form_signature.save()
|
|
58
|
+
return {}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@receiver(custom_update_data_from_factory, sender=ComplianceFormSignatureModelViewSet)
|
|
62
|
+
@receiver(custom_update_data_from_factory, sender=CFComplianceFormSignatureModelViewSet)
|
|
63
|
+
def receive_data_compliance_form_signature(sender, *args, **kwargs):
|
|
64
|
+
if (obj := kwargs.get("obj_factory")) and (user := kwargs.get("user")):
|
|
65
|
+
obj.person = user.profile
|
|
66
|
+
obj.signed = None
|
|
67
|
+
obj.save()
|
|
68
|
+
return {}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# =================================================================================================================
|
|
72
|
+
# UPDATE KWARGS
|
|
73
|
+
# =================================================================================================================
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@receiver(custom_update_kwargs, sender=ComplianceTaskInstanceReviewNoGroupModelViewSet)
|
|
77
|
+
@receiver(custom_update_kwargs, sender=ComplianceTaskReviewGroupModelViewSet)
|
|
78
|
+
@receiver(custom_update_kwargs, sender=ComplianceTaskReviewNoGroupModelViewSet)
|
|
79
|
+
def receive_kwargs_compliance_task_review(sender, *args, **kwargs):
|
|
80
|
+
if (obj := kwargs.get("obj_factory")) and obj.review.exists():
|
|
81
|
+
return {"review_id": obj.review.first().id}
|
|
82
|
+
return {}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@receiver(custom_update_kwargs, sender=ComplianceTaskInstanceReviewGroupModelViewSet)
|
|
86
|
+
def receive_kwargs_compliance_task_instance_review(sender, *args, **kwargs):
|
|
87
|
+
if (obj := kwargs.get("obj_factory")) and obj.review.exists():
|
|
88
|
+
return {"review_id": obj.review.first().id, "group_id": obj.task.group.id}
|
|
89
|
+
return {}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from wbcompliance.viewsets import ComplianceFormSignatureModelViewSet
|
|
3
|
+
|
|
4
|
+
from .mixins import UserTestMixin
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@pytest.mark.django_db
|
|
8
|
+
class TestSpecificFilters(UserTestMixin):
|
|
9
|
+
def test_filter_version(self, compliance_form_factory, user):
|
|
10
|
+
compliance_form = compliance_form_factory(assigned_to=(user.groups.first(),))
|
|
11
|
+
compliance_form.activationrequested()
|
|
12
|
+
compliance_form.active()
|
|
13
|
+
compliance_form.draft()
|
|
14
|
+
compliance_form.activationrequested()
|
|
15
|
+
compliance_form.active()
|
|
16
|
+
mvs = ComplianceFormSignatureModelViewSet()
|
|
17
|
+
qs = mvs.get_serializer_class().Meta.model.objects.all()
|
|
18
|
+
assert mvs.filterset_class().filter_version(qs, "", False) == qs
|
|
19
|
+
assert mvs.filterset_class().filter_version(qs, "", False).count() == 2
|
|
20
|
+
assert mvs.filterset_class().filter_version(qs, "", True).count() == 1
|
|
21
|
+
|
|
22
|
+
def test_not_created_m2m_field_compliance_form_factory(self, compliance_form_factory):
|
|
23
|
+
assert compliance_form_factory.build()
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from wbcompliance.models import ComplianceForm, ComplianceFormSignature
|
|
3
|
+
from wbcore.contrib.authentication.factories import UserFactory
|
|
4
|
+
from wbcore.permissions.shortcuts import get_internal_users
|
|
5
|
+
|
|
6
|
+
from .mixins import UserTestMixin
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.django_db
|
|
10
|
+
class TestSpecificModels(UserTestMixin):
|
|
11
|
+
@pytest.mark.parametrize("other_user", [True, False])
|
|
12
|
+
def test_draft_activationrequested_active(self, compliance_form_factory, other_user):
|
|
13
|
+
other_user = UserFactory() if other_user else None
|
|
14
|
+
compliance_form = compliance_form_factory()
|
|
15
|
+
assert compliance_form.status == ComplianceForm.Status.DRAFT
|
|
16
|
+
compliance_form.activationrequested(by=other_user)
|
|
17
|
+
assert compliance_form.status == ComplianceForm.Status.ACTIVATION_REQUESTED
|
|
18
|
+
compliance_form.active(by=other_user)
|
|
19
|
+
assert compliance_form.status == ComplianceForm.Status.ACTIVE
|
|
20
|
+
compliance_form.draft(by=other_user)
|
|
21
|
+
assert compliance_form.status == ComplianceForm.Status.DRAFT
|
|
22
|
+
|
|
23
|
+
def test_create_compliance_form_signature(
|
|
24
|
+
self,
|
|
25
|
+
compliance_form_factory,
|
|
26
|
+
user,
|
|
27
|
+
compliance_form_section_factory,
|
|
28
|
+
compliance_form_rule_factory,
|
|
29
|
+
):
|
|
30
|
+
compliance_form = compliance_form_factory(
|
|
31
|
+
assigned_to=(user.groups.filter(name="Compliance Position").first(),)
|
|
32
|
+
)
|
|
33
|
+
section = compliance_form_section_factory(compliance_form=compliance_form)
|
|
34
|
+
compliance_form_rule_factory(section=section)
|
|
35
|
+
|
|
36
|
+
compliance_form.activationrequested()
|
|
37
|
+
compliance_form.active()
|
|
38
|
+
assert ComplianceFormSignature.objects.count() == 1
|
|
39
|
+
|
|
40
|
+
# test empty assigned_to
|
|
41
|
+
compliance_form1 = compliance_form_factory(only_internal=True)
|
|
42
|
+
compliance_form1.activationrequested()
|
|
43
|
+
compliance_form1.active()
|
|
44
|
+
assert (
|
|
45
|
+
ComplianceFormSignature.objects.filter(compliance_form=compliance_form1).count()
|
|
46
|
+
== get_internal_users().count()
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# def test_only_internal(self, compliance_form_factory):
|
|
50
|
+
# employee.contract_type = EmployeeHumanResource.ContractType.EXTERNAL
|
|
51
|
+
# employee.save()
|
|
52
|
+
# compliance_form = compliance_form_factory(assigned_to=(user.groups.filter(name="Compliance Position").first(),), only_internal=True)
|
|
53
|
+
# assert compliance_form.get_signing_users().count() == 0
|
|
54
|
+
#
|
|
55
|
+
# employee2 = EmployeeHumanResourceFactory(profile=person2)
|
|
56
|
+
# compliance_form2 = compliance_form_factory(assigned_to=(employee2.position,), only_internal=False)
|
|
57
|
+
# assert compliance_form2.get_signing_users().count() == 1
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from datetime import date
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from dateutil.relativedelta import relativedelta
|
|
5
|
+
from rest_framework import status
|
|
6
|
+
from rest_framework.test import APIRequestFactory
|
|
7
|
+
from wbcompliance.viewsets import ComplianceFormModelViewSet
|
|
8
|
+
from wbcore.test.utils import (
|
|
9
|
+
get_data_from_factory,
|
|
10
|
+
get_kwargs,
|
|
11
|
+
get_model_factory,
|
|
12
|
+
get_or_create_superuser,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
from .mixins import UserTestMixin
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.mark.django_db
|
|
19
|
+
class TestSpecificSerializers(UserTestMixin):
|
|
20
|
+
@pytest.mark.parametrize("mvs", [ComplianceFormModelViewSet])
|
|
21
|
+
def test_update_compliance_form_model_serializer(self, mvs, user):
|
|
22
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
23
|
+
obj = factory(assigned_to=(user.groups.first(),))
|
|
24
|
+
user = get_or_create_superuser()
|
|
25
|
+
|
|
26
|
+
data = get_data_from_factory(obj, mvs, update=True, superuser=user)
|
|
27
|
+
request = APIRequestFactory().put("", data)
|
|
28
|
+
request.user = user
|
|
29
|
+
|
|
30
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
31
|
+
vs = mvs.as_view({"put": "update"})
|
|
32
|
+
response = vs(request, **kwargs, pk=obj.pk)
|
|
33
|
+
assert response.status_code == status.HTTP_200_OK
|
|
34
|
+
assert response.data.get("instance")
|
|
35
|
+
|
|
36
|
+
@pytest.mark.parametrize("mvs", [ComplianceFormModelViewSet])
|
|
37
|
+
def test_validate_date_compliance_form(self, mvs):
|
|
38
|
+
user = get_or_create_superuser()
|
|
39
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
40
|
+
now = date.today()
|
|
41
|
+
obj = factory(start=now, end=now - relativedelta(months=+5))
|
|
42
|
+
data = get_data_from_factory(obj, mvs, update=True, superuser=user)
|
|
43
|
+
request = APIRequestFactory().post("", data)
|
|
44
|
+
request.user = user
|
|
45
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
46
|
+
vs = mvs.as_view({"post": "create"})
|
|
47
|
+
response = vs(request, **kwargs)
|
|
48
|
+
assert response.status_code == status.HTTP_400_BAD_REQUEST
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from django.contrib.auth.models import Permission
|
|
3
|
+
from django.contrib.contenttypes.models import ContentType
|
|
4
|
+
from rest_framework import status
|
|
5
|
+
from rest_framework.test import APIRequestFactory
|
|
6
|
+
from wbcompliance.factories import (
|
|
7
|
+
ComplianceFormSectionFactory,
|
|
8
|
+
ComplianceFormSignatureRuleFactory,
|
|
9
|
+
ComplianceFormSignatureSectionFactory,
|
|
10
|
+
ComplianceFormTypeFactory,
|
|
11
|
+
)
|
|
12
|
+
from wbcompliance.models import (
|
|
13
|
+
ComplianceForm,
|
|
14
|
+
ComplianceFormRule,
|
|
15
|
+
ComplianceFormSection,
|
|
16
|
+
ComplianceFormSignature,
|
|
17
|
+
ComplianceFormType,
|
|
18
|
+
)
|
|
19
|
+
from wbcompliance.viewsets import (
|
|
20
|
+
CFComplianceFormSignatureModelViewSet,
|
|
21
|
+
ComplianceFormModelViewSet,
|
|
22
|
+
ComplianceFormRuleViewSet,
|
|
23
|
+
ComplianceFormSectionComplianceFormViewSet,
|
|
24
|
+
ComplianceFormSectionRuleViewSet,
|
|
25
|
+
ComplianceFormSignatureModelViewSet,
|
|
26
|
+
ComplianceFormTypeViewSet,
|
|
27
|
+
ComplianceTaskMatrixPandasViewSet,
|
|
28
|
+
)
|
|
29
|
+
from wbcore.contrib.authentication.factories import InternalUserFactory, UserFactory
|
|
30
|
+
from wbcore.contrib.authentication.models import User
|
|
31
|
+
from wbcore.test.utils import (
|
|
32
|
+
get_data_from_factory,
|
|
33
|
+
get_kwargs,
|
|
34
|
+
get_model_factory,
|
|
35
|
+
get_or_create_superuser,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
from .mixins import UserTestMixin
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.mark.django_db
|
|
42
|
+
class TestSpecificViewsets(UserTestMixin):
|
|
43
|
+
@pytest.mark.parametrize(
|
|
44
|
+
"mvs",
|
|
45
|
+
[
|
|
46
|
+
ComplianceFormModelViewSet,
|
|
47
|
+
ComplianceFormSignatureModelViewSet,
|
|
48
|
+
ComplianceFormTypeViewSet,
|
|
49
|
+
ComplianceFormSectionComplianceFormViewSet,
|
|
50
|
+
ComplianceFormSectionRuleViewSet,
|
|
51
|
+
],
|
|
52
|
+
)
|
|
53
|
+
def test_get_queryset(self, mvs):
|
|
54
|
+
request = APIRequestFactory().get("")
|
|
55
|
+
request.user = UserFactory(is_active=True, is_superuser=False)
|
|
56
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
57
|
+
obj = factory()
|
|
58
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
59
|
+
vs = mvs.as_view({"get": "list"})
|
|
60
|
+
response = vs(request, **kwargs)
|
|
61
|
+
assert response.status_code == status.HTTP_403_FORBIDDEN
|
|
62
|
+
|
|
63
|
+
@pytest.mark.parametrize(
|
|
64
|
+
"mvs, signature", [(ComplianceFormModelViewSet, False), (ComplianceFormSignatureModelViewSet, True)]
|
|
65
|
+
)
|
|
66
|
+
def test_option_request_declaration_on_honour(self, mvs, signature, compliance_form_factory):
|
|
67
|
+
request = APIRequestFactory().options("")
|
|
68
|
+
request.user = UserFactory(is_active=True, is_superuser=True)
|
|
69
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
70
|
+
complianceformtype = ComplianceFormTypeFactory()
|
|
71
|
+
complianceformtype.type = ComplianceFormType.Type.FORM
|
|
72
|
+
complianceformtype.save()
|
|
73
|
+
if signature:
|
|
74
|
+
cf = compliance_form_factory(form_type=complianceformtype)
|
|
75
|
+
obj = factory(compliance_form=cf)
|
|
76
|
+
sign_section = ComplianceFormSignatureSectionFactory(compliance_form_signature=obj)
|
|
77
|
+
ComplianceFormSignatureRuleFactory(section=sign_section)
|
|
78
|
+
else:
|
|
79
|
+
obj = factory(form_type=complianceformtype)
|
|
80
|
+
ComplianceFormSectionFactory(compliance_form=obj)
|
|
81
|
+
obj.save()
|
|
82
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
83
|
+
kwargs["pk"] = obj.pk
|
|
84
|
+
vs = mvs.as_view({"options": "options"})
|
|
85
|
+
response = vs(request, **kwargs)
|
|
86
|
+
assert response.status_code == status.HTTP_200_OK
|
|
87
|
+
|
|
88
|
+
@pytest.mark.parametrize(
|
|
89
|
+
"mvs, model, codename, is_queryset_not_empty",
|
|
90
|
+
[
|
|
91
|
+
(ComplianceFormTypeViewSet, ComplianceFormType, "view_complianceformtype", False),
|
|
92
|
+
(ComplianceFormRuleViewSet, ComplianceFormRule, "view_complianceformrule", True),
|
|
93
|
+
(ComplianceFormSectionComplianceFormViewSet, ComplianceFormSection, "view_complianceformsection", False),
|
|
94
|
+
(ComplianceFormSectionRuleViewSet, ComplianceFormRule, "view_complianceformrule", False),
|
|
95
|
+
],
|
|
96
|
+
)
|
|
97
|
+
def test_option_request_no_admin_section_rules(self, mvs, model, codename, is_queryset_not_empty):
|
|
98
|
+
request = APIRequestFactory().options("")
|
|
99
|
+
request.user = UserFactory(is_active=True)
|
|
100
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
101
|
+
obj = factory()
|
|
102
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
103
|
+
kwargs["pk"] = obj.pk
|
|
104
|
+
content_type = ContentType.objects.get_for_model(model)
|
|
105
|
+
permission = Permission.objects.get(
|
|
106
|
+
codename=codename,
|
|
107
|
+
content_type=content_type,
|
|
108
|
+
)
|
|
109
|
+
request.user.user_permissions.add(permission)
|
|
110
|
+
# permission check caching. -> refetch your object
|
|
111
|
+
request.user.refresh_from_db()
|
|
112
|
+
request.user = User.objects.get(pk=request.user.pk)
|
|
113
|
+
|
|
114
|
+
view = mvs()
|
|
115
|
+
view.setup(request, **kwargs)
|
|
116
|
+
|
|
117
|
+
assert view.get_queryset().exists() == is_queryset_not_empty
|
|
118
|
+
|
|
119
|
+
@pytest.mark.parametrize("mvs", [ComplianceFormModelViewSet])
|
|
120
|
+
def test_option_request_no_admin_compliance_form(self, mvs, compliance_form_factory):
|
|
121
|
+
request = APIRequestFactory().options("")
|
|
122
|
+
request.user = InternalUserFactory(is_active=True)
|
|
123
|
+
obj = compliance_form_factory.create()
|
|
124
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
125
|
+
|
|
126
|
+
permission_view = Permission.objects.get(
|
|
127
|
+
codename="view_complianceform",
|
|
128
|
+
content_type=ContentType.objects.get_for_model(ComplianceForm),
|
|
129
|
+
)
|
|
130
|
+
permission_select = Permission.objects.get(
|
|
131
|
+
codename="select_complianceform",
|
|
132
|
+
content_type=ContentType.objects.get_for_model(ComplianceForm),
|
|
133
|
+
)
|
|
134
|
+
permission_internal_user = Permission.objects.get(
|
|
135
|
+
codename="is_internal_user",
|
|
136
|
+
)
|
|
137
|
+
request.user.user_permissions.add(permission_view)
|
|
138
|
+
request.user.user_permissions.add(permission_select)
|
|
139
|
+
request.user.user_permissions.add(permission_internal_user)
|
|
140
|
+
|
|
141
|
+
request.user = User.objects.get(pk=request.user.pk) # reset cached property and permission cache
|
|
142
|
+
vs = mvs.as_view({"options": "options"})
|
|
143
|
+
response = vs(request, **kwargs)
|
|
144
|
+
assert response.status_code == status.HTTP_200_OK
|
|
145
|
+
|
|
146
|
+
@pytest.mark.parametrize(
|
|
147
|
+
"mvs, model, codename, is_allowed",
|
|
148
|
+
[
|
|
149
|
+
(ComplianceFormTypeViewSet, ComplianceFormType, "change_complianceformtype", False),
|
|
150
|
+
(ComplianceFormRuleViewSet, ComplianceFormRule, "change_complianceformrule", False),
|
|
151
|
+
(ComplianceFormSectionComplianceFormViewSet, ComplianceFormSection, "change_complianceformsection", False),
|
|
152
|
+
(ComplianceFormSectionRuleViewSet, ComplianceFormRule, "change_complianceformrule", False),
|
|
153
|
+
],
|
|
154
|
+
)
|
|
155
|
+
def test_get_instance_endpoint_no_admin_section_rules(self, mvs, model, codename, is_allowed):
|
|
156
|
+
user = UserFactory(is_active=True)
|
|
157
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
158
|
+
obj = factory()
|
|
159
|
+
data = get_data_from_factory(obj, mvs, update=True, superuser=user)
|
|
160
|
+
request = APIRequestFactory().put("", data)
|
|
161
|
+
request.user = user
|
|
162
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
163
|
+
|
|
164
|
+
content_type = ContentType.objects.get_for_model(model)
|
|
165
|
+
permission = Permission.objects.get(
|
|
166
|
+
codename=codename,
|
|
167
|
+
content_type=content_type,
|
|
168
|
+
)
|
|
169
|
+
request.user.user_permissions.add(permission)
|
|
170
|
+
# permission check caching. -> refetch your object
|
|
171
|
+
request.user.refresh_from_db()
|
|
172
|
+
request.user = User.objects.get(pk=request.user.pk)
|
|
173
|
+
|
|
174
|
+
vs = mvs.as_view({"put": "update"})
|
|
175
|
+
response = vs(request, **kwargs, pk=obj.pk)
|
|
176
|
+
if is_allowed:
|
|
177
|
+
assert response.status_code == status.HTTP_200_OK
|
|
178
|
+
else:
|
|
179
|
+
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
|
|
180
|
+
|
|
181
|
+
@pytest.mark.parametrize("mvs", [ComplianceFormSignatureModelViewSet, CFComplianceFormSignatureModelViewSet])
|
|
182
|
+
def test_get_create_endpoint_no_admin_compliance_form(self, mvs):
|
|
183
|
+
user = UserFactory(is_active=True)
|
|
184
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
185
|
+
obj = factory()
|
|
186
|
+
data = get_data_from_factory(obj, mvs, update=True, superuser=user)
|
|
187
|
+
request = APIRequestFactory().post("", data)
|
|
188
|
+
request.user = user
|
|
189
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
190
|
+
content_type = ContentType.objects.get_for_model(ComplianceFormSignature)
|
|
191
|
+
permission = Permission.objects.get(
|
|
192
|
+
codename="add_complianceformsignature",
|
|
193
|
+
content_type=content_type,
|
|
194
|
+
)
|
|
195
|
+
request.user.user_permissions.add(permission)
|
|
196
|
+
request.user.refresh_from_db()
|
|
197
|
+
request.user = User.objects.get(pk=request.user.pk)
|
|
198
|
+
vs = mvs.as_view({"post": "create"})
|
|
199
|
+
response = vs(request, **kwargs)
|
|
200
|
+
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
|
|
201
|
+
|
|
202
|
+
@pytest.mark.parametrize(
|
|
203
|
+
"mvs, model, codename, is_allowed",
|
|
204
|
+
[
|
|
205
|
+
(ComplianceFormTypeViewSet, ComplianceFormType, "add_complianceformtype", False),
|
|
206
|
+
(ComplianceFormRuleViewSet, ComplianceFormRule, "add_complianceformrule", False),
|
|
207
|
+
(ComplianceFormSectionComplianceFormViewSet, ComplianceFormSection, "add_complianceformsection", False),
|
|
208
|
+
(ComplianceFormSectionRuleViewSet, ComplianceFormRule, "add_complianceformrule", False),
|
|
209
|
+
],
|
|
210
|
+
)
|
|
211
|
+
def test_get_create_endpoint_no_admin_section_rules(self, mvs, model, codename, is_allowed):
|
|
212
|
+
user = UserFactory(is_active=True)
|
|
213
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
214
|
+
obj = factory()
|
|
215
|
+
data = get_data_from_factory(obj, mvs, update=True, superuser=user)
|
|
216
|
+
request = APIRequestFactory().post("", data)
|
|
217
|
+
request.user = user
|
|
218
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
219
|
+
|
|
220
|
+
content_type = ContentType.objects.get_for_model(model)
|
|
221
|
+
permission = Permission.objects.get(
|
|
222
|
+
codename=codename,
|
|
223
|
+
content_type=content_type,
|
|
224
|
+
)
|
|
225
|
+
request.user.user_permissions.add(permission)
|
|
226
|
+
request.user.refresh_from_db()
|
|
227
|
+
request.user = User.objects.get(pk=request.user.pk)
|
|
228
|
+
|
|
229
|
+
vs = mvs.as_view({"post": "create"})
|
|
230
|
+
response = vs(request, **kwargs)
|
|
231
|
+
if is_allowed:
|
|
232
|
+
assert response.status_code == status.HTTP_201_CREATED
|
|
233
|
+
else:
|
|
234
|
+
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
|
|
235
|
+
|
|
236
|
+
@pytest.mark.parametrize("mvs", [ComplianceFormSignatureModelViewSet, CFComplianceFormSignatureModelViewSet])
|
|
237
|
+
def test_get_delete_endpoint_no_admin_compliance_form(self, mvs):
|
|
238
|
+
request = APIRequestFactory().delete("")
|
|
239
|
+
request.user = UserFactory(is_active=True)
|
|
240
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
241
|
+
obj = factory()
|
|
242
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
243
|
+
|
|
244
|
+
content_type = ContentType.objects.get_for_model(ComplianceFormSignature)
|
|
245
|
+
permission = Permission.objects.get(
|
|
246
|
+
codename="delete_complianceformsignature",
|
|
247
|
+
content_type=content_type,
|
|
248
|
+
)
|
|
249
|
+
request.user.user_permissions.add(permission)
|
|
250
|
+
request.user.refresh_from_db()
|
|
251
|
+
|
|
252
|
+
# request.user = User.objects.get(pk=request.user.pk)
|
|
253
|
+
vs = mvs.as_view({"delete": "destroy"})
|
|
254
|
+
response = vs(request, **kwargs, pk=obj.pk)
|
|
255
|
+
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
|
|
256
|
+
|
|
257
|
+
# TODO this should have never worked as Loic remove the delete endpoint excpliticlty, so the returned status code is 405 method not allowed and not 403.
|
|
258
|
+
|
|
259
|
+
@pytest.mark.parametrize(
|
|
260
|
+
"mvs, model, codename, is_allowed",
|
|
261
|
+
[
|
|
262
|
+
(ComplianceFormTypeViewSet, ComplianceFormType, "delete_complianceformtype", False),
|
|
263
|
+
(ComplianceFormRuleViewSet, ComplianceFormRule, "delete_complianceformrule", False),
|
|
264
|
+
(ComplianceFormSectionComplianceFormViewSet, ComplianceFormSection, "delete_complianceformsection", False),
|
|
265
|
+
(ComplianceFormSectionRuleViewSet, ComplianceFormRule, "delete_complianceformrule", False),
|
|
266
|
+
],
|
|
267
|
+
)
|
|
268
|
+
def test_get_delete_endpoint_no_admin_section_rules(self, mvs, model, codename, is_allowed):
|
|
269
|
+
request = APIRequestFactory().delete("")
|
|
270
|
+
request.user = UserFactory(is_active=True)
|
|
271
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
272
|
+
obj = factory()
|
|
273
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
274
|
+
|
|
275
|
+
content_type = ContentType.objects.get_for_model(model)
|
|
276
|
+
permission = Permission.objects.get(
|
|
277
|
+
codename=codename,
|
|
278
|
+
content_type=content_type,
|
|
279
|
+
)
|
|
280
|
+
request.user.user_permissions.add(permission)
|
|
281
|
+
request.user.refresh_from_db()
|
|
282
|
+
|
|
283
|
+
# request.user = User.objects.get(pk=request.user.pk)
|
|
284
|
+
vs = mvs.as_view({"delete": "destroy"})
|
|
285
|
+
response = vs(request, **kwargs, pk=obj.pk)
|
|
286
|
+
if is_allowed:
|
|
287
|
+
assert response.status_code == status.HTTP_204_NO_CONTENT
|
|
288
|
+
else:
|
|
289
|
+
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
|
|
290
|
+
|
|
291
|
+
@pytest.mark.parametrize(
|
|
292
|
+
"mvs, no_employee", [(ComplianceFormModelViewSet, True), (ComplianceFormModelViewSet, False)]
|
|
293
|
+
)
|
|
294
|
+
def test_sendcomplianceformnotification(self, mvs, no_employee, user):
|
|
295
|
+
request = APIRequestFactory().get("")
|
|
296
|
+
request.user = get_or_create_superuser()
|
|
297
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
298
|
+
obj = factory()
|
|
299
|
+
if not no_employee:
|
|
300
|
+
obj.assigned_to.add(user.groups.first())
|
|
301
|
+
obj.activationrequested()
|
|
302
|
+
obj.active()
|
|
303
|
+
|
|
304
|
+
response = mvs().sendcomplianceformnotification(request, pk=obj.pk)
|
|
305
|
+
assert response
|
|
306
|
+
assert response.data
|
|
307
|
+
|
|
308
|
+
@pytest.mark.parametrize("mvs", [ComplianceFormSignatureModelViewSet, CFComplianceFormSignatureModelViewSet])
|
|
309
|
+
def test_signature(self, mvs, user_factory):
|
|
310
|
+
request = APIRequestFactory().get("")
|
|
311
|
+
user = user_factory.create(is_superuser=False)
|
|
312
|
+
superuser = user_factory.create(is_superuser=True)
|
|
313
|
+
request.user = user
|
|
314
|
+
|
|
315
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
316
|
+
obj = factory(person=user.profile)
|
|
317
|
+
obj2 = factory(person=superuser.profile)
|
|
318
|
+
|
|
319
|
+
response = mvs().signature(request, pk=obj.pk)
|
|
320
|
+
response2 = mvs().signature(request, pk=obj2.pk)
|
|
321
|
+
assert response
|
|
322
|
+
assert response.data
|
|
323
|
+
assert response2.status_code == status.HTTP_403_FORBIDDEN
|
|
324
|
+
|
|
325
|
+
@pytest.mark.parametrize("mvs, changer", [(ComplianceFormModelViewSet, True), (ComplianceFormModelViewSet, False)])
|
|
326
|
+
def test_active_compliance_form_viewset_admin(self, mvs, changer):
|
|
327
|
+
request = APIRequestFactory().get("")
|
|
328
|
+
request.user = get_or_create_superuser()
|
|
329
|
+
factory = get_model_factory(mvs().get_serializer_class().Meta.model)
|
|
330
|
+
if changer:
|
|
331
|
+
obj = factory()
|
|
332
|
+
else:
|
|
333
|
+
obj = factory(changer=None)
|
|
334
|
+
obj.activationrequested()
|
|
335
|
+
obj.active()
|
|
336
|
+
kwargs = get_kwargs(obj, mvs, request)
|
|
337
|
+
vs = mvs.as_view({"get": "list"})
|
|
338
|
+
response = vs(request, **kwargs)
|
|
339
|
+
assert response.status_code == status.HTTP_200_OK
|
|
340
|
+
assert response.data
|
|
341
|
+
assert response.data.get("results")
|
|
342
|
+
|
|
343
|
+
@pytest.mark.parametrize("mvs", [ComplianceTaskMatrixPandasViewSet])
|
|
344
|
+
def test_PandasAPIView(self, mvs, compliance_task_factory, compliance_task_instance_factory):
|
|
345
|
+
request = APIRequestFactory().get("")
|
|
346
|
+
request.user = get_or_create_superuser()
|
|
347
|
+
|
|
348
|
+
compliance_task_instance_factory(task=compliance_task_factory())
|
|
349
|
+
# kwargs = get_kwargs(obj, mvs, request)
|
|
350
|
+
vs = mvs.as_view({"get": "list"})
|
|
351
|
+
response = vs(request)
|
|
352
|
+
assert response.status_code == status.HTTP_200_OK, str(response.status_code) + " == 200"
|
|
353
|
+
assert response.data, str(response.data) + " should not be empty"
|
|
354
|
+
assert response.data.get("results"), str(response.data.get("results")) + " should not be empty"
|
|
355
|
+
|
|
356
|
+
def test_queryset_filtering_for_user(self, user_factory, compliance_form_signature_factory):
|
|
357
|
+
request = APIRequestFactory().get("")
|
|
358
|
+
user = user_factory.create(is_superuser=False)
|
|
359
|
+
form_signature = compliance_form_signature_factory.create()
|
|
360
|
+
form_signature2 = compliance_form_signature_factory.create()
|
|
361
|
+
|
|
362
|
+
request.user = user
|
|
363
|
+
viewset = ComplianceFormSignatureModelViewSet(request=request)
|
|
364
|
+
queryset = viewset.get_queryset()
|
|
365
|
+
assert queryset.count() == 0
|
|
366
|
+
|
|
367
|
+
form_signature.person = user.profile
|
|
368
|
+
form_signature.save()
|
|
369
|
+
queryset = viewset.get_queryset()
|
|
370
|
+
assert set(queryset) == {form_signature}
|
|
371
|
+
|
|
372
|
+
user.is_superuser = True
|
|
373
|
+
user.save()
|
|
374
|
+
request.user = user
|
|
375
|
+
viewset = ComplianceFormSignatureModelViewSet(request=request)
|
|
376
|
+
queryset = viewset.get_queryset()
|
|
377
|
+
assert set(queryset) == {form_signature, form_signature2}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from wbcore.test import GenerateTest, default_config
|
|
3
|
+
|
|
4
|
+
config = {}
|
|
5
|
+
for key, value in default_config.items():
|
|
6
|
+
config[key] = list(
|
|
7
|
+
filter(
|
|
8
|
+
lambda x: x.__module__.startswith("wbcompliance")
|
|
9
|
+
and x.__name__
|
|
10
|
+
not in [
|
|
11
|
+
"RuleCheckedObjectRelationshipRiskRuleModelViewSet",
|
|
12
|
+
],
|
|
13
|
+
value,
|
|
14
|
+
)
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.mark.django_db
|
|
19
|
+
@GenerateTest(config)
|
|
20
|
+
class TestProject:
|
|
21
|
+
pass
|