pyPreservica 2.6.7__py3-none-any.whl → 2.7.2__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.
pyPreservica/__init__.py CHANGED
@@ -18,11 +18,11 @@ from .adminAPI import AdminAPI
18
18
  from .monitorAPI import MonitorAPI, MonitorCategory, MonitorStatus, MessageStatus
19
19
  from .webHooksAPI import WebHooksAPI, TriggerType, WebHookHandler
20
20
  from .authorityAPI import AuthorityAPI, Table
21
-
21
+ from .mdformsAPI import MDFormsAPI
22
22
 
23
23
  __author__ = "James Carr (drjamescarr@gmail.com)"
24
24
 
25
- # Version of the Preservica API package
26
- __version__ = "2.6.7"
25
+ # Version of the pyPreservica package
26
+ __version__ = "2.7.2"
27
27
 
28
28
  __license__ = "Apache License Version 2.0"
pyPreservica/common.py CHANGED
@@ -23,6 +23,7 @@ import xml.etree.ElementTree
23
23
  from enum import Enum
24
24
  from pathlib import Path
25
25
  import pyotp
26
+ from requests import Response, Session
26
27
  from urllib3.util import Retry
27
28
  import requests
28
29
  from requests.adapters import HTTPAdapter
@@ -860,7 +861,7 @@ class AuthenticatedAPI:
860
861
 
861
862
  config = configparser.ConfigParser(interpolation=configparser.Interpolation())
862
863
  config.read('credentials.properties', encoding='utf-8')
863
- self.session = requests.Session()
864
+ self.session: Session = requests.Session()
864
865
 
865
866
  retries = Retry(
866
867
  total=3,
@@ -869,7 +870,7 @@ class AuthenticatedAPI:
869
870
  allowed_methods=Retry.DEFAULT_ALLOWED_METHODS
870
871
  )
871
872
 
872
- self.shared_secret = bool(use_shared_secret)
873
+ self.shared_secret: bool = bool(use_shared_secret)
873
874
  self.protocol = protocol
874
875
  self.two_fa_secret_key = two_fa_secret_key
875
876
 
pyPreservica/entityAPI.py CHANGED
@@ -796,11 +796,11 @@ class EntityAPI(AuthenticatedAPI):
796
796
  for url in entity.metadata:
797
797
  if schema == entity.metadata[url]:
798
798
  mref = url[url.rfind(f"{entity.reference}/metadata/") + len(f"{entity.reference}/metadata/"):]
799
- xml_object = xml.etree.ElementTree.Element('MetadataContainer',
800
- {"schemaUri": schema, "xmlns": self.xip_ns})
801
- xml.etree.ElementTree.SubElement(xml_object, "Ref").text = mref
802
- xml.etree.ElementTree.SubElement(xml_object, "Entity").text = entity.reference
803
- content = xml.etree.ElementTree.SubElement(xml_object, "Content")
799
+ xml_object = xml.etree.ElementTree.Element('xip:MetadataContainer',
800
+ {"schemaUri": schema, "xmlns:xip": self.xip_ns})
801
+ xml.etree.ElementTree.SubElement(xml_object, "xip:Ref").text = mref
802
+ xml.etree.ElementTree.SubElement(xml_object, "xip:Entity").text = entity.reference
803
+ content = xml.etree.ElementTree.SubElement(xml_object, "xip:Content")
804
804
  if isinstance(data, str):
805
805
  ob = xml.etree.ElementTree.fromstring(data)
806
806
  content.append(ob)
