layrz-sdk 4.0.29__tar.gz → 4.0.31__tar.gz

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.

Potentially problematic release.


This version of layrz-sdk might be problematic. Click here for more details.

Files changed (138) hide show
  1. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/CHANGELOG.md +9 -0
  2. {layrz_sdk-4.0.29/layrz_sdk.egg-info → layrz_sdk-4.0.31}/PKG-INFO +1 -1
  3. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/locator.py +14 -1
  4. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/operation_payload.py +84 -21
  5. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31/layrz_sdk.egg-info}/PKG-INFO +1 -1
  6. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/pyproject.toml +1 -1
  7. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/uv.lock +1 -1
  8. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/.github/workflows/checks.yml +0 -0
  9. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/.github/workflows/deploy.yml +0 -0
  10. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/.gitignore +0 -0
  11. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/.vscode/extensions.json +0 -0
  12. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/CODE_OF_CONDUCT.md +0 -0
  13. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/CONTRIBUTING.md +0 -0
  14. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/LICENSE +0 -0
  15. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/README.md +0 -0
  16. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/__init__.py +0 -0
  17. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/constants.py +0 -0
  18. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/decorators/__init__.py +0 -0
  19. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/decorators/func_timing.py +0 -0
  20. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/__init__.py +0 -0
  21. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/action.py +0 -0
  22. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/action_geofence_ownership.py +0 -0
  23. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/action_kind.py +0 -0
  24. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/action_subkind.py +0 -0
  25. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/asset.py +0 -0
  26. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/asset_constants.py +0 -0
  27. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/asset_contact.py +0 -0
  28. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/asset_operation_mode.py +0 -0
  29. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/ats_entry.py +0 -0
  30. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/ats_exit_history.py +0 -0
  31. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/ats_operation.py +0 -0
  32. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/ats_possible_entry.py +0 -0
  33. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/ats_possible_exit.py +0 -0
  34. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/ats_purchaseorder.py +0 -0
  35. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/ats_reception.py +0 -0
  36. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/broadcast/__init__.py +0 -0
  37. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/broadcast/payload.py +0 -0
  38. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/broadcast/request.py +0 -0
  39. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/broadcast/response.py +0 -0
  40. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/broadcast/result.py +0 -0
  41. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/broadcast/service.py +0 -0
  42. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/broadcast/status.py +0 -0
  43. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/case.py +0 -0
  44. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/case_ignored_status.py +0 -0
  45. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/case_status.py +0 -0
  46. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/axis_config.py +0 -0
  47. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/bar_chart.py +0 -0
  48. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/chart_alignment.py +0 -0
  49. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/chart_color.py +0 -0
  50. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/chart_configuration.py +0 -0
  51. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/chart_data_serie.py +0 -0
  52. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/chart_data_serie_type.py +0 -0
  53. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/chart_data_type.py +0 -0
  54. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/chart_render_technology.py +0 -0
  55. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/column_chart.py +0 -0
  56. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/html_chart.py +0 -0
  57. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/line_chart.py +0 -0
  58. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/map_center_type.py +0 -0
  59. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/map_chart.py +0 -0
  60. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/map_point.py +0 -0
  61. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/number_chart.py +0 -0
  62. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/pie_chart.py +0 -0
  63. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/radar_chart.py +0 -0
  64. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/radial_bar_chart.py +0 -0
  65. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/scatter_chart.py +0 -0
  66. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/scatter_serie.py +0 -0
  67. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/scatter_serie_item.py +0 -0
  68. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/table_chart.py +0 -0
  69. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/table_header.py +0 -0
  70. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/table_row.py +0 -0
  71. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/timeline_chart.py +0 -0
  72. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/timeline_serie.py +0 -0
  73. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/charts/timeline_serie_item.py +0 -0
  74. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/checkpoint.py +0 -0
  75. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/command_series_ticket.py +0 -0
  76. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/comment.py +0 -0
  77. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/custom_field.py +0 -0
  78. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/custom_report_page.py +0 -0
  79. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/destination_phone.py +0 -0
  80. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/device.py +0 -0
  81. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/event.py +0 -0
  82. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/exchange_service.py +0 -0
  83. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/function.py +0 -0
  84. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/geofence.py +0 -0
  85. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/geofence_category.py +0 -0
  86. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/last_message.py +0 -0
  87. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/message.py +0 -0
  88. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/modbus/__init__.py +0 -0
  89. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/modbus/config.py +0 -0
  90. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/modbus/parameter.py +0 -0
  91. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/modbus/schema.py +0 -0
  92. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/modbus/status.py +0 -0
  93. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/modbus/wait.py +0 -0
  94. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/notification_type.py +0 -0
  95. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/operation.py +0 -0
  96. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/operation_case_payload.py +0 -0
  97. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/operation_type.py +0 -0
  98. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/outbound_service.py +0 -0
  99. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/platform.py +0 -0
  100. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/position.py +0 -0
  101. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/presence_type.py +0 -0
  102. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/preset.py +0 -0
  103. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/report.py +0 -0
  104. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/report_col.py +0 -0
  105. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/report_configuration.py +0 -0
  106. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/report_data_type.py +0 -0
  107. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/report_format.py +0 -0
  108. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/report_header.py +0 -0
  109. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/report_page.py +0 -0
  110. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/report_row.py +0 -0
  111. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/request_type.py +0 -0
  112. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/sensor.py +0 -0
  113. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/sensor_mask.py +0 -0
  114. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/sound_effect.py +0 -0
  115. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/static_position.py +0 -0
  116. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/telemetry/__init__.py +0 -0
  117. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/telemetry/assetmessage.py +0 -0
  118. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/telemetry/devicemessage.py +0 -0
  119. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/text_alignment.py +0 -0
  120. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/timezone.py +0 -0
  121. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/trigger.py +0 -0
  122. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/trigger_kind.py +0 -0
  123. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/user.py +0 -0
  124. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/waypoint.py +0 -0
  125. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/entities/weekday.py +0 -0
  126. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/helpers/__init__.py +0 -0
  127. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/helpers/color.py +0 -0
  128. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/lcl/__init__.py +0 -0
  129. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/lcl/core.py +0 -0
  130. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk/py.typed +0 -0
  131. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk.egg-info/SOURCES.txt +0 -0
  132. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk.egg-info/dependency_links.txt +0 -0
  133. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk.egg-info/requires.txt +0 -0
  134. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/layrz_sdk.egg-info/top_level.txt +0 -0
  135. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/manual_deploy.py +0 -0
  136. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/setup.cfg +0 -0
  137. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/tests/__init__.py +0 -0
  138. {layrz_sdk-4.0.29 → layrz_sdk-4.0.31}/tests/test_lcl.py +0 -0
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.0.31
4
+
5
+ - Refined `OperationPayload` serialization to rely on field serializers, ensuring nested models, enums, datetimes, and timedeltas dump with the expected API shape.
6
+ - Allowed passing Twilio host phone data as dictionaries when constructing `OperationPayload`.
7
+
8
+ ## 4.0.30
9
+
10
+ - Added a validation for `pk` field in `Locator` entity to ensure it is always a string, converting from `int` or `UUID` if necessary.
11
+
3
12
  ## 4.0.29
