1+ import collections
12import csv
23import datetime
34from functools import partial
@@ -77,6 +78,13 @@ def filtered_item_search(self, key, string, query_type,
7778 offset = offset + 200
7879 return item_links
7980
81+ def get_id_from_handle (self , handle ):
82+ """Retrieves UUID for an object based on its handle."""
83+ endpoint = f'{ self .url } /handle/{ handle } '
84+ rec_obj = requests .get (endpoint , headers = self .header ,
85+ cookies = self .cookies ).json ()
86+ return rec_obj ['uuid' ]
87+
8088 def post_coll_to_comm (self , comm_handle , coll_name ):
8189 """Posts a collection to a specified community."""
8290 endpoint = f'{ self .url } /handle/{ comm_handle } '
@@ -117,22 +125,29 @@ def post_items_to_coll(self, coll_id, coll_metadata, file_dict,
117125
118126 def post_bitstreams_to_item (self , item_id , file_identifier , file_dict ,
119127 ingest_type ):
120- """Posts bitstreams to a specified item."""
121- for k , v in file_dict .items ():
122- if k .startswith (file_identifier ):
123- bitstream = file_dict [k ]
124- file_name = os .path .basename (bitstream )
125- if ingest_type == 'local' :
126- data = open (bitstream , 'rb' )
127- elif ingest_type == 'remote' :
128- data = requests .get (bitstream )
129- endpoint = (f'{ self .url } /items/{ item_id } '
130- + f'/bitstreams?name={ file_name } ' )
131- header_upload = {'accept' : 'application/json' }
132- bit_id = requests .post (endpoint , headers = header_upload ,
133- cookies = self .cookies , data = data ).json ()
134- bit_id = bit_id ['uuid' ]
135- 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
136151
137152 def _pop_inst (self , class_type , rec_obj ):
138153 """Populate class instance with data from record."""
@@ -192,7 +207,7 @@ def build_file_dict_remote(directory_url, file_type, file_dict):
192207 """Build list of files in a remote directory."""
193208 response = requests .get (directory_url )
194209 links = html .fromstring (response .content ).iterlinks ()
195- for link in [l for l in links if l [2 ].endswith (file_type )]:
210+ for link in [i for i in links if i [2 ].endswith (file_type )]:
196211 file_identifier = link [2 ].replace (f'.{ file_type } ' , '' )
197212 file_dict [file_identifier ] = f'{ directory_url } { link [2 ]} '
198213 return file_dict
@@ -213,24 +228,29 @@ def elapsed_time(start_time, label):
213228 logger .info (f'{ label } : { td } ' )
214229
215230
216- def metadata_csv (row , key , field , language = None ):
217- """Create metadata element from CSV."""
218- value = row [field ]
219- if language is not None :
220- metadata_elem = {'key' : key , 'language' : language , 'value' :
221- value }
222- else :
223- metadata_elem = {'key' : key , 'value' : value }
224- return metadata_elem
231+ def metadata_elems_from_row (row , key , field , language = None , delimiter = '' ):
232+ """Create a metadata element from a CSV row."""
233+ metadata_elems = []
234+ if row [field ] != '' :
235+ if delimiter :
236+ values = row [field ].split (delimiter )
237+ else :
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 })
244+ return metadata_elems
225245
226246
227247def create_metadata_rec (mapping_dict , row , metadata_rec ):
228- """Create metadata record from CSV ."""
248+ """Create metadata record from a series of metadata elements ."""
229249 for k , v in mapping_dict .items ():
230- if len (v ) == 2 :
231- metadata_elem = metadata_csv (row , k , v [0 ], v [1 ])
250+ if len (v ) == 3 :
251+ metadata_elems = metadata_elems_from_row (row , k , v [0 ], v [1 ], v [ 2 ])
232252 else :
233- metadata_elem = metadata_csv (row , k , v [0 ])
234- if metadata_elem [ 'value' ] != '' :
253+ metadata_elems = metadata_elems_from_row (row , k , v [0 ])
254+ for metadata_elem in metadata_elems :
235255 metadata_rec .append (metadata_elem )
236256 return metadata_rec
0 commit comments