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