wbcore 1.57.1__py2.py3-none-any.whl → 1.58.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.
@@ -4,7 +4,9 @@ from datetime import date as date_lib
4
4
  from decimal import Decimal
5
5
 
6
6
  from django.db import models
7
- from django.db.models import Expression, ExpressionWrapper, Subquery
7
+ from django.db.models import Case, CharField, Expression, ExpressionWrapper, F, Q, Subquery, Value, When
8
+ from django.db.models.functions import Concat
9
+ from persisting_theory import QuerySet
8
10
 
9
11
  from wbcore.contrib.io.mixins import ImportMixin
10
12
  from wbcore.models import WBModel
@@ -13,6 +15,21 @@ from wbcore.utils.models import LabelKeyMixin
13
15
  from .import_export.handlers import CurrencyFXRatesImportHandler, CurrencyImportHandler
14
16
 
15
17
 
18
+ class CurrencyDefaultManager(models.Manager):
19
+ def get_queryset(self) -> QuerySet:
20
+ return (
21
+ super()
22
+ .get_queryset()
23
+ .annotate(
24
+ name_repr=Case(
25
+ When(Q(symbol="") | Q(symbol__isnull=True), then=F("title")),
26
+ default=Concat(F("title"), Value(" ("), F("symbol"), Value(")")),
27
+ output_field=CharField(),
28
+ )
29
+ )
30
+ )
31
+
32
+
16
33
  class Currency(ImportMixin, LabelKeyMixin, WBModel):
17
34
  import_export_handler_class = CurrencyImportHandler
18
35
 
@@ -21,18 +38,19 @@ class Currency(ImportMixin, LabelKeyMixin, WBModel):
21
38
  verbose_name_plural = "Currencies"
22
39
  ordering = ("title",)
23
40
 
24
- def __str__(self):
25
- symbol = f"({self.symbol})" if self.symbol else ""
26
- return f"{self.key} {symbol}"
41
+ def __str__(self) -> str:
42
+ if self.symbol:
43
+ return f"{self.title} ({self.symbol})"
44
+ return self.title
27
45
 
28
- def __repr__(self):
46
+ def __repr__(self) -> str:
29
47
  return self.key
30
48
 
31
49
  title = models.CharField(max_length=255)
32
50
  symbol = models.CharField(max_length=10, blank=True, null=True)
33
51
  key = models.CharField(max_length=3, unique=True)
34
52
 
35
- objects = models.Manager()
53
+ objects = CurrencyDefaultManager()
36
54
 
37
55
  LABEL_KEY = "{{key}} ({{symbol}})"
38
56
 
@@ -83,7 +101,7 @@ class Currency(ImportMixin, LabelKeyMixin, WBModel):
83
101
 
84
102
  @classmethod
85
103
  def get_representation_label_key(cls) -> str:
86
- return "{{key}} ({{symbol}})"
104
+ return "{{name_repr}}"
87
105
 
88
106
 
89
107
  class CurrencyFXRates(ImportMixin, models.Model):
@@ -8,11 +8,15 @@ from .models import Currency, CurrencyFXRates
8
8
  class CurrencyRepresentationSerializer(wb_serializers.RepresentationSerializer):
9
9
  """Representation Serializer for Currencies"""
10
10
 
11
+ name_repr = wb_serializers.SerializerMethodField(read_only=True)
11
12
  _detail = wb_serializers.HyperlinkField(reverse_name="wbcore:currency:currency-detail")
12
13
 
14
+ def get_name_repr(self, obj):
15
+ return str(obj)
16
+
13
17
  class Meta:
14
18
  model = Currency
15
- fields = ("id", "title", "key", "symbol", "_detail")
19
+ fields = ("id", "name_repr", "key", "_detail")
16
20
 
17
21
 
18
22
  class CurrencyModelSerializer(wb_serializers.ModelSerializer):
@@ -30,6 +30,10 @@ class TestSerializers:
30
30
  mocker.patch.object(currency_fx_rate, "currency_id", currency.id)
31
31
  return currency_fx_rate
32
32
 
33
+ @pytest.fixture
34
+ def expected_representation_data(self, currency):
35
+ return {"id": currency.id, "name_repr": f"{currency.title} ({currency.symbol})", "key": currency.key}
36
+
33
37
  @pytest.fixture
