logs-py 2.9.6__py3-none-any.whl → 3.0.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 logs-py might be problematic. Click here for more details.
- LOGS/Auxiliary/DateTimeConverter.py +11 -1
- LOGS/Auxiliary/Exceptions.py +40 -4
- LOGS/Auxiliary/LOGSErrorResponse.py +4 -1
- LOGS/Auxiliary/MinimalModelGenerator.py +88 -28
- LOGS/Auxiliary/Tools.py +11 -0
- LOGS/Converter/Conversion.py +248 -0
- LOGS/Converter/Converter.py +96 -0
- LOGS/Converter/ConverterParameter.py +88 -0
- LOGS/Converter/ExportParamters.py +89 -0
- LOGS/Converter/__init__.py +13 -0
- LOGS/Entities/Bridge.py +6 -3
- LOGS/Entities/CustomField.py +96 -91
- LOGS/Entities/CustomFieldModels.py +57 -0
- LOGS/Entities/CustomFieldRelations.py +10 -0
- LOGS/Entities/CustomFieldRequestParameter.py +43 -15
- LOGS/Entities/CustomFieldValue.py +88 -0
- LOGS/Entities/CustomFieldValueConverter.py +66 -0
- LOGS/Entities/CustomType.py +187 -0
- LOGS/Entities/CustomTypeEntityType.py +11 -0
- LOGS/Entities/CustomTypeMinimal.py +8 -0
- LOGS/Entities/CustomTypeRelations.py +59 -0
- LOGS/Entities/CustomTypeRequestParameter.py +61 -0
- LOGS/Entities/CustomTypeSection.py +39 -0
- LOGS/Entities/CustomTypes.py +12 -0
- LOGS/Entities/DataSource.py +28 -14
- LOGS/Entities/Dataset.py +274 -136
- LOGS/Entities/DatasetCreator.py +23 -72
- LOGS/Entities/DatasetInfo.py +23 -2
- LOGS/Entities/DatasetModels.py +31 -0
- LOGS/Entities/DatasetRequestParameter.py +45 -32
- LOGS/Entities/Datatrack.py +74 -30
- LOGS/Entities/DatatrackFormattedTable.py +25 -0
- LOGS/Entities/DatatrackGeneric.py +34 -0
- LOGS/Entities/DatatrackImage.py +25 -0
- LOGS/Entities/DatatrackNumericArray.py +9 -39
- LOGS/Entities/DatatrackNumericMatrix.py +86 -0
- LOGS/Entities/DocumentRequestParameter.py +2 -2
- LOGS/Entities/EntitiesRequestParameter.py +2 -2
- LOGS/Entities/Experiment.py +3 -3
- LOGS/Entities/FileExcludePattern.py +8 -0
- LOGS/Entities/FormatFormat.py +22 -1
- LOGS/Entities/FormatFormatRequestParameter.py +2 -1
- LOGS/Entities/FormatFormats.py +1 -1
- LOGS/Entities/FormattedTable/DatatypeFormattedTable.py +135 -0
- LOGS/Entities/FormattedTable/DatatypeFormattedTableCell.py +108 -0
- LOGS/Entities/FormattedTable/DatatypeFormattedTableSettings.py +11 -0
- LOGS/Entities/FormattedTable/__init__.py +9 -0
- LOGS/Entities/ILiterarTypedEntity.py +19 -0
- LOGS/Entities/Instrument.py +3 -3
- LOGS/Entities/Inventories.py +12 -0
- LOGS/Entities/Inventory.py +95 -0
- LOGS/Entities/InventoryMinimal.py +20 -0
- LOGS/Entities/InventoryRelations.py +23 -0
- LOGS/Entities/InventoryRequestParameter.py +53 -0
- LOGS/Entities/LabNotebook.py +37 -0
- LOGS/Entities/LabNotebookEntry.py +47 -24
- LOGS/Entities/LabNotebookEntryContent/BasicAttribute.py +15 -0
- LOGS/Entities/LabNotebookEntryContent/EntityAttribute.py +85 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentBlockquote.py +13 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentBulletList.py +17 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentCallout.py +40 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentContentPlaceholderNode.py +31 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentConverter.py +207 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentDocument.py +8 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentEntity.py +13 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentEntityMention.py +31 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentHeading.py +33 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentHorizontalRule.py +12 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentItem.py +37 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentListItem.py +49 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentOrderedList.py +31 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentParagraph.py +13 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentTable.py +17 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentTableCell.py +40 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentTableRow.py +8 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentTaskList.py +17 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentTaskListItem.py +31 -0
- LOGS/Entities/LabNotebookEntryContent/EntryContentText.py +33 -0
- LOGS/Entities/LabNotebookEntryContent/IEntryContentWithAttribute.py +23 -0
- LOGS/Entities/LabNotebookEntryContent/IEntryContentWithContent.py +38 -0
- LOGS/Entities/LabNotebookEntryContent/IEntryContentWithTextAttribute.py +16 -0
- LOGS/Entities/LabNotebookEntryContent/TextAttribute.py +46 -0
- LOGS/Entities/LabNotebookEntryContent/TextMarkAtributes.py +64 -0
- LOGS/Entities/LabNotebookEntryContent/TextMarkConverter.py +45 -0
- LOGS/Entities/LabNotebookEntryContent/TextMarks.py +71 -0
- LOGS/Entities/LabNotebookEntryContent/__init__.py +34 -0
- LOGS/Entities/LabNotebookEntryRequestParameter.py +2 -0
- LOGS/Entities/LabNotebookExperiment.py +52 -0
- LOGS/Entities/LabNotebookExperimentMinimal.py +8 -0
- LOGS/Entities/LabNotebookExperimentRequestParameter.py +49 -0
- LOGS/Entities/LabNotebookExperiments.py +16 -0
- LOGS/Entities/LabNotebookMinimal.py +19 -0
- LOGS/Entities/LabNotebookModels.py +14 -0
- LOGS/Entities/LabNotebookRequestParameter.py +43 -0
- LOGS/Entities/LabNotebooks.py +12 -0
- LOGS/Entities/Method.py +3 -3
- LOGS/Entities/ParserLog.py +4 -0
- LOGS/Entities/Person.py +2 -2
- LOGS/Entities/Project.py +7 -7
- LOGS/Entities/{ProjectUserPermission.py → ProjectPersonPermission.py} +14 -4
- LOGS/Entities/Role.py +3 -3
- LOGS/Entities/RunState.py +1 -0
- LOGS/Entities/Sample.py +36 -57
- LOGS/Entities/SampleRequestParameter.py +30 -15
- LOGS/Entities/Track.py +8 -4
- LOGS/Entities/TrackData.py +11 -0
- LOGS/Entities/TrackImage.py +21 -0
- LOGS/Entities/TrackImageData.py +20 -0
- LOGS/Entities/TrackMatrix.py +28 -0
- LOGS/Entities/TrackMatrixData.py +22 -0
- LOGS/Entities/TrackTable.py +21 -0
- LOGS/Entities/TrackTableData.py +22 -0
- LOGS/Entities/TrackXY.py +5 -1
- LOGS/Entities/TrackXYComplex.py +1 -1
- LOGS/Entities/__init__.py +26 -7
- LOGS/Entity/ConnectedEntity.py +39 -1
- LOGS/Entity/Entity.py +9 -14
- LOGS/Entity/SerializeableContent.py +62 -5
- LOGS/Interfaces/IHierarchyType.py +63 -0
- LOGS/Interfaces/IPermissionedEntity.py +29 -5
- LOGS/Interfaces/IProjectBased.py +1 -1
- LOGS/Interfaces/ITypedEntity.py +69 -12
- LOGS/Interfaces/IVersionedEntity.py +39 -0
- LOGS/LOGS.py +137 -46
- LOGS/LOGSConnection.py +52 -24
- LOGS/LOGSOptions.py +8 -0
- LOGS/Parameters/Color.py +92 -0
- LOGS/Parameters/ParameterBase.py +55 -0
- LOGS/Parameters/ParameterConverter.py +24 -0
- LOGS/Parameters/ParameterElement.py +99 -0
- LOGS/Parameters/ParameterList.py +52 -0
- LOGS/Parameters/ParameterTable.py +64 -0
- LOGS/Parameters/__init__.py +13 -0
- LOGS/__init__.py +1 -0
- {logs_py-2.9.6.dist-info → logs_py-3.0.0.dist-info}/METADATA +2 -1
- logs_py-3.0.0.dist-info/RECORD +263 -0
- LOGS/Entities/CustomFieldEnums.py +0 -25
- LOGS/Entities/DatasetType.py +0 -7
- LOGS/Entities/DatasetTypeMinimal.py +0 -8
- LOGS/Entities/SampleType.py +0 -34
- LOGS/Entities/SampleTypeMinimal.py +0 -8
- LOGS/Entities/SampleTypeRequestParameter.py +0 -8
- LOGS/Entities/SampleTypes.py +0 -12
- logs_py-2.9.6.dist-info/RECORD +0 -183
- {logs_py-2.9.6.dist-info → logs_py-3.0.0.dist-info}/WHEEL +0 -0
- {logs_py-2.9.6.dist-info → logs_py-3.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from LOGS.Entities.LabNotebookModels import LabNotebookExperimentStatus
|
|
6
|
+
from LOGS.Entity.EntityRequestParameter import EntityRequestParameter
|
|
7
|
+
from LOGS.Interfaces.INamedEntity import INamedEntityRequest
|
|
8
|
+
from LOGS.Interfaces.IPermissionedEntity import (
|
|
9
|
+
GenericPermissionEntity,
|
|
10
|
+
IPermissionedEntityRequest,
|
|
11
|
+
)
|
|
12
|
+
from LOGS.Interfaces.IVersionedEntity import IVersionedEntityRequest
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class LabNotebookExperimentOrder(Enum):
|
|
16
|
+
ID_ASC = "ID_ASC"
|
|
17
|
+
ID_DESC = "ID_DESC"
|
|
18
|
+
NAME_ASC = "NAME_ASC"
|
|
19
|
+
NAME_DESC = "NAME_DESC"
|
|
20
|
+
STATUS_ASC = "STATUS_ASC"
|
|
21
|
+
STATUS_DESC = "STATUS_DESC"
|
|
22
|
+
LAB_NOTEBOOK_ID_ASC = "LAB_NOTEBOOK_ID_ASC"
|
|
23
|
+
LAB_NOTEBOOK_ID_DESC = "LAB_NOTEBOOK_ID_DESC"
|
|
24
|
+
LAB_NOTEBOOK_NAME_ASC = "LAB_NOTEBOOK_NAME_ASC"
|
|
25
|
+
LAB_NOTEBOOK_NAME_DESC = "LAB_NOTEBOOK_NAME_DESC"
|
|
26
|
+
LAB_NOTEBOOK_EXPERIMENT_NAME_ASC = "LAB_NOTEBOOK_EXPERIMENT_NAME_ASC"
|
|
27
|
+
LAB_NOTEBOOK_EXPERIMENT_NAME_DESC = "LAB_NOTEBOOK_EXPERIMENT_NAME_DESC"
|
|
28
|
+
CREATED_ON_ASC = "CREATED_ON_ASC"
|
|
29
|
+
CREATED_ON_DESC = "CREATED_ON_DESC"
|
|
30
|
+
CREATED_BY_ASC = "CREATED_BY_ASC"
|
|
31
|
+
CREATED_BY_DESC = "CREATED_BY_DESC"
|
|
32
|
+
MODIFIED_ON_ASC = "MODIFIED_ON_ASC"
|
|
33
|
+
MODIFIED_ON_DESC = "MODIFIED_ON_DESC"
|
|
34
|
+
MODIFIED_BY_ASC = "MODIFIED_BY_ASC"
|
|
35
|
+
MODIFIED_BY_DESC = "MODIFIED_BY_DESC"
|
|
36
|
+
VERSION_ASC = "VERSION_ASC"
|
|
37
|
+
VERSION_DESC = "VERSION_DESC"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass
|
|
41
|
+
class LabNotebookExperimentRequestParameter(
|
|
42
|
+
EntityRequestParameter[LabNotebookExperimentOrder],
|
|
43
|
+
IPermissionedEntityRequest,
|
|
44
|
+
IVersionedEntityRequest[int],
|
|
45
|
+
GenericPermissionEntity,
|
|
46
|
+
INamedEntityRequest,
|
|
47
|
+
):
|
|
48
|
+
status: Optional[List[LabNotebookExperimentStatus]] = None
|
|
49
|
+
labNotebookIds: Optional[List[int]] = None
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from LOGS.Auxiliary.Decorators import Endpoint
|
|
2
|
+
from LOGS.Entities.LabNotebookExperiment import LabNotebookExperiment
|
|
3
|
+
from LOGS.Entities.LabNotebookExperimentRequestParameter import (
|
|
4
|
+
LabNotebookExperimentRequestParameter,
|
|
5
|
+
)
|
|
6
|
+
from LOGS.Entity.EntityIterator import EntityIterator
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@Endpoint("lab_notebook_experiments")
|
|
10
|
+
class LabNotebookExperiments(
|
|
11
|
+
EntityIterator[LabNotebookExperiment, LabNotebookExperimentRequestParameter]
|
|
12
|
+
):
|
|
13
|
+
"""LOGS connected LabNotebookExperiment iterator"""
|
|
14
|
+
|
|
15
|
+
_generatorType = LabNotebookExperiment
|
|
16
|
+
_parameterType = LabNotebookExperimentRequestParameter
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from LOGS.Auxiliary.Decorators import FullModel
|
|
4
|
+
from LOGS.Entities.LabNotebook import LabNotebook
|
|
5
|
+
from LOGS.Entities.LabNotebookModels import LabNotebookStatus
|
|
6
|
+
from LOGS.Entity.EntityMinimalWithIntId import EntityMinimalWithIntId
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@FullModel(LabNotebook)
|
|
10
|
+
class LabNotebookMinimal(EntityMinimalWithIntId[LabNotebook]):
|
|
11
|
+
_status: Optional[LabNotebookStatus] = None
|
|
12
|
+
|
|
13
|
+
@property
|
|
14
|
+
def status(self) -> Optional[LabNotebookStatus]:
|
|
15
|
+
return self._status
|
|
16
|
+
|
|
17
|
+
@status.setter
|
|
18
|
+
def status(self, value: str):
|
|
19
|
+
self._status = self.checkAndConvertNullable(value, LabNotebookStatus, "status")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class LabNotebookStatus(Enum):
|
|
5
|
+
CLOSED = "CLOSED"
|
|
6
|
+
ACTIVE = "ACTIVE"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class LabNotebookExperimentStatus(Enum):
|
|
10
|
+
RUNNING = "RUNNING"
|
|
11
|
+
PAUSED = "PAUSED"
|
|
12
|
+
COMPLETED = "COMPLETED"
|
|
13
|
+
FAILED = "FAILED"
|
|
14
|
+
ABORTED = "ABORTED"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from LOGS.Entities.LabNotebookModels import LabNotebookStatus
|
|
6
|
+
from LOGS.Entity.EntityRequestParameter import EntityRequestParameter
|
|
7
|
+
from LOGS.Interfaces.INamedEntity import INamedEntityRequest
|
|
8
|
+
from LOGS.Interfaces.IPermissionedEntity import (
|
|
9
|
+
GenericPermissionEntity,
|
|
10
|
+
IPermissionedEntityRequest,
|
|
11
|
+
)
|
|
12
|
+
from LOGS.Interfaces.IProjectBased import IProjectBasedRequest
|
|
13
|
+
from LOGS.Interfaces.IVersionedEntity import IVersionedEntityRequest
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class LabNotebookOrder(Enum):
|
|
17
|
+
ID_DESC = "ID_DESC"
|
|
18
|
+
NAME_ASC = "NAME_ASC"
|
|
19
|
+
NAME_DESC = "NAME_DESC"
|
|
20
|
+
STATUS_ASC = "STATUS_ASC"
|
|
21
|
+
STATUS_DESC = "STATUS_DESC"
|
|
22
|
+
CREATED_ON_ASC = "CREATED_ON_ASC"
|
|
23
|
+
CREATED_ON_DESC = "CREATED_ON_DESC"
|
|
24
|
+
CREATED_BY_ASC = "CREATED_BY_ASC"
|
|
25
|
+
CREATED_BY_DESC = "CREATED_BY_DESC"
|
|
26
|
+
MODIFIED_ON_ASC = "MODIFIED_ON_ASC"
|
|
27
|
+
MODIFIED_ON_DESC = "MODIFIED_ON_DESC"
|
|
28
|
+
MODIFIED_BY_ASC = "MODIFIED_BY_ASC"
|
|
29
|
+
MODIFIED_BY_DESC = "MODIFIED_BY_DESC"
|
|
30
|
+
VERSION_ASC = "VERSION_ASC"
|
|
31
|
+
VERSION_DESC = "VERSION_DESC"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class LabNotebookRequestParameter(
|
|
36
|
+
EntityRequestParameter[LabNotebookOrder],
|
|
37
|
+
IPermissionedEntityRequest,
|
|
38
|
+
IVersionedEntityRequest[int],
|
|
39
|
+
IProjectBasedRequest,
|
|
40
|
+
GenericPermissionEntity,
|
|
41
|
+
INamedEntityRequest,
|
|
42
|
+
):
|
|
43
|
+
status: Optional[List[LabNotebookStatus]] = None
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from LOGS.Auxiliary.Decorators import Endpoint
|
|
2
|
+
from LOGS.Entities.LabNotebook import LabNotebook
|
|
3
|
+
from LOGS.Entities.LabNotebookRequestParameter import LabNotebookRequestParameter
|
|
4
|
+
from LOGS.Entity.EntityIterator import EntityIterator
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@Endpoint("lab_notebooks")
|
|
8
|
+
class LabNotebooks(EntityIterator[LabNotebook, LabNotebookRequestParameter]):
|
|
9
|
+
"""LOGS connected LabNotebook iterator"""
|
|
10
|
+
|
|
11
|
+
_generatorType = LabNotebook
|
|
12
|
+
_parameterType = LabNotebookRequestParameter
|
LOGS/Entities/Method.py
CHANGED
|
@@ -6,7 +6,7 @@ from LOGS.Entity.EntityWithIntId import IEntityWithIntId
|
|
|
6
6
|
from LOGS.Interfaces.ICreationRecord import ICreationRecord
|
|
7
7
|
from LOGS.Interfaces.IModificationRecord import IModificationRecord
|
|
8
8
|
from LOGS.Interfaces.INamedEntity import INamedEntity
|
|
9
|
-
from LOGS.Interfaces.IPermissionedEntity import
|
|
9
|
+
from LOGS.Interfaces.IPermissionedEntity import GenericPermissionEntity
|
|
10
10
|
from LOGS.Interfaces.IRelatedEntity import IRelatedEntity
|
|
11
11
|
from LOGS.Interfaces.IUniqueEntity import IUniqueEntity
|
|
12
12
|
|
|
@@ -19,9 +19,9 @@ class Method(
|
|
|
19
19
|
ICreationRecord,
|
|
20
20
|
IModificationRecord,
|
|
21
21
|
IRelatedEntity[MethodRelations],
|
|
22
|
-
|
|
22
|
+
GenericPermissionEntity,
|
|
23
23
|
):
|
|
24
|
-
_relationType =
|
|
24
|
+
_relationType = MethodRelations
|
|
25
25
|
|
|
26
26
|
_fullName: Optional[str] = None
|
|
27
27
|
_description: Optional[str] = None
|
LOGS/Entities/ParserLog.py
CHANGED
|
@@ -12,6 +12,10 @@ class ParserLog(SerializeableContent):
|
|
|
12
12
|
def __init__(self, ref=None):
|
|
13
13
|
super().__init__(ref=ref)
|
|
14
14
|
|
|
15
|
+
def __str__(self):
|
|
16
|
+
error = f" ({self.code})" if self.code else ""
|
|
17
|
+
return f"{type(self).__name__}.{self.type}{error}: {self.message}"
|
|
18
|
+
|
|
15
19
|
@property
|
|
16
20
|
def type(self) -> Optional[str]:
|
|
17
21
|
return self._type
|
LOGS/Entities/Person.py
CHANGED
|
@@ -9,7 +9,7 @@ from LOGS.Entity.EntityWithIntId import IEntityWithIntId
|
|
|
9
9
|
from LOGS.Interfaces.ICreationRecord import ICreationRecord
|
|
10
10
|
from LOGS.Interfaces.IModificationRecord import IModificationRecord
|
|
11
11
|
from LOGS.Interfaces.INamedEntity import INamedEntity
|
|
12
|
-
from LOGS.Interfaces.IPermissionedEntity import
|
|
12
|
+
from LOGS.Interfaces.IPermissionedEntity import GenericPermissionEntity
|
|
13
13
|
from LOGS.Interfaces.IRelatedEntity import IRelatedEntity
|
|
14
14
|
from LOGS.Interfaces.ISoftDeletable import ISoftDeletable
|
|
15
15
|
from LOGS.Interfaces.IUniqueEntity import IUniqueEntity
|
|
@@ -31,7 +31,7 @@ class Person(
|
|
|
31
31
|
ISoftDeletable,
|
|
32
32
|
ICreationRecord,
|
|
33
33
|
IModificationRecord,
|
|
34
|
-
|
|
34
|
+
GenericPermissionEntity,
|
|
35
35
|
):
|
|
36
36
|
_firstName: Optional[str]
|
|
37
37
|
_lastName: Optional[str]
|
LOGS/Entities/Project.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
from typing import List, Optional
|
|
2
2
|
|
|
3
3
|
from LOGS.Auxiliary.Decorators import Endpoint
|
|
4
|
+
from LOGS.Entities.ProjectPersonPermission import ProjectPersonPermission
|
|
4
5
|
from LOGS.Entities.ProjectRelations import ProjectRelations
|
|
5
|
-
from LOGS.Entities.ProjectUserPermission import ProjectUserPermission
|
|
6
6
|
from LOGS.Entity.EntityWithIntId import IEntityWithIntId
|
|
7
7
|
from LOGS.Entity.SerializeableContent import SerializeableClass
|
|
8
8
|
from LOGS.Interfaces.ICreationRecord import ICreationRecord
|
|
9
9
|
from LOGS.Interfaces.IModificationRecord import IModificationRecord
|
|
10
10
|
from LOGS.Interfaces.INamedEntity import INamedEntity
|
|
11
11
|
from LOGS.Interfaces.IOwnedEntity import IOwnedEntity
|
|
12
|
-
from LOGS.Interfaces.IPermissionedEntity import
|
|
12
|
+
from LOGS.Interfaces.IPermissionedEntity import GenericPermissionEntity
|
|
13
13
|
from LOGS.Interfaces.IRelatedEntity import IRelatedEntity
|
|
14
14
|
from LOGS.Interfaces.IUniqueEntity import IUniqueEntity
|
|
15
15
|
from LOGS.LOGSConnection import LOGSConnection
|
|
@@ -33,14 +33,14 @@ class Project(
|
|
|
33
33
|
ICreationRecord,
|
|
34
34
|
IModificationRecord,
|
|
35
35
|
IOwnedEntity,
|
|
36
|
-
|
|
36
|
+
GenericPermissionEntity,
|
|
37
37
|
):
|
|
38
|
-
_relationType =
|
|
38
|
+
_relationType = ProjectRelations
|
|
39
39
|
|
|
40
40
|
_notes: Optional[str]
|
|
41
41
|
_projectTags: Optional[List[ProjectTag]]
|
|
42
42
|
_relations: Optional[ProjectRelations]
|
|
43
|
-
_projectPersonPermissions: Optional[List[
|
|
43
|
+
_projectPersonPermissions: Optional[List[ProjectPersonPermission]]
|
|
44
44
|
|
|
45
45
|
def __init__(
|
|
46
46
|
self,
|
|
@@ -87,11 +87,11 @@ class Project(
|
|
|
87
87
|
)
|
|
88
88
|
|
|
89
89
|
@property
|
|
90
|
-
def projectPersonPermissions(self) -> Optional[List[
|
|
90
|
+
def projectPersonPermissions(self) -> Optional[List[ProjectPersonPermission]]:
|
|
91
91
|
return self._projectPersonPermissions
|
|
92
92
|
|
|
93
93
|
@projectPersonPermissions.setter
|
|
94
94
|
def projectPersonPermissions(self, value):
|
|
95
95
|
self._projectPersonPermissions = self.checkListAndConvertNullable(
|
|
96
|
-
value,
|
|
96
|
+
value, ProjectPersonPermission, "projectPersonPermissions"
|
|
97
97
|
)
|
|
@@ -1,26 +1,36 @@
|
|
|
1
1
|
from typing import TYPE_CHECKING, Optional
|
|
2
2
|
|
|
3
|
-
from LOGS.Auxiliary.MinimalModelGenerator import
|
|
3
|
+
from LOGS.Auxiliary.MinimalModelGenerator import MinimalFromSingle
|
|
4
4
|
from LOGS.Entity.SerializeableContent import SerializeableContent
|
|
5
5
|
|
|
6
6
|
if TYPE_CHECKING:
|
|
7
7
|
from LOGS.Entities.PersonMinimal import PersonMinimal
|
|
8
|
+
from LOGS.Entities.ProjectMinimal import ProjectMinimal
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
class
|
|
11
|
+
class ProjectPersonPermission(SerializeableContent):
|
|
11
12
|
_person: Optional["PersonMinimal"] = None
|
|
13
|
+
_project: Optional["ProjectMinimal"] = None
|
|
12
14
|
_administer: Optional[bool] = None
|
|
13
15
|
_edit: Optional[bool] = None
|
|
14
16
|
_add: Optional[bool] = None
|
|
15
17
|
_read: Optional[bool] = None
|
|
16
18
|
|
|
17
19
|
@property
|
|
18
|
-
def person(self):
|
|
20
|
+
def person(self) -> Optional["PersonMinimal"]:
|
|
19
21
|
return self._person
|
|
20
22
|
|
|
21
23
|
@person.setter
|
|
22
24
|
def person(self, value):
|
|
23
|
-
self._person =
|
|
25
|
+
self._person = MinimalFromSingle(value, "PersonMinimal", "person")
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def project(self) -> Optional["ProjectMinimal"]:
|
|
29
|
+
return self._project
|
|
30
|
+
|
|
31
|
+
@project.setter
|
|
32
|
+
def project(self, value):
|
|
33
|
+
self._project = MinimalFromSingle(value, "ProjectMinimal", "project")
|
|
24
34
|
|
|
25
35
|
@property
|
|
26
36
|
def administer(self) -> Optional[bool]:
|
LOGS/Entities/Role.py
CHANGED
|
@@ -6,7 +6,7 @@ from LOGS.Entity.EntityWithIntId import IEntityWithIntId
|
|
|
6
6
|
from LOGS.Interfaces.ICreationRecord import ICreationRecord
|
|
7
7
|
from LOGS.Interfaces.IModificationRecord import IModificationRecord
|
|
8
8
|
from LOGS.Interfaces.INamedEntity import INamedEntity
|
|
9
|
-
from LOGS.Interfaces.IPermissionedEntity import
|
|
9
|
+
from LOGS.Interfaces.IPermissionedEntity import GenericPermissionEntity
|
|
10
10
|
from LOGS.Interfaces.IRelatedEntity import IRelatedEntity
|
|
11
11
|
from LOGS.LOGSConnection import LOGSConnection
|
|
12
12
|
|
|
@@ -21,9 +21,9 @@ class Role(
|
|
|
21
21
|
ICreationRecord,
|
|
22
22
|
IModificationRecord,
|
|
23
23
|
IRelatedEntity[RoleRelations],
|
|
24
|
-
|
|
24
|
+
GenericPermissionEntity,
|
|
25
25
|
):
|
|
26
|
-
_relationType =
|
|
26
|
+
_relationType = RoleRelations
|
|
27
27
|
|
|
28
28
|
_roleId: Optional[str] = None
|
|
29
29
|
_description: Optional[str] = None
|
LOGS/Entities/RunState.py
CHANGED
LOGS/Entities/Sample.py
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
|
-
from typing import TYPE_CHECKING,
|
|
2
|
+
from typing import TYPE_CHECKING, List, Optional, Union, cast
|
|
3
3
|
|
|
4
4
|
from LOGS.Auxiliary.Decorators import Endpoint
|
|
5
|
-
from LOGS.Auxiliary.MinimalModelGenerator import
|
|
6
|
-
MinimalFromList,
|
|
7
|
-
SampleTypeMinimalFromDict,
|
|
8
|
-
)
|
|
5
|
+
from LOGS.Auxiliary.MinimalModelGenerator import MinimalFromList
|
|
9
6
|
from LOGS.Entities.SampleRelations import SampleRelations
|
|
10
|
-
from LOGS.Entities.SampleTypeMinimal import SampleTypeMinimal
|
|
11
7
|
from LOGS.Entity.EntityWithIntId import IEntityWithIntId
|
|
8
|
+
from LOGS.Interfaces.ICreationRecord import ICreationRecord
|
|
9
|
+
from LOGS.Interfaces.IModificationRecord import IModificationRecord
|
|
12
10
|
from LOGS.Interfaces.INamedEntity import INamedEntity
|
|
13
11
|
from LOGS.Interfaces.IOwnedEntity import IOwnedEntity
|
|
14
|
-
from LOGS.Interfaces.IPermissionedEntity import
|
|
12
|
+
from LOGS.Interfaces.IPermissionedEntity import GenericPermissionEntity
|
|
15
13
|
from LOGS.Interfaces.IProjectBased import IProjectBased
|
|
16
14
|
from LOGS.Interfaces.IRelatedEntity import IRelatedEntity
|
|
17
15
|
from LOGS.Interfaces.ISoftDeletable import ISoftDeletable
|
|
@@ -27,28 +25,27 @@ if TYPE_CHECKING:
|
|
|
27
25
|
|
|
28
26
|
@Endpoint("samples")
|
|
29
27
|
class Sample(
|
|
30
|
-
IProjectBased,
|
|
31
28
|
IEntityWithIntId,
|
|
29
|
+
INamedEntity,
|
|
30
|
+
IOwnedEntity,
|
|
31
|
+
IModificationRecord,
|
|
32
|
+
ICreationRecord,
|
|
33
|
+
IProjectBased,
|
|
32
34
|
IRelatedEntity[SampleRelations],
|
|
33
35
|
ITypedEntity,
|
|
34
36
|
IUniqueEntity,
|
|
35
|
-
IOwnedEntity,
|
|
36
37
|
ISoftDeletable,
|
|
37
|
-
|
|
38
|
-
IPermissionedEntity,
|
|
38
|
+
GenericPermissionEntity,
|
|
39
39
|
):
|
|
40
|
-
_relationType =
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
_preparedBy: Optional[List["PersonMinimal"]]
|
|
48
|
-
|
|
49
|
-
_other: Optional[str]
|
|
50
|
-
_notes: Optional[str]
|
|
51
|
-
_tags: Optional[Dict[str, Union[str, int, float]]]
|
|
40
|
+
_relationType = SampleRelations
|
|
41
|
+
|
|
42
|
+
_discarded: Optional[bool] = None
|
|
43
|
+
_discardedAt: Optional[datetime] = None
|
|
44
|
+
_discardedBy: Optional[List["PersonMinimal"]] = None
|
|
45
|
+
_notes: Optional[str] = None
|
|
46
|
+
_preparedAt: Optional[datetime] = None
|
|
47
|
+
_preparedBy: Optional[List["PersonMinimal"]] = None
|
|
48
|
+
_sequenceNumber: Optional[int] = None
|
|
52
49
|
|
|
53
50
|
def __init__(
|
|
54
51
|
self,
|
|
@@ -61,35 +58,15 @@ class Sample(
|
|
|
61
58
|
projects: Optional[List[Union["ProjectMinimal", "Project"]]] = None,
|
|
62
59
|
):
|
|
63
60
|
self._name = name
|
|
64
|
-
self._fullName = name
|
|
65
61
|
self._preparedAt = preparedAt
|
|
66
62
|
self._preparedBy = preparedBy
|
|
67
63
|
self._projects = cast(Optional[List["ProjectMinimal"]], projects)
|
|
68
|
-
self._type = None
|
|
69
|
-
self._createdAt = None
|
|
70
|
-
self._discardedAt = None
|
|
71
|
-
self._discardedBy = None
|
|
72
|
-
self._other = None
|
|
73
|
-
self._notes = None
|
|
74
|
-
self._customFields = None
|
|
75
|
-
self._relations = None
|
|
76
|
-
self._tags = None
|
|
77
64
|
|
|
78
65
|
if ref != None and isinstance(ref, (str, int, float)):
|
|
79
66
|
ref = {"text": str(ref)}
|
|
80
67
|
|
|
81
68
|
super().__init__(connection=connection, id=id, ref=ref)
|
|
82
69
|
|
|
83
|
-
@property
|
|
84
|
-
def type(self) -> Optional[SampleTypeMinimal]:
|
|
85
|
-
return self._type
|
|
86
|
-
|
|
87
|
-
@type.setter
|
|
88
|
-
def type(self, value):
|
|
89
|
-
self._type = SampleTypeMinimalFromDict(
|
|
90
|
-
value, "type", connection=self.connection
|
|
91
|
-
)
|
|
92
|
-
|
|
93
70
|
@property
|
|
94
71
|
def fullName(self) -> Optional[str]:
|
|
95
72
|
return self._fullName
|
|
@@ -114,6 +91,14 @@ class Sample(
|
|
|
114
91
|
def preparedAt(self, value):
|
|
115
92
|
self._preparedAt = self.checkAndConvert(value, datetime, "preparedAt")
|
|
116
93
|
|
|
94
|
+
@property
|
|
95
|
+
def discarded(self) -> Optional[bool]:
|
|
96
|
+
return self._discarded
|
|
97
|
+
|
|
98
|
+
@discarded.setter
|
|
99
|
+
def discarded(self, value):
|
|
100
|
+
self._discarded = self.checkAndConvertNullable(value, bool, "discarded")
|
|
101
|
+
|
|
117
102
|
@property
|
|
118
103
|
def discardedAt(self) -> Optional[datetime]:
|
|
119
104
|
return self._discardedAt
|
|
@@ -201,17 +186,11 @@ class Sample(
|
|
|
201
186
|
self._notes = self.checkAndConvertNullable(value, str, "notes")
|
|
202
187
|
|
|
203
188
|
@property
|
|
204
|
-
def
|
|
205
|
-
return self.
|
|
206
|
-
|
|
207
|
-
@
|
|
208
|
-
def
|
|
209
|
-
self.
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
str(k): v
|
|
213
|
-
for k, v in self._tags.items()
|
|
214
|
-
if v is not None and k != "Name" and isinstance(v, (str, int, float))
|
|
215
|
-
}
|
|
216
|
-
else:
|
|
217
|
-
self._tags = None
|
|
189
|
+
def sequenceNumber(self) -> Optional[int]:
|
|
190
|
+
return self._sequenceNumber
|
|
191
|
+
|
|
192
|
+
@sequenceNumber.setter
|
|
193
|
+
def sequenceNumber(self, value):
|
|
194
|
+
self._sequenceNumber = self.checkAndConvertNullable(
|
|
195
|
+
value, int, "sequenceNumber"
|
|
196
|
+
)
|
|
@@ -4,6 +4,8 @@ from enum import Enum
|
|
|
4
4
|
from typing import List, Optional
|
|
5
5
|
|
|
6
6
|
from LOGS.Entity.EntityRequestParameter import EntityRequestParameter
|
|
7
|
+
from LOGS.Interfaces.ICreationRecord import ICreationRecordRequest
|
|
8
|
+
from LOGS.Interfaces.IModificationRecord import IModificationRecordRequest
|
|
7
9
|
from LOGS.Interfaces.INamedEntity import INamedEntityRequest
|
|
8
10
|
from LOGS.Interfaces.IOwnedEntity import IOwnedEntityRequest
|
|
9
11
|
from LOGS.Interfaces.IPaginationRequest import IPaginationRequest
|
|
@@ -15,34 +17,47 @@ from LOGS.Interfaces.ITypedEntity import ITypedEntityRequest
|
|
|
15
17
|
class SampleOrder(Enum):
|
|
16
18
|
ID_ASC = "ID_ASC"
|
|
17
19
|
ID_DESC = "ID_DESC"
|
|
18
|
-
CREATION_DATE_ASC = "CREATION_DATE_ASC"
|
|
19
|
-
CREATION_DATE_DESC = "CREATION_DATE_DESC"
|
|
20
|
-
PREPARATION_DATE_ASC = "PREPARATION_DATE_ASC"
|
|
21
|
-
PREPARATION_DATE_DESC = "PREPARATION_DATE_DESC"
|
|
22
20
|
NAME_ASC = "NAME_ASC"
|
|
23
21
|
NAME_DESC = "NAME_DESC"
|
|
22
|
+
PREPARATION_DATE_ASC = "PREPARATION_DATE_ASC"
|
|
23
|
+
PREPARATION_DATE_DESC = "PREPARATION_DATE_DESC"
|
|
24
24
|
TYPE_ASC = "TYPE_ASC"
|
|
25
25
|
TYPE_DESC = "TYPE_DESC"
|
|
26
|
+
CREATED_ON_ASC = "CREATED_ON_ASC"
|
|
27
|
+
CREATED_ON_DESC = "CREATED_ON_DESC"
|
|
28
|
+
CREATED_BY_ASC = "CREATED_BY_ASC"
|
|
29
|
+
CREATED_BY_DESC = "CREATED_BY_DESC"
|
|
30
|
+
MODIFIED_ON_ASC = "MODIFIED_ON_ASC"
|
|
31
|
+
MODIFIED_ON_DESC = "MODIFIED_ON_DESC"
|
|
32
|
+
MODIFIED_BY_ASC = "MODIFIED_BY_ASC"
|
|
33
|
+
MODIFIED_BY_DESC = "MODIFIED_BY_DESC"
|
|
34
|
+
DISCARDED_DATE_ASC = "DISCARDED_DATE_ASC"
|
|
35
|
+
DISCARDED_DATE_DESC = "DISCARDED_DATE_DESC"
|
|
26
36
|
|
|
27
37
|
|
|
28
38
|
@dataclass
|
|
29
39
|
class SampleRequestParameter(
|
|
30
40
|
EntityRequestParameter[SampleOrder],
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
ITypedEntityRequest,
|
|
41
|
+
ICreationRecordRequest,
|
|
42
|
+
IModificationRecordRequest,
|
|
34
43
|
INamedEntityRequest,
|
|
35
|
-
|
|
44
|
+
IOwnedEntityRequest,
|
|
45
|
+
IPaginationRequest,
|
|
36
46
|
IPermissionedEntityRequest,
|
|
47
|
+
ISoftDeletableRequest,
|
|
48
|
+
ITypedEntityRequest,
|
|
37
49
|
):
|
|
38
|
-
projectIds: Optional[List[int]] = None
|
|
39
|
-
organizationIds: Optional[List[int]] = None
|
|
40
|
-
preparedByIds: Optional[List[int]] = None
|
|
41
|
-
documentIds: Optional[List[int]] = None
|
|
42
50
|
discardedByIds: Optional[List[int]] = None
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
discardedAtFrom: Optional[datetime] = None
|
|
52
|
+
discardedAtTo: Optional[datetime] = None
|
|
53
|
+
documentIds: Optional[List[int]] = None
|
|
45
54
|
excludeDiscarded: Optional[bool] = None
|
|
55
|
+
includeTags: Optional[bool] = None
|
|
56
|
+
organizationIds: Optional[List[int]] = None
|
|
57
|
+
participatedPersonIds: Optional[List[int]] = None
|
|
46
58
|
preparedAtFrom: Optional[datetime] = None
|
|
47
59
|
preparedAtTo: Optional[datetime] = None
|
|
48
|
-
|
|
60
|
+
preparedByIds: Optional[List[int]] = None
|
|
61
|
+
projectIds: Optional[List[int]] = None
|
|
62
|
+
typeIds: Optional[List[str]] = None
|
|
63
|
+
searchTermIncludeNotes: Optional[bool] = None
|
LOGS/Entities/Track.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from typing import Any, Dict, Generic, List, Literal, Optional, TypeVar, Union, cast
|
|
2
2
|
|
|
3
3
|
from LOGS.Entities.Datatrack import Datatrack
|
|
4
|
+
from LOGS.Entities.TrackData import TrackData
|
|
4
5
|
from LOGS.Entities.TrackSettings import TrackSettings
|
|
5
6
|
from LOGS.Entity.ConnectedEntity import ConnectedEntity
|
|
6
7
|
|
|
@@ -29,14 +30,17 @@ class Track(Generic[_T], ConnectedEntity):
|
|
|
29
30
|
def fromDict(self, ref) -> None:
|
|
30
31
|
if isinstance(ref, dict):
|
|
31
32
|
if "data" in ref:
|
|
32
|
-
|
|
33
|
-
if ref["type"] == "XY_real" or ref["type"] == "XY_complex":
|
|
34
|
-
self._dataIds = self.checkAndConvertNullable(ref["data"], dict)
|
|
35
|
-
|
|
33
|
+
self._dataIds = self.checkAndConvertNullable(ref["data"], dict)
|
|
36
34
|
ref["data"] = None
|
|
37
35
|
|
|
38
36
|
super().fromDict(ref)
|
|
39
37
|
|
|
38
|
+
def toDict(self) -> Dict[str, Any]:
|
|
39
|
+
d = super().toDict()
|
|
40
|
+
if isinstance(self.datatracks, TrackData):
|
|
41
|
+
d["data"] = self.datatracks.toData()
|
|
42
|
+
return d
|
|
43
|
+
|
|
40
44
|
def __str__(self):
|
|
41
45
|
s = (" name:'%s'" % getattr(self, "name")) if hasattr(self, "name") else ""
|
|
42
46
|
return "<%s id:%s%s>" % (type(self).__name__, str(self.id), s)
|
LOGS/Entities/TrackData.py
CHANGED
|
@@ -7,3 +7,14 @@ class TrackData(SerializeableContent):
|
|
|
7
7
|
"Specific %a class for this track type is not implemented yet."
|
|
8
8
|
% type(self).__name__
|
|
9
9
|
)
|
|
10
|
+
|
|
11
|
+
def toData(self):
|
|
12
|
+
from LOGS.Entities.Datatrack import Datatrack
|
|
13
|
+
|
|
14
|
+
d = {}
|
|
15
|
+
for key in self.__dict__:
|
|
16
|
+
if key.startswith("_"):
|
|
17
|
+
a = getattr(self, key)
|
|
18
|
+
if isinstance(a, Datatrack):
|
|
19
|
+
d[key[1:]] = a.id
|
|
20
|
+
return d
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from LOGS.Entities.Track import Track
|
|
4
|
+
from LOGS.Entities.TrackImageData import TrackImageData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TrackImage(Track):
|
|
8
|
+
_datatracks: Optional[TrackImageData] = None
|
|
9
|
+
|
|
10
|
+
def _fetchData(self):
|
|
11
|
+
if self.datatracks:
|
|
12
|
+
if self.datatracks.image:
|
|
13
|
+
self.datatracks.image.fetchFull()
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def datatracks(self) -> Optional[TrackImageData]:
|
|
17
|
+
return self._datatracks
|
|
18
|
+
|
|
19
|
+
@datatracks.setter
|
|
20
|
+
def datatracks(self, value):
|
|
21
|
+
self._datatracks = self.checkAndConvertNullable(value, TrackImageData, "data")
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from LOGS.Entities.DatatrackImage import DatatrackImage
|
|
4
|
+
from LOGS.Entities.TrackData import TrackData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TrackImageData(TrackData):
|
|
8
|
+
_image: Optional[DatatrackImage] = None
|
|
9
|
+
|
|
10
|
+
def fetchFull(self):
|
|
11
|
+
if self.image:
|
|
12
|
+
self.image.fetchFull()
|
|
13
|
+
|
|
14
|
+
@property
|
|
15
|
+
def image(self) -> Optional[DatatrackImage]:
|
|
16
|
+
return self._image
|
|
17
|
+
|
|
18
|
+
@image.setter
|
|
19
|
+
def image(self, value):
|
|
20
|
+
self._image = self.checkAndConvertNullable(value, DatatrackImage, "image")
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from LOGS.Entities.Track import Track
|
|
4
|
+
from LOGS.Entities.TrackMatrixData import TrackMatrixData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TrackMatrix(Track):
|
|
8
|
+
_datatracks: Optional[TrackMatrixData] = None
|
|
9
|
+
|
|
10
|
+
def _fetchData(self):
|
|
11
|
+
if self.datatracks:
|
|
12
|
+
if self.datatracks.matrix:
|
|
13
|
+
self.datatracks.matrix.fetchFull()
|
|
14
|
+
|
|
15
|
+
def __iter__(self):
|
|
16
|
+
if self.datatracks is not None and self.datatracks.matrix is not None:
|
|
17
|
+
for i in self.datatracks.matrix:
|
|
18
|
+
yield i[0], i[1], self.datatracks.matrix.getValueFromIndex(i)
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def datatracks(self) -> Optional[TrackMatrixData]:
|
|
22
|
+
return self._datatracks
|
|
23
|
+
|
|
24
|
+
@datatracks.setter
|
|
25
|
+
def datatracks(self, value):
|
|
26
|
+
self._datatracks = self.checkAndConvertNullable(
|
|
27
|
+
value, TrackMatrixData, "datatracks"
|
|
28
|
+
)
|