1
- import operator
1
+ from __future__ import annotations
2
2
3
+ import ast
3
4
import attr
5
+ import operator
4
6
import requests
5
- import smart_open
6
7
import structlog
7
8
9
+ import smart_open
10
+
8
11
from attrs import field , define
9
12
13
+
10
14
logger = structlog .get_logger ()
11
15
op = operator .attrgetter ("name" )
12
16
@@ -200,19 +204,39 @@ class Item(Object):
200
204
source_system_identifier = field (default = None )
201
205
202
206
@classmethod
203
- def metadata_from_csv_row (cls , record , mapping ):
207
+ def create (cls , record , mapping ) -> Item :
208
+ return cls (
209
+ metadata = cls .get_metadata (record , mapping ),
210
+ bitstreams = cls .get_bitstreams (record ),
211
+ ** cls .get_ids (record , mapping ),
212
+ )
213
+
214
+ @classmethod
215
+ def get_bitstreams (cls , record ) -> list :
216
+ if bitstreams := record .get ("bitstreams" ):
217
+ return ast .literal_eval (bitstreams )
218
+
219
+ @classmethod
220
+ def get_ids (cls , record , mapping ) -> dict :
221
+ ids = {}
222
+ if item_id_mapping := mapping .get ("item_identifier" ):
223
+ ids ["item_identifier" ] = record .get (item_id_mapping ["csv_field_name" ])
224
+ if source_system_id_mapping := mapping .get ("source_system_identifier" ):
225
+ ids ["source_system_identifier" ] = record .get (
226
+ source_system_id_mapping ["csv_field_name" ]
227
+ )
228
+ return ids
229
+
230
+ @classmethod
231
+ def get_metadata (cls , record , mapping ) -> list :
204
232
"""Create metadata for an item based on a CSV row and a JSON mapping field map."""
205
233
metadata = []
206
234
for field_name , field_mapping in mapping .items ():
235
+ if field_name in ["item_identifier" , "source_system_identifier" ]:
236
+ continue
207
237
field_value = record [field_mapping ["csv_field_name" ]]
208
238
209
239
if field_value :
210
- if field_name == "item_identifier" :
211
- item_identifier = field_value
212
- continue # file_identifier is not included in DSpace metadata
213
- if field_name == "source_system_identifier" :
214
- # source_system_identifier = field
215
- continue # source_system_identifier is not included in DSpace
216
240
delimiter = field_mapping ["delimiter" ]
217
241
language = field_mapping ["language" ]
218
242
if delimiter :
@@ -234,22 +258,18 @@ def metadata_from_csv_row(cls, record, mapping):
234
258
language = language ,
235
259
)
236
260
)
237
- return cls (
238
- metadata = metadata ,
239
- item_identifier = item_identifier ,
240
- # source_system_identifier=source_system_identifier,
241
- )
261
+ return metadata
242
262
243
263
244
264
@define
245
265
class Collection (Object ):
246
266
items = field (factory = list )
247
267
248
268
@classmethod
249
- def create_metadata_for_items_from_csv (cls , csv_reader , field_map ):
269
+ def add_items (cls , csv_reader , field_map ) -> Collection :
250
270
"""Create metadata for the collection's items based on a CSV and a JSON mapping
251
271
field map."""
252
- items = [Item .metadata_from_csv_row (row , field_map ) for row in csv_reader ]
272
+ items = [Item .create (row , field_map ) for row in csv_reader ]
253
273
return cls (items = items )
254
274
255
275
0 commit comments