34
38
  def expected_data(self, currency):
35
39
  return {"id": currency.id, "title": currency.title, "key": currency.key, "symbol": currency.symbol}
@@ -43,12 +47,12 @@ class TestSerializers:
43
47
  "currency": currency_fx_rate.currency_id,
44
48
  }
45
49
 
46
- def test_currency_representation_serializer(self, mocker: MockerFixture, currency, expected_data):
50
+ def test_currency_representation_serializer(self, mocker: MockerFixture, currency, expected_representation_data):
47
51
  detail = f"/wbcore/currency/currency/{currency.id}/"
48
52
  mocker.patch("wbcore.serializers.fields.fields.HyperlinkField", return_value=detail)
49
53
  serializer = CurrencyRepresentationSerializer(instance=currency)
50
- expected_data["_detail"] = detail
51
- assert serializer.data == expected_data
54
+ expected_representation_data["_detail"] = detail
55
+ assert serializer.data == expected_representation_data
52
56
 
53
57
  def test_currency_model_serializer(self, mocker: MockerFixture, currency, expected_data):
54
58
  mocker.patch(
@@ -50,7 +50,7 @@ class TestCurrencyRepresentationViewSets:
50
50
  assert response.status_code == status.HTTP_200_OK
51
51
  assert instance.get("id") == euro.id
52
52
  assert instance.get("key") == euro.key
53
- assert instance.get("title") == euro.title
53
+ assert instance.get("name_repr") == f"{euro.title} ({euro.symbol})"
54
54
 
55
55
 
56
56
  @pytest.mark.viewset_tests
@@ -19,8 +19,8 @@ class CurrencyRepresentationViewSet(viewsets.RepresentationViewSet):
19
19
  serializer_class = CurrencyRepresentationSerializer
20
20
  filter_backends = (filters.OrderingFilter, filters.SearchFilter)
21
21
 
22
- ordering = ordering_fields = ["-symbol"]
23
- search_fields = ("symbol", "key")
22
+ ordering = ["name_repr"]
23
+ search_fields = ("name_repr", "key")
24
24
 
25
25
 
26
26
  class CurrencyModelViewSet(viewsets.ModelViewSet):
@@ -357,19 +357,36 @@ class CompanyModelDisplay(EntryModelDisplay):
357
357
  ),
358
358
  )
359
359
 
