logs-py 2.9.6__py3-none-any.whl → 3.0.1__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.

Files changed (147) hide show
  1. LOGS/Auxiliary/DateTimeConverter.py +11 -1
  2. LOGS/Auxiliary/Exceptions.py +40 -4
  3. LOGS/Auxiliary/LOGSErrorResponse.py +4 -1
  4. LOGS/Auxiliary/MinimalModelGenerator.py +88 -28
  5. LOGS/Auxiliary/Tools.py +11 -0
  6. LOGS/Converter/Conversion.py +248 -0
  7. LOGS/Converter/Converter.py +96 -0
  8. LOGS/Converter/ConverterParameter.py +88 -0
  9. LOGS/Converter/ExportParamters.py +89 -0
  10. LOGS/Converter/__init__.py +13 -0
  11. LOGS/Entities/Bridge.py +6 -3
  12. LOGS/Entities/CustomField.py +96 -91
  13. LOGS/Entities/CustomFieldModels.py +57 -0
  14. LOGS/Entities/CustomFieldRelations.py +10 -0
  15. LOGS/Entities/CustomFieldRequestParameter.py +43 -15
  16. LOGS/Entities/CustomFieldValue.py +88 -0
  17. LOGS/Entities/CustomFieldValueConverter.py +66 -0
  18. LOGS/Entities/CustomType.py +187 -0
  19. LOGS/Entities/CustomTypeEntityType.py +11 -0
  20. LOGS/Entities/CustomTypeMinimal.py +8 -0
  21. LOGS/Entities/CustomTypeRelations.py +59 -0
  22. LOGS/Entities/CustomTypeRequestParameter.py +61 -0
  23. LOGS/Entities/CustomTypeSection.py +39 -0
  24. LOGS/Entities/CustomTypes.py +12 -0
  25. LOGS/Entities/DataSource.py +28 -14
  26. LOGS/Entities/Dataset.py +274 -136
  27. LOGS/Entities/DatasetCreator.py +23 -72
  28. LOGS/Entities/DatasetInfo.py +23 -2
  29. LOGS/Entities/DatasetModels.py +31 -0
  30. LOGS/Entities/DatasetRequestParameter.py +45 -32
  31. LOGS/Entities/Datatrack.py +74 -30
  32. LOGS/Entities/DatatrackFormattedTable.py +25 -0
  33. LOGS/Entities/DatatrackGeneric.py +34 -0
  34. LOGS/Entities/DatatrackImage.py +25 -0
  35. LOGS/Entities/DatatrackNumericArray.py +9 -39
  36. LOGS/Entities/DatatrackNumericMatrix.py +86 -0
  37. LOGS/Entities/DocumentRequestParameter.py +2 -2
  38. LOGS/Entities/EntitiesRequestParameter.py +2 -2
  39. LOGS/Entities/Experiment.py +3 -3
  40. LOGS/Entities/FileExcludePattern.py +8 -0
  41. LOGS/Entities/FormatFormat.py +22 -1
  42. LOGS/Entities/FormatFormatRequestParameter.py +2 -1
  43. LOGS/Entities/FormatFormats.py +1 -1
  44. LOGS/Entities/FormattedTable/DatatypeFormattedTable.py +135 -0
  45. LOGS/Entities/FormattedTable/DatatypeFormattedTableCell.py +108 -0
  46. LOGS/Entities/FormattedTable/DatatypeFormattedTableSettings.py +11 -0
  47. LOGS/Entities/FormattedTable/__init__.py +9 -0
  48. LOGS/Entities/ILiterarTypedEntity.py +19 -0
  49. LOGS/Entities/Instrument.py +3 -3
  50. LOGS/Entities/Inventories.py +12 -0
  51. LOGS/Entities/Inventory.py +95 -0
  52. LOGS/Entities/InventoryMinimal.py +20 -0
  53. LOGS/Entities/InventoryRelations.py +23 -0
  54. LOGS/Entities/InventoryRequestParameter.py +53 -0
  55. LOGS/Entities/LabNotebook.py +37 -0
  56. LOGS/Entities/LabNotebookEntry.py +47 -24
  57. LOGS/Entities/LabNotebookEntryContent/BasicAttribute.py +15 -0
  58. LOGS/Entities/LabNotebookEntryContent/EntityAttribute.py +85 -0
  59. LOGS/Entities/LabNotebookEntryContent/EntryContentBlockquote.py +13 -0
  60. LOGS/Entities/LabNotebookEntryContent/EntryContentBulletList.py +17 -0
  61. LOGS/Entities/LabNotebookEntryContent/EntryContentCallout.py +40 -0
  62. LOGS/Entities/LabNotebookEntryContent/EntryContentContentPlaceholderNode.py +31 -0
  63. LOGS/Entities/LabNotebookEntryContent/EntryContentConverter.py +207 -0
  64. LOGS/Entities/LabNotebookEntryContent/EntryContentDocument.py +8 -0
  65. LOGS/Entities/LabNotebookEntryContent/EntryContentEntity.py +13 -0
  66. LOGS/Entities/LabNotebookEntryContent/EntryContentEntityMention.py +31 -0
  67. LOGS/Entities/LabNotebookEntryContent/EntryContentHeading.py +33 -0
  68. LOGS/Entities/LabNotebookEntryContent/EntryContentHorizontalRule.py +12 -0
  69. LOGS/Entities/LabNotebookEntryContent/EntryContentItem.py +37 -0
  70. LOGS/Entities/LabNotebookEntryContent/EntryContentListItem.py +49 -0
  71. LOGS/Entities/LabNotebookEntryContent/EntryContentOrderedList.py +31 -0
  72. LOGS/Entities/LabNotebookEntryContent/EntryContentParagraph.py +13 -0
  73. LOGS/Entities/LabNotebookEntryContent/EntryContentTable.py +17 -0
  74. LOGS/Entities/LabNotebookEntryContent/EntryContentTableCell.py +40 -0
  75. LOGS/Entities/LabNotebookEntryContent/EntryContentTableRow.py +8 -0
  76. LOGS/Entities/LabNotebookEntryContent/EntryContentTaskList.py +17 -0
  77. LOGS/Entities/LabNotebookEntryContent/EntryContentTaskListItem.py +31 -0
  78. LOGS/Entities/LabNotebookEntryContent/EntryContentText.py +33 -0
  79. LOGS/Entities/LabNotebookEntryContent/IEntryContentWithAttribute.py +23 -0
  80. LOGS/Entities/LabNotebookEntryContent/IEntryContentWithContent.py +38 -0
  81. LOGS/Entities/LabNotebookEntryContent/IEntryContentWithTextAttribute.py +16 -0
  82. LOGS/Entities/LabNotebookEntryContent/TextAttribute.py +46 -0
  83. LOGS/Entities/LabNotebookEntryContent/TextMarkAtributes.py +64 -0
  84. LOGS/Entities/LabNotebookEntryContent/TextMarkConverter.py +45 -0
  85. LOGS/Entities/LabNotebookEntryContent/TextMarks.py +71 -0
  86. LOGS/Entities/LabNotebookEntryContent/__init__.py +34 -0
  87. LOGS/Entities/LabNotebookEntryRequestParameter.py +2 -0
  88. LOGS/Entities/LabNotebookExperiment.py +52 -0
  89. LOGS/Entities/LabNotebookExperimentMinimal.py +8 -0
  90. LOGS/Entities/LabNotebookExperimentRequestParameter.py +49 -0
  91. LOGS/Entities/LabNotebookExperiments.py +16 -0
  92. LOGS/Entities/LabNotebookMinimal.py +19 -0
  93. LOGS/Entities/LabNotebookModels.py +14 -0
  94. LOGS/Entities/LabNotebookRequestParameter.py +43 -0
  95. LOGS/Entities/LabNotebooks.py +12 -0
  96. LOGS/Entities/Method.py +3 -3
  97. LOGS/Entities/ParserLog.py +4 -0
  98. LOGS/Entities/Person.py +2 -2
  99. LOGS/Entities/PersonRequestParameter.py +1 -0
  100. LOGS/Entities/Project.py +7 -7
  101. LOGS/Entities/{ProjectUserPermission.py → ProjectPersonPermission.py} +14 -4
  102. LOGS/Entities/Role.py +3 -3
  103. LOGS/Entities/RunState.py +1 -0
  104. LOGS/Entities/Sample.py +36 -57
  105. LOGS/Entities/SampleRequestParameter.py +30 -15
  106. LOGS/Entities/Track.py +8 -4
  107. LOGS/Entities/TrackData.py +11 -0
  108. LOGS/Entities/TrackImage.py +21 -0
  109. LOGS/Entities/TrackImageData.py +20 -0
  110. LOGS/Entities/TrackMatrix.py +28 -0
  111. LOGS/Entities/TrackMatrixData.py +22 -0
  112. LOGS/Entities/TrackTable.py +21 -0
  113. LOGS/Entities/TrackTableData.py +22 -0
  114. LOGS/Entities/TrackXY.py +5 -1
  115. LOGS/Entities/TrackXYComplex.py +1 -1
  116. LOGS/Entities/__init__.py +26 -7
  117. LOGS/Entity/ConnectedEntity.py +39 -1
  118. LOGS/Entity/Entity.py +9 -14
  119. LOGS/Entity/SerializeableContent.py +62 -5
  120. LOGS/Interfaces/IHierarchyType.py +63 -0
  121. LOGS/Interfaces/IPermissionedEntity.py +29 -5
  122. LOGS/Interfaces/IProjectBased.py +1 -1
  123. LOGS/Interfaces/ITypedEntity.py +69 -12
  124. LOGS/Interfaces/IVersionedEntity.py +39 -0
  125. LOGS/LOGS.py +137 -46
  126. LOGS/LOGSConnection.py +52 -24
  127. LOGS/LOGSOptions.py +8 -0
  128. LOGS/Parameters/Color.py +92 -0
  129. LOGS/Parameters/ParameterBase.py +55 -0
  130. LOGS/Parameters/ParameterConverter.py +24 -0
  131. LOGS/Parameters/ParameterElement.py +99 -0
  132. LOGS/Parameters/ParameterList.py +52 -0
  133. LOGS/Parameters/ParameterTable.py +64 -0
  134. LOGS/Parameters/__init__.py +13 -0
  135. LOGS/__init__.py +1 -0
  136. {logs_py-2.9.6.dist-info → logs_py-3.0.1.dist-info}/METADATA +2 -1
  137. logs_py-3.0.1.dist-info/RECORD +263 -0
  138. LOGS/Entities/CustomFieldEnums.py +0 -25
  139. LOGS/Entities/DatasetType.py +0 -7
  140. LOGS/Entities/DatasetTypeMinimal.py +0 -8
  141. LOGS/Entities/SampleType.py +0 -34
  142. LOGS/Entities/SampleTypeMinimal.py +0 -8
  143. LOGS/Entities/SampleTypeRequestParameter.py +0 -8
  144. LOGS/Entities/SampleTypes.py +0 -12
  145. logs_py-2.9.6.dist-info/RECORD +0 -183
  146. {logs_py-2.9.6.dist-info → logs_py-3.0.1.dist-info}/WHEEL +0 -0
  147. {logs_py-2.9.6.dist-info → logs_py-3.0.1.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 IPermissionedEntity
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
- IPermissionedEntity,
22
+ GenericPermissionEntity,
23
23
  ):
