-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdate_metadata.py
More file actions
101 lines (78 loc) · 3.1 KB
/
Copy pathupdate_metadata.py
File metadata and controls
101 lines (78 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import json
import os
import re
import requests
from office365.runtime.client_request_exception import ClientRequestException
from office365.sharepoint.client_context import ClientContext
from dotenv import load_dotenv
from office365.sharepoint.fields.url_value import FieldUrlValue
load_dotenv()
# ENV variables
collection = 'HU OSA 394/HU OSA 394-0-1'
extension = '.mp4'
site_url = os.getenv('SHAREPOINT_SITE')
library = os.getenv('DOCUMENT_LIBRARY')
input_folder = os.getenv('INPUT_DIR')
container_api = os.getenv('AMS_CONTAINER_DATA_API')
item_api = os.getenv('AMS_ITEM_DATA_API')
token = os.getenv('AMS_API_KEY')
error_folder = os.getenv('ERROR_DIR')
success_folder = os.getenv('SUCCESS_DIR')
cert_settings = {
'client_id': os.getenv('CLIENT_ID'),
'thumbprint': os.getenv('THUMBPRINT'),
'cert_path': '{0}/selfsigncert.pem'.format(os.path.dirname(__file__)),
'scopes': ['{0}.default'.format(os.getenv('SHAREPOINT_ROOT'))]
}
def try_get_folder(ctx, url):
try:
return ctx.web.get_folder_by_server_relative_url(url).get().execute_query()
except ClientRequestException as e:
if e.response.status_code == 404:
return None
else:
raise ValueError(e.response.text)
def get_metadata(file_name):
legacy_id = file_name.replace(extension, "")
# Request info from AMS
headers = {"Authorization": "Bearer %s" % token}
# Container exists
if re.match(r'^HU_OSA_[0-9]{8}', legacy_id):
r = requests.get("%s%s" % (container_api, legacy_id), headers=headers)
else:
r = requests.get("%s%s" % (container_api, legacy_id), headers=headers)
if r.status_code == 200:
data = json.loads(r.text)
return data
def main():
ctx = ClientContext(site_url).with_client_certificate(os.getenv('TENANT'), **cert_settings)
url = "%s/%s" % (library, collection)
folder = try_get_folder(ctx, url)
if folder is None:
print("Folder not found")
else:
files = folder.files
ctx.load(files)
ctx.execute_query()
for file in files:
file_name = file.properties["Name"]
metadata = get_metadata(file_name)
filemeta = file.listItemAllFields
if metadata:
# Update metadata
series = metadata['archival_unit']['series']
filemeta.set_property('ArchivalReferenceNumber', '%s:%s' % (
series['reference_code'], metadata['container_no']
))
filemeta.set_property('Description', '%s #%s' % (metadata['carrier_type'], metadata['container_no']))
field_url = FieldUrlValue(
url='https://catalog.archivum.org/catalog/?tab=content&start=%s' % metadata['container_no'],
description='View in Catalog'
)
filemeta.set_property('Catalog', field_url)
filemeta.update().execute_query()
print('%s metadata was updated' % file_name)
else:
print('No metadata available for the file: %s' % file_name)
if __name__ == "__main__":
main()