@@ -836,9 +836,10 @@ class EntityAPI(AuthenticatedAPI):
836
836
  """
837
837
  headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/xml;charset=UTF-8'}
838
838
 
839
- xml_object = xml.etree.ElementTree.Element('MetadataContainer', {"schemaUri": schema, "xmlns": self.xip_ns})
840
- xml.etree.ElementTree.SubElement(xml_object, "Entity").text = entity.reference
841
- content = xml.etree.ElementTree.SubElement(xml_object, "Content")
839
+ xml_object = xml.etree.ElementTree.Element('xip:MetadataContainer', {"schemaUri": schema,
840
+ "xmlns:xip": self.xip_ns})
841
+ xml.etree.ElementTree.SubElement(xml_object, "xip:Entity").text = entity.reference
842
+ content = xml.etree.ElementTree.SubElement(xml_object, "xip:Content")
842
843
  if isinstance(data, str):
843
844
  ob = xml.etree.ElementTree.fromstring(data)
844
845
  content.append(ob)
@@ -1880,7 +1881,11 @@ class EntityAPI(AuthenticatedAPI):
1880
1881
  def children(self, folder: Union[str, Folder] = None, maximum: int = 100, next_page: str = None) -> PagedSet:
1881
1882
  headers = {HEADER_TOKEN: self.token}
1882
1883
  data = {'start': str(0), 'max': str(maximum)}
1883
- folder_reference = folder
1884
+
1885
+ if isinstance(folder, Folder):
1886
+ folder_reference = folder.reference
1887
+ else:
1888
+ folder_reference = folder
1884
1889
  if next_page is None:
1885
1890
  if folder_reference is None:
1886
1891
  request = self.session.get(f'{self.protocol}://{self.server}/api/entity/root/children', params=data,
@@ -0,0 +1,100 @@
1
+ """
2
+ pyPreservica MDFormsAPI module definition
3
+
4
+ A client library for the Preservica Repository web services Metadata API
5
+ https://demo.preservica.com/api/metadata/documentation.html
6
+
7
+ author: James Carr
8
+ licence: Apache License 2.0
9
+
10
+ """
11
+ import json
12
+ import xml.etree.ElementTree
13
+
14
+ from pyPreservica.common import *
15
+
16
+
17
+ class MDFormsAPI(AuthenticatedAPI):
18
+ def __init__(self, username: str = None, password: str = None, tenant: str = None, server: str = None,
19
+ use_shared_secret: bool = False, two_fa_secret_key: str = None, protocol: str = "https"):
20
+ super().__init__(username, password, tenant, server, use_shared_secret, two_fa_secret_key, protocol)
21
+ xml.etree.ElementTree.register_namespace("oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/")
22
+ xml.etree.ElementTree.register_namespace("ead", "urn:isbn:1-931666-22-9")
23
+
24
+ def delete_group(self, id: str):
25
+ """
26
+ Delete a group
27
+ :param id: Group ID
28
+ :return:
29
+ """
30
+ headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/json;charset=UTF-8'}
31
+ url = f'{self.protocol}://{self.server}/api/metadata/groups/{id}'
32
+ with self.session.delete(url, headers=headers) as request:
33
+ if request.status_code == requests.codes.unauthorized:
34
+ self.token = self.__token__()
35
+ return self.delete_group(id)
36
+ elif request.status_code == requests.codes.no_content:
37
+ return None
38
+ else:
39
+ exception = HTTPException(None, request.status_code, request.url, "delete_group",
40
+ request.content.decode('utf-8'))
41
+ logger.error(exception)
42
+ raise exception
43
+
44
+ def add_group(self, document):
45
+ """
46
+ Add a new group
47
+ :return:
48
+ """
49
+ headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/json;charset=UTF-8'}
50
+ url = f'{self.protocol}://{self.server}/api/metadata/groups/'
51
+ with self.session.post(url, headers=headers, json=document) as request:
52
+ if request.status_code == requests.codes.unauthorized:
53
+ self.token = self.__token__()
54
+ return self.add_group(document)
55
+ elif request.status_code == requests.codes.created:
56
+ return json.loads(str(request.content.decode('utf-8')))
57
+ else:
58
+ exception = HTTPException(None, request.status_code, request.url, "group",
59
+ request.content.decode('utf-8'))
60
+ logger.error(exception)
61
+ raise exception
62
+
63
+ def group(self, id: str):
64
+ """
65
+ Fetch a metadata Group by its id
66
+ :param id: The group ID
67
+ :return: JSON Document
68
+ """
69
+ headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/json;charset=UTF-8'}
70
+ url = f'{self.protocol}://{self.server}/api/metadata/groups/{id}'
71
+ with self.session.get(url, headers=headers) as request:
72
+ if request.status_code == requests.codes.unauthorized:
73
+ self.token = self.__token__()
74
+ return self.group(id)
75
+ elif request.status_code == requests.codes.ok:
76
+ return json.loads(str(request.content.decode('utf-8')))
77
+ else:
78
+ exception = HTTPException(None, request.status_code, request.url, "group",
79
+ request.content.decode('utf-8'))
80
+ logger.error(exception)
81
+ raise exception
82
+
83
+ def groups(self):
84
+ """
85
+ Fetch all the Metadata Groups as JSON
86
+ :return: JSON Document
87
+ """
88
+ headers = {HEADER_TOKEN: self.token, 'Content-Type': 'application/json;charset=UTF-8'}
89
+ url = f'{self.protocol}://{self.server}/api/metadata/groups'
90
+ with self.session.get(url, headers=headers) as request:
91
+ if request.status_code == requests.codes.unauthorized:
92
+ self.token = self.__token__()
93
+ return self.groups()
94
+ elif request.status_code == requests.codes.ok:
95
+ return json.loads(str(request.content.decode('utf-8')))['groups']
96
+ else:
97
+ exception = HTTPException(None, request.status_code, request.url, "groups",
98
+ request.content.decode('utf-8'))
99
+ logger.error(exception)
100
+ raise exception
pyPreservica/uploadAPI.py CHANGED
@@ -98,11 +98,11 @@ def prettify(elem):
98
98
 
99
99
  def __create_io__(xip=None, file_name=None, parent_folder=None, **kwargs):
100
100
  if xip is None:
101
- xip = Element('XIP')
101
+ xip = Element('xip:XIP')
102
102
  assert xip is not None
103
- xip.set('xmlns', 'http://preservica.com/XIP/v6.0')
104
- io = SubElement(xip, 'InformationObject')
105
- ref = SubElement(io, 'Ref')
103
+ xip.set('xmlns:xip', 'http://preservica.com/XIP/v6.0')
104
+ io = SubElement(xip, 'xip:InformationObject')
105
+ ref = SubElement(io, 'xip:Ref')
106
106
 
107
107
  if 'IO_Identifier_callback' in kwargs:
108
108
  ident_callback = kwargs.get('IO_Identifier_callback')
@@ -110,15 +110,15 @@ def __create_io__(xip=None, file_name=None, parent_folder=None, **kwargs):
110
110
  else:
111
111
  ref.text = str(uuid.uuid4())
112
112
 
113
- title = SubElement(io, 'Title')
113
+ title = SubElement(io, 'xip:Title')
114
114
  title.text = kwargs.get('Title', file_name)
115
- description = SubElement(io, 'Description')
115
+ description = SubElement(io, 'xip:Description')
116
116
  description.text = kwargs.get('Description', file_name)
117
- security = SubElement(io, 'SecurityTag')
117
+ security = SubElement(io, 'xip:SecurityTag')
118
118
  security.text = kwargs.get('SecurityTag', "open")
119
- custom_type = SubElement(io, 'CustomType')
119
+ custom_type = SubElement(io, 'xip:CustomType')
120
120
  custom_type.text = kwargs.get('CustomType', "")
121
- parent = SubElement(io, 'Parent')
121
+ parent = SubElement(io, 'xip:Parent')
122
122
 
123
123
  if hasattr(parent_folder, "reference"):
124
124
  parent.text = parent_folder.reference
@@ -129,76 +129,76 @@ def __create_io__(xip=None, file_name=None, parent_folder=None, **kwargs):
129
129
 
130
130
 
131
131
  def __make_representation__(xip, rep_name, rep_type, io_ref):
132
- representation = SubElement(xip, 'Representation')
133
- io_link = SubElement(representation, 'InformationObject')
132
+ representation = SubElement(xip, 'xip:Representation')
133
+ io_link = SubElement(representation, 'xip:InformationObject')
134
134
  io_link.text = io_ref
135
- access_name = SubElement(representation, 'Name')
135
+ access_name = SubElement(representation, 'xip:Name')
136
136
  access_name.text = rep_name
137
- access_type = SubElement(representation, 'Type')
137
+ access_type = SubElement(representation, 'xip:Type')
138
138
  access_type.text = rep_type
139
- content_objects = SubElement(representation, 'ContentObjects')
140
- content_object = SubElement(content_objects, 'ContentObject')
139
+ content_objects = SubElement(representation, 'xip:ContentObjects')
140
+ content_object = SubElement(content_objects, 'xip:ContentObject')
141
141
  content_object_ref = str(uuid.uuid4())
142
142
  content_object.text = content_object_ref
143
143
  return content_object_ref
144
144
 
145
145
 
146
146
  def __make_content_objects__(xip, content_title, co_ref, io_ref, tag, content_description, content_type):
147
- content_object = SubElement(xip, 'ContentObject')
148
- ref_element = SubElement(content_object, "Ref")
147
+ content_object = SubElement(xip, 'xip:ContentObject')
148
+ ref_element = SubElement(content_object, "xip:Ref")
149
149
  ref_element.text = co_ref
150
- title = SubElement(content_object, "Title")
150
+ title = SubElement(content_object, "xip:Title")
151
151
  title.text = content_title
152
- description = SubElement(content_object, "Description")
152
+ description = SubElement(content_object, "xip:Description")
153
153
  description.text = content_description
154
- security_tag = SubElement(content_object, "SecurityTag")
154
+ security_tag = SubElement(content_object, "xip:SecurityTag")
155
155
  security_tag.text = tag
156
- custom_type = SubElement(content_object, "CustomType")
156
+ custom_type = SubElement(content_object, "xip:CustomType")
157
157
  custom_type.text = content_type
158
- parent = SubElement(content_object, "Parent")
158
+ parent = SubElement(content_object, "xip:Parent")
159
159
  parent.text = io_ref
160
160
 
161
161
 
162
162
  def __make_generation__(xip, filename, co_ref, generation_label, location=None):
163
- generation = SubElement(xip, 'Generation', {"original": "true", "active": "true"})
164
- content_object = SubElement(generation, "ContentObject")
163
+ generation = SubElement(xip, 'xip:Generation', {"original": "true", "active": "true"})
164
+ content_object = SubElement(generation, "xip:ContentObject")
165
165
  content_object.text = co_ref
166
- label = SubElement(generation, "Label")
166
+ label = SubElement(generation, "xip:Label")
167
167
  if generation_label:
168
168
  label.text = generation_label
169
169
  else:
170
170
  label.text = os.path.splitext(filename)[0]
171
- effective_date = SubElement(generation, "EffectiveDate")
171
+ effective_date = SubElement(generation, "xip:EffectiveDate")
172
172
  effective_date.text = datetime.now().isoformat()
173
- bitstreams = SubElement(generation, "Bitstreams")
174
- bitstream = SubElement(bitstreams, "Bitstream")
173
+ bitstreams = SubElement(generation, "xip:Bitstreams")
174
+ bitstream = SubElement(bitstreams, "xip:Bitstream")
175
175
  bitstream.text = f"{location}/{filename}"
176
- SubElement(generation, "Formats")
177
- SubElement(generation, "Properties")
176
+ SubElement(generation, "xip:Formats")
177
+ SubElement(generation, "xip:Properties")
178
178
 
179
179
 
180
180
  def __make_bitstream__(xip, file_name, full_path, callback, location=None):
181
- bitstream = SubElement(xip, 'Bitstream')
182
- filename_element = SubElement(bitstream, "Filename")
181
+ bitstream = SubElement(xip, 'xip:Bitstream')
182
+ filename_element = SubElement(bitstream, "xip:Filename")
183
183
  filename_element.text = file_name
184
- filesize = SubElement(bitstream, "FileSize")
184
+ filesize = SubElement(bitstream, "xip:FileSize")
185
185
  file_stats = os.stat(full_path)
186
186
  filesize.text = str(file_stats.st_size)
187
- physical_location = SubElement(bitstream, "PhysicalLocation")
187
+ physical_location = SubElement(bitstream, "xip:PhysicalLocation")
188
188
  physical_location.text = location
189
- fixities = SubElement(bitstream, "Fixities")
189
+ fixities = SubElement(bitstream, "xip:Fixities")
190
190
  fixity_result = callback(file_name, full_path)
191
191
  if type(fixity_result) == tuple:
192
- fixity = SubElement(fixities, "Fixity")
193
- fixity_algorithm_ref = SubElement(fixity, "FixityAlgorithmRef")
194
- fixity_value = SubElement(fixity, "FixityValue")
192
+ fixity = SubElement(fixities, "xip:Fixity")
193
+ fixity_algorithm_ref = SubElement(fixity, "xip:FixityAlgorithmRef")
194
+ fixity_value = SubElement(fixity, "xip:FixityValue")
195
195
  fixity_algorithm_ref.text = fixity_result[0]
196
196
  fixity_value.text = fixity_result[1]
197
197
  elif type(fixity_result) == dict:
198
198
  for key, val in fixity_result.items():
199
- fixity = SubElement(fixities, "Fixity")
200
- fixity_algorithm_ref = SubElement(fixity, "FixityAlgorithmRef")
201
- fixity_value = SubElement(fixity, "FixityValue")
199
+ fixity = SubElement(fixities, "xip:Fixity")
200
+ fixity_algorithm_ref = SubElement(fixity, "xip:FixityAlgorithmRef")
201
+ fixity_value = SubElement(fixity, "xip:FixityValue")
202
202
  fixity_algorithm_ref.text = key
203
203
  fixity_value.text = val
204
204
  else:
@@ -207,17 +207,17 @@ def __make_bitstream__(xip, file_name, full_path, callback, location=None):
207
207
 
208
208
 
209
209
  def __make_representation_multiple_co__(xip, rep_name, rep_type, rep_files, io_ref):
210
- representation = SubElement(xip, 'Representation')
211
- io_link = SubElement(representation, 'InformationObject')
210
+ representation = SubElement(xip, 'xip:Representation')
211
+ io_link = SubElement(representation, 'xip:InformationObject')
212
212
  io_link.text = io_ref
213
- access_name = SubElement(representation, 'Name')
213
+ access_name = SubElement(representation, 'xip:Name')
214
214
  access_name.text = rep_name
215
- access_type = SubElement(representation, 'Type')
215
+ access_type = SubElement(representation, 'xip:Type')
216
216
  access_type.text = rep_type
217
- content_objects = SubElement(representation, 'ContentObjects')
217
+ content_objects = SubElement(representation, 'xip:ContentObjects')
218
218
  refs_dict = {}
219
219
  for f in rep_files:
220
- content_object = SubElement(content_objects, 'ContentObject')
220
+ content_object = SubElement(content_objects, 'xip:ContentObject')
221
221
  content_object_ref = str(uuid.uuid4())
222
222
  content_object.text = content_object_ref
223
223
  refs_dict[content_object_ref] = f
@@ -864,6 +864,8 @@ def complex_asset_package(preservation_files_list=None, access_files_list=None,
864
864
  'Preservation_Representation_Name' Name of the Preservation Representation
865
865
  'Access_Representation_Name' Name of the Access Representation
866
866
  """
867
+ xml.etree.ElementTree.register_namespace("xip", "http://preservica.com/XIP/v6.0")
868
+
867
869
  # some basic validation
868
870
  if export_folder is None:
869
871
  export_folder = tempfile.gettempdir()
@@ -990,12 +992,12 @@ def complex_asset_package(preservation_files_list=None, access_files_list=None,
990
992
  for identifier_key, identifier_value in identifier_map.items():
991
993
  if identifier_key:
992
994
  if identifier_value:
993
- identifier = SubElement(xip, 'Identifier')
994
- id_type = SubElement(identifier, "Type")
995
+ identifier = SubElement(xip, 'xip:Identifier')
996
+ id_type = SubElement(identifier, "xip:Type")
995
997
  id_type.text = identifier_key
996
- id_value = SubElement(identifier, "Value")
998
+ id_value = SubElement(identifier, "xip:Value")
997
999
  id_value.text = identifier_value
998
- id_io = SubElement(identifier, "Entity")
1000
+ id_io = SubElement(identifier, "xip:Entity")
999
1001
  id_io.text = io_ref
1000
1002
 
1001
1003
  if 'Asset_Metadata' in kwargs:
@@ -1005,22 +1007,22 @@ def complex_asset_package(preservation_files_list=None, access_files_list=None,
1005
1007
  if metadata_path and isinstance(metadata_path, str):
1006
1008
  if os.path.exists(metadata_path) and os.path.isfile(metadata_path):
1007
1009
  descriptive_metadata = xml.etree.ElementTree.parse(source=metadata_path)
1008
- metadata = SubElement(xip, 'Metadata', {'schemaUri': metadata_ns})
1009
- metadata_ref = SubElement(metadata, 'Ref')
1010
+ metadata = SubElement(xip, 'xip:Metadata', {'schemaUri': metadata_ns})
1011
+ metadata_ref = SubElement(metadata, 'xip:Ref')
1010
1012
  metadata_ref.text = str(uuid.uuid4())
1011
- entity = SubElement(metadata, 'Entity')
1013
+ entity = SubElement(metadata, 'xip:Entity')
1012
1014
  entity.text = io_ref
1013
- content = SubElement(metadata, 'Content')
1015
+ content = SubElement(metadata, 'xip:Content')
1014
1016
  content.append(descriptive_metadata.getroot())
1015
1017
  elif isinstance(metadata_path, str):
1016
1018
  try:
1017
1019
  descriptive_metadata = xml.etree.ElementTree.fromstring(metadata_path)
1018
- metadata = SubElement(xip, 'Metadata', {'schemaUri': metadata_ns})
1019
- metadata_ref = SubElement(metadata, 'Ref')
1020
+ metadata = SubElement(xip, 'xip:Metadata', {'schemaUri': metadata_ns})
1021
+ metadata_ref = SubElement(metadata, 'xip:Ref')
1020
1022
  metadata_ref.text = str(uuid.uuid4())
1021
- entity = SubElement(metadata, 'Entity')
1023
+ entity = SubElement(metadata, 'xip:Entity')
1022
1024
  entity.text = io_ref
1023
- content = SubElement(metadata, 'Content')
1025
+ content = SubElement(metadata, 'xip:Content')
1024
1026
  content.append(descriptive_metadata)
1025
1027
  except RuntimeError:
1026
1028
  logging.info(f"Could not parse asset metadata in namespace {metadata_ns}")
@@ -1028,12 +1030,12 @@ def complex_asset_package(preservation_files_list=None, access_files_list=None,
1028
1030
  for path in metadata_path:
1029
1031
  if os.path.exists(path) and os.path.isfile(path):
1030
1032
  descriptive_metadata = xml.etree.ElementTree.parse(source=path)
1031
- metadata = SubElement(xip, 'Metadata', {'schemaUri': metadata_ns})
1032
- metadata_ref = SubElement(metadata, 'Ref')
1033
+ metadata = SubElement(xip, 'xip:Metadata', {'schemaUri': metadata_ns})
1034
+ metadata_ref = SubElement(metadata, 'xip:Ref')
1033
1035
  metadata_ref.text = str(uuid.uuid4())
1034
- entity = SubElement(metadata, 'Entity')
1036
+ entity = SubElement(metadata, 'xip:Entity')
1035
1037
  entity.text = io_ref
1036
- content = SubElement(metadata, 'Content')
1038
+ content = SubElement(metadata, 'xip:Content')
1037
1039
  content.append(descriptive_metadata.getroot())
1038
1040
 
1039
1041
  if xip is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyPreservica
3
- Version: 2.6.7
3
+ Version: 2.7.2
4
4
  Summary: Python library for the Preservica API
5
5
  Home-page: https://pypreservica.readthedocs.io/
6
6
  Author: James Carr
@@ -1,19 +1,20 @@
1
- pyPreservica/__init__.py,sha256=WC44WynzHyCoyIEaO23odoVeBnG8EKKAYJ766bN4-z4,1085
1
+ pyPreservica/__init__.py,sha256=7niGhdk2fS4pMgHaqr-x-oZMJQg5-Nte_jfMNxZ3Lkk,1117
2
2
  pyPreservica/adminAPI.py,sha256=511bc5KtrCAXbDyBk39dmDnxUVDaOu6xaiyu0jYhxa4,37781
3
3
  pyPreservica/authorityAPI.py,sha256=Eule8g6LXr8c8SFcJgpRah4lH1FgevUItO5HhHDEaZE,9172
4
- pyPreservica/common.py,sha256=y-yzPQZMBm_sBc6C28VgMLBNIHh8kSy5utY9f0h8sWU,36463
4
+ pyPreservica/common.py,sha256=upTmwvPK9kcgSO3L8mfIMVrCOWJCCYIHi5GK516jOok,36518
5
5
  pyPreservica/contentAPI.py,sha256=d6bK7qXFLep8rOs8y-dJGzoFuqanO3fo82G4dW0YWWE,17245
6
- pyPreservica/entityAPI.py,sha256=CVPDQhJZzQjqq-HzV05vnGlqynEQ5aplTYwd1BZNyZ0,114526
6
+ pyPreservica/entityAPI.py,sha256=qNUjhAAdboBuY319AtyQV1n5N3Yrs1VY1enBxqQf5RQ,114750
7
+ pyPreservica/mdformsAPI.py,sha256=wHRCv5mcvztVFt9zBnUgHeGgSiNIrzR9IQOSV25daJ0,4576
7
8
  pyPreservica/monitorAPI.py,sha256=HD-PUPdSI9wGAa07e2_2_-FLINH8PoWUwpFogz7F-j4,6269
8
9
  pyPreservica/opex.py,sha256=ccra1S4ojUXS3PlbU8WfxajOkJrwG4OykBnNrYP_jus,4875
9
10
  pyPreservica/parAPI.py,sha256=bgaQvYfWNnzdD7ibKMV3ZV85pNkEdSoLsgVigoiFFfw,10771
10
11
  pyPreservica/retentionAPI.py,sha256=Cx1ofz9V31a8c8utEfKYLlfQaHSaaqg_D4R3LUFBEx0,23612
11
- pyPreservica/uploadAPI.py,sha256=4Rdm9xvO2FKC8SirOP41g5wVnPEZLRI0Mz4KinxT-L4,93553
12
+ pyPreservica/uploadAPI.py,sha256=8GCQlofg-fxJEY_djeValbVwBZoTBujJEDFxpS_fEkQ,93894
12
13
  pyPreservica/vocabularyAPI.py,sha256=jPl6KDZoBGqlY0oEYjTpZ9kNEPzchDW-gyp-HH-MSKk,5729
13
14
  pyPreservica/webHooksAPI.py,sha256=0wP-59mep8gtlIZ9P5vV68-HnNdTuuo2kzGcDWj0bNg,6790
14
15
  pyPreservica/workflowAPI.py,sha256=ENFWxcuPW5WX9jG2CAha6UzTywULWvosgTUVsmvs8f8,17323
15
- pyPreservica-2.6.7.dist-info/LICENSE.txt,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
16
- pyPreservica-2.6.7.dist-info/METADATA,sha256=rb3Y384XVbwgB_rd5A1WcHkUQcplCBPCmXQeoX0GbL8,2784
17
- pyPreservica-2.6.7.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
18
- pyPreservica-2.6.7.dist-info/top_level.txt,sha256=iIBh6NAznYQHOV8mv_y_kGKSDITek9rANyFDwJsbU-c,13
19
- pyPreservica-2.6.7.dist-info/RECORD,,
16
+ pyPreservica-2.7.2.dist-info/LICENSE.txt,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
17
+ pyPreservica-2.7.2.dist-info/METADATA,sha256=GDQ2AtPbqDpmjxUGGIwq-8EIoOXkz_fsxwkpMf68TDc,2784
18
+ pyPreservica-2.7.2.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
19
+ pyPreservica-2.7.2.dist-info/top_level.txt,sha256=iIBh6NAznYQHOV8mv_y_kGKSDITek9rANyFDwJsbU-c,13
20
+ pyPreservica-2.7.2.dist-info/RECORD,,