wbcore 1.59.10__py2.py3-none-any.whl → 1.59.12__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.
- wbcore/configs/registry.py +15 -13
- wbcore/configs/views.py +2 -2
- wbcore/contrib/authentication/tests/test_configs.py +2 -2
- wbcore/contrib/authentication/viewsets/users.py +2 -2
- wbcore/contrib/directory/configurations.py +9 -10
- wbcore/contrib/directory/serializers/__init__.py +1 -0
- wbcore/contrib/directory/serializers/entries.py +49 -0
- wbcore/contrib/directory/tests/test_configs.py +2 -2
- wbcore/contrib/documents/serializers/documents.py +1 -0
- wbcore/contrib/documents/viewsets/display/documents.py +6 -15
- wbcore/contrib/gleap/tests/tests.py +2 -2
- wbcore/contrib/guardian/filters.py +6 -2
- wbcore/contrib/icons/icons.py +2 -3
- wbcore/contrib/io/import_export/parsers/resources.py +2 -2
- wbcore/contrib/io/models.py +10 -4
- wbcore/contrib/io/resources.py +2 -2
- wbcore/contrib/notifications/tests/test_configs.py +2 -2
- wbcore/contrib/workflow/tests/test_configs.py +2 -2
- wbcore/metadata/configs/buttons/view_config.py +7 -2
- wbcore/permissions/registry.py +2 -2
- wbcore/tests/conftest.py +4 -2
- wbcore/tests/test_configs.py +12 -12
- wbcore/utils/importlib.py +0 -9
- {wbcore-1.59.10.dist-info → wbcore-1.59.12.dist-info}/METADATA +1 -1
- {wbcore-1.59.10.dist-info → wbcore-1.59.12.dist-info}/RECORD +26 -26
- {wbcore-1.59.10.dist-info → wbcore-1.59.12.dist-info}/WHEEL +0 -0
wbcore/configs/registry.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from contextlib import suppress
|
|
2
2
|
from importlib import import_module
|
|
3
3
|
from inspect import getmembers
|
|
4
|
-
from types import ModuleType
|
|
5
4
|
from typing import Any, Iterable
|
|
6
5
|
|
|
7
6
|
from django.conf import settings
|
|
@@ -15,21 +14,24 @@ class ConfigRegistry:
|
|
|
15
14
|
in the APIView of this module.
|
|
16
15
|
"""
|
|
17
16
|
|
|
18
|
-
def __init__(self,
|
|
19
|
-
self.
|
|
20
|
-
|
|
17
|
+
def __init__(self, *args, **kwargs):
|
|
18
|
+
self.config_members = []
|
|
19
|
+
self._load_configs()
|
|
21
20
|
|
|
22
|
-
def
|
|
21
|
+
def _load_configs(self):
|
|
23
22
|
for app in settings.INSTALLED_APPS:
|
|
24
23
|
with suppress(ModuleNotFoundError):
|
|
25
24
|
module = import_module(f"{app}.configs")
|
|
26
|
-
|
|
25
|
+
for member in getmembers(module, lambda member: hasattr(member, "_is_config")):
|
|
26
|
+
self.config_members.append(member[1])
|
|
27
27
|
|
|
28
|
-
def get_configs(self) -> Iterable[tuple[str, Any]]:
|
|
29
|
-
for
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
yield res
|
|
28
|
+
def get_configs(self, request: Request) -> Iterable[tuple[str, Any]]:
|
|
29
|
+
for member in self.config_members:
|
|
30
|
+
if res := member(request=request):
|
|
31
|
+
yield res
|
|
33
32
|
|
|
34
|
-
def get_config_dict(self) -> dict[str, Any]:
|
|
35
|
-
return dict(self.get_configs())
|
|
33
|
+
def get_config_dict(self, request: Request) -> dict[str, Any]:
|
|
34
|
+
return dict(self.get_configs(request))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
config_registry = ConfigRegistry()
|
wbcore/configs/views.py
CHANGED
|
@@ -2,11 +2,11 @@ from rest_framework.request import Request
|
|
|
2
2
|
from rest_framework.response import Response
|
|
3
3
|
from rest_framework.views import APIView
|
|
4
4
|
|
|
5
|
-
from wbcore.configs.registry import
|
|
5
|
+
from wbcore.configs.registry import config_registry
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class ConfigAPIView(APIView):
|
|
9
9
|
permission_classes = []
|
|
10
10
|
|
|
11
11
|
def get(self, request: Request) -> Response:
|
|
12
|
-
return Response(
|
|
12
|
+
return Response(config_registry.get_config_dict(request))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from wbcore.configs.registry import ConfigRegistry
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def test_authentication_config(config_registry: ConfigRegistry):
|
|
5
|
-
authentication = config_registry.get_config_dict()["authentication"]
|
|
4
|
+
def test_authentication_config(config_registry: ConfigRegistry, api_request):
|
|
5
|
+
authentication = config_registry.get_config_dict(api_request)["authentication"]
|
|
6
6
|
assert authentication
|
|
@@ -72,7 +72,7 @@ def reset_password_email(request):
|
|
|
72
72
|
try:
|
|
73
73
|
user.reset_password(request)
|
|
74
74
|
except Exception as e:
|
|
75
|
-
logger.error(
|
|
75
|
+
logger.error("While user try to reset password, we encounter the error", extra={"user": user, "detail": e})
|
|
76
76
|
return Response(
|
|
77
77
|
{
|
|
78
78
|
"status": "ok",
|
|
@@ -122,7 +122,7 @@ def register_user(request):
|
|
|
122
122
|
query_params["error_redirect_url"] = error_redirect_url
|
|
123
123
|
|
|
124
124
|
token = user.generate_temporary_token()
|
|
125
|
-
url = f
|
|
125
|
+
url = f"{reverse('wbcore:authentication:activate', args=[user.uuid, token], request=request)}?{urlencode(query_params)}"
|
|
126
126
|
|
|
127
127
|
# Construct registration mail and send
|
|
128
128
|
rendered_message = render_to_string("user_registration_email.html", {"user": user, "url": url})
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
from django.utils.module_loading import import_string
|
|
1
2
|
from django.utils.translation import gettext_lazy
|
|
2
3
|
from rest_framework.reverse import reverse
|
|
3
4
|
|
|
4
|
-
from wbcore.utils.importlib import import_from_dotted_path
|
|
5
|
-
|
|
6
5
|
|
|
7
6
|
class ConfigurationRegistry:
|
|
8
7
|
DEFAULT_COMPANY_MODEL_VIEWSET = "wbcore.contrib.directory.viewsets.entries.CompanyModelViewSet"
|
|
@@ -20,35 +19,35 @@ class ConfigurationRegistry:
|
|
|
20
19
|
|
|
21
20
|
@property
|
|
22
21
|
def company_model_viewset(self):
|
|
23
|
-
return
|
|
22
|
+
return import_string(self.DEFAULT_COMPANY_MODEL_VIEWSET)
|
|
24
23
|
|
|
25
24
|
@property
|
|
26
25
|
def company_representation_viewset(self):
|
|
27
|
-
return
|
|
26
|
+
return import_string(self.DEFAULT_COMPANY_REPRESENTATION_VIEWSET)
|
|
28
27
|
|
|
29
28
|
@property
|
|
30
29
|
def company_model_serializer(self):
|
|
31
|
-
return
|
|
30
|
+
return import_string(self.DEFAULT_COMPANY_MODEL_SERIALIZER)
|
|
32
31
|
|
|
33
32
|
@property
|
|
34
33
|
def company_representation_serializer(self):
|
|
35
|
-
return
|
|
34
|
+
return import_string(self.DEFAULT_COMPANY_REPRESENTATION_SERIALIZER)
|
|
36
35
|
|
|
37
36
|
@property
|
|
38
37
|
def person_model_viewset(self):
|
|
39
|
-
return
|
|
38
|
+
return import_string(self.DEFAULT_PERSON_MODEL_VIEWSET)
|
|
40
39
|
|
|
41
40
|
@property
|
|
42
41
|
def person_representation_viewset(self):
|
|
43
|
-
return
|
|
42
|
+
return import_string(self.DEFAULT_PERSON_REPRESENTATION_VIEWSET)
|
|
44
43
|
|
|
45
44
|
@property
|
|
46
45
|
def person_model_serializer(self):
|
|
47
|
-
return
|
|
46
|
+
return import_string(self.DEFAULT_PERSON_MODEL_SERIALIZER)
|
|
48
47
|
|
|
49
48
|
@property
|
|
50
49
|
def person_representation_serializer(self):
|
|
51
|
-
return
|
|
50
|
+
return import_string(self.DEFAULT_PERSON_REPRESENTATION_SERIALIZER)
|
|
52
51
|
|
|
53
52
|
|
|
54
53
|
class DirectoryConfigurationMixin:
|
|
@@ -36,6 +36,7 @@ from .entries import (
|
|
|
36
36
|
EntryRepresentationSerializer,
|
|
37
37
|
InternalUserProfileRepresentationSerializer,
|
|
38
38
|
PersonRepresentationSerializer,
|
|
39
|
+
FullDetailPersonRepresentationSerializer,
|
|
39
40
|
SpecializationModelSerializer,
|
|
40
41
|
SpecializationRepresentationSerializer,
|
|
41
42
|
)
|
|
@@ -16,6 +16,7 @@ from ..models import (
|
|
|
16
16
|
CompanyType,
|
|
17
17
|
CustomerStatus,
|
|
18
18
|
EmailContact,
|
|
19
|
+
EmployerEmployeeRelationship,
|
|
19
20
|
Entry,
|
|
20
21
|
Person,
|
|
21
22
|
Specialization,
|
|
@@ -63,6 +64,54 @@ class PersonRepresentationSerializer(EntryRepresentationSerializer):
|
|
|
63
64
|
)
|
|
64
65
|
|
|
65
66
|
|
|
67
|
+
class FullDetailPersonRepresentationSerializer(PersonRepresentationSerializer):
|
|
68
|
+
primary_email = wb_serializers.SerializerMethodField(
|
|
69
|
+
read_only=True, required=False, label=_("Primary Email"), allow_null=True
|
|
70
|
+
)
|
|
71
|
+
primary_telephone = wb_serializers.SerializerMethodField(
|
|
72
|
+
read_only=True, required=False, label=_("Primary Telephone"), allow_null=True
|
|
73
|
+
)
|
|
74
|
+
primary_position = wb_serializers.SerializerMethodField(
|
|
75
|
+
read_only=True, required=False, label=_("Primary Position"), allow_null=True
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def get_primary_email(self, person):
|
|
79
|
+
try:
|
|
80
|
+
return EmailContact.objects.get(entry_id=person.id, primary=True).address
|
|
81
|
+
except EmailContact.DoesNotExist:
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
def get_primary_telephone(self, person):
|
|
85
|
+
try:
|
|
86
|
+
return TelephoneContact.objects.get(entry_id=person.id, primary=True).number
|
|
87
|
+
except TelephoneContact.DoesNotExist:
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
def get_primary_position(self, person):
|
|
91
|
+
try:
|
|
92
|
+
rel = EmployerEmployeeRelationship.objects.get(employee_id=person.id, primary=True)
|
|
93
|
+
return rel.position.title if rel.position else rel.position_name
|
|
94
|
+
except EmployerEmployeeRelationship.DoesNotExist:
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
class Meta:
|
|
98
|
+
model = Person
|
|
99
|
+
fields = (
|
|
100
|
+
"id",
|
|
101
|
+
"computed_str",
|
|
102
|
+
"first_name",
|
|
103
|
+
"last_name",
|
|
104
|
+
"primary_email",
|
|
105
|
+
"primary_telephone",
|
|
106
|
+
"primary_position",
|
|
107
|
+
"profile_image",
|
|
108
|
+
"description",
|
|
109
|
+
"_detail",
|
|
110
|
+
"_detail_preview",
|
|
111
|
+
"_additional_resources",
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
66
115
|
class InternalUserProfileRepresentationSerializer(PersonRepresentationSerializer):
|
|
67
116
|
def get_filter_params(self, request):
|
|
68
117
|
return {"only_internal_users": True}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from wbcore.configs.registry import ConfigRegistry
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def test_profile_config(config_registry: ConfigRegistry):
|
|
5
|
-
profile = config_registry.get_config_dict()["profile"]
|
|
4
|
+
def test_profile_config(config_registry: ConfigRegistry, api_request):
|
|
5
|
+
profile = config_registry.get_config_dict(api_request)["profile"]
|
|
6
6
|
assert profile
|
|
@@ -15,6 +15,7 @@ class DocumentModelDisplay(DisplayViewConfig):
|
|
|
15
15
|
fields=[
|
|
16
16
|
dp.Field(key="name", label=_("Name")),
|
|
17
17
|
dp.Field(key="document_type", label=_("Type")),
|
|
18
|
+
dp.Field(key="permission_type", label=_("Permission")),
|
|
18
19
|
dp.Field(key="valid_from", label=_("Valid From")),
|
|
19
20
|
dp.Field(key="valid_until", label=_("Valid Until")),
|
|
20
21
|
dp.Field(key="updated", label=_("Updated")),
|
|
@@ -52,27 +53,17 @@ class DocumentModelDisplay(DisplayViewConfig):
|
|
|
52
53
|
layouts={
|
|
53
54
|
dp.default(): dp.Layout(
|
|
54
55
|
grid_template_areas=[
|
|
55
|
-
["file", "file", "file"
|
|
56
|
-
["name", "
|
|
57
|
-
["created", "
|
|
56
|
+
["file", "file", "file"],
|
|
57
|
+
["name", "document_type", "permission_type"],
|
|
58
|
+
["created", "updated", "system_created"],
|
|
59
|
+
["valid_from", "valid_until", "."],
|
|
58
60
|
[
|
|
59
|
-
"valid_from",
|
|
60
|
-
"valid_from",
|
|
61
|
-
"valid_from",
|
|
62
|
-
"valid_until",
|
|
63
|
-
"valid_until",
|
|
64
|
-
"valid_until",
|
|
65
|
-
],
|
|
66
|
-
[
|
|
67
|
-
"description",
|
|
68
|
-
"description",
|
|
69
|
-
"description",
|
|
70
61
|
"description",
|
|
71
62
|
"description",
|
|
72
63
|
"description",
|
|
73
64
|
],
|
|
74
65
|
],
|
|
75
|
-
grid_template_columns=[dp.repeat_field(
|
|
66
|
+
grid_template_columns=[dp.repeat_field(3, "1fr")],
|
|
76
67
|
)
|
|
77
68
|
},
|
|
78
69
|
),
|
|
@@ -23,7 +23,7 @@ def test_different_secret():
|
|
|
23
23
|
assert hash1 != hash2
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def test_gleap_config(config_registry: ConfigRegistry):
|
|
27
|
-
gleap = config_registry.get_config_dict()["gleap"]
|
|
26
|
+
def test_gleap_config(config_registry: ConfigRegistry, api_request):
|
|
27
|
+
gleap = config_registry.get_config_dict(api_request)["gleap"]
|
|
28
28
|
assert gleap["user_identity_endpoint"]
|
|
29
29
|
assert gleap["api_token"]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from django.db.models import Q
|
|
1
2
|
from rest_framework.filters import BaseFilterBackend
|
|
2
3
|
|
|
3
4
|
|
|
@@ -14,8 +15,11 @@ class ObjectPermissionsFilter(BaseFilterBackend):
|
|
|
14
15
|
model_class = queryset.model
|
|
15
16
|
if issubclass(model_class, PermissionObjectModelMixin):
|
|
16
17
|
user = request.user
|
|
17
|
-
|
|
18
|
-
return get_objects_for_user(
|
|
18
|
+
protected_objects = get_objects_for_user(
|
|
19
19
|
user, [model_class.view_perm_str], queryset, **model_class.guardian_shortcut_kwargs
|
|
20
20
|
)
|
|
21
|
+
public_objects = queryset.filter(permission_type=PermissionObjectModelMixin.PermissionType.PUBLIC)
|
|
22
|
+
return queryset.filter(
|
|
23
|
+
Q(id__in=public_objects.values("id")) | Q(id__in=protected_objects.values("id"))
|
|
24
|
+
).distinct()
|
|
21
25
|
return queryset
|
wbcore/contrib/icons/icons.py
CHANGED
|
@@ -5,8 +5,7 @@ from types import DynamicClassAttribute
|
|
|
5
5
|
from django.conf import settings
|
|
6
6
|
from django.db.models import TextChoices
|
|
7
7
|
from django.db.models.enums import ChoicesType
|
|
8
|
-
|
|
9
|
-
from wbcore.utils.importlib import import_from_dotted_path
|
|
8
|
+
from django.utils.module_loading import import_string
|
|
10
9
|
|
|
11
10
|
DEFAULT_ICON_BACKEND = "wbcore.contrib.icons.backends.material.IconBackend"
|
|
12
11
|
FALLBACK_ICON_VALUE = "FALLBACK_ICON"
|
|
@@ -21,7 +20,7 @@ class WBIconMeta(ChoicesType):
|
|
|
21
20
|
) # add a default member that represent the fallback in case it's not yet implement in the imported backend
|
|
22
21
|
cls = super().__new__(cls, classname, bases, classdict, **kwds)
|
|
23
22
|
with suppress(ModuleNotFoundError):
|
|
24
|
-
cls.icon_backend =
|
|
23
|
+
cls.icon_backend = import_string(getattr(settings, "WBCORE_ICON_BACKEND", DEFAULT_ICON_BACKEND))
|
|
25
24
|
icon_backend = cls.icon_backend
|
|
26
25
|
# For each enumeration values, attached an "icon" property to its members
|
|
27
26
|
for member, value in zip(cls.__members__.values(), cls.values, strict=False):
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import magic
|
|
2
2
|
from django.apps import apps
|
|
3
3
|
from django.conf import settings
|
|
4
|
+
from django.utils.module_loading import import_string
|
|
4
5
|
from import_export.formats.base_formats import CSV
|
|
5
6
|
from import_export.results import RowResult
|
|
6
7
|
from import_export.signals import post_import
|
|
7
|
-
from wbcore.utils.importlib import import_from_dotted_path
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
def default_import_parse(import_source):
|
|
11
11
|
resource_path = import_source.resource_kwargs["resource_path"]
|
|
12
12
|
resource_kwargs = import_source.resource_kwargs["resource_kwargs"]
|
|
13
|
-
resource_class =
|
|
13
|
+
resource_class = import_string(resource_path)
|
|
14
14
|
resource = resource_class(**resource_kwargs)
|
|
15
15
|
input_format = CSV(encoding="utf-8-sig")
|
|
16
16
|
|
wbcore/contrib/io/models.py
CHANGED
|
@@ -28,6 +28,7 @@ from django.db.utils import IntegrityError
|
|
|
28
28
|
from django.dispatch import receiver
|
|
29
29
|
from django.utils import timezone
|
|
30
30
|
from django.utils.functional import cached_property
|
|
31
|
+
from django.utils.module_loading import import_string
|
|
31
32
|
from django.utils.translation import gettext_lazy as _
|
|
32
33
|
from django_celery_beat.models import CrontabSchedule, PeriodicTask, cronexp
|
|
33
34
|
from import_export.resources import Resource
|
|
@@ -37,7 +38,6 @@ from tqdm import tqdm
|
|
|
37
38
|
|
|
38
39
|
from wbcore.contrib.notifications.dispatch import send_notification
|
|
39
40
|
from wbcore.contrib.notifications.utils import create_notification_type
|
|
40
|
-
from wbcore.utils.importlib import import_from_dotted_path
|
|
41
41
|
from wbcore.utils.models import ComplexToStringMixin
|
|
42
42
|
|
|
43
43
|
from ...workers import Queue
|
|
@@ -734,7 +734,7 @@ class ExportSource(ImportExportSource):
|
|
|
734
734
|
"""
|
|
735
735
|
Load into an attribute the instantiated resource loaded from the resource path
|
|
736
736
|
"""
|
|
737
|
-
resource_class =
|
|
737
|
+
resource_class = import_string(self.resource_path)
|
|
738
738
|
return resource_class(**self.resource_kwargs)
|
|
739
739
|
|
|
740
740
|
@property
|
|
@@ -802,7 +802,10 @@ class ExportSource(ImportExportSource):
|
|
|
802
802
|
self.log = f"{ex_type}: {ex_value}\n"
|
|
803
803
|
self.log += traceback.format_exc()
|
|
804
804
|
self.save()
|
|
805
|
-
logger.error(
|
|
805
|
+
logger.error(
|
|
806
|
+
"Data source export failed: Processing error during file generation.",
|
|
807
|
+
extra={"export_source": self, "parser_handler": self.parser_handler, "detail": e},
|
|
808
|
+
)
|
|
806
809
|
|
|
807
810
|
|
|
808
811
|
class ImportSource(ImportExportSource):
|
|
@@ -908,7 +911,10 @@ class ImportSource(ImportExportSource):
|
|
|
908
911
|
if debug:
|
|
909
912
|
raise e
|
|
910
913
|
elif not self.creator: # if a creator is set in this import source, they will receive a proper notification with feedback. No need then to pollute the logger
|
|
911
|
-
logger.error(
|
|
914
|
+
logger.error(
|
|
915
|
+
"Data import failed: Processing error during file parsing and handling.",
|
|
916
|
+
extra={"import_source": self, "parser_handler": self.parser_handler, "detail": e},
|
|
917
|
+
)
|
|
912
918
|
|
|
913
919
|
self.notify()
|
|
914
920
|
|
wbcore/contrib/io/resources.py
CHANGED
|
@@ -4,11 +4,11 @@ from inspect import isfunction
|
|
|
4
4
|
|
|
5
5
|
import tablib
|
|
6
6
|
from django.template import Context, Template
|
|
7
|
+
from django.utils.module_loading import import_string
|
|
7
8
|
from import_export import resources
|
|
8
9
|
|
|
9
10
|
from wbcore.serializers import ListSerializer
|
|
10
11
|
from wbcore.serializers.fields.related import ListSerializer as RelatedListSerializer
|
|
11
|
-
from wbcore.utils.importlib import import_from_dotted_path
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class ExportResourceMixin:
|
|
@@ -84,7 +84,7 @@ class ViewResource(ExportResourceMixin, resources.Resource):
|
|
|
84
84
|
super().__init__(**kwargs)
|
|
85
85
|
# in that case, serializer_class is lazy loaded,
|
|
86
86
|
if serializer_class_path:
|
|
87
|
-
serializer_class =
|
|
87
|
+
serializer_class = import_string(serializer_class_path)
|
|
88
88
|
if isfunction(serializer_class):
|
|
89
89
|
serializer_class = serializer_class(*serializer_class_method_args)
|
|
90
90
|
if not serializer_class:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from wbcore.configs.registry import ConfigRegistry
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def test_notifications_config(config_registry: ConfigRegistry):
|
|
5
|
-
notifications = config_registry.get_config_dict()["notifications"]
|
|
4
|
+
def test_notifications_config(config_registry: ConfigRegistry, api_request):
|
|
5
|
+
notifications = config_registry.get_config_dict(api_request)["notifications"]
|
|
6
6
|
assert notifications["endpoint"]
|
|
7
7
|
assert notifications["token"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from wbcore.configs.registry import ConfigRegistry
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def test_workflow_config(config_registry: ConfigRegistry):
|
|
5
|
-
workflow = config_registry.get_config_dict()["workflow"]
|
|
4
|
+
def test_workflow_config(config_registry: ConfigRegistry, api_request):
|
|
5
|
+
workflow = config_registry.get_config_dict(api_request)["workflow"]
|
|
6
6
|
assert workflow["endpoint"]
|
|
@@ -69,12 +69,17 @@ class ButtonViewConfig(WBCoreViewConfig):
|
|
|
69
69
|
return getattr(self.view, "FSM_BUTTONS", set())
|
|
70
70
|
|
|
71
71
|
# Create Button Configuration
|
|
72
|
-
CREATE_BUTTONS = frozenset(
|
|
72
|
+
CREATE_BUTTONS = frozenset(
|
|
73
|
+
{
|
|
74
|
+
Button.SAVE.value,
|
|
75
|
+
Button.SAVE_AND_CLOSE.value,
|
|
76
|
+
Button.SAVE_AND_NEW.value,
|
|
77
|
+
}
|
|
78
|
+
)
|
|
73
79
|
CREATE_BUTTONS_ORDERING = [
|
|
74
80
|
Button.SAVE.value,
|
|
75
81
|
Button.SAVE_AND_CLOSE.value,
|
|
76
82
|
Button.SAVE_AND_NEW.value,
|
|
77
|
-
Button.RESET.value,
|
|
78
83
|
]
|
|
79
84
|
|
|
80
85
|
def get_create_buttons(self) -> Iterable:
|
wbcore/permissions/registry.py
CHANGED
|
@@ -4,15 +4,15 @@ from django.conf import settings
|
|
|
4
4
|
from django.contrib.auth.models import Group
|
|
5
5
|
from django.db.models import QuerySet
|
|
6
6
|
from django.utils.functional import cached_property
|
|
7
|
+
from django.utils.module_loading import import_string
|
|
7
8
|
|
|
8
9
|
from wbcore.contrib.authentication.models import User
|
|
9
|
-
from wbcore.utils.importlib import import_from_dotted_path
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class UserBackendRegistry:
|
|
13
13
|
def __init__(self):
|
|
14
14
|
internal_users_backend_path = getattr(settings, "USER_BACKEND", "wbcore.permissions.backend.UserBackend")
|
|
15
|
-
internal_users_backend_class =
|
|
15
|
+
internal_users_backend_class = import_string(internal_users_backend_path)
|
|
16
16
|
self.backend = internal_users_backend_class()
|
|
17
17
|
|
|
18
18
|
@cached_property
|
wbcore/tests/conftest.py
CHANGED
|
@@ -43,10 +43,12 @@ pre_migrate.connect(app_pre_migration)
|
|
|
43
43
|
|
|
44
44
|
@pytest.fixture()
|
|
45
45
|
def config_registry():
|
|
46
|
-
|
|
47
|
-
registry = ConfigRegistry(request)
|
|
46
|
+
registry = ConfigRegistry()
|
|
48
47
|
return registry
|
|
49
48
|
|
|
49
|
+
@pytest.fixture()
|
|
50
|
+
def api_request():
|
|
51
|
+
return APIRequestFactory().get("/")
|
|
50
52
|
|
|
51
53
|
@pytest.fixture
|
|
52
54
|
def chrome_options(chrome_options):
|
wbcore/tests/test_configs.py
CHANGED
|
@@ -6,37 +6,37 @@ from wbcore.configs.registry import ConfigRegistry
|
|
|
6
6
|
from wbcore.configs.views import ConfigAPIView
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def test_registry(config_registry: ConfigRegistry):
|
|
10
|
-
configs = config_registry.get_config_dict()
|
|
9
|
+
def test_registry(config_registry: ConfigRegistry, api_request):
|
|
10
|
+
configs = config_registry.get_config_dict(api_request)
|
|
11
11
|
assert configs.keys()
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def test_release_note_config(config_registry: ConfigRegistry):
|
|
15
|
-
release_notes = config_registry.get_config_dict()["release_notes"]
|
|
14
|
+
def test_release_note_config(config_registry: ConfigRegistry, api_request):
|
|
15
|
+
release_notes = config_registry.get_config_dict(api_request)["release_notes"]
|
|
16
16
|
assert release_notes["endpoint"]
|
|
17
17
|
assert release_notes["unread_release_notes"]
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
def test_menu_config(config_registry: ConfigRegistry):
|
|
21
|
-
menu = config_registry.get_config_dict()["menu"]
|
|
20
|
+
def test_menu_config(config_registry: ConfigRegistry, api_request):
|
|
21
|
+
menu = config_registry.get_config_dict(api_request)["menu"]
|
|
22
22
|
assert menu
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def test_share_config(config_registry: ConfigRegistry):
|
|
26
|
-
share = config_registry.get_config_dict()["share"]
|
|
25
|
+
def test_share_config(config_registry: ConfigRegistry, api_request):
|
|
26
|
+
share = config_registry.get_config_dict(api_request)["share"]
|
|
27
27
|
assert share
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
def test_menu_calendar_config(config_registry: ConfigRegistry):
|
|
31
|
-
menu_calendar = config_registry.get_config_dict()["menu_calendar"]
|
|
30
|
+
def test_menu_calendar_config(config_registry: ConfigRegistry, api_request):
|
|
31
|
+
menu_calendar = config_registry.get_config_dict(api_request)["menu_calendar"]
|
|
32
32
|
assert menu_calendar
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
@pytest.mark.parametrize("text, version", [("Foo bar", "Foo")])
|
|
36
|
-
def test_beta_button_config(config_registry: ConfigRegistry, text, version):
|
|
36
|
+
def test_beta_button_config(config_registry: ConfigRegistry, text, version, api_request):
|
|
37
37
|
settings.BETA_BUTTON_VERSION = version
|
|
38
38
|
settings.BETA_BUTTON_TEXT = text
|
|
39
|
-
beta_calendar = config_registry.get_config_dict()["beta_button"]
|
|
39
|
+
beta_calendar = config_registry.get_config_dict(api_request)["beta_button"]
|
|
40
40
|
assert beta_calendar["url"] == f"{settings.CDN_BASE_ENDPOINT_URL}/{version}/main.js"
|
|
41
41
|
assert beta_calendar["text"] == text
|
|
42
42
|
|
wbcore/utils/importlib.py
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
from importlib import import_module
|
|
2
|
-
from typing import Callable, Type, Union
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
def import_from_dotted_path(path: str) -> Union[Type, Callable]:
|
|
6
|
-
*module_path, name = path.split(".")
|
|
7
|
-
return getattr(import_module(".".join(module_path)), name)
|
|
8
|
-
|
|
9
|
-
|
|
10
1
|
def parse_signal_received_for_module(receiver_response) -> tuple[str, any]:
|
|
11
2
|
for receiver, response in receiver_response:
|
|
12
3
|
if response:
|
|
@@ -24,8 +24,8 @@ wbcore/cache/views.py,sha256=Ehwglwlug2Z4285BPvTE5623sCAlHrDD3np1oZkw_gc,630
|
|
|
24
24
|
wbcore/configs/__init__.py,sha256=icE1l0NI-0vGErpIyCUx48l-Fys4OCJxK0Wi781Wdek,238
|
|
25
25
|
wbcore/configs/configs.py,sha256=QDgKfNUMFfVYXBvmh_yk_2oFikmAspiSKxuhjePAyd0,1882
|
|
26
26
|
wbcore/configs/decorators.py,sha256=5kdwENMaiw6rzjqTj-D7ezx-9gj2FVg1P5NsFrO-fnc,387
|
|
27
|
-
wbcore/configs/registry.py,sha256=
|
|
28
|
-
wbcore/configs/views.py,sha256=
|
|
27
|
+
wbcore/configs/registry.py,sha256=9WM_CUSgItFAE5sno5ssEH6qrmyyhX2wZz3SNWB__Ds,1295
|
|
28
|
+
wbcore/configs/views.py,sha256=QVmgyeB4pFZMmtkzv-JlRmyT-b6OwuUVuKOKMXxpOL4,358
|
|
29
29
|
wbcore/configurations/__init__.py,sha256=H-vQTsjryzvwQ7FN4kGLywoGFV_VrPkbuNV4VRx1WHU,68
|
|
30
30
|
wbcore/configurations/base.py,sha256=woxAbHfAU6vMHu6oZp5eDJB97j-PjUVkA6UdItXNc8Q,1550
|
|
31
31
|
wbcore/configurations/configurations/__init__.py,sha256=mni_MM6rOHK1YwOC9i4xlrITumInHJuKCngc4k-pdpo,574
|
|
@@ -172,7 +172,7 @@ wbcore/contrib/authentication/templates/user_registration_email.html,sha256=_hmZ
|
|
|
172
172
|
wbcore/contrib/authentication/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
173
173
|
wbcore/contrib/authentication/tests/conftest.py,sha256=_Ib93zJ2oygjPME_v38N8v_2P0geVGgvLLJgQ7JDQ7Y,485
|
|
174
174
|
wbcore/contrib/authentication/tests/signals.py,sha256=3Vrb_z4u_XMI-pfcGAbO4aBwhUdu7MPfPZDe07iqiAg,571
|
|
175
|
-
wbcore/contrib/authentication/tests/test_configs.py,sha256=
|
|
175
|
+
wbcore/contrib/authentication/tests/test_configs.py,sha256=BX2u3r2lbfMMvKo8JpaaNYLJslOPzhsezXy64pQdTO4,241
|
|
176
176
|
wbcore/contrib/authentication/tests/test_serializers.py,sha256=yiF6x5IRbWKwndlZkVlFwQd-zCebAJVbqmfDbpI87dE,79
|
|
177
177
|
wbcore/contrib/authentication/tests/test_tasks.py,sha256=yiqt4U2yxh2uslu0l-nA2Zldoh-yjG5LYeg2jUWKu00,1355
|
|
178
178
|
wbcore/contrib/authentication/tests/test_tokens.py,sha256=MtLW2BDElaWFpiZIRmDc_MTLd3TedjJcjOR6G1DYNbE,6129
|
|
@@ -183,7 +183,7 @@ wbcore/contrib/authentication/tests/e2e/__init__.py,sha256=0QhVTsjMlR1BTGlRiaO5i
|
|
|
183
183
|
wbcore/contrib/authentication/tests/e2e/e2e_auth_utility.py,sha256=DNCAiaLGVZ964oGmdp1CYc1oU2AEDZdA_W1kLZv5Zn0,564
|
|
184
184
|
wbcore/contrib/authentication/viewsets/__init__.py,sha256=Kvt5ikqkg0_4P-DXvRBOpfQcUMHwDIE7vyGpGQ5uSbg,479
|
|
185
185
|
wbcore/contrib/authentication/viewsets/user_activities.py,sha256=aJVtAnVYdbhc8iPOIMHcVripDJ2s0lU1lTQWSX_IyrI,8324
|
|
186
|
-
wbcore/contrib/authentication/viewsets/users.py,sha256=
|
|
186
|
+
wbcore/contrib/authentication/viewsets/users.py,sha256=PG0tmCQXq6UaTq8OaSl8GAKEaYGPslrddjZllh4a7uU,12465
|
|
187
187
|
wbcore/contrib/authentication/viewsets/buttons/__init__.py,sha256=H2DLTgMil7mRmj-NtnBfJa-DrbMxT4lv8GbZNhe_76w,66
|
|
188
188
|
wbcore/contrib/authentication/viewsets/buttons/users.py,sha256=OHtuM4M-Um85-bXXnKNA0PZQEZVB51BCiXsoOjfFLIs,2359
|
|
189
189
|
wbcore/contrib/authentication/viewsets/display/__init__.py,sha256=iOKARtlVqcaMB80CZqFpCPbyjz4bKaOdjYqEmGYlIBs,222
|
|
@@ -282,7 +282,7 @@ wbcore/contrib/dataloader/tests/test/dataloaders/proxies.py,sha256=AL7CunsWJW8G7
|
|
|
282
282
|
wbcore/contrib/directory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
283
283
|
wbcore/contrib/directory/apps.py,sha256=X-Cl9KtrSMSQIl4gejtQmjDX56BOCHS6K8qZLKqXu9I,165
|
|
284
284
|
wbcore/contrib/directory/configs.py,sha256=wFGQi3WO2L_xfeQ0MG8FxVaozR9vBAvISHjedlHw6fs,282
|
|
285
|
-
wbcore/contrib/directory/configurations.py,sha256=
|
|
285
|
+
wbcore/contrib/directory/configurations.py,sha256=SwcphDsxt8vz9UTqMVMJe-ORnxAo2viupwv3-6uJiGQ,2715
|
|
286
286
|
wbcore/contrib/directory/dynamic_preferences_registry.py,sha256=ejEzrt-gqmvI3q1NbndsUtbfpeLC7tzKiGrhVtwY4w0,2098
|
|
287
287
|
wbcore/contrib/directory/permissions.py,sha256=3i1n4AzGzHAx0L0H00KZKd4AHo90OHRdYk34opPYIjo,248
|
|
288
288
|
wbcore/contrib/directory/preferences.py,sha256=B6J1Y5jqEPW6VrnbuxdA9Sq94XFdrwP68wnBdYoaRjs,423
|
|
@@ -328,10 +328,10 @@ wbcore/contrib/directory/models/relationships.py,sha256=7SZFo1tA7NRzS7_gv_fKwMsP
|
|
|
328
328
|
wbcore/contrib/directory/release_notes/1_0_0.md,sha256=Twbl9RMLO6dbbm5dVoKorw8BecRqAYsKeobcNmDWHu8,165
|
|
329
329
|
wbcore/contrib/directory/release_notes/1_0_1.md,sha256=yHolV-HwBmIavaPn9pg0ABRgxQ-eKIuiAs-phKb_ix0,285
|
|
330
330
|
wbcore/contrib/directory/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
331
|
-
wbcore/contrib/directory/serializers/__init__.py,sha256=
|
|
331
|
+
wbcore/contrib/directory/serializers/__init__.py,sha256=kLr-KkhQ3sd0rSE0vRWP6Za31KWoMrTiebpYKGhkdmY,2177
|
|
332
332
|
wbcore/contrib/directory/serializers/companies.py,sha256=Bvxex_tq5lyR3k9Ox_Z2AnRQVyhPM0l1bdClJAjeEdo,5747
|
|
333
333
|
wbcore/contrib/directory/serializers/contacts.py,sha256=Q-3lmivmS4ci9XP-65lO1d06Gm6cQMgPH3YA8FY71ZE,15205
|
|
334
|
-
wbcore/contrib/directory/serializers/entries.py,sha256=
|
|
334
|
+
wbcore/contrib/directory/serializers/entries.py,sha256=FtHuXwKNrKigyx9w3T-r9RiD2XINmuEi-ru5_5WpHlU,15297
|
|
335
335
|
wbcore/contrib/directory/serializers/entry_representations.py,sha256=Pj8j4HYDINvXlLZ7onBypF2ZOK_GGzFZevd-yzESqoU,1397
|
|
336
336
|
wbcore/contrib/directory/serializers/persons.py,sha256=YtUgKKeijvV87JLtgeQtxmyk21COLQjSrb5klBw_EXQ,7641
|
|
337
337
|
wbcore/contrib/directory/serializers/relationships.py,sha256=jGrjy8M8kaxNRHHJ0HiDMdD_-wZFwioRJabCpCwHZ4U,12390
|
|
@@ -360,7 +360,7 @@ wbcore/contrib/directory/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
|
|
|
360
360
|
wbcore/contrib/directory/tests/conftest.py,sha256=54xK711IfBc6Cj7MweNOGNdkP-ojjMcfqjP1G2XrSn0,1826
|
|
361
361
|
wbcore/contrib/directory/tests/disable_signals.py,sha256=kgVeTtzItEtLJ7MOVo9KdnRABsMvKBTub-vhHIMKO_M,1727
|
|
362
362
|
wbcore/contrib/directory/tests/signals.py,sha256=DqQkJWnq2Y0wTTLh3ICY3qZJLUpGJqiTTSV6YypqsDQ,3217
|
|
363
|
-
wbcore/contrib/directory/tests/test_configs.py,sha256=
|
|
363
|
+
wbcore/contrib/directory/tests/test_configs.py,sha256=dXICPQOfKqloya9X8OxhVmdbeCOMCgHKDbgLzgpNTu8,213
|
|
364
364
|
wbcore/contrib/directory/tests/test_filters.py,sha256=tc4G0XoUoDoiisECXtaftYCG69fdE42-EmkmLcjbN78,2492
|
|
365
365
|
wbcore/contrib/directory/tests/test_models.py,sha256=L2029y7pTUznRYHXJOKFpy_jdTBZvvbx3KwHMEcNSAM,19304
|
|
366
366
|
wbcore/contrib/directory/tests/test_permissions.py,sha256=lmGAiE0wtIDJkHEfNk_8NDwqN71FdPuu2qXvSMm0FbM,4231
|
|
@@ -428,7 +428,7 @@ wbcore/contrib/documents/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
|
|
|
428
428
|
wbcore/contrib/documents/serializers/__init__.py,sha256=JQBjKbR6-rG5eIy4K0eSlH55vtdwqqztpqmhxC7yJa0,503
|
|
429
429
|
wbcore/contrib/documents/serializers/document_model_relationships.py,sha256=AvtHk3OGePZc3dXfqZjBtQrJhd_hx-2eUVsZZFfHKK4,962
|
|
430
430
|
wbcore/contrib/documents/serializers/document_types.py,sha256=Dtaq_EKOXbUU_x3cpuszbOHUFhY7_M_ehwDugV66BfE,1507
|
|
431
|
-
wbcore/contrib/documents/serializers/documents.py,sha256=
|
|
431
|
+
wbcore/contrib/documents/serializers/documents.py,sha256=Mkcwn-J9pFyUk0HO7eaAXO6AWI0cgwMbDi6wzyOGXss,2438
|
|
432
432
|
wbcore/contrib/documents/serializers/shareable_links.py,sha256=FbKWkDa8XZVbKcXh4ICTKMG0TQT3drSDlbnLlnegVBo,3319
|
|
433
433
|
wbcore/contrib/documents/static/documents/markdown/documentation/document_types.md,sha256=MebPHN-xP_gt58fKJQ6AgLKpIwE_7EPHytXdSrZ-okc,921
|
|
434
434
|
wbcore/contrib/documents/static/documents/markdown/documentation/documents.md,sha256=dbUB93mTQ-lSTXghaJYY51v58I-q9aAFtgg-XDY-Hds,768
|
|
@@ -448,7 +448,7 @@ wbcore/contrib/documents/viewsets/buttons/signals.py,sha256=6p7dtvJwyTE_OGknKbg6
|
|
|
448
448
|
wbcore/contrib/documents/viewsets/display/__init__.py,sha256=j_anyJOMU-oxc6CIj9arJe9asOMDkuVYHw2X6bGWPa8,263
|
|
449
449
|
wbcore/contrib/documents/viewsets/display/document_model_relationships.py,sha256=_gJtBB9u7MU2mKNVjrLvRhxMcgeQiYDBsKWYtIGi4vE,679
|
|
450
450
|
wbcore/contrib/documents/viewsets/display/document_types.py,sha256=iZFtRDjDd2ir4vCdKdGZKjmxEYUHV-tRy9unkAjC6K4,810
|
|
451
|
-
wbcore/contrib/documents/viewsets/display/documents.py,sha256
|
|
451
|
+
wbcore/contrib/documents/viewsets/display/documents.py,sha256=O5HbHKxhE1rbIksFirbstE4wiQuOhH2sjFCnAIbmR3Y,3797
|
|
452
452
|
wbcore/contrib/documents/viewsets/display/shareable_links.py,sha256=p8ZYt1N1HoapYEFj1vVQvPE7tLoIUhT7m2e6m4eE-N4,2367
|
|
453
453
|
wbcore/contrib/documents/viewsets/endpoints/__init__.py,sha256=S-14SZ88A8-JGIi_rF4es5ngJ6GrivIUUkplqZkbKeE,151
|
|
454
454
|
wbcore/contrib/documents/viewsets/endpoints/documents.py,sha256=Yoee84rx1g35L8vCKZkn41Bvf_-QIfO3IZX3WXigpi0,790
|
|
@@ -624,10 +624,10 @@ wbcore/contrib/gleap/urls.py,sha256=0g0EfJO90ketG8dCp3sUOfFuOjqOma_XDTqKoU8b4C0,
|
|
|
624
624
|
wbcore/contrib/gleap/views.py,sha256=8UthTu7LRRW_pi8muUDWzXVtBaQhwCRNox9JSriF5lQ,1088
|
|
625
625
|
wbcore/contrib/gleap/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
626
626
|
wbcore/contrib/gleap/tests/conftest.py,sha256=q9RKC6JpBsW4ZlgtnuB_V1uHtKUys4Zn0BGu3m4NbRI,36
|
|
627
|
-
wbcore/contrib/gleap/tests/tests.py,sha256=
|
|
627
|
+
wbcore/contrib/gleap/tests/tests.py,sha256=7m2BdJ1r34lUn8waMN_TqiS2u40f9sA2byUz0H8NZPU,738
|
|
628
628
|
wbcore/contrib/guardian/apps.py,sha256=dHE4YM4uk92w5Xsmk_P1agutR_1jQytTq9dRDaj-BAU,139
|
|
629
629
|
wbcore/contrib/guardian/configurations.py,sha256=rzSTs_4zbADDSnmqgqRHYd83gKdPAGyrHdegQtnH-qQ,168
|
|
630
|
-
wbcore/contrib/guardian/filters.py,sha256=
|
|
630
|
+
wbcore/contrib/guardian/filters.py,sha256=IQicKFbEtSAQ9TwwyxG-0FTbJjK53RY7qfYsibZ21L8,1064
|
|
631
631
|
wbcore/contrib/guardian/tasks.py,sha256=hCUKRkcASTnSjLIQTOgU5C6pNDCL2soyij-JzTjLU08,588
|
|
632
632
|
wbcore/contrib/guardian/urls.py,sha256=UCUiYxALnbEH7ZNKs4jp_xBx6vHClsVi9Hd_NR1_0Wg,412
|
|
633
633
|
wbcore/contrib/guardian/utils.py,sha256=3CP48t9r8puWQ1lFCmoPTVLnrXQc02h7bwEthnWQMCo,5198
|
|
@@ -661,7 +661,7 @@ wbcore/contrib/i18n/tests/conftest.py,sha256=S0kfCoA_Aq-05_75AXfPod0oWitji1un8_w
|
|
|
661
661
|
wbcore/contrib/i18n/tests/test_viewsets.py,sha256=cWDwIdVwEmVMbidU6fLVxjFFJH8FF8VuiM-sp4d7slE,2060
|
|
662
662
|
wbcore/contrib/icons/__init__.py,sha256=zMehywxDfn8IvNcMW-6TSai6FpXE7Dd4m6X2GI5l4Bk,26
|
|
663
663
|
wbcore/contrib/icons/apps.py,sha256=CbfoZkSePdV9nlUwxtNk0qMiWIR8XtBSNCmUbH1Clg8,102
|
|
664
|
-
wbcore/contrib/icons/icons.py,sha256=
|
|
664
|
+
wbcore/contrib/icons/icons.py,sha256=R4K8R202H8pWgMuoTHn7grGi4XJaozHDXuakzNYFCe0,6699
|
|
665
665
|
wbcore/contrib/icons/models.py,sha256=CaLITnSbltSJTKd_kieT1FAK0vrvKURVElilzqFF4wE,304
|
|
666
666
|
wbcore/contrib/icons/serializers.py,sha256=C08Gr43K3dv2jB7DcAqnBz-RD9r6O9t2E_JIV8k-P-Q,582
|
|
667
667
|
wbcore/contrib/icons/backends/__init__.py,sha256=GrA72d_857UivZzBmLkqgqLEqccF0L2pjpAcDTsPWls,118
|
|
@@ -676,8 +676,8 @@ wbcore/contrib/io/exceptions.py,sha256=-9pTtBr4oj7qBpKwnsN7sabu5S6gpDkWTXkA4ZaW9
|
|
|
676
676
|
wbcore/contrib/io/factories.py,sha256=VVtUf_YPJOkT0YmJ0M09bKz1RINd98yb-ZJKwu5F5R0,7133
|
|
677
677
|
wbcore/contrib/io/imports.py,sha256=Hu8ppai06SQ_CDQ2oUbFcwduAhekCp1l1DB89kTn2nQ,13087
|
|
678
678
|
wbcore/contrib/io/mixins.py,sha256=Sy_1mfdJzrIODCRcbfiA6miU8EqKEaJhL7mEjsRhOvY,1297
|
|
679
|
-
wbcore/contrib/io/models.py,sha256=
|
|
680
|
-
wbcore/contrib/io/resources.py,sha256=
|
|
679
|
+
wbcore/contrib/io/models.py,sha256=HzsHglQBQM1a4tf8Ga3hhVhi_iK2K4dQwvsHyGjcvJw,41147
|
|
680
|
+
wbcore/contrib/io/resources.py,sha256=igablmQh-4brM4f5ew_lmUwXgOeLoRqqXjik__kzbqc,6938
|
|
681
681
|
wbcore/contrib/io/serializers.py,sha256=oS5od8ni8wUZml1zM_RAdW9VWrw226Ru4v3RBifOnFY,4639
|
|
682
682
|
wbcore/contrib/io/signals.py,sha256=jCGHjt5Qg2T1aIi4BzWYzWYb2YZT82gUMhG68v2rx58,145
|
|
683
683
|
wbcore/contrib/io/tasks.py,sha256=auozEPYqu_R7pjwr_1QSS5csGAYIEEWIVqNjSLzZhkw,859
|
|
@@ -700,7 +700,7 @@ wbcore/contrib/io/import_export/backends/sftp.py,sha256=va27MF_naWE2horVOGkrqBKf
|
|
|
700
700
|
wbcore/contrib/io/import_export/backends/stream.py,sha256=ywSZCm8ccC1kxB9CBt0PypshdZooAxo5eHZboPwzcnY,3090
|
|
701
701
|
wbcore/contrib/io/import_export/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
702
702
|
wbcore/contrib/io/import_export/parsers/base_csv.py,sha256=6CPeV5j8VBeFOothav42kJEkY1F5d_ucVTRfnX8boiM,1250
|
|
703
|
-
wbcore/contrib/io/import_export/parsers/resources.py,sha256=
|
|
703
|
+
wbcore/contrib/io/import_export/parsers/resources.py,sha256=4bEEwmx3rtBtOJdtKo5-KqHRFg70LhRIhTfh13bE1YQ,1871
|
|
704
704
|
wbcore/contrib/io/locale/de/LC_MESSAGES/django.po,sha256=98w3QBX3Evo7W8kRGx7fdedT3jJX_vF5go0c0TguNqU,3235
|
|
705
705
|
wbcore/contrib/io/locale/de/LC_MESSAGES/django.po.translated,sha256=KSVtjDxjCHfWg4Hq-sbkIKvGsOusXuOMFhEmOYkKFF4,2558
|
|
706
706
|
wbcore/contrib/io/locale/en/LC_MESSAGES/django.po,sha256=8QyjmE4MJoz10z3k6tLXpW-mF8988Uh0CEndIvtLSTw,2920
|
|
@@ -772,7 +772,7 @@ wbcore/contrib/notifications/static/notifications/service-worker.js,sha256=4_yl6
|
|
|
772
772
|
wbcore/contrib/notifications/templates/notifications/notification_template.html,sha256=k-o9ieU6z6c0SKAw43_iLEleJTIZK43Y8jrRCwbKPCc,1441
|
|
773
773
|
wbcore/contrib/notifications/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
774
774
|
wbcore/contrib/notifications/tests/conftest.py,sha256=QthEmk6WnvMsvo9Rdva7RGGT8grNlGvSLdD9Ggj4480,1486
|
|
775
|
-
wbcore/contrib/notifications/tests/test_configs.py,sha256=
|
|
775
|
+
wbcore/contrib/notifications/tests/test_configs.py,sha256=2V3m8EurnV7FlnVpexawfgR5fsOUSSe9RDZMzWqWowk,283
|
|
776
776
|
wbcore/contrib/notifications/tests/test_tasks.py,sha256=d8EtXHNPZFU_JwTiVDqpdjBsxbZuRZ-NruEuaqt306M,2338
|
|
777
777
|
wbcore/contrib/notifications/tests/test_utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
778
778
|
wbcore/contrib/notifications/tests/test_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -906,7 +906,7 @@ wbcore/contrib/workflow/static/workflow/markdown/documentation/workflow.md,sha25
|
|
|
906
906
|
wbcore/contrib/workflow/templates/Test_Templates.txt,sha256=TPyYY95ZVlOPsdH_XPaDgz11RpB6tZH-PUu6BKutJhE,764
|
|
907
907
|
wbcore/contrib/workflow/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
908
908
|
wbcore/contrib/workflow/tests/conftest.py,sha256=5jS-R4lpLOu0VhNENaKPI1O_62qbltHzcSowRHN3Md0,6471
|
|
909
|
-
wbcore/contrib/workflow/tests/test_configs.py,sha256=
|
|
909
|
+
wbcore/contrib/workflow/tests/test_configs.py,sha256=Ir2YnjDPhpzbxtrEM_JX6SmUADw6w0W_66pcOOEQJzY,229
|
|
910
910
|
wbcore/contrib/workflow/tests/test_dispatch.py,sha256=xW8EHv6yV88893R1O41ytEIaC_GY0GFLGYsdOVOF5-w,4133
|
|
911
911
|
wbcore/contrib/workflow/tests/test_displays.py,sha256=Do1lD5OvnMTEW0bnjI7MV0BjKToaMUB2knvyncyfQw4,1526
|
|
912
912
|
wbcore/contrib/workflow/tests/test_filters.py,sha256=tHDn1DxAIgLlcWIDQPV_vFB6FG3VGbfCfOg1KFybQPo,4146
|
|
@@ -1033,7 +1033,7 @@ wbcore/metadata/configs/buttons/bases.py,sha256=rAw5Te9V5y6tCCKOTbZXz-uln0vT7io2
|
|
|
1033
1033
|
wbcore/metadata/configs/buttons/buttons.py,sha256=0dKPokHYMis_SZhFZ1gTHayFTMQk5nVAvyDetTNdQ6o,5033
|
|
1034
1034
|
wbcore/metadata/configs/buttons/enums.py,sha256=vkJBfNFPTIIFvYrDGxrugqgRe22_KcqFRU39jo8ZvFw,1472
|
|
1035
1035
|
wbcore/metadata/configs/buttons/metadata.py,sha256=OhSkW18R6B_uJrtcGjN8VEkNCPlXD2DxuYWCqZXQbD0,348
|
|
1036
|
-
wbcore/metadata/configs/buttons/view_config.py,sha256=
|
|
1036
|
+
wbcore/metadata/configs/buttons/view_config.py,sha256=j-ydilvH0zK2AzhtBi-JaQalJOZc8I4dUItoZUHqOR8,5397
|
|
1037
1037
|
wbcore/metadata/configs/display/__init__.py,sha256=K3CdAUuC-YbowUusZ9F6vGfepppSqE8cfvazczEGePo,272
|
|
1038
1038
|
wbcore/metadata/configs/display/configs.py,sha256=T_jJaryQf7hMqgJ_m2b685ynBxTQgsb526Zw4maBcsI,654
|
|
1039
1039
|
wbcore/metadata/configs/display/display.py,sha256=WszWJutDuE_95RBlIxj7FkR2WxGhRuQ4fUcwYmGlfY8,6236
|
|
@@ -1077,7 +1077,7 @@ wbcore/permissions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
|
1077
1077
|
wbcore/permissions/backend.py,sha256=pLK_Hpk_2O4pMXEnUkw_dDYG2Jagm4vK0ER9eZt80MY,1368
|
|
1078
1078
|
wbcore/permissions/mixins.py,sha256=LfuFM-RcB83_-ChFPvwsoL5SbY4in7gEgaqDQ2LRyTQ,1795
|
|
1079
1079
|
wbcore/permissions/permissions.py,sha256=cIj7NWhG5ws_4JHYOLYmlxQt72ygq_eAPBNWMG-wkgU,1801
|
|
1080
|
-
wbcore/permissions/registry.py,sha256=
|
|
1080
|
+
wbcore/permissions/registry.py,sha256=fS4tbLF_5IIrHXqeZRlsqZ7XRUaqln4Oz86enjX83tg,1085
|
|
1081
1081
|
wbcore/permissions/shortcuts.py,sha256=xCtU-CCfW3bCHQG5H94SxrHDLm6TStsDpqKu7nDv188,1137
|
|
1082
1082
|
wbcore/permissions/utils.py,sha256=Bn7Gj4kabzEwCdz-lnqtJlH-1Zy1MRJdDdBPXKszmdQ,935
|
|
1083
1083
|
wbcore/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -1155,9 +1155,9 @@ wbcore/test/utils.py,sha256=-PNuj4UjeoX2FdRCPObedTQAgUDsmiO672BCwIZtKwE,8406
|
|
|
1155
1155
|
wbcore/test/e2e_helpers_methods/e2e_checks.py,sha256=teyYS5OQGSy2r7VvhfxkaskPOrQ_jLBNPN64CRUKmzQ,4266
|
|
1156
1156
|
wbcore/test/e2e_helpers_methods/e2e_helper_methods.py,sha256=Uo61TfEwYOP_u9N84gz-asZ4VwK80cWhdlnhJpnw8U8,17654
|
|
1157
1157
|
wbcore/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1158
|
-
wbcore/tests/conftest.py,sha256=
|
|
1158
|
+
wbcore/tests/conftest.py,sha256=mIDICLGEZNz-fluDsu_qRdqv-KIVMvC_3uHduww5FNI,1452
|
|
1159
1159
|
wbcore/tests/models.py,sha256=QYJRhVMJZ6nENYuO-ktieiKvw3clxy57n3Is5h0tcmg,207
|
|
1160
|
-
wbcore/tests/test_configs.py,sha256=
|
|
1160
|
+
wbcore/tests/test_configs.py,sha256=PQ-VKV-fHN4bcS0naflpO6VMKMW0fw1_K9i0n05DYZo,1910
|
|
1161
1161
|
wbcore/tests/test_enums.py,sha256=KwnEznR6PdWN9AHFMY1qx0krOqAoT7QZF8x-BPsOanM,1741
|
|
1162
1162
|
wbcore/tests/test_list_display.py,sha256=9zX8grPa0lie65vxDAzJUBTjwVIep2mItbu0voSwhHs,721
|
|
1163
1163
|
wbcore/tests/test_pagination.py,sha256=JRdmhLNrBkg_r7Cg1tug-jxjt0hJg4k8m-xcjpsyKMY,1078
|
|
@@ -1213,7 +1213,7 @@ wbcore/utils/deprecations.py,sha256=ju1h3-icVlJnItZkugdOdeX4sY3QJIeFxXxAo9TG_rM,
|
|
|
1213
1213
|
wbcore/utils/enum.py,sha256=eTTMt03iCMaNEoB5xsq5IGxkCi8X3xfIRjJNI0ygzWs,533
|
|
1214
1214
|
wbcore/utils/figures.py,sha256=Z7EsJ-pSWk2UExahKhO7OnPYTJltMFV6LJp8DbLptiI,9199
|
|
1215
1215
|
wbcore/utils/html.py,sha256=Ir_bX4l3EgaWf7bv3ymlt836ekoCVDHedMMu8TzXyj4,157
|
|
1216
|
-
wbcore/utils/importlib.py,sha256=
|
|
1216
|
+
wbcore/utils/importlib.py,sha256=uWxesC-A0sgmjEWEVjCXOb3GuOxG_xs2Bfd4dzhAJxw,211
|
|
1217
1217
|
wbcore/utils/itertools.py,sha256=tgmDS9FMzq3oy5PzAMcBreNAN8EjpoC6waRt738dcW8,1410
|
|
1218
1218
|
wbcore/utils/models.py,sha256=fCYU6OUuWzBA0JzTtkTZr9jw-XPNQZaCDxAh6tBdJ_g,9490
|
|
1219
1219
|
wbcore/utils/numbers.py,sha256=KaC2yNmaVMwe05uRvGvC_ayWJW_1dOgjswlqsB-QeoM,2289
|
|
@@ -1238,6 +1238,6 @@ wbcore/viewsets/generics.py,sha256=lKDq9UY_Tyc56u1bqaIEvHGgoaXwXxpZ1c3fLVteptI,1
|
|
|
1238
1238
|
wbcore/viewsets/mixins.py,sha256=IdHd_uixOv3ExKoHxTgL5Bt8OELIwfYwhBZm0nsvZfc,12054
|
|
1239
1239
|
wbcore/viewsets/utils.py,sha256=4520Ij3ASM8lOa8QZkCqbBfOexVRiZu688eW-PGqMOA,882
|
|
1240
1240
|
wbcore/viewsets/viewsets.py,sha256=FPPESunEjlunDr5VFsjTfsquTS3iDSQkw0H6QjMKPqk,6574
|
|
1241
|
-
wbcore-1.59.
|
|
1242
|
-
wbcore-1.59.
|
|
1243
|
-
wbcore-1.59.
|
|
1241
|
+
wbcore-1.59.12.dist-info/METADATA,sha256=3P0NTHFMvLQkaopsmazWN789ZtepkAcEg0YxUTgnW-A,2317
|
|
1242
|
+
wbcore-1.59.12.dist-info/WHEEL,sha256=aha0VrrYvgDJ3Xxl3db_g_MDIW-ZexDdrc_m-Hk8YY4,105
|
|
1243
|
+
wbcore-1.59.12.dist-info/RECORD,,
|
|
File without changes
|