24
- _relationType = type(MethodRelations)
24
+ _relationType = MethodRelations
25
25
 
26
26
  _fullName: Optional[str] = None
27
27
  _description: Optional[str] = None
@@ -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 IPermissionedEntity
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
- IPermissionedEntity,
34
+ GenericPermissionEntity,
35
35
  ):
36
36
  _firstName: Optional[str]
37
37
  _lastName: Optional[str]
@@ -55,6 +55,7 @@ class PersonRequestParameter(
55
55
  documentIds: Optional[List[int]] = None
56
56
  hasAccount: Optional[bool] = None
57
57
  isAccountEnabled: Optional[bool] = None
58
+ includeSystemUsers: Optional[bool] = None
58
59
  logins: Optional[List[str]] = None
59
60
  emails: Optional[List[str]] = None
60
61
  firstNames: Optional[List[str]] = None
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 IPermissionedEntity
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
- IPermissionedEntity,
36
+ GenericPermissionEntity,
37
37
  ):
38
- _relationType = type(ProjectRelations)
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[ProjectUserPermission]]
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[ProjectUserPermission]]:
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, ProjectUserPermission, "projectPersonPermissions"
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 PersonMinimalFromDict
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 ProjectUserPermission(SerializeableContent):
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 = PersonMinimalFromDict(value, "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 IPermissionedEntity
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
- IPermissionedEntity,
24
+ GenericPermissionEntity,
25
25
  ):
