wbcore 1.55.10rc0__py2.py3-none-any.whl → 1.56.0__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.
@@ -6,7 +6,6 @@ from .models import UserActivity
6
6
 
7
7
  class UserActivityChartFilter(wb_filters.FilterSet):
8
8
  date = wb_filters.DateTimeRangeFilter(
9
- method=wb_filters.DateRangeFilter.base_date_range_filter_method,
10
9
  label="Date Range",
11
10
  required=True,
12
11
  clearable=False,
@@ -227,7 +227,7 @@ class BankingContact(PrimaryMixin, WBModel):
227
227
 
228
228
  notification_types = [
229
229
  create_notification_type(
230
- code="directory.banking+contact.approval",
230
+ code="directory.banking_contact.approval",
231
231
  title="Banking Contact Notification",
232
232
  help_text="Sends out a notification when you want need to approve a change in bank details",
233
233
  )
@@ -13,7 +13,6 @@ from wbcore.contrib.documents.models import (
13
13
  class ShareableLinkFilter(wb_filters.FilterSet):
14
14
  valid = wb_filters.BooleanFilter(label=_("Valid"), method="boolean_is_valid")
15
15
  valid_until = wb_filters.DateTimeRangeFilter(
16
- method=wb_filters.DateRangeFilter.base_date_range_filter_method,
17
16
  label="Valid Until",
18
17
  )
19
18
  link = wb_filters.CharFilter(label=_("Link"), method="filter_uuid")
@@ -36,7 +35,6 @@ class ShareableLinkFilter(wb_filters.FilterSet):
36
35
  class ShareableLinkAccessFilter(wb_filters.FilterSet):
37
36
  clearable = (False,)
38
37
  accessed = wb_filters.DateTimeRangeFilter(
39
- method=wb_filters.DateRangeFilter.base_date_range_filter_method,
40
38
  label="Accessed between date",
41
39
  )
42
40
 
@@ -46,7 +46,7 @@ class ImportExportHandler:
46
46
  else:
47
47
  return provider_id, content_type
48
48
 
49
- def _model_dict_diff(self, model: Any, data: Dict[str, Any]) -> Dict[str, Any]:
49
+ def _model_dict_diff(self, model: Any, data: Dict[str, Any]) -> Dict[str, Any]: # noqa: C901
50
50
  """
51
51
  Given a model and its dictionary representation, compare them and find out the fields that are different
52
52
  Args:
@@ -1,6 +1,9 @@
1
1
  from contextlib import suppress
2
2
 
3
3
  import django_filters
4
+ from django.contrib.postgres.fields import RangeField
5
+ from django_filters.constants import EMPTY_VALUES
6
+ from django_filters.utils import get_model_field
4
7
 
5
8
  from wbcore.filters.mixins import WBCoreFilterMixin
6
9
  from wbcore.forms import DateRangeField, DateTimeRangeField
@@ -45,6 +48,13 @@ class DateRangeFilter(ShortcutAndPerformanceMixin, django_filters.Filter):
45
48
  kwargs.setdefault("lookup_expr", "overlap")
46
49
  super().__init__(*args, **kwargs)
47
50
 
51
+ @property
52
+ def is_range(self) -> bool:
53
+ if hasattr(self, "model"):
54
+ field = get_model_field(self.model, self.field_name)
55
+ return issubclass(field.__class__, RangeField)
56
+ return False
57
+
48
58
  def _get_initial(self, *args):
49
59
  initial = super()._get_initial(*args)
50
60
  if initial is not None:
@@ -70,16 +80,30 @@ class DateRangeFilter(ShortcutAndPerformanceMixin, django_filters.Filter):
70
80
 
71
81
  return representation, lookup_expr
72
82
 
73
- @classmethod
74
- def base_date_range_filter_method(cls, queryset, field_name, value):
83
+ def filter(self, qs, value):
84
+ if value in EMPTY_VALUES:
85
+ return qs
75
86
  if value:
87
+ lower, upper = value.lower, value.upper
76
88
  filters = {}
77
- if value.lower:
78
- filters[f"{field_name}__gte"] = value.lower
79
- if value.upper:
80
- filters[f"{field_name}__lte"] = value.upper
81
- return queryset.filter(**filters)
82
- return queryset
89
+ is_field_range = self.is_range
90
+ if lower:
91
+ if is_field_range:
92
+ filters[f"{self.field_name}__startswith__gte"] = lower
93
+ else:
94
+ filters[f"{self.field_name}__gte"] = lower
95
+
96
+ if upper:
97
+ if is_field_range:
98
+ filters[f"{self.field_name}__endswith__lte"] = upper
99
+ else:
100
+ filters[f"{self.field_name}__lte"] = upper
101
+
102
+ if self.exclude:
103
+ qs = qs.exclude(**filters)
104
+ else:
105
+ qs = qs.filter(**filters)
106
+ return qs
83
107
 
84
108
 
85
109
  class FinancialPerformanceDateRangeFilter(DateRangeFilter):
@@ -90,3 +114,4 @@ class FinancialPerformanceDateRangeFilter(DateRangeFilter):
90
114
  class DateTimeRangeFilter(DateRangeFilter):
91
115
  field_class = DateTimeRangeField
92
116
  initial_format = "%Y-%m-%dT%H:%M:%S%z"
117
+ filter_type = "datetimerange"
@@ -1,5 +1,7 @@
1
1
  import logging
2
+ from collections import OrderedDict
2
3
  from contextlib import suppress
4
+ from copy import copy
3
5
 
4
6
  from django.contrib.postgres.fields import DateRangeField, DateTimeRangeField
5
7
  from django.core.exceptions import FieldError
@@ -65,6 +67,7 @@ class CustomFilterSetMetaClass(FilterSetMetaclass):
65
67
 
66
68
 
67
69
  class FilterSet(DjangoFilterSet, metaclass=CustomFilterSetMetaClass):
70
+ DEFAULT_EXCLUDE_FILTER_LOOKUP: str = "exclude"
68
71
  FILTER_DEFAULTS = {
69
72
  models.BooleanField: {"filter_class": fields.BooleanFilter},
70
73
  models.NullBooleanField: {"filter_class": fields.BooleanFilter},
@@ -196,7 +199,7 @@ class FilterSet(DjangoFilterSet, metaclass=CustomFilterSetMetaClass):
196
199
 
197
200
  @classmethod
198
201
  def get_filters(cls):
199
- filters = super().get_filters()
202
+ filters = dict(super().get_filters())
200
203
  remote_filters = add_filters.send(sender=cls.filter_class_for_remote_filter())
201
204
  for _, res in remote_filters:
202
205
  if res:
@@ -211,7 +214,20 @@ class FilterSet(DjangoFilterSet, metaclass=CustomFilterSetMetaClass):
211
214
  for field, values in cls.get_dependency_map():
212
215
  for value in values:
213
216
  filters[field].depends_on.append({"field": value, "options": {}})
214
- return filters
217
+
218
+ excluding_fields = {}
219
+ for name, field in filters.items():
220
+ # if allow_exclude is true, we add a copy of the field with the parameter exclude=True
221
+ # (to use `exclude` queryset method instead of `filter`) and add this with the suffix __{cls.DEFAULT_EXCLUDE_FILTER_LOOKUP}
222
+ if field.allow_exclude:
223
+ excluding_field = copy(field)
224
+ excluding_field.exclude = True
225
+ excluding_field.excluded_filter = True
226
+ excluding_field.hidden = True
227
+ excluding_field.required = False
228
+ excluding_fields[f"{name}__{cls.DEFAULT_EXCLUDE_FILTER_LOOKUP}"] = excluding_field
229
+ filters.update(excluding_fields)
230
+ return OrderedDict(filters)
215
231
 
216
232
  def extract_required_field_labels(self):
217
233
  return [label for label, filter in self.base_filters.items() if getattr(filter, "required", False)]
wbcore/filters/mixins.py CHANGED
@@ -30,6 +30,10 @@ class WBCoreFilterMixin:
30
30
  "label_format",
31
31
  getattr(self, "default_label_format", "{{field_label}} {{operation_icon}} {{value_label}}"),
32
32
  )
33
+ self.allow_exclude = kwargs.pop(
34
+ "allow_exclude", kwargs.get("method") is None
35
+ ) # if False, we will not automatically add a similar filter "opposite" filter
36
+ self.excluded_filter = kwargs.pop("excluded_filter", False)
33
37
  self.lookup_icon = kwargs.pop("lookup_icon", None)
34
38
  self.lookup_label = kwargs.pop("lookup_label", None)
35
39
  self.depends_on = kwargs.pop("depends_on", [])
@@ -90,6 +94,7 @@ class WBCoreFilterMixin:
90
94
  "icon": get_lookup_icon(self.lookup_expr) if self.lookup_icon is None else self.lookup_icon,
91
95
  "key": name,
92
96
  "hidden": self.hidden,
97
+ "allow_exclude": self.allow_exclude,
93
98
  "input_properties": {
94
99
  "type": self.filter_type,
95
100
  },
@@ -25,16 +25,17 @@ class FilterFieldsViewConfig(WBCoreViewConfig):
25
25
  hidden_fields.extend(getattr(filterset_class_meta, "hidden_fields", []))
26
26
  filters.update(getattr(filterset_class_meta, "df_fields", {}))
27
27
  for name, field in filters.items():
28
- field.parent = filterset
29
- if res := field.get_representation(self.request, name, self.view):
30
- representation, lookup_expr = res
31
- if name in hidden_fields:
32
- lookup_expr["hidden"] = True
33
- if field.key in filter_fields:
34
- filter_fields[field.key]["lookup_expr"].append(lookup_expr)
35
- else:
36
- filter_fields[field.key] = representation
37
- filter_fields[field.key]["lookup_expr"] = [lookup_expr]
38
- filter_fields[field.key]["label"] = field.label
28
+ if not field.excluded_filter:
29
+ field.parent = filterset
30
+ if res := field.get_representation(self.request, name, self.view):
31
+ representation, lookup_expr = res
32
+ if name in hidden_fields:
33
+ lookup_expr["hidden"] = True
34
+ if field.key in filter_fields:
35
+ filter_fields[field.key]["lookup_expr"].append(lookup_expr)
36
+ else:
37
+ filter_fields[field.key] = representation
38
+ filter_fields[field.key]["lookup_expr"] = [lookup_expr]
39
+ filter_fields[field.key]["label"] = field.label
39
40
 
40
41
  return filter_fields
@@ -49,7 +49,7 @@ def validate_nested_representation(instance, value):
49
49
 
50
50
 
51
51
  class WBCoreSerializerMetaClass(SerializerMetaclass):
52
- def __new__(cls, *args, **kwargs):
52
+ def __new__(cls, *args, **kwargs): # noqa: C901
53
53
  _class = super().__new__(cls, *args, **kwargs)
54
54
 
55
55
  if _meta := getattr(_class, "Meta", None):
wbcore/test/mixins.py CHANGED
@@ -173,7 +173,7 @@ class ParentViewset:
173
173
  else get_model_factory(self.model)
174
174
  )
175
175
 
176
- def _get_mixins_data(self, type="GET", dump_data=False, data=None):
176
+ def _get_mixins_data(self, type="GET", dump_data=False, data=None): # noqa: C901
177
177
  api_request = APIRequestFactory()
178
178
  superuser = get_or_create_superuser()
179
179
  kwargs = None
wbcore/test/utils.py CHANGED
@@ -45,7 +45,7 @@ def get_model_factory(model):
45
45
  return mfs[0]
46
46
 
47
47
 
48
- def get_data_from_factory(instance, viewset, delete=False, update=False, superuser=None, factory=None):
48
+ def get_data_from_factory(instance, viewset, delete=False, update=False, superuser=None, factory=None): # noqa: C901
49
49
  """
50
50
  Our goal here is to get the serializer dynamically based on the viewset, use this serializer to generate data for the post and update test.
51
51
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbcore
3
- Version: 1.55.10rc0
3
+ Version: 1.56.0
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  Requires-Dist: boto3==1.35.*
6
6
  Requires-Dist: celery[redis]==5.*
@@ -126,7 +126,7 @@ wbcore/contrib/authentication/authentication.py,sha256=DLWOsGlk88uegMnepEIRrc91B
126
126
  wbcore/contrib/authentication/configs.py,sha256=Z3M2X6xzWhwJEEvHym6d9khriSdgyTmimbkxi7KAGuk,358
127
127
  wbcore/contrib/authentication/configurations.py,sha256=N-631Y0kfJzacLcs926uom7SaoJC7RvhA7nsR5NV_hs,2362
128
128
  wbcore/contrib/authentication/dynamic_preferences_registry.py,sha256=oWCqvR-lzduzOrwh5DlsTBfP-9NyjCERNpKLjfnkNzo,982
129
- wbcore/contrib/authentication/filters.py,sha256=uUhTQa1VVm_8b6oIy_tK_vAbC8C8oy7VqiNVbCGKcBM,497
129
+ wbcore/contrib/authentication/filters.py,sha256=UEIbxpFhjc2G8DFq0r0hWEoAASoNZDmBI3PZvPD8-Q8,424
130
130
  wbcore/contrib/authentication/tasks.py,sha256=5h2dL3nbrfpkU6i6Qq51vk7PMh14_-YLlfvyskGOVO0,1201
131
131
  wbcore/contrib/authentication/urls.py,sha256=OUeLXEwuF6yS-oXeBpkC5aCviEC-nPbM3CSOcNpEImE,3974
132
132
  wbcore/contrib/authentication/utils.py,sha256=jmOZtY_z6oW_r6npGPH00IbPcUjWZ1NchodMgcHXEbs,341
@@ -317,7 +317,7 @@ wbcore/contrib/directory/migrations/0012_alter_person_managers.py,sha256=Y-GWOA5
317
317
  wbcore/contrib/directory/migrations/0013_alter_clientmanagerrelationship_options.py,sha256=sj9-aCqnzwqKyfYAyLfc1TW2o9X_oVVtNkT30fRuVdQ,560
318
318
  wbcore/contrib/directory/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
319
319
  wbcore/contrib/directory/models/__init__.py,sha256=XtnmU5YUr3SGig6PsSfGsWUaiBaX6kaHShBv3sbxZ14,526
320
- wbcore/contrib/directory/models/contacts.py,sha256=4gCmAvUe8guFitb98GCyHlqzGaRugoroE2ck6Gao8Lc,18322
320
+ wbcore/contrib/directory/models/contacts.py,sha256=8KVCmzNARTzeQgRtXe78QKhJr0SvEJ-aZcsRuYaMIbE,18322
321
321
  wbcore/contrib/directory/models/entries.py,sha256=Zu4xt3q05tKk6t4Q2BwAMXPsqNdNbRB77in63yoVIUc,31664
322
322
  wbcore/contrib/directory/models/relationships.py,sha256=7SZFo1tA7NRzS7_gv_fKwMsPPhawu90eWSrEvij_0rk,22108
323
323
  wbcore/contrib/directory/release_notes/1_0_0.md,sha256=Twbl9RMLO6dbbm5dVoKorw8BecRqAYsKeobcNmDWHu8,165
@@ -399,7 +399,7 @@ wbcore/contrib/documents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
399
399
  wbcore/contrib/documents/admin.py,sha256=vh7dhViQ63Ot_olFvJMcRLjxFnQOK8T8QNzB7gOCBro,2378
400
400
  wbcore/contrib/documents/apps.py,sha256=z3pYGj-qPkkpe88MP_G7uO_sb2uEvD_KZriePPbtX2Y,161
401
401
  wbcore/contrib/documents/factories.py,sha256=4VGupvQQGNk43c1pubCyJfHRqlWjFTKhiiq8y-5G3Q0,1053
402
- wbcore/contrib/documents/filters.py,sha256=SMTf51Shh8vtD6XhuDjehCnEVyGE6MSJjhgGDI8HrTk,2623
402
+ wbcore/contrib/documents/filters.py,sha256=ZRw_uN_MdP28GMK_7hM1mgoW1ZViL3oGEe49CBJwZ5w,2477
403
403
  wbcore/contrib/documents/urls.py,sha256=1i3xEygi5myhLWo6OSy7fCd_m_ze_stRf871WsCKiqI,1769
404
404
  wbcore/contrib/documents/fixtures/docments.json,sha256=xGsdB7WZ-k_06yC_2OfcQCeBc3T8TlQwLp3ex9DcdIM,4025
405
405
  wbcore/contrib/documents/locale/de/LC_MESSAGES/django.po,sha256=kmmIkwn_e-NZn5sJdZs2NMYmW8I7EBLCLHzCDQAbEcc,8104
@@ -668,7 +668,7 @@ wbcore/contrib/io/dynamic_preferences_registry.py,sha256=8dyFqiacvwUZOgQl9gvKfGv
668
668
  wbcore/contrib/io/enums.py,sha256=9Ph2hUn-cjfvTIhPGxlC07qubPS6R3B9ilvC3tpMm8o,417
669
669
  wbcore/contrib/io/exceptions.py,sha256=-9pTtBr4oj7qBpKwnsN7sabu5S6gpDkWTXkA4ZaW9EE,690
670
670
  wbcore/contrib/io/factories.py,sha256=U5ppoOMM4yd6pla_bscWo9v7ug5W_bWV29ZL4PKLZsU,7053
671
- wbcore/contrib/io/imports.py,sha256=eTn8ntObhA507697fNj9_aBlqd0NxTM5EswfjQxAT2o,13073
671
+ wbcore/contrib/io/imports.py,sha256=Hu8ppai06SQ_CDQ2oUbFcwduAhekCp1l1DB89kTn2nQ,13087
672
672
  wbcore/contrib/io/mixins.py,sha256=Sy_1mfdJzrIODCRcbfiA6miU8EqKEaJhL7mEjsRhOvY,1297
673
673
  wbcore/contrib/io/models.py,sha256=oYGMz0tbR5Eyul-J1tOSqjbMaNDjaOvB56YrZZhPYd8,40230
674
674
  wbcore/contrib/io/resources.py,sha256=eGEpmyrtkB3DgFKV6m57OFzyu6jBZUIXkn5Jopeus9M,6953
@@ -964,15 +964,15 @@ wbcore/docs/reparent.md,sha256=_pWHAuRwSQZRcvRxa7tsNKVdRP4Nj6O0Zdbwk9AsB9Q,839
964
964
  wbcore/filters/__init__.py,sha256=I4NntVOrIgMTPh49Ek5K6J6jEGR6Y8YR_TEVtNOJunw,491
965
965
  wbcore/filters/backends.py,sha256=7XX5LcFrAFE5jvFj5qSjww4VMux8aKRlcQKmZxdIiKY,730
966
966
  wbcore/filters/defaults.py,sha256=poSD8Ww2NumwYjZ01zS0iBsNCmv6Bee1z3bDSYdX17A,1988
967
- wbcore/filters/filterset.py,sha256=bu8W1rXx_Cwpr30PLF1omZ2JwJDKG8Kv1kcOsq9D3sU,10918
967
+ wbcore/filters/filterset.py,sha256=TTk4mQq9DFCXdyzMq3Ig6e5uIbmjsr4HT2kswOgiuPc,11775
968
968
  wbcore/filters/lookups.py,sha256=IYuQqEcYutiXk9UpzY3qKSCaCR2vyllB0RXBj98o8Ao,1186
969
- wbcore/filters/mixins.py,sha256=wzkfZ17SCSUvsOdwU_vrfLCHnVQH-_q2oQQBkoN_jQg,4204
969
+ wbcore/filters/mixins.py,sha256=_CT4Nrn8vwsANLrIRO4Ghal2aZD6XYTnFOubPPzGuSE,4508
970
970
  wbcore/filters/utils.py,sha256=wSs0g7mKF6n_ziSEDItfFYcuHwZTXyu78D6LHxzY2Bk,786
971
971
  wbcore/filters/fields/__init__.py,sha256=ZucwBossNTlvcUfRullicg0ovghQEGO0jxY5eQ3UaEs,546
972
972
  wbcore/filters/fields/booleans.py,sha256=6BrK3p1Bv_KIlVCeMOgJ7V8_P8tWQKBnxTOBOBSsGvE,175
973
973
  wbcore/filters/fields/choices.py,sha256=cXjPtWTEb-GF0oQaYszdDs2XRHEeviwipjbmlptX9mc,2529
974
974
  wbcore/filters/fields/content_type.py,sha256=OtIzgNrr3-jtiS7m1YWrO5LEQd4hOhaukWTmDrmhJtg,1484
975
- wbcore/filters/fields/datetime.py,sha256=DKjnMgNCfjETosPLwh3PL7hWzkvKIwRJlPJvmmtNX28,3496
975
+ wbcore/filters/fields/datetime.py,sha256=17IP-ZGkmH0M4juc68kk0IPoiW7xKTUOy_y8DebV_Ts,4342
976
976
  wbcore/filters/fields/models.py,sha256=43MwNyWqIkxAYTopYnGrsDRv-te34DIaHYmI4TtYTBs,5203
977
977
  wbcore/filters/fields/multiple_lookups.py,sha256=gATxmkosBkDNbs_BQUw-rkON6xF5-C5evItvT0OkjQg,616
978
978
  wbcore/filters/fields/numbers.py,sha256=DRKDndzZwBvnzlLrMiijwoZ41px8B0xcYv23eFI64hw,1908
@@ -1010,7 +1010,7 @@ wbcore/metadata/configs/base.py,sha256=jxOuuisAAEMjvdvQY_1WSruEaNR9onmXn7W6NN95o
1010
1010
  wbcore/metadata/configs/documentations.py,sha256=Wv6vToaalOFkCY_KU8HOddpkfeMKsBoGlla_4LTbJ40,348
1011
1011
  wbcore/metadata/configs/endpoints.py,sha256=peGTXR53IpOYcm0kBqDwMuIxxjjLYHRhDv0XWt6-OYQ,7143
1012
1012
  wbcore/metadata/configs/fields.py,sha256=t_GFdQUUDiCUkk7i9TffFEBDBhRCuD_yaoyUIu9tCMQ,634
1013
- wbcore/metadata/configs/filter_fields.py,sha256=Aue6hBV3sdQ8IwvmcopBkg95kqS_l2nqCadnv6t8QWU,1906
1013
+ wbcore/metadata/configs/filter_fields.py,sha256=1jZyZHU8rBse2P69xFFRAn8VitEdevz5bPeniMk0vKs,2000
1014
1014
  wbcore/metadata/configs/identifiers.py,sha256=4cntC5IarkENLrBnFf26uyfrZY3b4QDXtugvNc_VRhI,1025
1015
1015
  wbcore/metadata/configs/ordering_fields.py,sha256=9ww1zwCFfL6XKGxMI2RKCcMhRS-dkFi3pYbQVbuKN_A,878
1016
1016
  wbcore/metadata/configs/paginations.py,sha256=QsQ2-D4Co6CZSrv6euBKZcYQVFRRfd5Jr-Sgw0Ij_Uo,373
@@ -1092,7 +1092,7 @@ wbcore/reversion/viewsets/viewsets.py,sha256=OlDYkqLBD8-eyb07eXVG69BzBanjhj_E_kI
1092
1092
  wbcore/search/__init__.py,sha256=1V_2yxfShXBHdZLQZkFGqn5SrRpUBZCpaEyF1skLLO4,1496
1093
1093
  wbcore/serializers/__init__.py,sha256=82xurxoF-BXAo7RN_iSQM0xHZRAh5ldHsY-V2chty3c,1480
1094
1094
  wbcore/serializers/mixins.py,sha256=5oOTK82mP7d5fMqr8hMcq-pnh3MQ_HwmX6qpUrEQNYI,755
1095
- wbcore/serializers/serializers.py,sha256=wOqleHI7fg7D1lHN4q7ZFkqZb32zT0y5Gdrel-7eQbU,18820
1095
+ wbcore/serializers/serializers.py,sha256=pEcbOD6f8RCANG2cM1KBrYPxs15BSqJLrmlu2nvAgqI,18834
1096
1096
  wbcore/serializers/utils.py,sha256=H_faApLg6bNiZvZNvApZhmVBJ07obw1u5QKZx7DLLa8,4251
1097
1097
  wbcore/serializers/fields/__init__.py,sha256=xNNak0yl8FtC6m-__B5mfieSNGAygXND34E_HrJ2Fcw,1498
1098
1098
  wbcore/serializers/fields/boolean.py,sha256=vwP7HQflArFEG0w9FfXkPYKreFJ5qMjs-L0qKMeKCVQ,1682
@@ -1139,10 +1139,10 @@ wbcore/templates/wbcore/frontend.html,sha256=ZNm9NgvXwxzs10px95I2GyBhORpw9-adF1A
1139
1139
  wbcore/templates/wbcore/admin/change_list.html,sha256=R4D2DiiESjopzwvUTThpsGqX1ikYA92D1fPbER-M74Q,188
1140
1140
  wbcore/templates/wbcore/admin/csv_form.html,sha256=g8w6oXAyvwOL7ckNmR_wch-vxnh-JLXFOa3cUkDnGSA,337
1141
1141
  wbcore/test/__init__.py,sha256=gxYHDwZugGf-eRh7sG5z7247y5uvyDIHmsm4J0ajBis,713
1142
- wbcore/test/mixins.py,sha256=mg-UxzrwkX0aQykNtznSan1tqOiiVBsCT93BSfk_EII,32361
1142
+ wbcore/test/mixins.py,sha256=rtjhQCh-u4eGoEC-XTfjsmy1CwiQ1Q4dSs0EpZBz7Q0,32375
1143
1143
  wbcore/test/signals.py,sha256=UX7n9zsak30feE1GLXkwAhLEbmRnllNPu17D1top6YI,174
1144
1144
  wbcore/test/tests.py,sha256=NqD0cXhEabjPH52I7nBPijEu5cXTwn0duBckvG18rlI,4485
1145
- wbcore/test/utils.py,sha256=EkqqHjpyHfK-eTJX5ABlCdYADSUp2Io1exX_NWN_Pvw,8392
1145
+ wbcore/test/utils.py,sha256=-PNuj4UjeoX2FdRCPObedTQAgUDsmiO672BCwIZtKwE,8406
1146
1146
  wbcore/test/e2e_helpers_methods/e2e_checks.py,sha256=teyYS5OQGSy2r7VvhfxkaskPOrQ_jLBNPN64CRUKmzQ,4266
1147
1147
  wbcore/test/e2e_helpers_methods/e2e_helper_methods.py,sha256=Uo61TfEwYOP_u9N84gz-asZ4VwK80cWhdlnhJpnw8U8,17654
1148
1148
  wbcore/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1229,6 +1229,6 @@ wbcore/viewsets/generics.py,sha256=lKDq9UY_Tyc56u1bqaIEvHGgoaXwXxpZ1c3fLVteptI,1
1229
1229
  wbcore/viewsets/mixins.py,sha256=IdHd_uixOv3ExKoHxTgL5Bt8OELIwfYwhBZm0nsvZfc,12054
1230
1230
  wbcore/viewsets/utils.py,sha256=4520Ij3ASM8lOa8QZkCqbBfOexVRiZu688eW-PGqMOA,882
1231
1231
  wbcore/viewsets/viewsets.py,sha256=FPPESunEjlunDr5VFsjTfsquTS3iDSQkw0H6QjMKPqk,6574
1232
- wbcore-1.55.10rc0.dist-info/METADATA,sha256=-eW4y0TLl2aoju59wSczN_qa0nkUxZq3YqJip2nrZbQ,2307
1233
- wbcore-1.55.10rc0.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
1234
- wbcore-1.55.10rc0.dist-info/RECORD,,
1232
+ wbcore-1.56.0.dist-info/METADATA,sha256=OgDUR-sEZZKX074Xapv0_sbWZJBGdqdBXtUMlSFjmr4,2303
1233
+ wbcore-1.56.0.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
1234
+ wbcore-1.56.0.dist-info/RECORD,,