4
13
 
5
14
  - Added `created_at` and `updated_at` fields to `Locator` entity to track creation and last update timestamps.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: layrz-sdk
3
- Version: 4.0.29
3
+ Version: 4.0.31
4
4
  Summary: Layrz SDK for Python
5
5
  Author-email: "Golden M, Inc." <software@goldenm.com>
6
6
  Maintainer-email: Kenny Mochizuki <kenny@goldenm.com>, Luis Reyes <lreyes@goldenm.com>, Kasen Li <kli@goldenm.com>, Miguel Zauzich <miguel@goldenm.com>, Angel Prieto <aprieto@goldenm.com>
@@ -1,6 +1,8 @@
1
1
  from datetime import datetime
2
+ from typing import Any
3
+ from uuid import UUID
2
4
 
3
- from pydantic import BaseModel, Field, field_serializer
5
+ from pydantic import BaseModel, Field, field_serializer, field_validator
4
6
 
5
7
  from .asset import Asset
6
8
  from .geofence import Geofence
@@ -17,6 +19,17 @@ class LocatorMqttConfig(BaseModel):
17
19
 
18
20
  class Locator(BaseModel):
19
21
  pk: str = Field(..., description='Defines the primary key of the locator', alias='id')
22
+
23
+ @field_validator('pk', mode='before')
24
+ def validate_pk(cls, v: Any) -> str:
25
+ if isinstance(v, int):
26
+ return str(v)
27
+ if isinstance(v, str):
28
+ return v
29
+ if isinstance(v, UUID):
30
+ return str(v)
31
+ raise ValueError('Invalid type for pk')
32
+
20
33
  token: str = Field(..., description='Defines the token of the locator')