360
- display = Display(
360
+ grid_template_areas = [
361
+ ["profile_image", "name", "customer_status", "activity_table"],
362
+ ["profile_image", "primary_telephone", "primary_telephone", "activity_table"],
363
+ ["profile_image", "type", "tier", "activity_table"],
364
+ ["profile_image", "activity_heat", "activity_heat", "activity_table"],
365
+ ["employees_section", "employees_section", "employees_section", "employees_section"],
366
+ ]
367
+ sections = [employees_section]
368
+ if portfolio_fields:
369
+ grid_template_areas.insert(
370
+ 4,
371
+ [
372
+ portfolio_fields.key,
373
+ portfolio_fields.key,
374
+ portfolio_fields.key,
375
+ "activity_table",
376
+ ],
377
+ )
378
+ sections.append(portfolio_fields)
379
+ if aum_table:
380
+ grid_template_areas[-1][-1] = aum_table.key
381
+ sections.append(aum_table)
382
+
383
+ return Display(
361
384
  pages=[
362
385
  Page(
363
386
  title=_("Main Information"),
364
387
  layouts={
365
388
  default(): Layout(
366
- grid_template_areas=[
367
- ["profile_image", "name", "customer_status", "activity_table"],
368
- ["profile_image", "primary_telephone", "primary_telephone", "activity_table"],
369
- ["profile_image", "type", "tier", "activity_table"],
370
- ["profile_image", "activity_heat", "activity_heat", "activity_table"],
371
- ["employees_section", "employees_section", "employees_section", "employees_section"],
372
- ],
389
+ grid_template_areas=grid_template_areas,
373
390
  grid_template_columns=[
374
391
  Style.MIN_CONTENT,
375
392
  "minmax(min-content, 1fr)",
@@ -378,7 +395,7 @@ class CompanyModelDisplay(EntryModelDisplay):
378
395
  ],
379
396
  grid_template_rows=[Style.rem(6), Style.rem(6), Style.rem(6)],
380
397
  grid_auto_rows=Style.MIN_CONTENT,
381
- sections=[employees_section],
398
+ sections=sections,
382
399
  inlines=[
383
400
  Inline(
384
401
  key="activity_table",
@@ -403,29 +420,6 @@ class CompanyModelDisplay(EntryModelDisplay):
403
420
  ]
404
421
  )
405
422
 
406
- # Need to insert the portfolio fields into the display
407
- for page in display.pages:
408
- if page.title == "Main Information":
409
- for layout_key in page.layouts.keys():
410
- if portfolio_fields:
411
- # Insert the section with the AUM fields below the profile picture at the left
412
- page.layouts[layout_key].grid_template_areas.insert(
413
- 4,
414
- [
415
- portfolio_fields.key,
416
- portfolio_fields.key,
417
- portfolio_fields.key,
418
- "activity_table",
419
- ],
420
- )
421
- page.layouts[layout_key].sections.append(portfolio_fields)
422
- if aum_table:
423
- # Insert the section with the AUM table at the bottom right
424
- page.layouts[layout_key].grid_template_areas[-1][-1] = aum_table.key
425
- page.layouts[layout_key].sections.append(aum_table)
426
- break
427
- return display
428
-
429
423
  @classmethod
430
424
  def _get_new_company_instance_display(cls) -> Display:
431
425
  """Returns the display for creating a new company
@@ -1,5 +1,6 @@
1
1
  from typing import Iterable
2
2
 
3
+ from celery import shared_task
3
4
  from django.conf import settings
4
5
  from django.contrib.auth import get_user_model
5
6
  from django.db import transaction
@@ -63,6 +64,14 @@ def send_notification(
63
64
  )
64
65
 
65
66
 
67
+ @shared_task()
68
+ def send_notification_as_task(code, title, body, user_id, **kwargs):
69
+ if not isinstance(user_id, list):
70
+ user_id = [user_id]
71
+ user = User.objects.filter(id__in=user_id)
72
+ send_notification(code, title, body, user, **kwargs)
73
+
74
+
66
75
  @receiver(handle_widget_sharing)
67
76
  def share_notification(
68
77
  request, widget_relative_endpoint, share=False, share_message=None, share_recipients=None, **kwargs
@@ -5,6 +5,7 @@ from dynamic_preferences.types import IntegerPreference, StringPreference
5
5
  from dynamic_preferences.users.registries import user_preferences_registry
6
6
 
7
7
  from wbcore.contrib.dynamic_preferences.types import ChoicePreference, LanguageChoicePreference
8
+ from wbcore.utils.date import get_timezone_choices
8
9
 
9
10
  wbcore = Section("wbcore")
10
11
 
@@ -50,8 +51,21 @@ class LanguagePreference(LanguageChoicePreference):
50
51
 
51
52
 
52
53
  @user_preferences_registry.register
53
- class DateFormatPreference(ChoicePreference):
54
+ class TimezonePreference(ChoicePreference):
54
55
  weight = 0
56
+ # Value is a IANA timezone name
57
+ choices = get_timezone_choices()
58
+ section = wbcore
59
+ name = "timezone"
60
+ default = "Europe/Berlin"
61
+
62
+ verbose_name = _("Timezone")
63
+ help_text = _("Pick the timezone in which you want the workbench's dates to be displayed in.")
64
+
65
+
66
+ @user_preferences_registry.register
67
+ class DateFormatPreference(ChoicePreference):
68
+ weight = 1
55
69
  choices = [
56
70
  ("DD.MM.YYYY", "13.04.2007"),
57
71
  ("DD/MM/YYYY", "13/04/2007"),
@@ -77,7 +91,7 @@ class DateFormatPreference(ChoicePreference):
77
91
 
78
92
  @user_preferences_registry.register
79
93
  class TimeFormatPreference(ChoicePreference):
80
- weight = 1
94
+ weight = 2
81
95
  choices = [
82
96
  ("HH:mm", "14:05"),
83
97
  ("hh:mm", "02:05"),
@@ -100,7 +114,7 @@ class TimeFormatPreference(ChoicePreference):
100
114
 
101
115
  @user_preferences_registry.register
102
116
  class NumberFormatPreference(ChoicePreference):
103
- weight = 2
117
+ weight = 3
104
118
  # Value is a BCP 47 region subtag
105
119
  choices = [
106
120
  ("US", "1,234,567.89"),
@@ -109,8 +109,6 @@ class DateTimeRangeField(RangeMixin, ShortcutMixin, serializers.DateTimeField):
109
109
  representation["upper_time_choices"] = self.upper_time_choices(self, request)
110
110
  else:
111
111
  representation["upper_time_choices"] = self.upper_time_choices
112
- if timezone := getattr(self, "timezone", None):
113
- representation["timezone"] = str(timezone)
114
112
  return key, representation
115
113
 
116
114
 
@@ -121,7 +119,6 @@ class TimeRange(RangeMixin, ShortcutMixin, serializers.TimeField):
121
119
  def __init__(self, *args, timerange_fields: tuple[str, str] | None = None, **kwargs):
122
120
  self.timerange_fields = timerange_fields
123
121
  super().__init__(*args, **kwargs)
124
- self.timezone = None
125
122
  self.default_date_repr = date.min.strftime(getattr(self, "format", api_settings.DATE_FORMAT))
126
123
  if self.timerange_fields:
127
124
  self.source = "*"
@@ -334,6 +334,7 @@ class RepresentationSerializer(WBCoreSerializerFieldMixin, ModelSerializer):
334
334
  getattr(self, "optional_get_parameters", None),
335
335
  )
336
336
  self.tree_config = tree_config
337
+ self.select_first_choice = kwargs.pop("select_first_choice", getattr(self, "select_first_choice", None))
337
338
  super().__init__(*args, **kwargs)
338
339
 
339
340
  def to_representation(self, value):
@@ -410,6 +411,9 @@ class RepresentationSerializer(WBCoreSerializerFieldMixin, ModelSerializer):
410
411
  },
411
412
  }
412
413
 
414
+ if self.select_first_choice:
415
+ representation["select_first_choice"] = True
416
+
413
417
  if self.help_text:
414
418
  representation["help_text"] = self.help_text
415
419
 
wbcore/utils/date.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from collections import defaultdict
2
- from datetime import date, datetime, time, timedelta
2
+ from datetime import date, datetime, time, timedelta, timezone
3
+ from zoneinfo import ZoneInfo, available_timezones
3
4
 
4
5
  from dateutil import rrule
5
6
  from django.utils.dateparse import parse_date
@@ -222,3 +223,15 @@ def get_next_day_timedelta(now: datetime | None = None) -> int:
222
223
  if not now:
223
224
  now = datetime.now()
224
225
  return (datetime.combine(now.date() + timedelta(days=1), time(0, 0, 0)) - now).seconds
226
+
227
+
228
+ def get_timezone_choices() -> list[tuple[str, str]]:
229
+ now_utc = datetime.now(timezone.utc)
230
+ tz_tuples = [] # a list of (timezone_name, timezone_name (UTC offset))
231
+ for tz_name in sorted(available_timezones()):
232
+ tz = ZoneInfo(tz_name)
233
+ now_in_tz = now_utc.astimezone(tz)
234
+ offset_str = now_in_tz.strftime("UTC%z") # gives UTC+HHMM
235
+ offset_str = offset_str[:-2] + ":" + offset_str[-2:]
236
+ tz_tuples.append((tz_name, f"{tz_name} ({offset_str})"))
237
+ return tz_tuples
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbcore
3
- Version: 1.57.1
3
+ Version: 1.58.1
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  Requires-Dist: boto3==1.35.*
6
6
  Requires-Dist: celery[redis]==5.*
@@ -2,7 +2,7 @@ wbcore/__init__.py,sha256=J-j-u0itpEFT6irdmWmixQqYMadNl1X91TxUmoiLHMI,22
2
2
  wbcore/admin.py,sha256=ES5cf6mX9dLeihMYnv9Ol6YTuD2zyexv3qr3nHEL5OI,6771
3
3
  wbcore/apps.py,sha256=GbEGrRyFv6TSfo-rkvdxMnPU9J6RFpqhqU4ibE7rARw,482
4
4
  wbcore/dispatch.py,sha256=QiLhugCp5FJzOWkiKittene8bVbYbPJbb-NDS7Y4Suo,2053
5
- wbcore/dynamic_preferences_registry.py,sha256=o0VMLbAnv-VUfc1HZV9pxr91ngUrCNWK7D2beHSWPik,3450
5
+ wbcore/dynamic_preferences_registry.py,sha256=maplz8DukWht052A6DwB0s-4ZfghtNIE2u9r2i8vhuo,3877
6
6
  wbcore/enums.py,sha256=DUJzxDPvDBrjg_B1rqhKA6WMQ8bQfRcITMljG3yYKcQ,938
7
7
  wbcore/forms.py,sha256=aUUT9XxZGSvpr3ZyhTv6AeydRayn7Jy1besKWybQa0A,3633
8
8
  wbcore/frontend.py,sha256=TA2duYbgzRLrjmU2ImSGgJmGTu_J_w0n1Bh_b7s94uQ,856
@@ -213,8 +213,8 @@ wbcore/contrib/currency/admin.py,sha256=40IS_gMyIXjYYUka35Olk3aYI3cLLb5NXpC_rWds
213
213
  wbcore/contrib/currency/apps.py,sha256=10grJHw9gyBLDfbVJ-gGGUFcU5AgTaH7uBFr8j0bshE,106
214
214
  wbcore/contrib/currency/dynamic_preferences_registry.py,sha256=1f4tPjAf1OYyp4FPUZ9WCdh8cEcM_1OD_y5GWRCa6NA,1074
215
215
  wbcore/contrib/currency/factories.py,sha256=DTFzyceTewYzj3IFyI3roJCwF1VWKZOZKLcsJg829mA,1211
216
- wbcore/contrib/currency/models.py,sha256=GwlFpHBCv1Zj7goAvpfC6S96M1qvXzjVEKs76kOpFiM,6357
217
- wbcore/contrib/currency/serializers.py,sha256=OGv9MCvN9GK8vThZ2B84zHZqyokAp69TDuqPaTaiGP8,1326
216
+ wbcore/contrib/currency/models.py,sha256=Qxa_d-6oNL4VtCoAgXVvXqe9nO1IOeAb3f2aCnYASJg,6961
217
+ wbcore/contrib/currency/serializers.py,sha256=v9y5ldcxe9cm2rabwEI9yHIj2Sp0QKnVAs9eX6F60fY,1448
218
218
  wbcore/contrib/currency/urls.py,sha256=kyM6mM-1wQtsdc58r7MsSgAGhVS-4U-xLPeC3-XPNys,685
219
219
  wbcore/contrib/currency/fixtures/currency.yaml,sha256=lB0DyTrfSt96fym_fc8_13qsWIk09h-6jfVnjHIhVQs,17225
220
220
  wbcore/contrib/currency/fixtures/currency_fx_rate.yaml,sha256=tzkBO-Vc-RYFCzbT2ys9MOQxhB0zBvseHaPjVerg3qY,1452692
@@ -236,10 +236,10 @@ wbcore/contrib/currency/release_notes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
236
236
  wbcore/contrib/currency/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
237
  wbcore/contrib/currency/tests/conftest.py,sha256=WVsiPAsvPDwt9SsCSrUjM-jg5uc02Nqor8xQFltoZm8,200
238
238
  wbcore/contrib/currency/tests/test_models.py,sha256=BWvcy8de3hXqo1-SlilVS4L5RHEZ9g3cPCyfZk-WFiI,4720
239
- wbcore/contrib/currency/tests/test_serializers.py,sha256=yO4bphUZ_ghvoKB4L_xK5DFn7CWXhAyZfBfxodrT6sU,2698
240
- wbcore/contrib/currency/tests/test_viewsets.py,sha256=EhTLnh0MSMo5eYFUhvQlNJHCeA0L9bhY7WJZydnVJLE,7173
239
+ wbcore/contrib/currency/tests/test_serializers.py,sha256=5AIH6thmG76bjBTuVFnB4_izfDrXZIsDZ7xsOvXi4lw,2928
240
+ wbcore/contrib/currency/tests/test_viewsets.py,sha256=aGuKRY9UE-1JIDBWQMWbhZUAg1Envh7JNa4AgnMhqTw,7198
241
241
  wbcore/contrib/currency/viewsets/__init__.py,sha256=uPP607FDQ8gdiZq898RfRAmhMJ-zQgzBrejbc9kVf_E,141
242
- wbcore/contrib/currency/viewsets/currency.py,sha256=-zEavlYn1ODN7DaJCMapU-S1ETpoE2Q31sGB9UuroXU,1942
242
+ wbcore/contrib/currency/viewsets/currency.py,sha256=LcSZponETU62YkRPLk5Omj5Lu6GHMLnxblPaGKfN6HQ,1929
243
243
  wbcore/contrib/currency/viewsets/currency_fx_rates.py,sha256=p9trRNGbaaOyrG68sp-ef0T38eKnOXcaT0TBwdC6UMs,1217
244
244
  wbcore/contrib/currency/viewsets/buttons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
245
245
  wbcore/contrib/currency/viewsets/display/__init__.py,sha256=5TGu-Uz_bbUA67zaktMY-DRjuws1tHAtfTVEzA5hPlg,112
@@ -375,7 +375,7 @@ wbcore/contrib/directory/viewsets/buttons/entries.py,sha256=X7tH209qPojFNlBiE8hU
375
375
  wbcore/contrib/directory/viewsets/buttons/relationships.py,sha256=Q1vLLA9ZGt-s29Of8dj24IlMQzDzW_sMPU7n_F00DuY,2786
376
376
  wbcore/contrib/directory/viewsets/display/__init__.py,sha256=NiC0d1-RjPIYEzkGAQzThNFQeYv5UAW3aKL9j_lFV38,945
377
377
  wbcore/contrib/directory/viewsets/display/contacts.py,sha256=2PBSxVmbq_26LyhSTWrpjNv9cxKz7w086BqoVX7SDs4,13449
378
- wbcore/contrib/directory/viewsets/display/entries.py,sha256=tMqdgklK_YjqQ6at2c4aBBf_yvx5PoxvPjWpIqVZw_Q,24295
378
+ wbcore/contrib/directory/viewsets/display/entries.py,sha256=tK2tsiJvKy_SEWHq9TT30Nu1g158bpGv5z4EnFd9psQ,23548
379
379
  wbcore/contrib/directory/viewsets/display/relationships.py,sha256=-s3ABMIGmbvmAOe8CRJqVv8RpKaMw7xeoy0HSvo0kRQ,11587
380
380
  wbcore/contrib/directory/viewsets/display/utils.py,sha256=5sMFdEXUfanKp60IvTyO4YLqFlEUz9fGMldoqTYTnwU,830
381
381
  wbcore/contrib/directory/viewsets/endpoints/__init__.py,sha256=0z1LYIrLQvIcs2qZEfD2SYB6tqycmSQjlJ4NwZgd0JY,647
@@ -722,7 +722,7 @@ wbcore/contrib/notifications/admin.py,sha256=aeLRLXw-5-fRXrrRAyFBtoFo8rzu8XSozM1
722
722
  wbcore/contrib/notifications/apps.py,sha256=O5rwHeCn3FBTE1rjJgNDahJcGXQqezvIEX7T1RtBsZ8,1883
723
723
  wbcore/contrib/notifications/configs.py,sha256=Brt_79I8teg-sLzy6KBVsb0eXg-KFmgv_t-bNdznX5k,538
724
724
  wbcore/contrib/notifications/configurations.py,sha256=ZoNd8cdbw8Y-rQIQtS2VgieUO8FQ-kdgZdzNMwqL484,327
725
- wbcore/contrib/notifications/dispatch.py,sha256=-zYNEdT4uab4qlRRN2ZStHwVoR4ul9k_R6gCeGuAmic,2973
725
+ wbcore/contrib/notifications/dispatch.py,sha256=64LrSiZXk545QJ_PpOKqEQZO4Jep5-MRcPgtU_w5qaQ,3260
726
726
  wbcore/contrib/notifications/tasks.py,sha256=ayNcO2WoPDdc9ktfPxdod7Odja5xhn1o7eVUyrSm1zE,2051
727
727
  wbcore/contrib/notifications/urls.py,sha256=C764DdlQcJaPjzRKqKrLxKMhpZITZe-YLZaAQOFtzys,872
728
728
  wbcore/contrib/notifications/utils.py,sha256=Ou8JwrsDfJ_OHaz4qJuNrR5nhgKXAatRyFyWwAYrCaY,929
@@ -1092,12 +1092,12 @@ 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=pEcbOD6f8RCANG2cM1KBrYPxs15BSqJLrmlu2nvAgqI,18834
1095
+ wbcore/serializers/serializers.py,sha256=5o2w91TacoyTWi0MHpbezVRfUP5u2re_1k88BtHtH-4,19042
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
1099
1099
  wbcore/serializers/fields/choice.py,sha256=ozVwKaPCpsgPuQXQWr8TxHIcxSdGvhw23OFVD0xnipg,2128
1100
- wbcore/serializers/fields/datetime.py,sha256=XYt6wRT4lCuiQfBPRXhUFaeCRpJkFqnqFG79QXej62c,7526
1100
+ wbcore/serializers/fields/datetime.py,sha256=UVrBAdh-Iy3cDdVxbce9rsPYwwfxDJ-kJEr_1K_29ec,7386
1101
1101
  wbcore/serializers/fields/fields.py,sha256=nRvVGqjaqgDThKKuMptrM5_IOKNi_hkGuL5rP2cr4Uw,7005
1102
1102
  wbcore/serializers/fields/file.py,sha256=tDDK2bITiP7zxl9Ilzja2_gWae_lf9CkO1rDEBPaj6g,568
1103
1103
  wbcore/serializers/fields/fsm.py,sha256=xUYxDj166PDnmDLggI4fShXdSunJVzbc8quFQioM3Yc,700
@@ -1199,7 +1199,7 @@ wbcore/tests/test_utils/test_primary.py,sha256=a6FF5V3CFZmsD1fxEZFONTW9Z3oBzJSRD
1199
1199
  wbcore/tests/test_utils/test_signals.py,sha256=W9d3YBF5DqbH3AwNa1_3RVq0HuLB5oI2fIp6Fj0eaYQ,1339
1200
1200
  wbcore/utils/__init__.py,sha256=CpWxRXxxPpu3MU7TNEGqfAFpdYUpjw2FTo0lKjWUE1c,325
1201
1201
  wbcore/utils/cache.py,sha256=3p2sA7UNSO08TmLLrSB-rIUgJ_FkGPj2TdCG-M1OMAc,279
1202
- wbcore/utils/date.py,sha256=vJBFbHnqKZvNmnjzkdSawMw4k1v_S45jUxfk8Z6ghGg,7334
1202
+ wbcore/utils/date.py,sha256=tSNatnQ3CBNvyPjt5sZHctLtY0cOy4OHD4NOqInLdXE,7905
1203
1203
  wbcore/utils/deprecations.py,sha256=ju1h3-icVlJnItZkugdOdeX4sY3QJIeFxXxAo9TG_rM,269
1204
1204
  wbcore/utils/enum.py,sha256=eTTMt03iCMaNEoB5xsq5IGxkCi8X3xfIRjJNI0ygzWs,533
1205
1205
  wbcore/utils/figures.py,sha256=PgORGOByqq3kSTTwSoRgoSOirqwz57qu6rQs57w5AMc,9223
@@ -1230,6 +1230,6 @@ wbcore/viewsets/generics.py,sha256=lKDq9UY_Tyc56u1bqaIEvHGgoaXwXxpZ1c3fLVteptI,1
1230
1230
  wbcore/viewsets/mixins.py,sha256=IdHd_uixOv3ExKoHxTgL5Bt8OELIwfYwhBZm0nsvZfc,12054
1231
1231
  wbcore/viewsets/utils.py,sha256=4520Ij3ASM8lOa8QZkCqbBfOexVRiZu688eW-PGqMOA,882
1232
1232
  wbcore/viewsets/viewsets.py,sha256=FPPESunEjlunDr5VFsjTfsquTS3iDSQkw0H6QjMKPqk,6574
1233
- wbcore-1.57.1.dist-info/METADATA,sha256=Jg__1RGkPViuZeEigvawy6OW0oQ2M63hV12DfUBfYCE,2332
1234
- wbcore-1.57.1.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
1235
- wbcore-1.57.1.dist-info/RECORD,,
1233
+ wbcore-1.58.1.dist-info/METADATA,sha256=aEtD04ozqu19fyRFpUKCqwUuVlSGN6uKctMsRp_OdCM,2332
1234
+ wbcore-1.58.1.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
1235
+ wbcore-1.58.1.dist-info/RECORD,,