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
layrz_sdk/__init__.py CHANGED
@@ -1 +1 @@
1
- """ Layrz SDK Namespace """
1
+ """ Layrz SDK Namespace """
layrz_sdk/constants.py ADDED
@@ -0,0 +1,5 @@
1
+ """Constants"""
2
+
3
+ from zoneinfo import ZoneInfo
4
+
5
+ UTC = ZoneInfo('UTC')
@@ -1,73 +1,129 @@
1
- """Init file"""
2
-
3
- # Broadcast entities
4
- from .broadcasts import BroadcastRequest, BroadcastResponse, BroadcastResult, BroadcastStatus, OutboundService
5
-
6
- # Cases entitites
7
- from .cases import Case, CaseIgnoredStatus, CaseStatus, Comment, Trigger
8
-
9
- # Charts entities
10
- from .charts import (
11
- AreaChart,
12
- AxisConfig,
13
- BarChart,
14
- ChartAlignment,
15
- ChartColor,
16
- ChartConfiguration,
17
- ChartDataSerie,
18
- ChartDataSerieType,
19
- ChartDataType,
20
- ChartException,
21
- ChartRenderTechnology,
22
- ColumnChart,
23
- HTMLChart,
24
- LineChart,
25
- MapCenterType,
26
- MapChart,
27
- MapPoint,
28
- NumberChart,
29
- PieChart,
30
- RadarChart,
31
- RadialBarChart,
32
- ScatterChart,
33
- ScatterSerie,
34
- ScatterSerieItem,
35
- TableChart,
36
- TableHeader,
37
- TableRow,
38
- TimelineChart,
39
- TimelineSerie,
40
- TimelineSerieItem,
41
- get_color_list,
42
- )
43
-
44
- # Checkpoints entities
45
- from .checkpoints import Checkpoint, Waypoint
46
-
47
- # Events entities
48
- from .events import Event
49
-
50
- # Formatting entities
51
- from .formatting import TextAlignment
52
-
53
- # General entities
54
- from .general import Asset, AssetOperationMode, CustomField, Device, Geofence, PresenceType, Sensor, User
55
-
56
- # REPCOM entities
57
- from .repcom import Transaction
58
-
59
- # Reports entities
60
- from .reports import (
61
- CustomReportPage,
62
- Report,
63
- ReportCol,
64
- ReportConfiguration,
65
- ReportDataType,
66
- ReportFormat,
67
- ReportHeader,
68
- ReportPage,
69
- ReportRow,
70
- )
71
-
72
- # Telemetry entities
73
- from .telemetry import LastMessage, Message, Position
1
+ """Init file"""
2
+
3
+ from .asset import Asset
4
+ from .asset_operation_mode import AssetOperationMode
5
+ from .broadcast_request import BroadcastRequest
6
+ from .broadcast_response import BroadcastResponse
7
+ from .broadcast_result import BroadcastResult
8
+ from .broadcast_status import BroadcastStatus
9
+ from .case import Case
10
+ from .case_ignored_status import CaseIgnoredStatus
11
+ from .case_status import CaseStatus
12
+ from .charts.axis_config import AxisConfig
13
+ from .charts.bar_chart import BarChart
14
+ from .charts.chart_alignment import ChartAlignment
15
+ from .charts.chart_color import ChartColor
16
+ from .charts.chart_configuration import ChartConfiguration
17
+ from .charts.chart_data_serie import ChartDataSerie
18
+ from .charts.chart_data_serie_type import ChartDataSerieType
19
+ from .charts.chart_data_type import ChartDataType
20
+ from .charts.chart_render_technology import ChartRenderTechnology
21
+ from .charts.column_chart import ColumnChart
22
+ from .charts.html_chart import HTMLChart
23
+ from .charts.line_chart import LineChart
24
+ from .charts.map_center_type import MapCenterType
25
+ from .charts.map_chart import MapChart
26
+ from .charts.map_point import MapPoint
27
+ from .charts.number_chart import NumberChart
28
+ from .charts.pie_chart import PieChart
29
+ from .charts.radar_chart import RadarChart
30
+ from .charts.radial_bar_chart import RadialBarChart
31
+ from .charts.scatter_chart import ScatterChart
32
+ from .charts.scatter_serie import ScatterSerie
33
+ from .charts.scatter_serie_item import ScatterSerieItem
34
+ from .charts.table_chart import TableChart
35
+ from .charts.table_header import TableHeader
36
+ from .charts.table_row import TableRow
37
+ from .charts.timeline_chart import TimelineChart
38
+ from .charts.timeline_serie import TimelineSerie
39
+ from .charts.timeline_serie_item import TimelineSerieItem
40
+ from .checkpoint import Checkpoint
41
+ from .comment import Comment
42
+ from .custom_field import CustomField
43
+ from .custom_report_page import CustomReportPage
44
+ from .device import Device
45
+ from .event import Event
46
+ from .geofence import Geofence
47
+ from .last_message import LastMessage
48
+ from .message import Message
49
+ from .outbound_service import OutboundService
50
+ from .position import Position
51
+ from .presence_type import PresenceType
52
+ from .report import Report
53
+ from .report_col import ReportCol
54
+ from .report_configuration import ReportConfiguration
55
+ from .report_data_type import ReportDataType
56
+ from .report_format import ReportFormat
57
+ from .report_header import ReportHeader
58
+ from .report_page import ReportPage
59
+ from .report_row import ReportRow
60
+ from .sensor import Sensor
61
+ from .text_alignment import TextAlignment
62
+ from .trigger import Trigger
63
+ from .user import User
64
+ from .waypoint import Waypoint
65
+
66
+ __all__ = [
67
+ 'Asset',
68
+ 'AssetOperationMode',
69
+ 'BroadcastRequest',
70
+ 'BroadcastResponse',
71
+ 'BroadcastResult',
72
+ 'BroadcastStatus',
73
+ 'Case',
74
+ 'CaseIgnoredStatus',
75
+ 'CaseStatus',
76
+ 'AxisConfig',
77
+ 'BarChart',
78
+ 'ChartAlignment',
79
+ 'ChartColor',
80
+ 'ChartConfiguration',
81
+ 'ChartDataSerie',
82
+ 'ChartDataSerieType',
83
+ 'ChartDataType',
84
+ 'ChartRenderTechnology',
85
+ 'ColumnChart',
86
+ 'HTMLChart',
87
+ 'LineChart',
88
+ 'MapCenterType',
89
+ 'MapChart',
90
+ 'MapPoint',
91
+ 'NumberChart',
92
+ 'PieChart',
93
+ 'RadarChart',
94
+ 'RadialBarChart',
95
+ 'ScatterChart',
96
+ 'ScatterSerie',
97
+ 'ScatterSerieItem',
98
+ 'TableChart',
99
+ 'TableHeader',
100
+ 'TableRow',
101
+ 'TimelineChart',
102
+ 'TimelineSerie',
103
+ 'TimelineSerieItem',
104
+ 'Checkpoint',
105
+ 'Comment',
106
+ 'CustomField',
107
+ 'CustomReportPage',
108
+ 'Device',
109
+ 'Event',
110
+ 'Geofence',
111
+ 'LastMessage',
112
+ 'Message',
113
+ 'OutboundService',
114
+ 'Position',
115
+ 'PresenceType',
116
+ 'Report',
117
+ 'ReportCol',
118
+ 'ReportConfiguration',
119
+ 'ReportDataType',
120
+ 'ReportFormat',
121
+ 'ReportHeader',
122
+ 'ReportPage',
123
+ 'ReportRow',
124
+ 'Sensor',
125
+ 'TextAlignment',
126
+ 'Trigger',
127
+ 'User',
128
+ 'Waypoint',
129
+ ]
@@ -0,0 +1,71 @@
1
+ """Asset Entity"""
2
+
3
+ import sys
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ from pydantic import BaseModel, Field, model_validator
7
+
8
+ if sys.version_info >= (3, 11):
9
+ from typing import Self
10
+ else:
11
+ from typing_extensions import Self
12
+
13
+ from .asset_operation_mode import AssetOperationMode
14
+ from .custom_field import CustomField
15
+ from .device import Device
16
+ from .sensor import Sensor
17
+
18
+
19
+ class Asset(BaseModel):
20
+ """Asset entity definition"""
21
+
22
+ pk: int = Field(description='Defines the primary key of the asset')
23
+ name: str = Field(description='Defines the name of the asset')
24
+ vin: Optional[str] = Field(
25
+ default=None,
26
+ description='Defines the serial number of the asset, may be an VIN, or any other unique identifier',
27
+ )
28
+ plate: Optional[str] = Field(default=None, description='Defines the plate number of the asset')
29
+ asset_type: int = Field(description='Defines the type of the asset')
30
+ operation_mode: AssetOperationMode = Field(description='Defines the operation mode of the asset')
31
+ sensors: List[Sensor] = Field(default_factory=list, description='Defines the list of sensors of the asset')
32
+ custom_fields: List[CustomField] = Field(
33
+ default_factory=list, description='Defines the list of custom fields of the asset'
34
+ )
35
+ devices: List[Device] = Field(default_factory=list, description='Defines the list of devices of the asset')
36
+ children: List[Self] = Field(default_factory=list, description='Defines the list of children of the asset')
37
+
38
+ @model_validator(mode='before')
39
+ def _validate_model(cls: Self, data: Dict[str, Any]) -> Dict[str, Any]:
40
+ """Validate model"""
41
+ operation_mode = data.get('operation_mode')
42
+ if operation_mode == AssetOperationMode.ASSETMULTIPLE:
43
+ data['devices'] = []
44
+
45
+ elif operation_mode == AssetOperationMode.SINGLE:
46
+ primary: Optional[Device] = None
47
+ for device in data['devices']:
48
+ if device.is_primary:
49
+ primary = device
50
+ break
51
+
52
+ if not primary:
53
+ raise ValueError('Single asset must have a primary device')
54
+ data['devices'] = [primary]
55
+
56
+ else:
57
+ data['children'] = []
58
+
59
+ return data
60
+
61
+ @property
62
+ def primary(self: Self) -> Optional[Device]:
63
+ """Get primary device"""
64
+ if self.operation_mode not in [AssetOperationMode.SINGLE, AssetOperationMode.MULTIPLE]:
65
+ return None
66
+
67
+ for device in self.devices:
68
+ if device.is_primary:
69
+ return device
70
+
71
+ return None
@@ -1,30 +1,31 @@
1
- """Asset Operation Mode"""
2
-
3
- from enum import Enum
4
-
5
-
6
- class AssetOperationMode(Enum):
7
- """
8
- Asset Operation mode definition
9
- It's an enum of the operation mode of the asset.
10
- """
11
-
12
- SINGLE = 'SINGLE'
13
- MULTIPLE = 'MULTIPLE'
14
- ASSETMULTIPLE = 'ASSETMULTIPLE'
15
- DISCONNECTED = 'DISCONNECTED'
16
- STATIC = 'STATIC'
17
- ZONE = 'ZONE'
18
-
19
- @property
20
- def _readable(self) -> str | None | bool:
21
- """Readable"""
22
- return self.value
23
-
24
- def __str__(self) -> str | None | bool:
25
- """Readable property"""
26
- return self._readable
27
-
28
- def __repr__(self) -> str | None | bool:
29
- """Readable property"""
30
- return self._readable
1
+ """Asset Operation Mode"""
2
+
3
+ import sys
4
+ from enum import Enum
5
+
6
+ if sys.version_info >= (3, 11):
7
+ from typing import Self
8
+ else:
9
+ from typing_extensions import Self
10
+
11
+
12
+ class AssetOperationMode(Enum):
13
+ """
14
+ Asset Operation mode definition
15
+ It's an enum of the operation mode of the asset.
16
+ """
17
+
18
+ SINGLE = 'SINGLE'
19
+ MULTIPLE = 'MULTIPLE'
20
+ ASSETMULTIPLE = 'ASSETMULTIPLE'
21
+ DISCONNECTED = 'DISCONNECTED'
22
+ STATIC = 'STATIC'
23
+ ZONE = 'ZONE'
24
+
25
+ def __str__(self: Self) -> str:
26
+ """Readable property"""
27
+ return self.name
28
+
29
+ def __repr__(self: Self) -> str:
30
+ """Readable property"""
31
+ return f'AssetOperationMode.{self.name}'
@@ -0,0 +1,12 @@
1
+ """Broadcast Result Request data"""
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+
8
+ class BroadcastRequest(BaseModel):
9
+ """Broadcast request data"""
10
+
11
+ json: Any = Field(description='Parsed data')
12
+ raw: str = Field(description='Raw data')
@@ -0,0 +1,12 @@
1
+ """Broadcast Result Response data"""
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+
8
+ class BroadcastResponse(BaseModel):
9
+ """Broadcast response data"""
10
+
11
+ json: Any = Field(description='Parsed data')
12
+ raw: str = Field(description='Raw data')
@@ -0,0 +1,20 @@
1
+ """Broadcast result"""
2
+
3
+ from datetime import datetime
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+ from .broadcast_request import BroadcastRequest
8
+ from .broadcast_response import BroadcastResponse
9
+ from .broadcast_status import BroadcastStatus
10
+
11
+
12
+ class BroadcastResult(BaseModel):
13
+ """Broadcast result data"""
14
+
15
+ service_id: int = Field(description='Service ID')
16
+ asset_id: int = Field(description='Asset ID')
17
+ status: BroadcastStatus = Field(description='Broadcast status')
18
+ request: BroadcastRequest = Field(description='Broadcast request')
19
+ response: BroadcastResponse = Field(description='Broadcast response')
20
+ submitted_at: datetime = Field(description='Broadcast submission date')
@@ -1,27 +1,28 @@
1
- """Broadcast result Status"""
2
-
3
- from enum import Enum
4
-
5
-
6
- class BroadcastStatus(Enum):
7
- """Broadcast result status"""
8
-
9
- OK = 'OK'
10
- BADREQUEST = 'BADREQUEST'
11
- INTERNALERROR = 'INTERNALERROR'
12
- UNAUTHORIZED = 'UNAUTHORIZED'
13
- UNPROCESSABLE = 'UNPROCESSABLE'
14
- DISCONNECTED = 'DISCONNECTED'
15
-
16
- @property
17
- def _readable(self) -> str | None | bool:
18
- """Readable"""
19
- return f'BroadcastStatus.{self.value}'
20
-
21
- def __str__(self) -> str | None | bool:
22
- """Readable property"""
23
- return self._readable
24
-
25
- def __repr__(self) -> str | None | bool:
26
- """Readable property"""
27
- return self._readable
1
+ """Broadcast result Status"""
2
+
3
+ import sys
4
+ from enum import Enum
5
+
6
+ if sys.version_info >= (3, 11):
7
+ from typing import Self
8
+ else:
9
+ from typing_extensions import Self
10
+
11
+
12
+ class BroadcastStatus(Enum):
13
+ """Broadcast result status"""
14
+
15
+ OK = 'OK'
16
+ BADREQUEST = 'BADREQUEST'
17
+ INTERNALERROR = 'INTERNALERROR'
18
+ UNAUTHORIZED = 'UNAUTHORIZED'
19
+ UNPROCESSABLE = 'UNPROCESSABLE'
20
+ DISCONNECTED = 'DISCONNECTED'
21
+
22
+ def __str__(self: Self) -> str:
23
+ """Readable property"""
24
+ return self.name
25
+
26
+ def __repr__(self: Self) -> str:
27
+ """Readable property"""
28
+ return f'BroadcastStatus.{self.name}'
@@ -0,0 +1,47 @@
1
+ """Events entities"""
2
+ import sys
3
+ from datetime import datetime
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ from pydantic import BaseModel, Field, model_validator
7
+
8
+ from .case_ignored_status import CaseIgnoredStatus
9
+ from .case_status import CaseStatus
10
+ from .comment import Comment
11
+ from .trigger import Trigger
12
+
13
+ if sys.version_info >= (3, 11):
14
+ from typing import Self
15
+ else:
16
+ from typing_extensions import Self
17
+
18
+
19
+ class Case(BaseModel):
20
+ """Case entity"""
21
+
22
+ pk: int = Field(description='Defines the primary key of the case')
23
+ trigger: Trigger = Field(description='Defines the trigger of the case')
24
+ asset_id: int = Field(description='Defines the asset ID of the case')
25
+ comments: List[Comment] = Field(default_factory=list, description='Defines the comments of the case')
26
+ opened_at: datetime = Field(description='Defines the date when the case was opened')
27
+ closed_at: Optional[datetime] = Field(default=None, description='Defines the date when the case was closed')
28
+ status: CaseStatus = Field(description='Defines the status of the case', default=CaseStatus.CLOSED)
29
+ ignored_status: CaseIgnoredStatus = Field(
30
+ description='Defines the ignored status of the case',
31
+ default=CaseIgnoredStatus.NORMAL,
32
+ )
33
+ sequence: Optional[int | str] = Field(
34
+ default=None,
35
+ description='Defines the sequence of the case. This is a unique identifier for the case',
36
+ )
37
+
38
+ @model_validator(mode='before')
39
+ def _validate_model(cls: Self, data: Dict[str, Any]) -> Dict[str, Any]:
40
+ """Validate model"""
41
+ sequence = data.get('sequence')
42
+ if sequence is not None and isinstance(sequence, int):
43
+ data['sequence'] = f'{data["trigger"].code}/{sequence}'
44
+ else:
45
+ data['sequence'] = f'GENERIC/{data["pk"]}'
46
+
47
+ return data
@@ -0,0 +1,26 @@
1
+ import sys
2
+ from enum import Enum
3
+
4
+ if sys.version_info >= (3, 11):
5
+ from typing import Self
6
+ else:
7
+ from typing_extensions import Self
8
+
9
+
10
+ class CaseIgnoredStatus(Enum):
11
+ """
12
+ Case ignore status, will define what kind ignore happened.
13
+ """
14
+
15
+ NORMAL = 'NORMAL'
16
+ IGNORED = 'IGNORED'
17
+ PRESET = 'PRESET'
18
+ AUTO = 'AUTO'
19
+
20
+ def __str__(self: Self) -> str:
21
+ """Readable property"""
22
+ return self.name
23
+
24
+ def __repr__(self: Self) -> str:
25
+ """Readable property"""
26
+ return f'CaseIgnoredStatus.{self.name}'
@@ -0,0 +1,23 @@
1
+ import sys
2
+ from enum import Enum
3
+
4
+ if sys.version_info >= (3, 11):
5
+ from typing import Self
6
+ else:
7
+ from typing_extensions import Self
8
+
9
+
10
+ class CaseStatus(Enum):
11
+ """Case status enum"""
12
+
13
+ PENDING = 'PENDING'
14
+ FOLLOWED = 'FOLLOWED'
15
+ CLOSED = 'CLOSED'
16
+
17
+ def __str__(self: Self) -> str:
18
+ """Readable property"""
19
+ return self.name
20
+
21
+ def __repr__(self: Self) -> str:
22
+ """Readable property"""
23
+ return f'CaseStatus.{self.name}'
@@ -0,0 +1,15 @@
1
+ from typing import Optional
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from .chart_data_type import ChartDataType
6
+
7
+
8
+ class AxisConfig(BaseModel):
9
+ """Axis configuration"""
10
+
11
+ label: str = Field(default='', description='Label of the axis')
12
+ measure_unit: str = Field(default='', description='Measure unit of the axis')
13
+ min_value: Optional[float] = Field(default=None, description='Minimum value of the axis')
14
+ max_value: Optional[float] = Field(default=None, description='Maximum value of the axis')
15
+ data_type: ChartDataType = Field(default=ChartDataType.DATETIME, description='Data type of the axis')