21
34
  owner_id: int = Field(..., description='Defines the owner ID of the locator')
22
35
 
@@ -3,7 +3,7 @@
3
3
  from datetime import datetime, timedelta
4
4
  from typing import Any, Self
5
5
 
6
- from pydantic import BaseModel, Field, field_validator
6
+ from pydantic import BaseModel, Field, field_serializer, field_validator
7
7
 
8
8
  from layrz_sdk.entities.asset import Asset
9
9
  from layrz_sdk.entities.destination_phone import DestinationPhone
@@ -22,29 +22,16 @@ from layrz_sdk.entities.trigger import Trigger
22
22
  class OperationPayload(BaseModel):
23
23
  """Operation Payload entity"""
24
24
 
25
- model_config = {
26
- 'json_encoders': {
27
- timedelta: lambda v: v.total_seconds(),
28
- datetime: lambda v: v.timestamp(),
29
- Asset: lambda v: v.model_dump(by_alias=True, exclude_none=True),
30
- Trigger: lambda v: v.model_dump(by_alias=True, exclude_none=True),
31
- Operation: lambda v: v.model_dump(by_alias=True, exclude_none=True),
32
- Geofence: lambda v: v.model_dump(by_alias=True, exclude_none=True),
33
- OperationType: lambda v: v.value,
34
- HttpRequestType: lambda v: v.value,
35
- TwilioNotificationType: lambda v: v.value,
36
- SoundEffect: lambda v: v.value,
37
- Platform: lambda v: v.value,
38
- PresenceType: lambda v: v.value,
39
- },
40
- }
41
-
42
25
  kind: OperationType = Field(
43
26
  ...,
44
27
  description='Defines the kind of the operation',
45
28
  alias='operationType',
46
29
  )
47
30
 
31
+ @field_serializer('kind', when_used='always')
32
+ def serialize_kind(self, value: OperationType) -> str:
33
+ return value.value
34
+
48
35
  asset: Asset = Field(..., description='Defines the asset associated with the operation')
49
36
 
50
37
  @field_validator('asset', mode='before')
@@ -52,7 +39,7 @@ class OperationPayload(BaseModel):
52
39
  """Serialize asset to a dictionary"""
53
40
  if isinstance(value, Asset):
