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,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