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.
- wbcore/contrib/currency/models.py +25 -7
- wbcore/contrib/currency/serializers.py +5 -1
- wbcore/contrib/currency/tests/test_serializers.py +7 -3
- wbcore/contrib/currency/tests/test_viewsets.py +1 -1
- wbcore/contrib/currency/viewsets/currency.py +2 -2
- wbcore/contrib/directory/viewsets/display/entries.py +26 -32
- wbcore/contrib/notifications/dispatch.py +9 -0
- wbcore/dynamic_preferences_registry.py +17 -3
- wbcore/serializers/fields/datetime.py +0 -3
- wbcore/serializers/serializers.py +4 -0
- wbcore/utils/date.py +14 -1
- {wbcore-1.57.1.dist-info → wbcore-1.58.1.dist-info}/METADATA +1 -1
- {wbcore-1.57.1.dist-info → wbcore-1.58.1.dist-info}/RECORD +14 -14
- {wbcore-1.57.1.dist-info → wbcore-1.58.1.dist-info}/WHEEL +0 -0
|
@@ -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
|
-
|
|
26
|
-
|
|
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 =
|
|
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 "{{
|
|
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", "
|
|
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,
|
|
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
|
-
|
|
51
|
-
assert serializer.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("
|
|
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 =
|
|
23
|
-
search_fields = ("
|
|
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
|
-
|
|
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=
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
@@ -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=
|
|
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=
|
|
217
|
-
wbcore/contrib/currency/serializers.py,sha256=
|
|
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=
|
|
240
|
-
wbcore/contrib/currency/tests/test_viewsets.py,sha256=
|
|
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
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1234
|
-
wbcore-1.
|
|
1235
|
-
wbcore-1.
|
|
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,,
|
|
File without changes
|