layrz-sdk 3.0.14__py3-none-any.whl → 3.1.0__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.

Potentially problematic release.


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

Files changed (123) hide show
  1. layrz_sdk/__init__.py +1 -1
  2. layrz_sdk/constants.py +5 -0
  3. layrz_sdk/entities/__init__.py +129 -73
  4. layrz_sdk/entities/asset.py +71 -0
  5. layrz_sdk/entities/{general/asset_operation_mode.py → asset_operation_mode.py} +31 -30
  6. layrz_sdk/entities/broadcast_request.py +12 -0
  7. layrz_sdk/entities/broadcast_response.py +12 -0
  8. layrz_sdk/entities/broadcast_result.py +20 -0
  9. layrz_sdk/entities/{broadcasts/status.py → broadcast_status.py} +28 -27
  10. layrz_sdk/entities/case.py +47 -0
  11. layrz_sdk/entities/case_ignored_status.py +26 -0
  12. layrz_sdk/entities/case_status.py +23 -0
  13. layrz_sdk/entities/charts/axis_config.py +15 -0
  14. layrz_sdk/entities/charts/{bar.py → bar_chart.py} +171 -208
  15. layrz_sdk/entities/charts/chart_alignment.py +27 -0
  16. layrz_sdk/entities/charts/chart_color.py +44 -0
  17. layrz_sdk/entities/charts/chart_configuration.py +10 -0
  18. layrz_sdk/entities/charts/chart_data_serie.py +19 -0
  19. layrz_sdk/entities/charts/chart_data_serie_type.py +28 -0
  20. layrz_sdk/entities/charts/chart_data_type.py +27 -0
  21. layrz_sdk/entities/charts/{render_technology.py → chart_render_technology.py} +30 -29
  22. layrz_sdk/entities/charts/{column.py → column_chart.py} +197 -236
  23. layrz_sdk/entities/charts/html_chart.py +34 -0
  24. layrz_sdk/entities/charts/{line.py → line_chart.py} +244 -282
  25. layrz_sdk/entities/charts/map_center_type.py +22 -0
  26. layrz_sdk/entities/charts/map_chart.py +104 -0
  27. layrz_sdk/entities/charts/map_point.py +22 -0
  28. layrz_sdk/entities/charts/number_chart.py +50 -0
  29. layrz_sdk/entities/charts/{pie.py → pie_chart.py} +127 -148
  30. layrz_sdk/entities/charts/radar_chart.py +77 -0
  31. layrz_sdk/entities/charts/{radial_bar.py → radial_bar_chart.py} +127 -148
  32. layrz_sdk/entities/charts/{scatter.py → scatter_chart.py} +206 -290
  33. layrz_sdk/entities/charts/scatter_serie.py +15 -0
  34. layrz_sdk/entities/charts/scatter_serie_item.py +8 -0
  35. layrz_sdk/entities/charts/table_chart.py +50 -0
  36. layrz_sdk/entities/charts/table_header.py +8 -0
  37. layrz_sdk/entities/charts/table_row.py +9 -0
  38. layrz_sdk/entities/charts/timeline_chart.py +75 -0
  39. layrz_sdk/entities/charts/timeline_serie.py +12 -0
  40. layrz_sdk/entities/charts/timeline_serie_item.py +12 -0
  41. layrz_sdk/entities/checkpoint.py +18 -0
  42. layrz_sdk/entities/comment.py +16 -0
  43. layrz_sdk/entities/custom_field.py +10 -0
  44. layrz_sdk/entities/custom_report_page.py +16 -0
  45. layrz_sdk/entities/device.py +13 -0
  46. layrz_sdk/entities/event.py +23 -0
  47. layrz_sdk/entities/geofence.py +11 -0
  48. layrz_sdk/entities/last_message.py +12 -0
  49. layrz_sdk/entities/message.py +23 -0
  50. layrz_sdk/entities/outbound_service.py +10 -0
  51. layrz_sdk/entities/position.py +101 -0
  52. layrz_sdk/entities/presence_type.py +16 -0
  53. layrz_sdk/entities/{reports/report.py → report.py} +257 -286
  54. layrz_sdk/entities/report_col.py +40 -0
  55. layrz_sdk/entities/report_configuration.py +8 -0
  56. layrz_sdk/entities/report_data_type.py +28 -0
  57. layrz_sdk/entities/{reports/format.py → report_format.py} +27 -26
  58. layrz_sdk/entities/report_header.py +43 -0
  59. layrz_sdk/entities/report_page.py +17 -0
  60. layrz_sdk/entities/report_row.py +28 -0
  61. layrz_sdk/entities/sensor.py +11 -0
  62. layrz_sdk/entities/{formatting/text_align.py → text_alignment.py} +26 -25
  63. layrz_sdk/entities/trigger.py +11 -0
  64. layrz_sdk/entities/user.py +10 -0
  65. layrz_sdk/entities/waypoint.py +18 -0
  66. layrz_sdk/helpers/__init__.py +8 -2
  67. layrz_sdk/helpers/color.py +41 -45
  68. layrz_sdk/lcl/__init__.py +7 -2
  69. layrz_sdk/lcl/core.py +832 -820
  70. layrz_sdk/py.typed +0 -0
  71. {layrz_sdk-3.0.14.dist-info → layrz_sdk-3.1.0.dist-info}/LICENSE +6 -6
  72. {layrz_sdk-3.0.14.dist-info → layrz_sdk-3.1.0.dist-info}/METADATA +48 -45
  73. layrz_sdk-3.1.0.dist-info/RECORD +75 -0
  74. {layrz_sdk-3.0.14.dist-info → layrz_sdk-3.1.0.dist-info}/WHEEL +1 -1
  75. layrz_sdk/entities/broadcasts/__init__.py +0 -6
  76. layrz_sdk/entities/broadcasts/request.py +0 -30
  77. layrz_sdk/entities/broadcasts/response.py +0 -30
  78. layrz_sdk/entities/broadcasts/result.py +0 -53
  79. layrz_sdk/entities/broadcasts/service.py +0 -28
  80. layrz_sdk/entities/cases/__init__.py +0 -4
  81. layrz_sdk/entities/cases/case.py +0 -120
  82. layrz_sdk/entities/cases/comment.py +0 -37
  83. layrz_sdk/entities/cases/trigger.py +0 -31
  84. layrz_sdk/entities/charts/__init__.py +0 -21
  85. layrz_sdk/entities/charts/alignment.py +0 -26
  86. layrz_sdk/entities/charts/color.py +0 -38
  87. layrz_sdk/entities/charts/configuration.py +0 -54
  88. layrz_sdk/entities/charts/data_type.py +0 -26
  89. layrz_sdk/entities/charts/exceptions.py +0 -29
  90. layrz_sdk/entities/charts/html.py +0 -44
  91. layrz_sdk/entities/charts/map.py +0 -179
  92. layrz_sdk/entities/charts/number.py +0 -52
  93. layrz_sdk/entities/charts/radar.py +0 -102
  94. layrz_sdk/entities/charts/serie.py +0 -56
  95. layrz_sdk/entities/charts/serie_type.py +0 -27
  96. layrz_sdk/entities/charts/table.py +0 -74
  97. layrz_sdk/entities/charts/timeline.py +0 -148
  98. layrz_sdk/entities/checkpoints/__init__.py +0 -4
  99. layrz_sdk/entities/checkpoints/checkpoint.py +0 -50
  100. layrz_sdk/entities/checkpoints/waypoint.py +0 -52
  101. layrz_sdk/entities/events/__init__.py +0 -2
  102. layrz_sdk/entities/events/event.py +0 -58
  103. layrz_sdk/entities/formatting/__init__.py +0 -2
  104. layrz_sdk/entities/general/__init__.py +0 -9
  105. layrz_sdk/entities/general/asset.py +0 -72
  106. layrz_sdk/entities/general/custom_field.py +0 -29
  107. layrz_sdk/entities/general/device.py +0 -45
  108. layrz_sdk/entities/general/geofence.py +0 -53
  109. layrz_sdk/entities/general/sensor.py +0 -31
  110. layrz_sdk/entities/general/user.py +0 -29
  111. layrz_sdk/entities/repcom/__init__.py +0 -2
  112. layrz_sdk/entities/repcom/transaction.py +0 -54
  113. layrz_sdk/entities/reports/__init__.py +0 -7
  114. layrz_sdk/entities/reports/col.py +0 -86
  115. layrz_sdk/entities/reports/header.py +0 -57
  116. layrz_sdk/entities/reports/page.py +0 -64
  117. layrz_sdk/entities/reports/row.py +0 -43
  118. layrz_sdk/entities/telemetry/__init__.py +0 -5
  119. layrz_sdk/entities/telemetry/last_message.py +0 -41
  120. layrz_sdk/entities/telemetry/message.py +0 -37
  121. layrz_sdk/entities/telemetry/position.py +0 -51
  122. layrz_sdk-3.0.14.dist-info/RECORD +0 -70
  123. {layrz_sdk-3.0.14.dist-info → layrz_sdk-3.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,12 @@
1
+ from typing import List
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from .timeline_serie_item import TimelineSerieItem
6
+
7
+
8
+ class TimelineSerie(BaseModel):
9
+ """Chart Data Serie for Timeline charts"""
10
+
11
+ data: List[TimelineSerieItem] = Field(description='List of data points', default_factory=list)
12
+ label: str = Field(description='Label of the serie')
@@ -0,0 +1,12 @@
1
+ from datetime import datetime
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class TimelineSerieItem(BaseModel):
7
+ """Chart Data Serie Item for Timeline Charts"""
8
+
9
+ name: str = Field(description='Name of the item')
10
+ start_at: datetime = Field(description='Start date of the item')
11
+ end_at: datetime = Field(description='End date of the item')
12
+ color: str = Field(description='Color of the item')
@@ -0,0 +1,18 @@
1
+ """Checkpoints entitites"""
2
+
3
+ from datetime import datetime
4
+ from typing import List
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from .waypoint import Waypoint
9
+
10
+
11
+ class Checkpoint(BaseModel):
12
+ """Checkpoint entity definition"""
13
+
14
+ pk: int = Field(description='Checkpoint ID')
15
+ asset_id: int = Field(description='Asset ID')
16
+ waypoints: List[Waypoint] = Field(description='List of waypoints', default_factory=list)
17
+ start_at: datetime = Field(description='Checkpoint start date')
18
+ end_at: datetime = Field(description='Checkpoint end date')
@@ -0,0 +1,16 @@
1
+ """Comment entity"""
2
+
3
+ from datetime import datetime
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+ from .user import User
8
+
9
+
10
+ class Comment(BaseModel):
11
+ """Comment entity"""
12
+
13
+ pk: int = Field(description='Comment ID')
14
+ content: str = Field(description='Comment content')
15
+ user: User = Field(description='Operator/User what commented the case')
16
+ submitted_at: datetime = Field(description='Date of comment submission')
@@ -0,0 +1,10 @@
1
+ """Custom Field entitiy"""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class CustomField(BaseModel):
7
+ """Custom field definition"""
8
+
9
+ name: str = Field(description='Defines the name of the custom field')
10
+ value: str = Field(description='Defines the value of the custom field')
@@ -0,0 +1,16 @@
1
+ from typing import Callable
2
+
3
+ from pydantic import BaseModel, Field
4
+ from xlsxwriter.worksheet import Worksheet
5
+
6
+
7
+ class CustomReportPage(BaseModel):
8
+ """
9
+ Custom report page
10
+ Basically it's a wrapper of the `xlswriter` worksheet that uses a function to construct the page
11
+ """
12
+
13
+ name: str = Field(description='Name of the page. Length should be less than 60 characters')
14
+ builder: Callable[[Worksheet], None] = Field(
15
+ description='Function to build the page. The only argument is the worksheet object',
16
+ )
@@ -0,0 +1,13 @@
1
+ """Device entitiy"""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class Device(BaseModel):
7
+ """Device entity"""
8
+
9
+ pk: int = Field(description='Defines the primary key of the device')
10
+ name: str = Field(description='Defines the name of the device')
11
+ ident: str = Field(description='Defines the identifier of the device')
12
+ protocol: str = Field(description='Defines the protocol of the device')
13
+ is_primary: bool = Field(default=False, description='Defines if the device is the primary device')
@@ -0,0 +1,23 @@
1
+ """Event entity"""
2
+
3
+ from datetime import datetime
4
+ from typing import Optional
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from .geofence import Geofence
9
+ from .message import Message
10
+ from .presence_type import PresenceType
11
+ from .trigger import Trigger
12
+
13
+
14
+ class Event(BaseModel):
15
+ """Event entity definition"""
16
+
17
+ pk: int = Field(description='Event ID')
18
+ trigger: Trigger = Field(description='Event trigger')
19
+ asset_id: int = Field(description='Asset ID')
20
+ message: Message = Field(description='Message')
21
+ activated_at: datetime = Field(description='Event activation date')
22
+ geofence: Optional[Geofence] = Field(default=None, description='Geofence object')
23
+ presence_type: Optional[PresenceType] = Field(default=None, description='Presence type object')
@@ -0,0 +1,11 @@
1
+ """Geofence entity"""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class Geofence(BaseModel):
7
+ """Geofence entity"""
8
+
9
+ pk: int = Field(description='Defines the primary key of the geofence')
10
+ name: str = Field(description='Defines the name of the geofence')
11
+ color: str = Field(description='Defines the color of the geofence')
@@ -0,0 +1,12 @@
1
+ """LastMessage entity"""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from .asset import Asset
6
+ from .message import Message
7
+
8
+
9
+ class LastMessage(Message, BaseModel):
10
+ """LastMessage definition"""
11
+
12
+ asset: Asset = Field(description='Defines the asset of the last message')
@@ -0,0 +1,23 @@
1
+ """Message entity"""
2
+
3
+ from datetime import datetime
4
+ from typing import Any, Dict, TypeAlias
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from layrz_sdk.constants import UTC
9
+
10
+ from .position import Position
11
+
12
+ PayloadType: TypeAlias = Dict[str, Any]
13
+
14
+
15
+ class Message(BaseModel):
16
+ """Message definition"""
17
+
18
+ pk: int
19
+ asset_id: int
20
+ position: Position = Field(default_factory=lambda: Position())
21
+ payload: PayloadType = Field(default_factory=dict)
22
+ sensors: PayloadType = Field(default_factory=dict)
23
+ received_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
@@ -0,0 +1,10 @@
1
+ """Service entity"""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class OutboundService(BaseModel):
7
+ """Outbound service definition"""
8
+
9
+ pk: int = Field(description='Service ID')
10
+ name: str = Field(description='Service name')
@@ -0,0 +1,101 @@
1
+ """Position entity"""
2
+
3
+ import sys
4
+ from typing import Any, Optional
5
+
6
+ from pydantic import BaseModel, Field, field_validator
7
+
8
+ if sys.version_info >= (3, 11):
9
+ from typing import Self
10
+ else:
11
+ from typing_extensions import Self
12
+
13
+
14
+ class Position(BaseModel):
15
+ """Geographic position definition"""
16
+
17
+ latitude: Optional[float] = Field(default=None, description='Defines the latitude of the position')
18
+ longitude: Optional[float] = Field(default=None, description='Defines the longitude of the position')
19
+ altitude: Optional[float] = Field(default=None, description='Defines the altitude of the position')
20
+ hdop: Optional[float] = Field(default=None, description='Defines the horizontal dilution of precision')
21
+ speed: Optional[float] = Field(default=None, description='Defines the speed of the position')
22
+ direction: Optional[float] = Field(default=None, description='Defines the direction of the position')
23
+ satellites: Optional[int] = Field(
24
+ default=None,
25
+ description='Defines the number of satellites used to calculate the position',
26
+ )
27
+
28
+ @field_validator('latitude', mode='before')
29
+ def _validate_latitude(cls: Self, value: Any) -> None | float:
30
+ """Validate latitude"""
31
+ if value is None:
32
+ return None
33
+
34
+ if not isinstance(value, float):
35
+ return None
36
+
37
+ if -90 <= value <= 90:
38
+ return value
39
+
40
+ return None
41
+
42
+ @field_validator('longitude', mode='before')
43
+ def _validate_longitude(cls: Self, value: Any) -> None | float:
44
+ """Validate longitude"""
45
+ if value is None:
46
+ return None
47
+
48
+ if not isinstance(value, float):
49
+ return None
50
+
51
+ if -180 <= value <= 180:
52
+ return value
53
+
54
+ return None
55
+
56
+ @field_validator('altitude', mode='before')
57
+ def _validate_altitude(cls: Self, value: Any) -> None | float:
58
+ """Validate altitude"""
59
+ if value is None:
60
+ return None
61
+
62
+ if not isinstance(value, (float, int)):
63
+ return None
64
+
65
+ return value
66
+
67
+ @field_validator('hdop', mode='before')
68
+ def _validate_hdop(cls: Self, value: Any) -> None | float:
69
+ """Validate hdop"""
70
+ if value is None:
71
+ return None
72
+
73
+ if not isinstance(value, float):
74
+ return None
75
+
76
+ return value
77
+
78
+ @field_validator('speed', mode='before')
79
+ def _validate_speed(cls: Self, value: Any) -> None | float:
80
+ """Validate speed"""
81
+ if value is None:
82
+ return None
83
+
84
+ if not isinstance(value, (float, int)):
85
+ return None
86
+
87
+ return abs(value)
88
+
89
+ @field_validator('direction', mode='before')
90
+ def _validate_direction(cls: Self, value: Any) -> None | float:
91
+ """Validate direction"""
92
+ if value is None:
93
+ return None
94
+
95
+ if not isinstance(value, (float, int)):
96
+ return None
97
+
98
+ if 0 <= value <= 360:
99
+ return value
100
+
101
+ return None
@@ -0,0 +1,16 @@
1
+ from enum import Enum
2
+
3
+
4
+ class PresenceType(Enum):
5
+ """Presence type enum"""
6
+
7
+ ENTRANCE = 'ENTRANCE'
8
+ EXIT = 'EXIT'
9
+
10
+ def __str__(self) -> str:
11
+ """Readable property"""
12
+ return self.name
13
+
14
+ def __repr__(self) -> str:
15
+ """Readable property"""
16
+ return f'PresenceType.{self.name}'