layrz-sdk 4.0.11__py3-none-any.whl → 4.1.8__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.
Files changed (104) hide show
  1. layrz_sdk/decorators/__init__.py +5 -0
  2. layrz_sdk/decorators/func_timing.py +103 -0
  3. layrz_sdk/entities/__init__.py +19 -0
  4. layrz_sdk/entities/action.py +28 -16
  5. layrz_sdk/entities/action_geofence_ownership.py +0 -2
  6. layrz_sdk/entities/action_kind.py +0 -2
  7. layrz_sdk/entities/action_subkind.py +0 -2
  8. layrz_sdk/entities/asset.py +20 -9
  9. layrz_sdk/entities/asset_constants.py +10 -9
  10. layrz_sdk/entities/asset_contact.py +7 -3
  11. layrz_sdk/entities/asset_operation_mode.py +0 -2
  12. layrz_sdk/entities/ats_entry.py +11 -4
  13. layrz_sdk/entities/ats_exit_history.py +21 -19
  14. layrz_sdk/entities/ats_operation.py +87 -0
  15. layrz_sdk/entities/ats_possible_entry.py +10 -7
  16. layrz_sdk/entities/ats_possible_exit.py +19 -9
  17. layrz_sdk/entities/ats_purchaseorder.py +106 -0
  18. layrz_sdk/entities/ats_reception.py +16 -4
  19. layrz_sdk/entities/broadcast/__init__.py +2 -1
  20. layrz_sdk/entities/broadcast/payload.py +40 -8
  21. layrz_sdk/entities/broadcast/result.py +72 -1
  22. layrz_sdk/entities/broadcast/service.py +12 -2
  23. layrz_sdk/entities/broadcast/status.py +2 -2
  24. layrz_sdk/entities/case.py +51 -8
  25. layrz_sdk/entities/case_ignored_status.py +1 -0
  26. layrz_sdk/entities/charts/axis_config.py +13 -5
  27. layrz_sdk/entities/charts/bar_chart.py +12 -1
  28. layrz_sdk/entities/charts/chart_data_serie.py +17 -1
  29. layrz_sdk/entities/charts/column_chart.py +12 -1
  30. layrz_sdk/entities/charts/html_chart.py +8 -4
  31. layrz_sdk/entities/charts/line_chart.py +12 -3
  32. layrz_sdk/entities/charts/map_chart.py +14 -5
  33. layrz_sdk/entities/charts/map_point.py +7 -1
  34. layrz_sdk/entities/charts/number_chart.py +8 -4
  35. layrz_sdk/entities/charts/pie_chart.py +11 -3
  36. layrz_sdk/entities/charts/radar_chart.py +11 -3
  37. layrz_sdk/entities/charts/radial_bar_chart.py +11 -3
  38. layrz_sdk/entities/charts/scatter_chart.py +12 -3
  39. layrz_sdk/entities/charts/scatter_serie.py +11 -1
  40. layrz_sdk/entities/charts/scatter_serie_item.py +7 -1
  41. layrz_sdk/entities/charts/table_chart.py +7 -3
  42. layrz_sdk/entities/charts/table_header.py +7 -1
  43. layrz_sdk/entities/charts/table_row.py +7 -1
  44. layrz_sdk/entities/charts/timeline_chart.py +11 -3
  45. layrz_sdk/entities/charts/timeline_serie.py +7 -1
  46. layrz_sdk/entities/charts/timeline_serie_item.py +7 -1
  47. layrz_sdk/entities/checkpoint.py +20 -13
  48. layrz_sdk/entities/command_series_ticket.py +29 -4
  49. layrz_sdk/entities/comment.py +22 -5
  50. layrz_sdk/entities/custom_field.py +12 -4
  51. layrz_sdk/entities/custom_report_page.py +3 -0
  52. layrz_sdk/entities/destination_phone.py +7 -1
  53. layrz_sdk/entities/device.py +11 -4
  54. layrz_sdk/entities/event.py +20 -4
  55. layrz_sdk/entities/exchange_service.py +12 -4
  56. layrz_sdk/entities/function.py +11 -4
  57. layrz_sdk/entities/geofence.py +20 -5
  58. layrz_sdk/entities/geofence_category.py +0 -2
  59. layrz_sdk/entities/last_message.py +7 -3
  60. layrz_sdk/entities/locator.py +95 -0
  61. layrz_sdk/entities/message.py +16 -9
  62. layrz_sdk/entities/modbus/config.py +7 -1
  63. layrz_sdk/entities/modbus/parameter.py +7 -1
  64. layrz_sdk/entities/modbus/wait.py +11 -1
  65. layrz_sdk/entities/notification_type.py +0 -2
  66. layrz_sdk/entities/operation.py +37 -16
  67. layrz_sdk/entities/operation_case_payload.py +39 -13
  68. layrz_sdk/entities/operation_payload.py +63 -26
  69. layrz_sdk/entities/operation_type.py +0 -2
  70. layrz_sdk/entities/outbound_service.py +11 -4
  71. layrz_sdk/entities/parameter_update.py +25 -0
  72. layrz_sdk/entities/platform.py +0 -2
  73. layrz_sdk/entities/position.py +7 -3
  74. layrz_sdk/entities/preset.py +15 -9
  75. layrz_sdk/entities/report.py +9 -5
  76. layrz_sdk/entities/report_col.py +17 -3
  77. layrz_sdk/entities/report_configuration.py +7 -1
  78. layrz_sdk/entities/report_data_type.py +1 -3
  79. layrz_sdk/entities/report_format.py +1 -5
  80. layrz_sdk/entities/report_header.py +12 -29
  81. layrz_sdk/entities/report_page.py +7 -3
  82. layrz_sdk/entities/report_row.py +7 -19
  83. layrz_sdk/entities/request_type.py +0 -2
  84. layrz_sdk/entities/sensor.py +21 -3
  85. layrz_sdk/entities/sensor_mask.py +28 -0
  86. layrz_sdk/entities/sound_effect.py +0 -2
  87. layrz_sdk/entities/static_position.py +6 -1
  88. layrz_sdk/entities/telemetry/assetmessage.py +14 -15
  89. layrz_sdk/entities/telemetry/devicemessage.py +19 -9
  90. layrz_sdk/entities/text_alignment.py +0 -2
  91. layrz_sdk/entities/timezone.py +12 -4
  92. layrz_sdk/entities/trigger.py +102 -17
  93. layrz_sdk/entities/trigger_kind.py +2 -5
  94. layrz_sdk/entities/user.py +11 -4
  95. layrz_sdk/entities/waypoint.py +38 -16
  96. layrz_sdk/entities/weekday.py +1 -3
  97. layrz_sdk/helpers/color.py +1 -6
  98. layrz_sdk/lcl/core.py +0 -1
  99. {layrz_sdk-4.0.11.dist-info → layrz_sdk-4.1.8.dist-info}/METADATA +2 -2
  100. layrz_sdk-4.1.8.dist-info/RECORD +123 -0
  101. layrz_sdk-4.0.11.dist-info/RECORD +0 -116
  102. {layrz_sdk-4.0.11.dist-info → layrz_sdk-4.1.8.dist-info}/WHEEL +0 -0
  103. {layrz_sdk-4.0.11.dist-info → layrz_sdk-4.1.8.dist-info}/licenses/LICENSE +0 -0
  104. {layrz_sdk-4.0.11.dist-info → layrz_sdk-4.1.8.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,6 @@
1
- """Map chart"""
1
+ from typing import Any, Self
2
2
 
3
- from typing import Any, Optional, Self, Tuple
4
-
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
6
4
 
7
5
  from .chart_render_technology import ChartRenderTechnology
8
6
  from .map_center_type import MapCenterType
@@ -12,10 +10,21 @@ from .map_point import MapPoint
12
10
  class MapChart(BaseModel):
13
11
  """Map chart configuration"""
14
12
 
13
+ model_config = ConfigDict(
14
+ validate_by_name=False,
15
+ validate_by_alias=True,
16
+ serialize_by_alias=True,
17
+ )
18
+
15
19
  points: list[MapPoint] = Field(description='Points of the chart', default_factory=list)
16
20
  title: str = Field(description='Title of the chart', default='Chart')
17
21
  center: MapCenterType = Field(description='Center of the chart', default=MapCenterType.CONTAIN)
18
- center_latlng: Optional[list[float]] = Field(description='Center of the chart in latlng format', default=None)
22
+
23
+ @field_serializer('center', when_used='always')
24
+ def serialize_center(self, center: MapCenterType) -> str:
25
+ return center.value
26
+
27
+ center_latlng: list[float] | None = Field(description='Center of the chart in latlng format', default=None)
19
28
 
20
29
  def render(self: Self, technology: ChartRenderTechnology = ChartRenderTechnology.FLUTTER_MAP) -> dict[str, Any]:
21
30
  """
@@ -1,9 +1,15 @@
1
- from pydantic import BaseModel, Field, field_validator
1
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
2
2
 
3
3
 
4
4
  class MapPoint(BaseModel):
5
5
  """Map point configuration"""
6
6
 
7
+ model_config = ConfigDict(
8
+ validate_by_name=False,
9
+ validate_by_alias=True,
10
+ serialize_by_alias=True,
11
+ )
12
+
7
13
  latitude: float = Field(description='Latitude of the point')
8
14
  longitude: float = Field(description='Longitude of the point')
9
15
  label: str = Field(description='Label of the point')
@@ -1,8 +1,6 @@
1
- """Number chart"""
1
+ from typing import Any, Self
2
2
 
3
- from typing import Any, Dict, Self
4
-
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field
6
4
 
7
5
  from .chart_render_technology import ChartRenderTechnology
8
6
 
@@ -10,6 +8,12 @@ from .chart_render_technology import ChartRenderTechnology
10
8
  class NumberChart(BaseModel):
11
9
  """Number chart configuration"""
12
10
 
11
+ model_config = ConfigDict(
12
+ validate_by_name=False,
13
+ validate_by_alias=True,
14
+ serialize_by_alias=True,
15
+ )
16
+
13
17
  value: float = Field(description='Value of the number')
14
18
  color: str = Field(description='Color of the number')
15
19
  label: str = Field(description='Label of the number')
@@ -1,8 +1,6 @@
1
- """Pie chart"""
2
-
3
1
  from typing import Any, Self
4
2
 
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
6
4
 
7
5
  from .chart_alignment import ChartAlignment
8
6
  from .chart_data_serie import ChartDataSerie
@@ -12,10 +10,20 @@ from .chart_render_technology import ChartRenderTechnology
12
10
  class PieChart(BaseModel):
13
11
  """Pie chart configuration"""
14
12
 
13
+ model_config = ConfigDict(
14
+ validate_by_name=False,
15
+ validate_by_alias=True,
16
+ serialize_by_alias=True,
17
+ )
18
+
15
19
  series: list[ChartDataSerie] = Field(description='List of series to be displayed in the chart', default_factory=list)
16
20
  title: str = Field(description='Title of the chart', default='Chart')
17
21
  align: ChartAlignment = Field(description='Alignment of the chart', default=ChartAlignment.CENTER)
18
22
 
23
+ @field_serializer('align', when_used='always')
24
+ def serialize_align(self, align: ChartAlignment) -> str:
25
+ return align.value
26
+
19
27
  def render(
20
28
  self: Self,
21
29
  technology: ChartRenderTechnology = ChartRenderTechnology.SYNCFUSION_FLUTTER_CHARTS,
@@ -1,8 +1,6 @@
1
- """Radar chart"""
2
-
3
1
  from typing import Any, Self
4
2
 
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
6
4
 
7
5
  from .chart_alignment import ChartAlignment
8
6
  from .chart_data_serie import ChartDataSerie
@@ -12,11 +10,21 @@ from .chart_data_serie_type import ChartDataSerieType
12
10
  class RadarChart(BaseModel):
13
11
  """Radar chart configuration"""
14
12
 
13
+ model_config = ConfigDict(
14
+ validate_by_name=False,
15
+ validate_by_alias=True,
16
+ serialize_by_alias=True,
17
+ )
18
+
15
19
  x_axis: ChartDataSerie = Field(description='X Axis of the chart')
16
20
  y_axis: list[ChartDataSerie] = Field(description='Y Axis of the chart', default_factory=list)
17
21
  title: str = Field(description='Title of the chart', default='Chart')
18
22
  align: ChartAlignment = Field(description='Alignment of the chart', default=ChartAlignment.CENTER)
19
23
 
24
+ @field_serializer('align', when_used='always')
25
+ def serialize_align(self, align: ChartAlignment) -> str:
26
+ return align.value
27
+
20
28
  def render(self: Self) -> dict[str, Any]:
21
29
  """
22
30
  Render chart to a graphic Library.
@@ -1,8 +1,6 @@
1
- """Radial Bar chart"""
2
-
3
1
  from typing import Any, Self
4
2
 
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
6
4
 
7
5
  from .chart_alignment import ChartAlignment
8
6
  from .chart_data_serie import ChartDataSerie
@@ -12,10 +10,20 @@ from .chart_render_technology import ChartRenderTechnology
12
10
  class RadialBarChart(BaseModel):
13
11
  """Radial Bar chart configuration"""
14
12
 
13
+ model_config = ConfigDict(
14
+ validate_by_name=False,
15
+ validate_by_alias=True,
16
+ serialize_by_alias=True,
17
+ )
18
+
15
19
  series: list[ChartDataSerie] = Field(description='List of series to be displayed in the chart', default_factory=list)
16
20
  title: str = Field(description='Title of the chart', default='Chart')
17
21
  align: ChartAlignment = Field(description='Alignment of the chart', default=ChartAlignment.CENTER)
18
22
 
23
+ @field_serializer('align', when_used='always')
24
+ def serialize_align(self, align: ChartAlignment) -> str:
25
+ return align.value
26
+
19
27
  def render(
20
28
  self: Self,
21
29
  technology: ChartRenderTechnology = ChartRenderTechnology.SYNCFUSION_FLUTTER_CHARTS,
@@ -1,8 +1,6 @@
1
- """Scatter chart"""
2
-
3
1
  from typing import Any, Self
4
2
 
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
6
4
 
7
5
  from .axis_config import AxisConfig
8
6
  from .chart_alignment import ChartAlignment
@@ -14,9 +12,20 @@ from .scatter_serie import ScatterSerie
14
12
  class ScatterChart(BaseModel):
15
13
  """Scatter chart configuration"""
16
14
 
15
+ model_config = ConfigDict(
16
+ validate_by_name=False,
17
+ validate_by_alias=True,
18
+ serialize_by_alias=True,
19
+ )
20
+
17
21
  series: list[ScatterSerie] = Field(description='List of series to be displayed in the chart', default_factory=list)
18
22
  title: str = Field(description='Title of the chart', default='Chart')
19
23
  align: ChartAlignment = Field(description='Alignment of the chart', default=ChartAlignment.CENTER)
24
+
25
+ @field_serializer('align', when_used='always')
26
+ def serialize_align(self, align: ChartAlignment) -> str:
27
+ return align.value
28
+
20
29
  x_axis_config: AxisConfig = Field(
21
30
  default_factory=lambda: AxisConfig(),
22
31
  description='Configuration of the X Axis',
@@ -1,4 +1,4 @@
1
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
2
2
 
3
3
  from .chart_data_serie_type import ChartDataSerieType
4
4
  from .scatter_serie_item import ScatterSerieItem
@@ -7,7 +7,17 @@ from .scatter_serie_item import ScatterSerieItem
7
7
  class ScatterSerie(BaseModel):
8
8
  """Chart Data Serie for Timeline charts"""
9
9
 
10
+ model_config = ConfigDict(
11
+ validate_by_name=False,
12
+ validate_by_alias=True,
13
+ serialize_by_alias=True,
14
+ )
15
+
10
16
  data: list[ScatterSerieItem] = Field(description='List of data points', default_factory=list)
11
17
  color: str = Field(description='Color of the serie', default='')
12
18
  label: str = Field(description='Label of the serie', default='')
13
19
  serie_type: ChartDataSerieType = Field(description='Type of the serie', default=ChartDataSerieType.SCATTER)
20
+
21
+ @field_serializer('serie_type', when_used='always')
22
+ def serialize_serie_type(self, serie_type: ChartDataSerieType) -> str:
23
+ return serie_type.value
@@ -1,8 +1,14 @@
1
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
2
2
 
3
3
 
4
4
  class ScatterSerieItem(BaseModel):
5
5
  """Chart Data Serie Item for Scatter Charts"""
6
6
 
7
+ model_config = ConfigDict(
8
+ validate_by_name=False,
9
+ validate_by_alias=True,
10
+ serialize_by_alias=True,
11
+ )
12
+
7
13
  x: float = Field(description='X value of the item')
8
14
  y: float = Field(description='Y value of the item')
@@ -1,8 +1,6 @@
1
- """Number chart"""
2
-
3
1
  from typing import Any, Self
4
2
 
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field
6
4
 
7
5
  from .chart_render_technology import ChartRenderTechnology
8
6
  from .table_header import TableHeader
@@ -12,6 +10,12 @@ from .table_row import TableRow
12
10
  class TableChart(BaseModel):
13
11
  """Table chart configuration"""
14
12
 
13
+ model_config = ConfigDict(
14
+ validate_by_name=False,
15
+ validate_by_alias=True,
16
+ serialize_by_alias=True,
17
+ )
18
+
15
19
  columns: list[TableHeader] = Field(description='List of columns', default_factory=list)
16
20
  rows: list[TableRow] = Field(description='List of rows', default_factory=list)
17
21
 
@@ -1,8 +1,14 @@
1
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
2
2
 
3
3
 
4
4
  class TableHeader(BaseModel):
5
5
  """Table header chart configuration"""
6
6
 
7
+ model_config = ConfigDict(
8
+ validate_by_name=False,
9
+ validate_by_alias=True,
10
+ serialize_by_alias=True,
11
+ )
12
+
7
13
  label: str = Field(description='Label of the header')
8
14
  key: str = Field(description='Key of the header')
@@ -1,9 +1,15 @@
1
1
  from typing import Any
2
2
 
3
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field
4
4
 
5
5
 
6
6
  class TableRow(BaseModel):
7
7
  """Table row chart configuration"""
8
8
 
9
+ model_config = ConfigDict(
10
+ validate_by_name=False,
11
+ validate_by_alias=True,
12
+ serialize_by_alias=True,
13
+ )
14
+
9
15
  data: Any = Field(description='Data of the row')
@@ -1,8 +1,6 @@
1
- """Timeline chart entities"""
2
-
3
1
  from typing import Any, Self
4
2
 
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
6
4
 
7
5
  from .chart_alignment import ChartAlignment
8
6
  from .timeline_serie import TimelineSerie
@@ -11,10 +9,20 @@ from .timeline_serie import TimelineSerie
11
9
  class TimelineChart(BaseModel):
12
10
  """Timeline chart configuration"""
13
11
 
12
+ model_config = ConfigDict(
13
+ validate_by_name=False,
14
+ validate_by_alias=True,
15
+ serialize_by_alias=True,
16
+ )
17
+
14
18
  series: list[TimelineSerie] = Field(description='List of series to be displayed in the chart', default_factory=list)
15
19
  title: str = Field(description='Title of the chart', default='Chart')
16
20
  align: ChartAlignment = Field(description='Alignment of the chart', default=ChartAlignment.CENTER)
17
21
 
22
+ @field_serializer('align', when_used='always')
23
+ def serialize_align(self, align: ChartAlignment) -> str:
24
+ return align.value
25
+
18
26
  def render(self: Self) -> dict[str, Any]:
19
27
  """
20
28
  Render chart to a graphic Library.
@@ -1,4 +1,4 @@
1
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
2
2
 
3
3
  from .timeline_serie_item import TimelineSerieItem
4
4
 
@@ -6,5 +6,11 @@ from .timeline_serie_item import TimelineSerieItem
6
6
  class TimelineSerie(BaseModel):
7
7
  """Chart Data Serie for Timeline charts"""
8
8
 
9
+ model_config = ConfigDict(
10
+ validate_by_name=False,
11
+ validate_by_alias=True,
12
+ serialize_by_alias=True,
13
+ )
14
+
9
15
  data: list[TimelineSerieItem] = Field(description='List of data points', default_factory=list)
10
16
  label: str = Field(description='Label of the serie')
@@ -1,11 +1,17 @@
1
1
  from datetime import datetime
2
2
 
3
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field
4
4
 
5
5
 
6
6
  class TimelineSerieItem(BaseModel):
7
7
  """Chart Data Serie Item for Timeline Charts"""
8
8
 
9
+ model_config = ConfigDict(
10
+ validate_by_name=False,
11
+ validate_by_alias=True,
12
+ serialize_by_alias=True,
13
+ )
14
+
9
15
  name: str = Field(description='Name of the item')
10
16
  start_at: datetime = Field(description='Start date of the item')
11
17
  end_at: datetime = Field(description='End date of the item')
@@ -1,9 +1,7 @@
1
- """Checkpoints entitites"""
2
-
3
1
  from datetime import datetime
4
2
  from enum import StrEnum
5
3
 
6
- from pydantic import BaseModel, Field
4
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
7
5
 
8
6
  from .waypoint import Waypoint, WaypointRef
9
7
 
@@ -21,27 +19,36 @@ class CheckpointOperationMode(StrEnum):
21
19
  class Checkpoint(BaseModel):
22
20
  """Checkpoint entity definition"""
23
21
 
24
- model_config = {
25
- 'json_encoders': {
26
- datetime: lambda v: v.timestamp(),
27
- },
28
- }
22
+ model_config = ConfigDict(
23
+ validate_by_name=False,
24
+ validate_by_alias=True,
25
+ serialize_by_alias=True,
26
+ )
29
27
 
30
28
  pk: int = Field(description='Checkpoint ID')
31
29
  asset_id: int = Field(description='Asset ID')
32
30
  waypoints: list[Waypoint] = Field(description='List of waypoints', default_factory=list)
33
31
  start_at: datetime = Field(description='Checkpoint start date')
32
+
33
+ @field_serializer('start_at', when_used='always')
34
+ def serialize_start_at(self, start_at: datetime) -> float:
35
+ return start_at.timestamp()
36
+
34
37
  end_at: datetime = Field(description='Checkpoint end date')
35
38
 
39
+ @field_serializer('end_at', when_used='always')
40
+ def serialize_end_at(self, end_at: datetime) -> float:
41
+ return end_at.timestamp()
42
+
36
43
 
37
44
  class CheckpointRef(BaseModel):
38
45
  """Checkpoint reference entity definition"""
39
46
 
40
- model_config = {
41
- 'json_encoders': {
42
- CheckpointOperationMode: lambda v: v.value,
43
- },
44
- }
47
+ model_config = ConfigDict(
48
+ validate_by_name=False,
49
+ validate_by_alias=True,
50
+ serialize_by_alias=True,
51
+ )
45
52
 
46
53
  pk: int = Field(description='Checkpoint ID', alias='id')
47
54
  name: str = Field(description='Checkpoint name')
@@ -1,10 +1,8 @@
1
- """Command Series Ticket entity"""
2
-
3
1
  from datetime import datetime
4
2
  from enum import StrEnum
5
3
  from typing import Any
6
4
 
7
- from pydantic import BaseModel, Field
5
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
8
6
 
9
7
  from layrz_sdk.constants import UTC
10
8
  from layrz_sdk.entities.action import Action
@@ -27,17 +25,35 @@ class CommandSeriesTicketStatus(StrEnum):
27
25
  class CommandSeriesTicket(BaseModel):
28
26
  """Command Series Ticket definition"""
29
27
 
30
- pk: int = Field(..., description='ID', alias='id')
28
+ model_config = ConfigDict(
29
+ validate_by_name=False,
30
+ validate_by_alias=True,
31
+ serialize_by_alias=True,
32
+ )
33
+
34
+ pk: int = Field(
35
+ ...,
36
+ description='ID',
37
+ alias='id',
38
+ )
31
39
  service_id: int = Field(..., description='Service ID')
32
40
  status: CommandSeriesTicketStatus = Field(
33
41
  default=CommandSeriesTicketStatus.IN_SERVICE,
34
42
  description='Ticket status',
35
43
  )
36
44
 
45
+ @field_serializer('status', when_used='always')
46
+ def serialize_status(self, status: CommandSeriesTicketStatus) -> str:
47
+ return status.value
48
+
37
49
  ticket_id: str = Field(..., description='Ticket ID')
38
50
  ticket_code: str = Field(..., description='Ticket code')
39
51
  ticket_at: datetime = Field(..., description='Ticket creation date')
40
52
 
53
+ @field_serializer('ticket_at', when_used='always')
54
+ def serialize_ticket_at(self, ticket_at: datetime) -> float:
55
+ return ticket_at.timestamp()
56
+
41
57
  source_id: int | None = Field(default=None, description='Source geofence ID')
42
58
  source: Geofence | None = Field(default=None, description='Source geofence')
43
59
 
@@ -60,7 +76,16 @@ class CommandSeriesTicket(BaseModel):
60
76
  default_factory=lambda: datetime.now(UTC),
61
77
  description='Creation date',
62
78
  )
79
+
80
+ @field_serializer('created_at', when_used='always')
81
+ def serialize_created_at(self, created_at: datetime) -> float:
82
+ return created_at.timestamp()
83
+
63
84
  updated_at: datetime = Field(
64
85
  default_factory=lambda: datetime.now(UTC),
65
86
  description='Last update date',
66
87
  )
88
+
89
+ @field_serializer('updated_at', when_used='always')
90
+ def serialize_updated_at(self, updated_at: datetime) -> float:
91
+ return updated_at.timestamp()
@@ -1,8 +1,7 @@
1
- """Comment entity"""
2
-
3
1
  from datetime import datetime
2
+ from typing import Any
4
3
 
5
- from pydantic import BaseModel, Field
4
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
6
5
 
7
6
  from .user import User
8
7
 
@@ -10,7 +9,25 @@ from .user import User
10
9
  class Comment(BaseModel):
11
10
  """Comment entity"""
12
11
 
13
- pk: int = Field(description='Comment ID', alias='id')
12
+ model_config = ConfigDict(
13
+ validate_by_name=False,
14
+ validate_by_alias=True,
15
+ serialize_by_alias=True,
16
+ )
17
+
18
+ pk: int = Field(
19
+ description='Comment ID',
20
+ alias='id',
21
+ )
14
22
  content: str = Field(description='Comment content')
15
- user: User = Field(description='Operator/User what commented the case')
23
+ user: User | None = Field(description='Operator/User what commented the case. None if system generated')
16
24
  submitted_at: datetime = Field(description='Date of comment submission')
25
+
26
+ @field_serializer('submitted_at', when_used='always')
27
+ def serialize_submitted_at(self, submitted_at: datetime) -> float:
28
+ return submitted_at.timestamp()
29
+
30
+ metadata: dict[str, Any] = Field(
31
+ default_factory=dict,
32
+ description='Additional metadata associated with the comment',
33
+ )
@@ -1,12 +1,20 @@
1
- """Custom Field entitiy"""
2
-
3
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
4
2
 
5
3
 
6
4
  class CustomField(BaseModel):
7
5
  """Custom field definition"""
8
6
 
9
- pk: int | None = Field(default=None, description='Primary key of the custom field', alias='id')
7
+ model_config = ConfigDict(
8
+ validate_by_name=False,
9
+ validate_by_alias=True,
10
+ serialize_by_alias=True,
11
+ )
12
+
13
+ pk: int | None = Field(
14
+ default=None,
15
+ description='Primary key of the custom field',
16
+ alias='id',
17
+ )
10
18
  name: str = Field(description='Defines the name of the custom field')
11
19
  value: str = Field(description='Defines the value of the custom field')
12
20
  is_fixed: bool = Field(default=False, description='Defines if the custom field is fixed or not')
@@ -21,6 +21,9 @@ class CustomReportPage(BaseModel):
21
21
  """
22
22
 
23
23
  model_config = ConfigDict(
24
+ validate_by_name=False,
25
+ validate_by_alias=True,
26
+ serialize_by_alias=True,
24
27
  from_attributes=True,
25
28
  arbitrary_types_allowed=True,
26
29
  )
@@ -1,11 +1,17 @@
1
1
  from typing import Self
2
2
 
3
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field
4
4
 
5
5
 
6
6
  class DestinationPhone(BaseModel):
7
7
  """Destination Phone"""
8
8
 
9
+ model_config = ConfigDict(
10
+ validate_by_name=False,
11
+ validate_by_alias=True,
12
+ serialize_by_alias=True,
13
+ )
14
+
9
15
  phone_number: str = Field(
10
16
  ...,
11
17
  description='Defines the phone number for Twilio notifications',
@@ -1,8 +1,6 @@
1
- """Device entitiy"""
2
-
3
1
  from typing import Any
4
2
 
5
- from pydantic import BaseModel, Field, field_validator
3
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
6
4
 
7
5
  from .modbus import ModbusConfig
8
6
 
@@ -10,7 +8,16 @@ from .modbus import ModbusConfig
10
8
  class Device(BaseModel):
11
9
  """Device entity"""
12
10
 
13
- pk: int = Field(description='Defines the primary key of the device', alias='id')
11
+ model_config = ConfigDict(
12
+ validate_by_name=False,
13
+ validate_by_alias=True,
14
+ serialize_by_alias=True,
15
+ )
16
+
17
+ pk: int = Field(
18
+ description='Defines the primary key of the device',
19
+ alias='id',
20
+ )
14
21
  name: str = Field(description='Defines the name of the device')
15
22
  ident: str = Field(description='Defines the identifier of the device')
16
23
  protocol_id: int | None = Field(
@@ -1,8 +1,6 @@
1
- """Event entity"""
2
-
3
1
  from datetime import datetime
4
2
 
5
- from pydantic import BaseModel, Field
3
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
6
4
 
7
5
  from .geofence import Geofence
8
6
  from .message import Message
@@ -13,10 +11,28 @@ from .trigger import Trigger
13
11
  class Event(BaseModel):
14
12
  """Event entity definition"""
15
13
 
16
- pk: int = Field(description='Event ID', alias='id')
14
+ model_config = ConfigDict(
15
+ validate_by_name=False,
16
+ validate_by_alias=True,
17
+ serialize_by_alias=True,
18
+ )
19
+
20
+ pk: int = Field(
21
+ description='Event ID',
22
+ alias='id',
23
+ )
17
24
  trigger: Trigger = Field(description='Event trigger')
18
25
  asset_id: int = Field(description='Asset ID')
19
26
  message: Message = Field(description='Message')
20
27
  activated_at: datetime = Field(description='Event activation date')
28
+
29
+ @field_serializer('activated_at', when_used='always')
30
+ def serialize_activated_at(self, activated_at: datetime) -> float:
31
+ return activated_at.timestamp()
32
+
21
33
  geofence: Geofence | None = Field(default=None, description='Geofence object')
22
34
  presence_type: PresenceType | None = Field(default=None, description='Presence type object')
35
+
36
+ @field_serializer('presence_type', when_used='always')
37
+ def serialize_presence_type(self, presence_type: PresenceType | None) -> str | None:
38
+ return presence_type.value if presence_type else None