54
41
  return Asset(
55
- id=value.pk,
42
+ id=value.pk, # ty: ignore
56
43
  name=value.name,
57
44
  operation_mode=value.operation_mode,
58
45
  vin=value.vin,
@@ -66,6 +53,11 @@ class OperationPayload(BaseModel):
66
53
 
67
54
  raise ValueError('Asset must be an instance of Asset or a dictionary')
68
55
 
56
+ @field_serializer('asset', when_used='always')
57
+ def serialize_asset_field(self, value: Asset) -> dict[str, Any]:
58
+ """Serialize asset to a dictionary"""
59
+ return value.model_dump(by_alias=True)
60
+
69
61
  trigger: Trigger = Field(..., description='Defines the trigger associated with the operation')
70
62
 
71
63
  @field_validator('trigger', mode='before')
@@ -73,7 +65,7 @@ class OperationPayload(BaseModel):
73
65
  """Serialize trigger to a dictionary"""
74
66
  if isinstance(value, Trigger):
75
67
  return Trigger(
76
- id=value.pk,
68
+ id=value.pk, # ty: ignore
77
69
  name=value.name,
78
70
  code=value.code,
79
71
  )
@@ -83,6 +75,11 @@ class OperationPayload(BaseModel):
83
75
 
84
76
  raise ValueError('Trigger must be an instance of Trigger or a dictionary')
85
77
 
78
+ @field_serializer('trigger', when_used='always')
79
+ def serialize_trigger_field(self, value: Trigger) -> dict[str, Any]:
80
+ """Serialize trigger to a dictionary"""
81
+ return value.model_dump(by_alias=True)
82
+
86
83
  operation: Operation = Field(..., description='Defines the operation associated with the payload')
87
84
 
88
85
  @field_validator('operation', mode='before')
@@ -90,7 +87,7 @@ class OperationPayload(BaseModel):
90
87
  """Serialize operation to a dictionary"""
91
88
  if isinstance(value, Operation):
92
89
  return Operation(
93
- id=value.pk,
90
+ id=value.pk, # ty: ignore
94
91
  name=value.name,
95
92
  operation_type=value.kind,
96
93
  timezone=value.timezone,
@@ -101,12 +98,21 @@ class OperationPayload(BaseModel):
101
98
 
102
99
  raise ValueError('Operation must be an instance of Operation or a dictionary')
103
100
 
101
+ @field_serializer('operation', when_used='always')
102
+ def serialize_operation_field(self, value: Operation) -> dict[str, Any]:
103
+ """Serialize operation to a dictionary"""
104
+ return value.model_dump(by_alias=True)
105
+
104
106
  activated_at: datetime = Field(
105
107
  ...,
106
108
  description='Defines the date when the operation was activated',
107
109
  alias='activatedAt',
108
110
  )
109
111
 
112
+ @field_serializer('activated_at', when_used='always')
113
+ def serialize_activated_at(self, value: datetime) -> float:
114
+ return value.timestamp()
115
+
110
116
  position: dict[str, Any] = Field(
111
117
  default_factory=dict,
112
118
  description='Defines the position of the operation',
@@ -122,18 +128,36 @@ class OperationPayload(BaseModel):
122
128
  description='Defines the geofence of the operation',
123
129
  )
124
130
 
131
+ @field_serializer('geofence', when_used='always')
132
+ def serialize_geofence(self, value: Geofence | None) -> Any:
133
+ if value is None:
134
+ return None
135
+ return value.model_dump(by_alias=True)
136
+
125
137
  presence_type: PresenceType | None = Field(
126
138
  default=None,
127
139
  description='Defines the presence type of the operation',
128
140
  alias='presenceType',
129
141
  )
130
142
 
143
+ @field_serializer('presence_type', when_used='always')
144
+ def serialize_presence_type(self, value: PresenceType | None) -> Any:
145
+ if value is None:
146
+ return None
147
+ return value.value
148
+
131
149
  case_: OperationCasePayload | None = Field(
132
150
  default=None,
133
151
  description='Defines the case of the operation',
134
152
  alias='case',
135
153
  )
136
154
 
155
+ @field_serializer('case_', when_used='always')
156
+ def serialize_case(self, value: OperationCasePayload | None) -> Any:
157
+ if value is None:
158
+ return None
159
+ return value.model_dump(by_alias=True)
160
+
137
161
  language_id: int = Field(
138
162
  default=2,
139
163
  description='Defines the language ID of the operation',
@@ -167,6 +191,13 @@ class OperationPayload(BaseModel):
167
191
  description='Defines the HTTP method of the operation',
168
192
  alias='method',
169
193
  )
194
+
195
+ @field_serializer('http_method', when_used='always')
196
+ def serialize_http_method(self, value: HttpRequestType | None) -> Any:
197
+ if value is None:
198
+ return None
199
+ return value.value
200
+
170
201
  http_headers: list[dict[str, Any]] = Field(
171
202
  default_factory=list,
172
203
  description='Defines the headers of the operation',
@@ -215,18 +246,38 @@ class OperationPayload(BaseModel):
215
246
 
216
247
  return []
217
248
 
249
+ @field_serializer('destinations', when_used='always')
250
+ def serialize_destinations_field(self, value: list[DestinationPhone]) -> list[dict[str, Any]]:
251
+ """Serialize destinations to a list of dictionaries"""
252
+ return [dest.model_dump(by_alias=True) for dest in value]
253
+
218
254
  twilio_host_phone: DestinationPhone | None = Field(
219
255
  default=None,
220
256
  description='Defines the host phone number for Twilio notifications',
221
257
  alias='hostPhone',
222
258
  )
223
259
 
260
+ @field_validator('twilio_host_phone', mode='before')
261
+ def serialize_twilio_host_phone(cls, value: Any) -> DestinationPhone | None:
262
+ """Serialize host phone to a DestinationPhone"""
263
+ if isinstance(value, DestinationPhone):
264
+ return value
265
+
266
+ if isinstance(value, dict):
267
+ return DestinationPhone.model_validate(value)
268
+
269
+ return None
270
+
224
271
  twilio_notification_type: TwilioNotificationType = Field(
225
272
  default=TwilioNotificationType.SMS,
226
273
  description='Defines the Twilio notification type of the operation',
227
274
  alias='notificationType',
228
275
  )
229
276
 
277
+ @field_serializer('twilio_notification_type', when_used='always')
278
+ def serialize_twilio_notification_type(self, value: TwilioNotificationType) -> str:
279
+ return value.value
280
+
230
281
  username: str | None = Field(
231
282
  default=None,
232
283
  description='Defines the username for the operation',
@@ -262,6 +313,10 @@ class OperationPayload(BaseModel):
262
313
  alias='pushPlatforms',
263
314
  )
264
315
 
316
+ @field_serializer('push_platforms', when_used='always')
317
+ def serialize_push_platforms(self, value: list[Platform]) -> list[str]:
318
+ return [platform.value for platform in value]
319
+
265
320
  ## For usage of In-app notifications operations
266
321
  destinations_ids: list[int] = Field(
267
322
  default_factory=list,
@@ -274,6 +329,10 @@ class OperationPayload(BaseModel):
274
329
  alias='soundEffect',
275
330
  )
276
331
 
332
+ @field_serializer('sound_effect', when_used='always')
333
+ def serialize_sound_effect(self, value: SoundEffect) -> str:
334
+ return value.value
335
+
277
336
  sound_effect_uri: str | None = Field(
278
337
  default=None,
279
338
  description='Defines the sound effect URI for the operation',
@@ -301,3 +360,7 @@ class OperationPayload(BaseModel):
301
360
  if isinstance(value, (int, float)):
302
361
  return timedelta(seconds=value)
303
362
  return timedelta(seconds=0)
363
+
364
+ @field_serializer('duration', when_used='always')
365
+ def serialize_duration(self, value: timedelta) -> float:
366
+ return value.total_seconds()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: layrz-sdk
3
- Version: 4.0.29
3
+ Version: 4.0.31
4
4
  Summary: Layrz SDK for Python
5
5
  Author-email: "Golden M, Inc." <software@goldenm.com>
6
6
  Maintainer-email: Kenny Mochizuki <kenny@goldenm.com>, Luis Reyes <lreyes@goldenm.com>, Kasen Li <kli@goldenm.com>, Miguel Zauzich <miguel@goldenm.com>, Angel Prieto <aprieto@goldenm.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "layrz-sdk"
3
- version = "4.0.29"
3
+ version = "4.0.31"
4
4
  description = "Layrz SDK for Python"
5
5
  authors = [{ name = "Golden M, Inc.", email = "software@goldenm.com" }]
6
6
  requires-python = ">=3.13"
@@ -233,7 +233,7 @@ wheels = [
233
233
 
234
234
  [[package]]
235
235
  name = "layrz-sdk"
236
- version = "4.0.29"
236
+ version = "4.0.31"
237
237
  source = { editable = "." }
238
238
  dependencies = [
239
239
  { name = "geopy" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes