layrz-sdk 4.0.23__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 (100) hide show
  1. layrz_sdk/decorators/func_timing.py +14 -7
  2. layrz_sdk/entities/__init__.py +7 -0
  3. layrz_sdk/entities/action.py +28 -16
  4. layrz_sdk/entities/action_geofence_ownership.py +0 -2
  5. layrz_sdk/entities/action_kind.py +0 -2
  6. layrz_sdk/entities/action_subkind.py +0 -2
  7. layrz_sdk/entities/asset.py +15 -9
  8. layrz_sdk/entities/asset_constants.py +10 -9
  9. layrz_sdk/entities/asset_contact.py +7 -3
  10. layrz_sdk/entities/asset_operation_mode.py +0 -2
  11. layrz_sdk/entities/ats_entry.py +11 -4
  12. layrz_sdk/entities/ats_exit_history.py +21 -19
  13. layrz_sdk/entities/ats_operation.py +57 -17
  14. layrz_sdk/entities/ats_possible_entry.py +9 -4
  15. layrz_sdk/entities/ats_possible_exit.py +19 -9
  16. layrz_sdk/entities/ats_purchaseorder.py +53 -12
  17. layrz_sdk/entities/ats_reception.py +16 -4
  18. layrz_sdk/entities/broadcast/payload.py +40 -8
  19. layrz_sdk/entities/broadcast/result.py +21 -2
  20. layrz_sdk/entities/broadcast/service.py +12 -2
  21. layrz_sdk/entities/case.py +34 -7
  22. layrz_sdk/entities/charts/axis_config.py +13 -5
  23. layrz_sdk/entities/charts/bar_chart.py +12 -1
  24. layrz_sdk/entities/charts/chart_data_serie.py +17 -1
  25. layrz_sdk/entities/charts/column_chart.py +12 -1
  26. layrz_sdk/entities/charts/html_chart.py +8 -4
  27. layrz_sdk/entities/charts/line_chart.py +12 -3
  28. layrz_sdk/entities/charts/map_chart.py +14 -5
  29. layrz_sdk/entities/charts/map_point.py +7 -1
  30. layrz_sdk/entities/charts/number_chart.py +8 -4
  31. layrz_sdk/entities/charts/pie_chart.py +11 -3
  32. layrz_sdk/entities/charts/radar_chart.py +11 -3
  33. layrz_sdk/entities/charts/radial_bar_chart.py +11 -3
  34. layrz_sdk/entities/charts/scatter_chart.py +12 -3
  35. layrz_sdk/entities/charts/scatter_serie.py +11 -1
  36. layrz_sdk/entities/charts/scatter_serie_item.py +7 -1
  37. layrz_sdk/entities/charts/table_chart.py +7 -3
  38. layrz_sdk/entities/charts/table_header.py +7 -1
  39. layrz_sdk/entities/charts/table_row.py +7 -1
  40. layrz_sdk/entities/charts/timeline_chart.py +11 -3
  41. layrz_sdk/entities/charts/timeline_serie.py +7 -1
  42. layrz_sdk/entities/charts/timeline_serie_item.py +7 -1
  43. layrz_sdk/entities/checkpoint.py +20 -13
  44. layrz_sdk/entities/command_series_ticket.py +29 -4
  45. layrz_sdk/entities/comment.py +15 -4
  46. layrz_sdk/entities/custom_field.py +12 -4
  47. layrz_sdk/entities/custom_report_page.py +3 -0
  48. layrz_sdk/entities/destination_phone.py +7 -1
  49. layrz_sdk/entities/device.py +11 -4
  50. layrz_sdk/entities/event.py +20 -4
  51. layrz_sdk/entities/exchange_service.py +12 -4
  52. layrz_sdk/entities/function.py +11 -4
  53. layrz_sdk/entities/geofence.py +12 -4
  54. layrz_sdk/entities/geofence_category.py +0 -2
  55. layrz_sdk/entities/last_message.py +7 -3
  56. layrz_sdk/entities/locator.py +95 -0
  57. layrz_sdk/entities/message.py +16 -9
  58. layrz_sdk/entities/modbus/config.py +7 -1
  59. layrz_sdk/entities/modbus/parameter.py +7 -1
  60. layrz_sdk/entities/modbus/wait.py +11 -1
  61. layrz_sdk/entities/notification_type.py +0 -2
  62. layrz_sdk/entities/operation.py +37 -16
  63. layrz_sdk/entities/operation_case_payload.py +39 -13
  64. layrz_sdk/entities/operation_payload.py +63 -26
  65. layrz_sdk/entities/operation_type.py +0 -2
  66. layrz_sdk/entities/outbound_service.py +11 -4
  67. layrz_sdk/entities/parameter_update.py +25 -0
  68. layrz_sdk/entities/platform.py +0 -2
  69. layrz_sdk/entities/position.py +7 -3
  70. layrz_sdk/entities/preset.py +15 -9
  71. layrz_sdk/entities/report.py +9 -5
  72. layrz_sdk/entities/report_col.py +17 -3
  73. layrz_sdk/entities/report_configuration.py +7 -1
  74. layrz_sdk/entities/report_data_type.py +1 -3
  75. layrz_sdk/entities/report_format.py +1 -5
  76. layrz_sdk/entities/report_header.py +12 -29
  77. layrz_sdk/entities/report_page.py +7 -3
  78. layrz_sdk/entities/report_row.py +7 -19
  79. layrz_sdk/entities/request_type.py +0 -2
  80. layrz_sdk/entities/sensor.py +11 -4
  81. layrz_sdk/entities/sensor_mask.py +16 -5
  82. layrz_sdk/entities/sound_effect.py +0 -2
  83. layrz_sdk/entities/static_position.py +6 -1
  84. layrz_sdk/entities/telemetry/assetmessage.py +14 -15
  85. layrz_sdk/entities/telemetry/devicemessage.py +19 -9
  86. layrz_sdk/entities/text_alignment.py +0 -2
  87. layrz_sdk/entities/timezone.py +12 -4
  88. layrz_sdk/entities/trigger.py +46 -13
  89. layrz_sdk/entities/trigger_kind.py +1 -5
  90. layrz_sdk/entities/user.py +11 -4
  91. layrz_sdk/entities/waypoint.py +38 -16
  92. layrz_sdk/entities/weekday.py +1 -3
  93. layrz_sdk/helpers/color.py +1 -6
  94. layrz_sdk/lcl/core.py +0 -1
  95. {layrz_sdk-4.0.23.dist-info → layrz_sdk-4.1.8.dist-info}/METADATA +2 -2
  96. layrz_sdk-4.1.8.dist-info/RECORD +123 -0
  97. layrz_sdk-4.0.23.dist-info/RECORD +0 -121
  98. {layrz_sdk-4.0.23.dist-info → layrz_sdk-4.1.8.dist-info}/WHEEL +0 -0
  99. {layrz_sdk-4.0.23.dist-info → layrz_sdk-4.1.8.dist-info}/licenses/LICENSE +0 -0
  100. {layrz_sdk-4.0.23.dist-info → layrz_sdk-4.1.8.dist-info}/top_level.txt +0 -0
@@ -1,9 +1,7 @@
1
- """Report col"""
2
-
3
1
  import warnings
4
2
  from typing import Any, Optional, Self
5
3
 
6
- from pydantic import BaseModel, Field, field_validator
4
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator
7
5
 
8
6
  from .report_data_type import ReportDataType
9
7
  from .text_alignment import TextAlignment
@@ -12,11 +10,27 @@ from .text_alignment import TextAlignment
12
10
  class ReportCol(BaseModel):
13
11
  """Report column entity"""
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
  content: Any = Field(description='Column content')
16
20
  color: str = Field(description='Column color', default='#ffffff')
17
21
  text_color: Optional[str] = Field(description='Column text color', default=None)
18
22
  align: TextAlignment = Field(description='Column text alignment', default=TextAlignment.LEFT)
23
+
24
+ @field_serializer('align', when_used='always')
25
+ def serialize_align(self, align: TextAlignment) -> str:
26
+ return align.value
27
+
19
28
  data_type: ReportDataType = Field(description='Column data type', default=ReportDataType.STR)
29
+
30
+ @field_serializer('data_type', when_used='always')
31
+ def serialize_data_type(self, data_type: ReportDataType) -> str:
32
+ return data_type.value
33
+
20
34
  datetime_format: str = Field(description='Datetime format', default='%Y-%m-%d %H:%M:%S')
21
35
  currency_symbol: str = Field(description='Currency symbol', default='')
22
36
  bold: bool = Field(description='Bold text', default=False)
@@ -1,8 +1,14 @@
1
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
2
2
 
3
3
 
4
4
  class ReportConfiguration(BaseModel):
5
5
  """Report configuration entity"""
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
  title: str = Field(description='Report title')
8
14
  pages_count: int = Field(description='Number of pages in the report')
@@ -3,9 +3,7 @@ from typing import Self
3
3
 
4
4
 
5
5
  class ReportDataType(StrEnum):
6
- """
7
- Report date type
8
- """
6
+ """Report date type"""
9
7
 
10
8
  STR = 'str'
11
9
  INT = 'int'
@@ -1,13 +1,9 @@
1
- """Report formats"""
2
-
3
1
  from enum import StrEnum
4
2
  from typing import Self
5
3
 
6
4
 
7
5
  class ReportFormat(StrEnum):
8
- """
9
- Report format definition.
10
- """
6
+ """Report format definition."""
11
7
 
12
8
  MICROSOFT_EXCEL = 'MICROSOFT_EXCEL'
13
9
  JSON = 'JSON'
@@ -1,9 +1,7 @@
1
- """Report header"""
2
-
3
1
  import warnings
4
2
  from typing import Any, Optional
5
3
 
6
- from pydantic import BaseModel, Field, field_validator
4
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator
7
5
 
8
6
  from .text_alignment import TextAlignment
9
7
 
@@ -11,33 +9,18 @@ from .text_alignment import TextAlignment
11
9
  class ReportHeader(BaseModel):
12
10
  """Report header entity"""
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
  content: Any = Field(description='Header content')
15
19
  color: str = Field(description='Header color', default='#ffffff')
16
- text_color: Optional[str] = Field(description='Header text color', default=None)
17
20
  align: TextAlignment = Field(description='Header text alignment', default=TextAlignment.CENTER)
21
+
22
+ @field_serializer('align', when_used='always')
23
+ def serialize_align(self, align: TextAlignment) -> str:
24
+ return align.value
25
+
18
26
  bold: bool = Field(description='Bold text', default=False)
19
- width: Optional[float] = Field(description='Header width', default=None)
20
-
21
- @field_validator('text_color', mode='before')
22
- def _validate_text_color(cls, value: Any) -> Any:
23
- """Validate text color"""
24
- if value is not None:
25
- warnings.warn(
26
- 'text_color is deprecated, the algorithm will calculate the rigth text color instead',
27
- DeprecationWarning,
28
- stacklevel=2,
29
- )
30
-
31
- return value
32
-
33
- @field_validator('width', mode='before')
34
- def _validate_width(cls, value: Any) -> Any:
35
- """Validate width"""
36
- if value is not None:
37
- warnings.warn(
38
- 'width is deprecated, the algorithm will calculate the rigth width instead',
39
- DeprecationWarning,
40
- stacklevel=2,
41
- )
42
-
43
- return value
@@ -1,6 +1,4 @@
1
- """Report page"""
2
-
3
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
4
2
 
5
3
  from .report_header import ReportHeader
6
4
  from .report_row import ReportRow
@@ -9,6 +7,12 @@ from .report_row import ReportRow
9
7
  class ReportPage(BaseModel):
10
8
  """Report page definition"""
11
9
 
10
+ model_config = ConfigDict(
11
+ validate_by_name=False,
12
+ validate_by_alias=True,
13
+ serialize_by_alias=True,
14
+ )
15
+
12
16
  name: str = Field(description='Name of the page. Length should be less than 60 characters')
13
17
  headers: list[ReportHeader] = Field(description='List of report headers', default_factory=list)
14
18
  rows: list[ReportRow] = Field(description='List of report rows', default_factory=list)
@@ -1,9 +1,4 @@
1
- """Report row"""
2
-
3
- import warnings
4
- from typing import Any, Optional
5
-
6
- from pydantic import BaseModel, Field, field_validator
1
+ from pydantic import BaseModel, ConfigDict, Field
7
2
 
8
3
  from .report_col import ReportCol
9
4
 
@@ -11,18 +6,11 @@ from .report_col import ReportCol
11
6
  class ReportRow(BaseModel):
12
7
  """Report row definition"""
13
8
 
9
+ model_config = ConfigDict(
10
+ validate_by_name=False,
11
+ validate_by_alias=True,
12
+ serialize_by_alias=True,
13
+ )
14
+
14
15
  content: list[ReportCol] = Field(description='List of report columns', default_factory=list)
15
- height: Optional[float] = Field(description='Row height', default=None)
16
16
  compact: bool = Field(description='Compact mode', default=False)
17
-
18
- @field_validator('height', mode='before')
19
- def _validate_height(cls, value: Any) -> Any:
20
- """Validate height"""
21
- if value is not None:
22
- warnings.warn(
23
- 'height is deprecated, the algorithm will calculate the rigth text color instead',
24
- DeprecationWarning,
25
- stacklevel=2,
26
- )
27
-
28
- return value
@@ -1,5 +1,3 @@
1
- """Http Operation Type"""
2
-
3
1
  from enum import StrEnum
4
2
  from typing import Self
5
3
 
@@ -1,6 +1,4 @@
1
- """Sensor entity"""
2
-
3
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
4
2
 
5
3
  from .sensor_mask import SensorMask
6
4
 
@@ -8,7 +6,16 @@ from .sensor_mask import SensorMask
8
6
  class Sensor(BaseModel):
9
7
  """Sensor entity"""
10
8
 
11
- pk: int = Field(description='Defines the primary key of the sensor', alias='id')
9
+ model_config = ConfigDict(
10
+ validate_by_name=False,
11
+ validate_by_alias=True,
12
+ serialize_by_alias=True,
13
+ )
14
+
15
+ pk: int = Field(
16
+ description='Defines the primary key of the sensor',
17
+ alias='id',
18
+ )
12
19
  name: str = Field(description='Defines the name of the sensor')
13
20
  slug: str = Field(description='Defines the slug of the sensor')
14
21
  formula: str = Field(
@@ -1,14 +1,25 @@
1
- """Sensor entity"""
2
-
3
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
4
2
 
5
3
 
6
4
  class SensorMask(BaseModel):
7
5
  """Sensor entity"""
8
6
 
9
- icon: str | None = Field(description='Defines the icon of the sensor')
10
- text: str | None = Field(description='Defines the text of the sensor')
7
+ model_config = ConfigDict(
8
+ validate_by_name=False,
9
+ validate_by_alias=True,
10
+ serialize_by_alias=True,
11
+ )
12
+
13
+ icon: str | None = Field(
14
+ default=None,
15
+ description='Defines the icon of the sensor',
16
+ )
17
+ text: str | None = Field(
18
+ default=None,
19
+ description='Defines the text of the sensor',
20
+ )
11
21
  color: str | None = Field(
22
+ default=None,
12
23
  description='Defines the color of the sensor, used for visual representation',
13
24
  )
14
25
  value: str | float | int | None = Field(
@@ -1,5 +1,3 @@
1
- """SoundEffect"""
2
-
3
1
  from enum import StrEnum
4
2
  from typing import Self
5
3
 
@@ -1,7 +1,12 @@
1
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
2
2
 
3
3
 
4
4
  class StaticPosition(BaseModel):
5
+ model_config = ConfigDict(
6
+ validate_by_name=False,
7
+ validate_by_alias=True,
8
+ serialize_by_alias=True,
9
+ )
5
10
  latitude: float = Field(
6
11
  ...,
7
12
  description='Latitude of the static position',
@@ -1,13 +1,10 @@
1
- """Asset message"""
2
-
3
1
  from __future__ import annotations
4
2
 
5
- import json
6
3
  from datetime import datetime, timedelta
7
4
  from typing import Any, Self, cast
8
5
 
9
6
  from geopy.distance import geodesic
10
- from pydantic import BaseModel, Field, field_serializer
7
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
11
8
  from shapely.geometry import MultiPoint
12
9
 
13
10
  from layrz_sdk.constants import UTC
@@ -21,15 +18,17 @@ from layrz_sdk.entities.telemetry.devicemessage import DeviceMessage
21
18
  class AssetMessage(BaseModel):
22
19
  """Asset message model"""
23
20
 
24
- model_config = {
25
- 'json_encoders': {
26
- datetime: lambda v: v.timestamp(),
27
- timedelta: lambda v: v.total_seconds(),
28
- Position: lambda v: json.loads(v.model_dump_json(exclude_none=True)),
29
- }
30
- }
21
+ model_config = ConfigDict(
22
+ validate_by_name=False,
23
+ validate_by_alias=True,
24
+ serialize_by_alias=True,
25
+ )
31
26
 
32
- pk: int | None = Field(default=None, description='Message ID', alias='id')
27
+ pk: int | None = Field(
28
+ default=None,
29
+ description='Message ID',
30
+ alias='id',
31
+ )
33
32
  asset_id: int = Field(..., description='Asset ID')
34
33
 
35
34
  position: dict[str, float | int] = Field(
@@ -62,7 +61,7 @@ class AssetMessage(BaseModel):
62
61
  description='Timestamp when the message was received',
63
62
  )
64
63
 
65
- @field_serializer('received_at')
64
+ @field_serializer('received_at', when_used='always')
66
65
  def serialize_received_at(self: Self, value: datetime) -> float:
67
66
  """Serialize received_at to a timestamp."""
68
67
  return value.timestamp()
@@ -72,7 +71,7 @@ class AssetMessage(BaseModel):
72
71
  description='Elapsed time since the last message',
73
72
  )
74
73
 
75
- @field_serializer('elapsed_time')
74
+ @field_serializer('elapsed_time', when_used='always')
76
75
  def serialize_elapsed_time(self: Self, value: timedelta) -> float:
77
76
  """Serialize elapsed_time to total seconds."""
78
77
  return value.total_seconds()
@@ -153,7 +152,7 @@ class AssetMessage(BaseModel):
153
152
  def to_message(self: Self) -> Message:
154
153
  """Convert the asset message to a Message object."""
155
154
  return Message(
156
- id=self.pk if self.pk is not None else 0,
155
+ id=self.pk if self.pk is not None else 0, # ty: ignore
157
156
  asset_id=self.asset_id,
158
157
  position=Position.model_validate(self.position),
159
158
  payload=self.payload,
@@ -1,12 +1,9 @@
1
- """Device message"""
2
-
3
1
  from __future__ import annotations
4
2
 
5
- import json
6
3
  from datetime import datetime
7
4
  from typing import Any, Self
8
5
 
9
- from pydantic import BaseModel, Field, field_serializer
6
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
10
7
 
11
8
  from layrz_sdk.constants import REJECTED_KEYS, UTC
12
9
  from layrz_sdk.entities.device import Device
@@ -17,7 +14,16 @@ from layrz_sdk.entities.position import Position
17
14
  class DeviceMessage(BaseModel):
18
15
  """Device message model"""
19
16
 
20
- pk: int | None = Field(default=None, description='Device message ID', alias='id')
17
+ model_config = ConfigDict(
18
+ validate_by_name=False,
19
+ validate_by_alias=True,
20
+ serialize_by_alias=True,
21
+ )
22
+ pk: int | None = Field(
23
+ default=None,
24
+ description='Device message ID',
25
+ alias='id',
26
+ )
21
27
  ident: str = Field(..., description='Device identifier')
22
28
  device_id: int = Field(..., description='Device ID')
23
29
  protocol_id: int = Field(..., description='Protocol ID')
@@ -37,7 +43,7 @@ class DeviceMessage(BaseModel):
37
43
  description='Timestamp when the message was received',
38
44
  )
39
45
 
40
- @field_serializer('received_at')
46
+ @field_serializer('received_at', when_used='always')
41
47
  def serialize_received_at(self: Self, value: datetime) -> float:
42
48
  """Serialize received_at to a timestamp."""
43
49
  return value.timestamp()
@@ -69,6 +75,9 @@ class DeviceMessage(BaseModel):
69
75
  @classmethod
70
76
  def parse_from_dict(cls, *, raw_payload: dict[str, Any], device: Device) -> DeviceMessage:
71
77
  """Format a DeviceMessage from a dictionary."""
78
+ if not device.protocol_id:
79
+ raise ValueError('Device protocol_id is required to parse DeviceMessage')
80
+
72
81
  received_at: datetime
73
82
  position: dict[str, float | int] = {}
74
83
  payload: dict[str, Any] = {}
@@ -80,7 +89,8 @@ class DeviceMessage(BaseModel):
80
89
 
81
90
  for key, value in raw_payload.items():
82
91
  if key.startswith('position.'):
83
- position[key[9:]] = value
92
+ if isinstance(value, (float, int)):
93
+ position[key[9:]] = value
84
94
 
85
95
  if key not in REJECTED_KEYS:
86
96
  payload[key] = value
@@ -88,7 +98,7 @@ class DeviceMessage(BaseModel):
88
98
  return cls(
89
99
  ident=device.ident,
90
100
  device_id=device.pk,
91
- protocol_id=device.protocol_id, # type: ignore
101
+ protocol_id=device.protocol_id,
92
102
  position=position,
93
103
  payload=payload,
94
104
  received_at=received_at,
@@ -97,7 +107,7 @@ class DeviceMessage(BaseModel):
97
107
  def to_message(self: Self) -> Message:
98
108
  """Convert the asset message to a Message object."""
99
109
  return Message(
100
- id=self.pk if self.pk is not None else 0,
110
+ id=self.pk if self.pk is not None else 0, # ty: ignore
101
111
  asset_id=self.device_id if self.device_id is not None else 0,
102
112
  position=Position.model_validate(self.position),
103
113
  payload=self.payload,
@@ -1,5 +1,3 @@
1
- """Text alignment"""
2
-
3
1
  from enum import StrEnum
4
2
  from typing import Self
5
3
 
@@ -1,11 +1,19 @@
1
- """Timezone entity"""
2
-
3
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
4
2
 
5
3
 
6
4
  class Timezone(BaseModel):
7
5
  """Timezone entity"""
8
6
 
9
- pk: int = Field(..., description='Defines the primary key of the timezone', 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 = Field(
14
+ ...,
15
+ description='Defines the primary key of the timezone',
16
+ alias='id',
17
+ )
10
18
  name: str = Field(..., description='Defines the name of the timezone')
11
19
  offset: int = Field(..., description='Defines the offset of the timezone in seconds from UTC')
@@ -3,7 +3,7 @@
3
3
  from datetime import time, timedelta
4
4
  from typing import Any
5
5
 
6
- from pydantic import BaseModel, Field, field_serializer, field_validator
6
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator
7
7
 
8
8
  from .trigger_kind import TriggerCaseKind, TriggerCommentPattern, TriggerGeofenceKind, TriggerKind
9
9
  from .weekday import Weekday
@@ -12,7 +12,16 @@ from .weekday import Weekday
12
12
  class Trigger(BaseModel):
13
13
  """Trigger entity"""
14
14
 
15
- pk: int = Field(description='Defines the primary key of the trigger', alias='id')
15
+ model_config = ConfigDict(
16
+ validate_by_name=False,
17
+ validate_by_alias=True,
18
+ serialize_by_alias=True,
19
+ )
20
+
21
+ pk: int = Field(
22
+ description='Defines the primary key of the trigger',
23
+ alias='id',
24
+ )
16
25
  name: str = Field(description='Defines the name of the trigger')
17
26
  code: str = Field(description='Defines the code of the trigger')
18
27
 
@@ -34,7 +43,6 @@ class Trigger(BaseModel):
34
43
 
35
44
  @field_serializer('type_', when_used='always')
36
45
  def serialize_type(self, value: TriggerKind | None) -> str | None:
37
- """Serialize type_ to its value."""
38
46
  return value.value if value else None
39
47
 
40
48
  presence_type: TriggerGeofenceKind | None = Field(
@@ -44,7 +52,6 @@ class Trigger(BaseModel):
44
52
 
45
53
  @field_serializer('presence_type', when_used='always')
46
54
  def serialize_presence_type(self, value: TriggerGeofenceKind | None) -> str | None:
47
- """Serialize presence_type to its value."""
48
55
  return value.value if value else None
49
56
 
50
57
  case_type: TriggerCaseKind | None = Field(
@@ -54,7 +61,6 @@ class Trigger(BaseModel):
54
61
 
55
62
  @field_serializer('case_type', when_used='always')
56
63
  def serialize_case_type(self, value: TriggerCaseKind | None) -> str | None:
57
- """Serialize case_type to its value."""
58
64
  return value.value if value else None
59
65
 
60
66
  case_comment_pattern: TriggerCommentPattern | None = Field(
@@ -64,7 +70,6 @@ class Trigger(BaseModel):
64
70
 
65
71
  @field_serializer('case_comment_pattern', when_used='always')
66
72
  def serialize_case_comment_pattern(self, value: TriggerCommentPattern | None) -> str | None:
67
- """Serialize case_comment_pattern to its value."""
68
73
  return value.value if value else None
69
74
 
70
75
  case_comment_value: str | None = Field(
@@ -88,7 +93,6 @@ class Trigger(BaseModel):
88
93
 
89
94
  @field_serializer('weekdays', when_used='always')
90
95
  def serialize_weekdays(self, value: list[Weekday]) -> list[str]:
91
- """Serialize weekdays to their values."""
92
96
  return [day.value for day in value]
93
97
 
94
98
  is_plain_crontab: bool = Field(
@@ -113,10 +117,7 @@ class Trigger(BaseModel):
113
117
 
114
118
  @field_validator('manual_action_fields', mode='before')
115
119
  def validate_manual_action_fields(cls, value: Any) -> list[dict[str, Any]]:
116
- """Ensure manual_action_fields is a list of dictionaries."""
117
- if isinstance(value, list):
118
- return value
119
- return []
120
+ return value if isinstance(value, list) else []
120
121
 
121
122
  formula: str | None = Field(
122
123
  default=None,
@@ -176,7 +177,6 @@ class Trigger(BaseModel):
176
177
 
177
178
  @field_serializer('when_case_expires_delta', when_used='always')
178
179
  def serialize_when_case_expires_delta(self, value: timedelta | None) -> float | None:
179
- """Serialize when_case_expires_delta to total seconds."""
180
180
  return value.total_seconds() if value else None
181
181
 
182
182
  should_stack: bool = Field(
@@ -200,5 +200,38 @@ class Trigger(BaseModel):
200
200
 
201
201
  @field_serializer('search_time_delta', when_used='always')
202
202
  def serialize_search_time_delta(self, value: timedelta | None) -> float | None:
203
- """Serialize search_time_delta to total seconds."""
204
203
  return value.total_seconds() if value else None
204
+
205
+ is_paused: bool = Field(
206
+ default=False,
207
+ description='Defines if the trigger is paused',
208
+ )
209
+
210
+ should_generate_locator: bool = Field(
211
+ default=False,
212
+ description='Defines if the trigger should generate a locator',
213
+ )
214
+
215
+ locator_expires_delta: timedelta | None = Field(
216
+ default=None,
217
+ description='Defines the locator expires delta of the trigger',
218
+ )
219
+
220
+ @field_serializer('locator_expires_delta', when_used='always')
221
+ def serialize_locator_expires_delta(self, value: timedelta | None) -> float | None:
222
+ return value.total_seconds() if value else None
223
+
224
+ locator_expires_triggers_ids: list[int] = Field(
225
+ default_factory=list,
226
+ description='Defines the locator expires triggers IDs of the trigger',
227
+ )
228
+
229
+ locator_geofences_ids: list[int] = Field(
230
+ default_factory=list,
231
+ description='Defines the locator geofences IDs of the trigger',
232
+ )
233
+
234
+ locator_customization_id: int | None = Field(
235
+ default=None,
236
+ description='Defines the locator customization ID of the trigger',
237
+ )
@@ -1,13 +1,9 @@
1
- """Asset Operation Mode"""
2
-
3
1
  from enum import StrEnum
4
2
  from typing import Self
5
3
 
6
4
 
7
5
  class TriggerKind(StrEnum):
8
- """
9
- Trigger Kind definition
10
- """
6
+ """Trigger Kind definition"""
11
7
 
12
8
  PRESENCE_IN_GEOFENCE = 'PRESENCEINGEOFENCE'
13
9
  EXACT_TIME = 'EXACTTIME'
@@ -1,10 +1,17 @@
1
- """User entity"""
2
-
3
- from pydantic import BaseModel, Field
1
+ from pydantic import BaseModel, ConfigDict, Field
4
2
 
5
3
 
6
4
  class User(BaseModel):
7
5
  """User entity"""
8
6
 
9
- pk: int = Field(description='Defines the primary key of the user', 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 = Field(
14
+ description='Defines the primary key of the user',
15
+ alias='id',
16
+ )
10
17
  name: str = Field(description='Defines the name of the user')