commonlib-reader 1.0.8__tar.gz → 1.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/PKG-INFO +1 -1
- commonlib_reader-1.1.0/commonlib_reader/facility.py +277 -0
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/commonlib_reader/ims.py +30 -15
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/commonlib_reader/tag.py +116 -34
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/commonlib_reader/unit.py +33 -11
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/commonlib_reader/utils.py +2 -1
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/pyproject.toml +1 -1
- commonlib_reader-1.0.8/commonlib_reader/facility.py +0 -141
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/README.md +0 -0
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/commonlib_reader/__init__.py +0 -0
- {commonlib_reader-1.0.8 → commonlib_reader-1.1.0}/commonlib_reader/connector.py +0 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
from typing import List, Union
|
|
2
|
+
|
|
3
|
+
from commonlib_reader.utils import attributes_list_to_dict, get_code
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Facility:
|
|
7
|
+
"""
|
|
8
|
+
Facility class to encapsulate information.
|
|
9
|
+
|
|
10
|
+
Attributes:
|
|
11
|
+
identity (str) : A unique identifier for the facility (read from the data source).
|
|
12
|
+
name (str) : The name of the facility (read from the data source).
|
|
13
|
+
description (str) : A description of the facility (read from the data source).
|
|
14
|
+
SAPPlant (str) : SAP Plant code (if available).
|
|
15
|
+
Field (str) : Field identifier associated with the facility (if available).
|
|
16
|
+
ParentFacility (str) : Parent facility identifier (if available).
|
|
17
|
+
NPDID (str) : NPD ID (if available).
|
|
18
|
+
GovernmentalName (str) : Governmental facility name (if available).
|
|
19
|
+
|
|
20
|
+
_cache (list of dict, optional):
|
|
21
|
+
Class level cache to store facility data, to minimize data source access.
|
|
22
|
+
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
_cache = None
|
|
26
|
+
|
|
27
|
+
def __init__(self, code):
|
|
28
|
+
"""
|
|
29
|
+
Initializes the Facility instance by retrieving data related to the given STID plant code.
|
|
30
|
+
|
|
31
|
+
Parameters:
|
|
32
|
+
code (str): The code used to retrieve facility data from the data source.
|
|
33
|
+
STID plant code is preferred, but SAP codes and governmental facility names can also be used.
|
|
34
|
+
|
|
35
|
+
Raises:
|
|
36
|
+
ValueError: If no data is found for the provided code.
|
|
37
|
+
"""
|
|
38
|
+
self._data = Facility._get_facility_data(code=code)
|
|
39
|
+
self._attributes = attributes_list_to_dict(self._data["attributes"])
|
|
40
|
+
|
|
41
|
+
if self.is_stid:
|
|
42
|
+
self.STID = self.identity
|
|
43
|
+
self.instCode = self.identity # Alias for identity
|
|
44
|
+
try:
|
|
45
|
+
self.SAP = int(self.sap) # Alias for SAPPlant as integer
|
|
46
|
+
except (TypeError, ValueError):
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def identity(self) -> str:
|
|
51
|
+
return self._data.get("identity", "")
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def name(self) -> str:
|
|
55
|
+
return self._data.get("name", "")
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def description(self) -> str:
|
|
59
|
+
return self._data.get("description", "")
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def stid(self) -> str:
|
|
63
|
+
return self.inst_code
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def inst_code(self) -> str:
|
|
67
|
+
if self.is_stid:
|
|
68
|
+
return self.identity
|
|
69
|
+
return ""
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def is_stid(self) -> bool:
|
|
73
|
+
return self.isSTID()
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def sap(self) -> str:
|
|
77
|
+
return self._attributes.get("SAPPlant", "")
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def field(self) -> str:
|
|
81
|
+
return self._attributes.get("Field", "")
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def parent_facility(self) -> str:
|
|
85
|
+
return self._attributes.get("ParentFacility", "")
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def npd_id(self):
|
|
89
|
+
return self._attributes.get("NPDID", "")
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def governmental_name(self) -> str:
|
|
93
|
+
return self._attributes.get("GovernmentalName", "")
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def ioc_plant(self) -> str:
|
|
97
|
+
return self._attributes.get("IOCPlant", "")
|
|
98
|
+
|
|
99
|
+
def isSTID(self):
|
|
100
|
+
"""
|
|
101
|
+
Checks if the facility is marked for STID.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
bool: True if the facility is marked for STID, False otherwise.
|
|
105
|
+
"""
|
|
106
|
+
if "IsForSTID" in self._attributes.keys():
|
|
107
|
+
if self._attributes["IsForSTID"] == "True":
|
|
108
|
+
return True
|
|
109
|
+
|
|
110
|
+
return False
|
|
111
|
+
|
|
112
|
+
def resolve_gov_facility_name(self) -> str:
|
|
113
|
+
"""
|
|
114
|
+
Retrieves the governmental facility name.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
str: The governmental facility name if available, otherwise an empty string.
|
|
118
|
+
"""
|
|
119
|
+
if len(self.governmental_name) > 0:
|
|
120
|
+
return self.governmental_name
|
|
121
|
+
|
|
122
|
+
if self.parent_facility != "":
|
|
123
|
+
parent = Facility(self.parent_facility)
|
|
124
|
+
return parent.resolve_gov_facility_name()
|
|
125
|
+
|
|
126
|
+
raise ValueError(
|
|
127
|
+
f"Cannot resolve governmental facility name for facility {self.name}"
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def resolve_inst_code(self) -> str:
|
|
131
|
+
if self.stid != "":
|
|
132
|
+
return self.stid
|
|
133
|
+
elif len(self.parent_facility) > 0:
|
|
134
|
+
f = Facility(self.parent_facility)
|
|
135
|
+
return f.resolve_inst_code()
|
|
136
|
+
|
|
137
|
+
raise ValueError(f"Cannot resolve installation code for facility {self.name}")
|
|
138
|
+
|
|
139
|
+
def resolve_ioc_plant_name(self) -> str:
|
|
140
|
+
"""
|
|
141
|
+
Retrieves the IOC plant name.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
str: The IOC plant name if available, otherwise an empty string.
|
|
145
|
+
"""
|
|
146
|
+
if len(self.ioc_plant) > 0:
|
|
147
|
+
return self.ioc_plant
|
|
148
|
+
|
|
149
|
+
if self.parent_facility != "":
|
|
150
|
+
parent = Facility(self.parent_facility)
|
|
151
|
+
return parent.resolve_ioc_plant_name()
|
|
152
|
+
|
|
153
|
+
raise ValueError(f"Cannot resolve IOC plant name for facility {self.name}")
|
|
154
|
+
|
|
155
|
+
@classmethod
|
|
156
|
+
def get_inst_code(cls, facility: Union[str, int]) -> str:
|
|
157
|
+
"""
|
|
158
|
+
Retrieves the STID installation code for the given facility identifier.
|
|
159
|
+
If the facility is not a STID facility, it recursively retrieves the installation code of its parent facility.
|
|
160
|
+
|
|
161
|
+
Parameters:
|
|
162
|
+
facility (str or int): The facility identifier, which can be a STID plant code, SAP code, or governmental facility name.
|
|
163
|
+
Returns:
|
|
164
|
+
str: The installation code corresponding to the facility.
|
|
165
|
+
Raises:
|
|
166
|
+
ValueError: If no facility is found for the provided identifier.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
f = cls(facility)
|
|
170
|
+
if isinstance(f, cls):
|
|
171
|
+
return f.stid
|
|
172
|
+
|
|
173
|
+
raise ValueError(f"No facility found for {facility}")
|
|
174
|
+
|
|
175
|
+
@classmethod
|
|
176
|
+
def get_child_facilities(
|
|
177
|
+
cls, parent_facility: Union[str, "Facility"], recurse=True
|
|
178
|
+
) -> List["Facility"]:
|
|
179
|
+
"""
|
|
180
|
+
Retrieves all child facilities of the given parent facility.
|
|
181
|
+
|
|
182
|
+
Parameters:
|
|
183
|
+
parent_facility (str or Facility): The parent identifier of the parent facility.
|
|
184
|
+
recurse (bool): Whether to recursively retrieve child
|
|
185
|
+
facilities. Default is True.
|
|
186
|
+
Returns:
|
|
187
|
+
List[Facility]: A list of child
|
|
188
|
+
"""
|
|
189
|
+
|
|
190
|
+
if isinstance(parent_facility, Facility):
|
|
191
|
+
parent_facility = parent_facility.identity
|
|
192
|
+
|
|
193
|
+
children = []
|
|
194
|
+
for f in cls.get_all_facilities():
|
|
195
|
+
if f.parent_facility == parent_facility:
|
|
196
|
+
children.append(f)
|
|
197
|
+
|
|
198
|
+
if recurse and len(children) > 0:
|
|
199
|
+
grandkids = []
|
|
200
|
+
for c in children:
|
|
201
|
+
gc = cls.get_child_facilities(c)
|
|
202
|
+
if len(gc) > 0:
|
|
203
|
+
grandkids.append(gc)
|
|
204
|
+
|
|
205
|
+
if len(grandkids) > 0:
|
|
206
|
+
[children.append(gc) for gc in grandkids]
|
|
207
|
+
|
|
208
|
+
return children
|
|
209
|
+
|
|
210
|
+
@classmethod
|
|
211
|
+
def get_all_facilities(cls) -> List["Facility"]:
|
|
212
|
+
"""
|
|
213
|
+
Retrieves and returns a list of Facility instances for all known facilities.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
List[Facility]: A list of Facility instances.
|
|
217
|
+
"""
|
|
218
|
+
f = Facility._get_all_facility_data()
|
|
219
|
+
return [Facility(x["identity"]) for x in f]
|
|
220
|
+
|
|
221
|
+
@classmethod
|
|
222
|
+
def _get_all_facility_data(cls) -> List[dict]:
|
|
223
|
+
"""
|
|
224
|
+
Retrieves all facility data, using a class level cache.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
List[dict]: A list of dictionaries, each representing facility data.
|
|
228
|
+
"""
|
|
229
|
+
if cls._cache is None:
|
|
230
|
+
code = get_code("Facility")
|
|
231
|
+
if isinstance(code, list):
|
|
232
|
+
cls._cache = code
|
|
233
|
+
else:
|
|
234
|
+
raise ValueError("Failed to retrieve facility data")
|
|
235
|
+
|
|
236
|
+
return cls._cache
|
|
237
|
+
|
|
238
|
+
@classmethod
|
|
239
|
+
def _get_facility_data(cls, code) -> dict:
|
|
240
|
+
"""
|
|
241
|
+
Retrieves the facility data for the given code.
|
|
242
|
+
|
|
243
|
+
Parameters:
|
|
244
|
+
code (str): The STID plant code corresponding to the facility. NB! SAP codes and governmental facility names can also be used.
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
dict: A dictionary containing data related to the facility.
|
|
248
|
+
|
|
249
|
+
Raises:
|
|
250
|
+
ValueError: If no data is found for the provided code.
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
if isinstance(code, str):
|
|
254
|
+
for f in cls._get_all_facility_data():
|
|
255
|
+
if (
|
|
256
|
+
f["identity"].upper() == code.upper()
|
|
257
|
+
or f["name"].upper() == code.upper()
|
|
258
|
+
or f["description"].upper() == code.upper()
|
|
259
|
+
):
|
|
260
|
+
return f
|
|
261
|
+
|
|
262
|
+
for f in cls._get_all_facility_data():
|
|
263
|
+
check_sap = False
|
|
264
|
+
check_gov_fac_name = False
|
|
265
|
+
for a in f["attributes"]:
|
|
266
|
+
if a["definitionName"] == "SAPPlant":
|
|
267
|
+
if a["displayValue"] == str(code):
|
|
268
|
+
return f
|
|
269
|
+
check_sap = True
|
|
270
|
+
elif a["definitionName"] == "GovernmentalName":
|
|
271
|
+
if a["displayValue"].upper() == str(code).upper():
|
|
272
|
+
return f
|
|
273
|
+
check_gov_fac_name = True
|
|
274
|
+
if check_sap and check_gov_fac_name:
|
|
275
|
+
break
|
|
276
|
+
|
|
277
|
+
raise ValueError(f"No data found for {code}")
|
|
@@ -34,14 +34,29 @@ class IMS:
|
|
|
34
34
|
self._attributes = attributes_list_to_dict(self._data["attributes"])
|
|
35
35
|
|
|
36
36
|
self.isValid = data["isValid"]
|
|
37
|
-
|
|
38
|
-
self.Facility = ""
|
|
39
|
-
self.IMSType = ""
|
|
40
|
-
self.Alias = ""
|
|
41
|
-
|
|
42
37
|
for attr in self._data["attributes"]:
|
|
43
38
|
self.__setattr__(attr["definitionName"], attr["displayValue"])
|
|
44
39
|
|
|
40
|
+
@property
|
|
41
|
+
def alias(self) -> str:
|
|
42
|
+
return getattr(self, "Alias", "")
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def type(self) -> str:
|
|
46
|
+
return getattr(self, "IMSType", "")
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def facility(self) -> str:
|
|
50
|
+
return getattr(self, "Facility", "")
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def is_valid(self) -> bool:
|
|
54
|
+
return getattr(self, "isValid", False)
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def seeq_datasource(self) -> str:
|
|
58
|
+
return getattr(self, "IMSSeeqDatasource", "")
|
|
59
|
+
|
|
45
60
|
@staticmethod
|
|
46
61
|
def from_facility(facility: Union[Facility, str, int]) -> "IMS":
|
|
47
62
|
"""Get IMS instance from STID code.
|
|
@@ -56,7 +71,7 @@ class IMS:
|
|
|
56
71
|
IMS: IMS instance
|
|
57
72
|
"""
|
|
58
73
|
if isinstance(facility, int):
|
|
59
|
-
facility = Facility(facility)
|
|
74
|
+
facility = Facility(facility)
|
|
60
75
|
|
|
61
76
|
if isinstance(facility, Facility):
|
|
62
77
|
facility = facility.identity
|
|
@@ -94,12 +109,12 @@ class IMS:
|
|
|
94
109
|
"""
|
|
95
110
|
i = IMS._get_ims_codes()
|
|
96
111
|
if len(facility) > 0:
|
|
97
|
-
return [x for x in i if x.
|
|
112
|
+
return [x for x in i if x.facility == facility]
|
|
98
113
|
|
|
99
114
|
return i
|
|
100
115
|
|
|
101
|
-
@
|
|
102
|
-
def get_source(facility: str) -> str:
|
|
116
|
+
@classmethod
|
|
117
|
+
def get_source(cls, facility: str) -> str:
|
|
103
118
|
"""Get IMS name for a facility.
|
|
104
119
|
|
|
105
120
|
Args:
|
|
@@ -112,11 +127,11 @@ class IMS:
|
|
|
112
127
|
str: Name of IMS
|
|
113
128
|
"""
|
|
114
129
|
|
|
115
|
-
l_ims =
|
|
116
|
-
return l_ims.
|
|
130
|
+
l_ims = cls.from_facility(facility=facility)
|
|
131
|
+
return l_ims.alias
|
|
117
132
|
|
|
118
|
-
@
|
|
119
|
-
def get_type(facility: str) -> str:
|
|
133
|
+
@classmethod
|
|
134
|
+
def get_type(cls, facility: str) -> str:
|
|
120
135
|
"""Get IMS type for a facility.
|
|
121
136
|
|
|
122
137
|
Args:
|
|
@@ -128,5 +143,5 @@ class IMS:
|
|
|
128
143
|
Returns:
|
|
129
144
|
str: Type of IMS
|
|
130
145
|
"""
|
|
131
|
-
l_ims =
|
|
132
|
-
return l_ims.
|
|
146
|
+
l_ims = cls.from_facility(facility=facility)
|
|
147
|
+
return l_ims.type
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
from typing import List, Optional, Union
|
|
2
|
-
from commonlib_reader.utils import
|
|
2
|
+
from commonlib_reader.utils import (
|
|
3
|
+
attributes_list_to_dict,
|
|
4
|
+
get_code,
|
|
5
|
+
get_code_param,
|
|
6
|
+
query_sql,
|
|
7
|
+
)
|
|
3
8
|
import re
|
|
4
9
|
|
|
5
10
|
# from commonlib_reader.utils import attributes_list_to_dict
|
|
@@ -31,12 +36,30 @@ class TagFormatElement:
|
|
|
31
36
|
"""
|
|
32
37
|
self._data = data
|
|
33
38
|
|
|
34
|
-
self.description = data["Description"]
|
|
35
|
-
self.name = data["Name"]
|
|
36
39
|
self.IsValid = bool(data["IsValid"])
|
|
37
40
|
self.IsRequired = bool(data["Required"])
|
|
38
41
|
self.IsSelected = bool(data["SelectFlag"])
|
|
39
42
|
|
|
43
|
+
@property
|
|
44
|
+
def name(self) -> str:
|
|
45
|
+
return self._data["Name"]
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def description(self) -> str:
|
|
49
|
+
return self._data["Description"]
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def is_valid(self) -> bool:
|
|
53
|
+
return self.IsValid
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def is_required(self) -> bool:
|
|
57
|
+
return self.IsRequired
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def is_selected(self) -> bool:
|
|
61
|
+
return self.IsSelected
|
|
62
|
+
|
|
40
63
|
def get_TagFormat(self) -> "TagFormat":
|
|
41
64
|
tag_format_id = self._data["TagFormat_ID"]
|
|
42
65
|
res = query_sql(f"Select * from tagformat where Id = '{tag_format_id}'")
|
|
@@ -86,25 +109,33 @@ class TagFormat:
|
|
|
86
109
|
# Cache tagformatelements
|
|
87
110
|
self._tfe = None
|
|
88
111
|
|
|
89
|
-
|
|
112
|
+
self._attributes = attributes_list_to_dict(self._data["attributes"])
|
|
90
113
|
|
|
91
|
-
self.
|
|
92
|
-
self.description = data["description"]
|
|
114
|
+
self._inst_code = inst_code
|
|
93
115
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
self.
|
|
97
|
-
self.regex_grouped = ""
|
|
116
|
+
@property
|
|
117
|
+
def inst_code(self) -> str:
|
|
118
|
+
return self._inst_code
|
|
98
119
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
120
|
+
@property
|
|
121
|
+
def description(self) -> str:
|
|
122
|
+
return self._data["description"]
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def tag_category(self) -> str:
|
|
126
|
+
return self._attributes.get("TagCategory", "")
|
|
127
|
+
|
|
128
|
+
@property
|
|
129
|
+
def syntax(self) -> str:
|
|
130
|
+
return self._attributes.get("Syntax", "")
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def regex(self) -> str:
|
|
134
|
+
return self._attributes.get("Regex", "")
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def regex_grouped(self) -> str:
|
|
138
|
+
return self._attributes.get("RegexGrouped", "")
|
|
108
139
|
|
|
109
140
|
def __str__(self):
|
|
110
141
|
return f"{self.description} - {self.tag_category}"
|
|
@@ -237,18 +268,36 @@ class TagType:
|
|
|
237
268
|
inst_code (str): Installation code for which this tag type applies.
|
|
238
269
|
"""
|
|
239
270
|
self._data = data
|
|
240
|
-
self.
|
|
241
|
-
|
|
242
|
-
self.name = self._data["name"]
|
|
243
|
-
self.description = self._data["description"]
|
|
244
|
-
self.is_valid = self._data["isValid"]
|
|
245
|
-
self.tag_category = ""
|
|
271
|
+
self._attributes = attributes_list_to_dict(self._data["attributes"])
|
|
272
|
+
self._inst_code = inst_code
|
|
246
273
|
|
|
247
274
|
for attr in self._data["attributes"]:
|
|
248
275
|
if attr["definitionName"] == "STIDTagCount":
|
|
249
276
|
self.STID_tag_Count = int(attr["displayValue"])
|
|
250
|
-
|
|
251
|
-
|
|
277
|
+
|
|
278
|
+
@property
|
|
279
|
+
def inst_code(self) -> str:
|
|
280
|
+
return self._inst_code
|
|
281
|
+
|
|
282
|
+
@property
|
|
283
|
+
def name(self) -> str:
|
|
284
|
+
return self._data["name"]
|
|
285
|
+
|
|
286
|
+
@property
|
|
287
|
+
def description(self) -> str:
|
|
288
|
+
return self._data["description"]
|
|
289
|
+
|
|
290
|
+
@property
|
|
291
|
+
def tag_category(self) -> str:
|
|
292
|
+
return self._attributes.get("TagCategory", "")
|
|
293
|
+
|
|
294
|
+
@property
|
|
295
|
+
def is_valid(self) -> bool:
|
|
296
|
+
return self._data["isValid"]
|
|
297
|
+
|
|
298
|
+
@property
|
|
299
|
+
def stid_tag_count(self) -> int:
|
|
300
|
+
return self.STID_tag_Count
|
|
252
301
|
|
|
253
302
|
def __str__(self):
|
|
254
303
|
return f"{self.name} - {self.description}"
|
|
@@ -425,11 +474,8 @@ class TagCategory:
|
|
|
425
474
|
inst_code (str): Installation code for which this tag category applies.
|
|
426
475
|
"""
|
|
427
476
|
self._data = data
|
|
428
|
-
self.
|
|
429
|
-
|
|
430
|
-
self.name = self._data["name"]
|
|
431
|
-
self.description = self._data["description"]
|
|
432
|
-
self.is_valid = self._data["isValid"]
|
|
477
|
+
self._inst_code = inst_code
|
|
478
|
+
self._attributes = attributes_list_to_dict(self._data["attributes"])
|
|
433
479
|
|
|
434
480
|
for attr in self._data["attributes"]:
|
|
435
481
|
if attr["definitionName"] == "TagCategoryId":
|
|
@@ -444,6 +490,42 @@ class TagCategory:
|
|
|
444
490
|
self._types = []
|
|
445
491
|
self._formats = []
|
|
446
492
|
|
|
493
|
+
@property
|
|
494
|
+
def inst_code(self) -> str:
|
|
495
|
+
return self._inst_code
|
|
496
|
+
|
|
497
|
+
@property
|
|
498
|
+
def name(self) -> str:
|
|
499
|
+
return self._data["name"]
|
|
500
|
+
|
|
501
|
+
@property
|
|
502
|
+
def description(self) -> str:
|
|
503
|
+
return self._data["description"]
|
|
504
|
+
|
|
505
|
+
@property
|
|
506
|
+
def is_valid(self) -> bool:
|
|
507
|
+
return self._data["isValid"]
|
|
508
|
+
|
|
509
|
+
@property
|
|
510
|
+
def tag_category_id(self) -> int:
|
|
511
|
+
id = self._attributes.get("TagCategoryId")
|
|
512
|
+
if id is None:
|
|
513
|
+
raise ValueError("TagCategoryId attribute not found")
|
|
514
|
+
|
|
515
|
+
return int(id)
|
|
516
|
+
|
|
517
|
+
@property
|
|
518
|
+
def tag_category_dlg(self) -> str:
|
|
519
|
+
return self._attributes.get("TagCategoryDlg", "")
|
|
520
|
+
|
|
521
|
+
@property
|
|
522
|
+
def individ_flag(self) -> str:
|
|
523
|
+
return self._attributes.get("IndividFlag", "")
|
|
524
|
+
|
|
525
|
+
@property
|
|
526
|
+
def sap_fl_category(self) -> str:
|
|
527
|
+
return self._attributes.get("SapFlCategory", "")
|
|
528
|
+
|
|
447
529
|
def get_formats(self) -> List[TagFormat]:
|
|
448
530
|
"""Get tag formats for this specific tag category.
|
|
449
531
|
|
|
@@ -506,7 +588,7 @@ class TagCategory:
|
|
|
506
588
|
)
|
|
507
589
|
|
|
508
590
|
def __str__(self):
|
|
509
|
-
return f"{self.
|
|
591
|
+
return f"{self.tag_category_id}:{self.name} - {self.description}"
|
|
510
592
|
|
|
511
593
|
@staticmethod
|
|
512
594
|
def get_category(inst_code: str, name="") -> List["TagCategory"]:
|
|
@@ -522,7 +604,7 @@ class TagCategory:
|
|
|
522
604
|
|
|
523
605
|
categories = _get_category_data(inst_code=inst_code)
|
|
524
606
|
tc = [TagCategory(x, inst_code=inst_code) for x in categories]
|
|
525
|
-
tc.sort(key=lambda x: x.
|
|
607
|
+
tc.sort(key=lambda x: x.tag_category_id)
|
|
526
608
|
if name is None:
|
|
527
609
|
pass
|
|
528
610
|
elif isinstance(name, str) and len(name) > 0:
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
from
|
|
1
|
+
from typing import Union
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
from commonlib_reader.utils import get_code
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class Unit:
|
|
7
7
|
_units = []
|
|
8
8
|
|
|
9
|
-
def __init__(self, data: dict):
|
|
10
|
-
self.name = ""
|
|
11
|
-
self.description = ""
|
|
12
|
-
|
|
13
|
-
self.identity = ""
|
|
14
|
-
self.quantity = ""
|
|
15
|
-
|
|
9
|
+
def __init__(self, data: Union[dict, str]):
|
|
16
10
|
if isinstance(data, str):
|
|
17
11
|
s = [x for x in Unit.get_units() if x.name == data]
|
|
18
12
|
if len(s) > 0:
|
|
@@ -22,14 +16,42 @@ class Unit:
|
|
|
22
16
|
|
|
23
17
|
if isinstance(data, dict):
|
|
24
18
|
self._data = data
|
|
25
|
-
# self._attributes = attributes_list_to_dict(self._data["attributes"])
|
|
26
|
-
|
|
27
19
|
for key in data.keys():
|
|
28
20
|
if key == "attributes":
|
|
29
21
|
for attr in data["attributes"]:
|
|
30
22
|
self.__setattr__(attr["definitionName"], attr["displayValue"])
|
|
31
23
|
else:
|
|
32
24
|
self.__setattr__(key, data[key])
|
|
25
|
+
else:
|
|
26
|
+
raise ValueError("Input data must be a dict from codetable")
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def name(self):
|
|
30
|
+
return getattr(self, "_name", "")
|
|
31
|
+
|
|
32
|
+
@name.setter
|
|
33
|
+
def name(self, value):
|
|
34
|
+
self._name = value
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def description(self):
|
|
38
|
+
return getattr(self, "_description", "")
|
|
39
|
+
|
|
40
|
+
@description.setter
|
|
41
|
+
def description(self, value):
|
|
42
|
+
self._description = value
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def identity(self):
|
|
46
|
+
return getattr(self, "_identity", "")
|
|
47
|
+
|
|
48
|
+
@identity.setter
|
|
49
|
+
def identity(self, value):
|
|
50
|
+
self._identity = value
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def quantity(self):
|
|
54
|
+
return getattr(self, "Quantity", "")
|
|
33
55
|
|
|
34
56
|
@classmethod
|
|
35
57
|
def get_units(cls):
|
|
@@ -9,7 +9,8 @@ from commonlib_reader.connector import get_connector
|
|
|
9
9
|
|
|
10
10
|
def get_library_names():
|
|
11
11
|
library_names = get_connector().get_json(url="/api/Library/NameList")
|
|
12
|
-
library_names
|
|
12
|
+
if isinstance(library_names, list):
|
|
13
|
+
library_names.sort()
|
|
13
14
|
return library_names
|
|
14
15
|
|
|
15
16
|
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
from typing import List
|
|
2
|
-
|
|
3
|
-
from commonlib_reader.utils import attributes_list_to_dict, get_code
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class Facility:
|
|
7
|
-
"""
|
|
8
|
-
Facility class to encapsulate information.
|
|
9
|
-
|
|
10
|
-
Attributes:
|
|
11
|
-
identity (str) : A unique identifier for the facility (read from the data source).
|
|
12
|
-
name (str) : The name of the facility (read from the data source).
|
|
13
|
-
description (str) : A description of the facility (read from the data source).
|
|
14
|
-
SAPPlant (str) : SAP Plant code (if available).
|
|
15
|
-
Field (str) : Field identifier associated with the facility (if available).
|
|
16
|
-
ParentFacility (str) : Parent facility identifier (if available).
|
|
17
|
-
NPDID (str) : NPD ID (if available).
|
|
18
|
-
GovernmentalName (str) : Governmental facility name (if available).
|
|
19
|
-
|
|
20
|
-
_cache (list of dict, optional):
|
|
21
|
-
Class level cache to store facility data, to minimize data source access.
|
|
22
|
-
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
_cache = None
|
|
26
|
-
|
|
27
|
-
def __init__(self, code):
|
|
28
|
-
"""
|
|
29
|
-
Initializes the Facility instance by retrieving data related to the given STID plant code.
|
|
30
|
-
|
|
31
|
-
Parameters:
|
|
32
|
-
code (str): The code used to retrieve facility data from the data source.
|
|
33
|
-
STID plant code is preferred, but SAP codes and governmental facility names can also be used.
|
|
34
|
-
|
|
35
|
-
Raises:
|
|
36
|
-
ValueError: If no data is found for the provided code.
|
|
37
|
-
"""
|
|
38
|
-
self._data = Facility._get_facility_data(code=code)
|
|
39
|
-
self._attributes = attributes_list_to_dict(self._data["attributes"])
|
|
40
|
-
|
|
41
|
-
self.identity = self._data["identity"]
|
|
42
|
-
self.name = self._data["name"]
|
|
43
|
-
self.description = self._data["description"]
|
|
44
|
-
|
|
45
|
-
self.SAPPlant = ""
|
|
46
|
-
self.Field = ""
|
|
47
|
-
self.ParentFacility = ""
|
|
48
|
-
self.NPDID = ""
|
|
49
|
-
self.GovernmentalName = ""
|
|
50
|
-
|
|
51
|
-
for key, val in self._attributes.items():
|
|
52
|
-
if key in self.__getattribute__("__dict__").keys():
|
|
53
|
-
self.__setattr__(key, val)
|
|
54
|
-
|
|
55
|
-
self.STID = self.identity # Alias for identity
|
|
56
|
-
self.instCode = self.identity # Alias for identity
|
|
57
|
-
try:
|
|
58
|
-
self.SAP = int(self.SAPPlant) # Alias for SAPPlant as integer
|
|
59
|
-
except (TypeError, ValueError):
|
|
60
|
-
pass
|
|
61
|
-
|
|
62
|
-
def isSTID(self):
|
|
63
|
-
"""
|
|
64
|
-
Checks if the facility is marked for STID.
|
|
65
|
-
|
|
66
|
-
Returns:
|
|
67
|
-
bool: True if the facility is marked for STID, False otherwise.
|
|
68
|
-
"""
|
|
69
|
-
if "IsForSTID" in self._attributes.keys():
|
|
70
|
-
if self._attributes["IsForSTID"] == "True":
|
|
71
|
-
return True
|
|
72
|
-
|
|
73
|
-
return False
|
|
74
|
-
|
|
75
|
-
def __str__(self):
|
|
76
|
-
return f"Facility: {self.identity}, Name: {self.name}, Description: {self.description}"
|
|
77
|
-
|
|
78
|
-
@classmethod
|
|
79
|
-
def get_all_facilities(cls) -> List["Facility"]:
|
|
80
|
-
"""
|
|
81
|
-
Retrieves and returns a list of Facility instances for all known facilities.
|
|
82
|
-
|
|
83
|
-
Returns:
|
|
84
|
-
List[Facility]: A list of Facility instances.
|
|
85
|
-
"""
|
|
86
|
-
f = Facility._get_all_facility_data()
|
|
87
|
-
return [Facility(x["identity"]) for x in f]
|
|
88
|
-
|
|
89
|
-
@classmethod
|
|
90
|
-
def _get_all_facility_data(cls) -> List[dict]:
|
|
91
|
-
"""
|
|
92
|
-
Retrieves all facility data, using a class level cache.
|
|
93
|
-
|
|
94
|
-
Returns:
|
|
95
|
-
List[dict]: A list of dictionaries, each representing facility data.
|
|
96
|
-
"""
|
|
97
|
-
if cls._cache is None:
|
|
98
|
-
cls._cache = get_code("Facility")
|
|
99
|
-
|
|
100
|
-
return cls._cache
|
|
101
|
-
|
|
102
|
-
@classmethod
|
|
103
|
-
def _get_facility_data(cls, code) -> dict:
|
|
104
|
-
"""
|
|
105
|
-
Retrieves the facility data for the given code.
|
|
106
|
-
|
|
107
|
-
Parameters:
|
|
108
|
-
code (str): The STID plant code corresponding to the facility. NB! SAP codes and governmental facility names can also be used.
|
|
109
|
-
|
|
110
|
-
Returns:
|
|
111
|
-
dict: A dictionary containing data related to the facility.
|
|
112
|
-
|
|
113
|
-
Raises:
|
|
114
|
-
ValueError: If no data is found for the provided code.
|
|
115
|
-
"""
|
|
116
|
-
|
|
117
|
-
if isinstance(code, str):
|
|
118
|
-
for f in cls._get_all_facility_data():
|
|
119
|
-
if (
|
|
120
|
-
f["identity"].upper() == code.upper()
|
|
121
|
-
or f["name"].upper() == code.upper()
|
|
122
|
-
or f["description"].upper() == code.upper()
|
|
123
|
-
):
|
|
124
|
-
return f
|
|
125
|
-
|
|
126
|
-
for f in cls._get_all_facility_data():
|
|
127
|
-
check_sap = False
|
|
128
|
-
check_gov_fac_name = False
|
|
129
|
-
for a in f["attributes"]:
|
|
130
|
-
if a["definitionName"] == "SAPPlant":
|
|
131
|
-
if a["displayValue"] == str(code):
|
|
132
|
-
return f
|
|
133
|
-
check_sap = True
|
|
134
|
-
elif a["definitionName"] == "GovernmentalName":
|
|
135
|
-
if a["displayValue"].upper() == str(code).upper():
|
|
136
|
-
return f
|
|
137
|
-
check_gov_fac_name = True
|
|
138
|
-
if check_sap and check_gov_fac_name:
|
|
139
|
-
break
|
|
140
|
-
|
|
141
|
-
raise ValueError(f"No data found for {code}")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|