26
- _relationType = type(RoleRelations)
26
+ _relationType = RoleRelations
27
27
 
28
28
  _roleId: Optional[str] = None
29
29
  _description: Optional[str] = None
LOGS/Entities/RunState.py CHANGED
@@ -5,3 +5,4 @@ class RunState(Enum):
5
5
  Running = "Running"
6
6
  Failed = "Failed"
7
7
  Finished = "Finished"
8
+ Waiting = "Waiting"
LOGS/Entities/Sample.py CHANGED
@@ -1,17 +1,15 @@
1
1
  from datetime import datetime
2
- from typing import TYPE_CHECKING, Dict, List, Optional, Union, cast
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 IPermissionedEntity
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
- INamedEntity,
38
- IPermissionedEntity,
38
+ GenericPermissionEntity,
39
39
  ):
40
- _relationType = type(SampleRelations)
41
-
42
- _type: Optional[SampleTypeMinimal]
43
- _fullName: Optional[str] = None
44
- _createdAt: Optional[datetime]
45
- _preparedAt: Optional[datetime]
46
- _discardedAt: Optional[datetime]
47
- _preparedBy: Optional[List["PersonMinimal"]]
48
- _discardedBy: Optional[List["PersonMinimal"]]
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 tags(self) -> Optional[Dict[str, Union[str, int, float]]]:
205
- return self._tags
206
-
207
- @tags.setter
208
- def tags(self, value):
209
- self._tags = self.checkAndConvertNullable(value, dict, "tags")
210
- if self._tags:
211
- self._tags = {
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
- IPaginationRequest,
32
- IOwnedEntityRequest,
33
- ITypedEntityRequest,
41
+ ICreationRecordRequest,
42
+ IModificationRecordRequest,
34
43
  INamedEntityRequest,
35
- ISoftDeletableRequest,
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
- participatedPersonIds: Optional[List[int]] = None
44
- typeIds: Optional[List[str]] = None
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
- includeTags: Optional[bool] = None
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
- if "type" in ref:
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)
@@ -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")