|
| 1 | +import collections |
1 | 2 | import csv |
2 | 3 | import datetime |
3 | 4 | from functools import partial |
@@ -78,7 +79,7 @@ def filtered_item_search(self, key, string, query_type, |
78 | 79 | return item_links |
79 | 80 |
|
80 | 81 | def get_id_from_handle(self, handle): |
81 | | - """Posts a collection to a specified community.""" |
| 82 | + """Retrieves UUID for an object based on its handle.""" |
82 | 83 | endpoint = f'{self.url}/handle/{handle}' |
83 | 84 | rec_obj = requests.get(endpoint, headers=self.header, |
84 | 85 | cookies=self.cookies).json() |
@@ -124,26 +125,29 @@ def post_items_to_coll(self, coll_id, coll_metadata, file_dict, |
124 | 125 |
|
125 | 126 | def post_bitstreams_to_item(self, item_id, file_identifier, file_dict, |
126 | 127 | ingest_type): |
127 | | - """Posts bitstreams to a specified item.""" |
128 | | - for k, v in file_dict.items(): |
129 | | - bitstreams = [] |
130 | | - if k.startswith(file_identifier): |
131 | | - bitstreams.append(k) |
132 | | - bitstreams.sort() |
133 | | - for bitstream in bitstreams: |
134 | | - bitstream_path = file_dict[bitstream] |
135 | | - file_name = os.path.basename(bitstream_path) |
136 | | - if ingest_type == 'local': |
137 | | - data = open(bitstream_path, 'rb') |
138 | | - elif ingest_type == 'remote': |
139 | | - data = requests.get(bitstream_path) |
140 | | - endpoint = (f'{self.url}/items/{item_id}' |
141 | | - + f'/bitstreams?name={file_name}') |
142 | | - header_upload = {'accept': 'application/json'} |
143 | | - bit_id = requests.post(endpoint, headers=header_upload, |
144 | | - cookies=self.cookies, data=data).json() |
145 | | - bit_id = bit_id['uuid'] |
146 | | - yield bit_id |
| 128 | + """Post a sorted set of bitstreams to a specified item.""" |
| 129 | + file_dict = collections.OrderedDict(sorted(file_dict.items())) |
| 130 | + for bitstream, v in file_dict.items(): |
| 131 | + bit_id = self.post_bitstream(item_id, file_identifier, file_dict, |
| 132 | + ingest_type, bitstream) |
| 133 | + yield bit_id |
| 134 | + |
| 135 | + def post_bitstream(self, item_id, file_identifier, file_dict, ingest_type, |
| 136 | + bitstream): |
| 137 | + """Post a bitstream to a specified item.""" |
| 138 | + bitstream_path = file_dict[bitstream] |
| 139 | + file_name = os.path.basename(bitstream_path) |
| 140 | + if ingest_type == 'local': |
| 141 | + data = open(bitstream_path, 'rb') |
| 142 | + elif ingest_type == 'remote': |
| 143 | + data = requests.get(bitstream_path) |
| 144 | + endpoint = (f'{self.url}/items/{item_id}' |
| 145 | + + f'/bitstreams?name={file_name}') |
| 146 | + header_upload = {'accept': 'application/json'} |
| 147 | + bit_id = requests.post(endpoint, headers=header_upload, |
| 148 | + cookies=self.cookies, data=data).json() |
| 149 | + bit_id = bit_id['uuid'] |
| 150 | + return bit_id |
147 | 151 |
|
148 | 152 | def _pop_inst(self, class_type, rec_obj): |
149 | 153 | """Populate class instance with data from record.""" |
@@ -224,38 +228,29 @@ def elapsed_time(start_time, label): |
224 | 228 | logger.info(f'{label} : {td}') |
225 | 229 |
|
226 | 230 |
|
227 | | -def metadata_csv(row, key, field, language=None, delimiter=''): |
228 | | - """Create metadata element from CSV.""" |
| 231 | +def metadata_elems_from_row(row, key, field, language=None, delimiter=''): |
| 232 | + """Create a metadata element from a CSV row.""" |
229 | 233 | metadata_elems = [] |
230 | 234 | if row[field] != '': |
231 | | - if delimiter != '' and delimiter in row[field]: |
| 235 | + if delimiter: |
232 | 236 | values = row[field].split(delimiter) |
233 | | - for value in values: |
234 | | - if language is not None: |
235 | | - metadata_elem = {'key': key, 'language': language, 'value': |
236 | | - value} |
237 | | - metadata_elems.append(metadata_elem) |
238 | | - else: |
239 | | - metadata_elem = {'key': key, 'value': value} |
240 | | - metadata_elems.append(metadata_elem) |
241 | 237 | else: |
242 | | - value = row[field] |
243 | | - if language is not None: |
244 | | - metadata_elem = {'key': key, 'language': language, 'value': |
245 | | - value} |
246 | | - else: |
247 | | - metadata_elem = {'key': key, 'value': value} |
248 | | - metadata_elems.append(metadata_elem) |
| 238 | + values = [row[field]] |
| 239 | + for value in values: |
| 240 | + metadata_elem = {'key': key, 'language': language, 'value': |
| 241 | + value} |
| 242 | + metadata_elems.append({k: v for k, v in metadata_elem.items() |
| 243 | + if v is not None}) |
249 | 244 | return metadata_elems |
250 | 245 |
|
251 | 246 |
|
252 | 247 | def create_metadata_rec(mapping_dict, row, metadata_rec): |
253 | | - """Create metadata record from CSV.""" |
| 248 | + """Create metadata record from a series of metadata elements.""" |
254 | 249 | for k, v in mapping_dict.items(): |
255 | 250 | if len(v) == 3: |
256 | | - metadata_elems = metadata_csv(row, k, v[0], v[1], v[2]) |
| 251 | + metadata_elems = metadata_elems_from_row(row, k, v[0], v[1], v[2]) |
257 | 252 | else: |
258 | | - metadata_elems = metadata_csv(row, k, v[0]) |
| 253 | + metadata_elems = metadata_elems_from_row(row, k, v[0]) |
259 | 254 | for metadata_elem in metadata_elems: |
260 | 255 | metadata_rec.append(metadata_elem) |
261 | 256 | return metadata_rec |
0 commit comments