def check_transformation(marcxml_body, json_body): blob = create_record(marcxml.format(marcxml_body)) model._default_fields = {"_migration": {**get_helper_dict()}} record = model.do(blob, ignore_missing=False) expected = {"_migration": {**get_helper_dict()}} expected.update(**json_body) assert record == expected
def test_publication_info(app): """Test publication info.""" with app.app_context(): host = current_app.config["SPA_HOST"] check_transformation( """ <datafield tag="962" ind1=" " ind2=" "> <subfield code="b">2155631</subfield> <subfield code="n">genoa20160330</subfield> <subfield code="k">1</subfield> </datafield> """, { "_migration": { **get_helper_dict(record_type="document"), }, "urls": [ { "value": f"{host}/legacy/2155631", "description": "is chapter of" } ], "publication_info": [ { "pages": '1', } ], }, )
class CDSStandard(CdsIlsOverdo): """CDS Standard Overdo model.""" __query__ = ("003:SzGeCERN 690C_:STANDARD OR 980__:STANDARD") __ignore_keys__ = CDS_IGNORE_FIELDS _default_fields = { "_migration": { **get_helper_dict(record_type="document") } } rectype = "document" def do( self, blob, ignore_missing=True, exception_handlers=None, init_fields=None, ): """Overwrite the do method.""" init_fields = deepcopy(self._default_fields) return super().do(blob, ignore_missing, exception_handlers, init_fields)
def test_monograph_volume_migration_doi(app): """Test multipart volume with DOIs attached to volumes.""" with app.app_context(): check_transformation( """ <datafield tag="024" ind1="7" ind2=" "> <subfield code="2">DOI</subfield> <subfield code="a">10.1007/978-3-030-49613-5</subfield> <subfield code="q">ebook (v.1)</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "record_type": "multipart", "volumes_identifiers": [{ "doi": "10.1007/978-3-030-49613-5", "material": "ebook", "source": None, "volume": "1", }], }, "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
def test_monograph_volume_url(app): """Test multipart volume with urls.""" with app.app_context(): check_transformation( """ <datafield tag="856" ind1="4" ind2=" "> <subfield code="u">https://cds.cern.ch/auth.py?r=EBLIB_P_1890382</subfield> <subfield code="y">ebook (v.1)</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "record_type": "multipart", "volumes_urls": [{ "description": "ebook", "url": "https://cds.cern.ch/auth.py?r=EBLIB_P_1890382", "volume": "1", }], }, "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
def test_monograph_series_authors(app): """Test multipart authors.""" with app.app_context(): check_transformation( """ <datafield tag="100" ind1=" " ind2=" "> <subfield code="a">Mehra, Jagdish</subfield> </datafield> <datafield tag="700" ind1=" " ind2=" "> <subfield code="a">Rechenberg, Helmut</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "record_type": "multipart", }, "authors": [ { "full_name": "Mehra, Jagdish", "roles": ["AUTHOR"] }, { "full_name": "Rechenberg, Helmut", "roles": ["AUTHOR"], }, ], "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
def test_monograph_volume_migration_no_description(app): """Test multipart volume without description (https://cds.cern.ch/record/287517).""" with app.app_context(): check_transformation( """ <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">1560810726</subfield> <subfield code="u">v.13</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "record_type": "multipart", "volumes_identifiers": [{ "is_electronic": False, "isbn": "1560810726", "volume": "13", }], }, "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
class CDSBook(CdsIlsOverdo): """Translation Index for CDS Books.""" __query__ = ( '003:SzGeCERN 690C_:BOOK OR 690C_:"YELLOW REPORT" OR ' "980__:PROCEEDINGS OR " "(-980:STANDARD 980:BOOK) OR " "697C_:LEGSERLIB AND " "(-980__:DELETED -980__:MIGRATED -980__:STANDARD " "-596__:MULTIVOLUMES)" ) __model_ignore_keys__ = { # this field is used to match multipart monograph items as volumes "020__b", } __ignore_keys__ = CDS_IGNORE_FIELDS | __model_ignore_keys__ _default_fields = {"_migration": {**get_helper_dict()}} def do( self, blob, ignore_missing=True, exception_handlers=None, init_fields=None, ): """Overwrite the do method.""" init_fields = deepcopy(self._default_fields) return super().do( blob, ignore_missing, exception_handlers, init_fields )
def test_monograph_invalid_volume_migration(app): with app.app_context(): check_transformation( """ <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9788808175366</subfield> <subfield code="u">print version, paperback (v.1)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9788808247049</subfield> <subfield code="u">print version, paperback (v.2)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9788808047038</subfield> <subfield code="u">print version, paperback (v.2, CD-ROM)</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "record_type": "multipart", "volumes_identifiers": [ { "is_electronic": False, "isbn": "9788808175366", "physical_description": "print " "version, " "paperback", "volume": "1", }, { "is_electronic": False, "isbn": "9788808247049", "physical_description": "print " "version, " "paperback", "volume": "2", }, { "is_electronic": False, "isbn": "9788808047038", "volume": "2", }, ], "volumes_urls": [], }, "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
class CDSDocument(CdsIlsOverdo): """Translation Index for CDS Books.""" __query__ = ('003:SzGeCERN 690C_:BOOK OR 690C_:CONFERENCE OR ' '690C_:"YELLOW REPORT" OR ' "980__:PROCEEDINGS OR " "(-980:STANDARD 980:BOOK) OR " "697C_:LEGSERLIB AND " "(-980__:STANDARD " "-596__:MULTIVOLUMES1 -596__:MULTIVOLUMESX)") __model_ignore_keys__ = { # this field is used to match multipart monograph items as volumes "020__b", "0247_9", "084__2", "084__a", "270__b", "540__u", "700__i", "710__5", "700__m", "100__m", "775__n", "775__p", } __ignore_keys__ = CDS_IGNORE_FIELDS | __model_ignore_keys__ _default_fields = { "_migration": { **get_helper_dict(record_type="document") } } rectype = "document" def do( self, blob, ignore_missing=True, exception_handlers=None, init_fields=None, ): """Overwrite the do method.""" init_fields = deepcopy(self._default_fields) return super().do(blob, ignore_missing, exception_handlers, init_fields)
def test_monograph_volume_migration_doi(app): """Test multipart volume with DOIs attached to volumes.""" with app.app_context(): check_transformation( """ <datafield tag="024" ind1="7" ind2=" "> <subfield code="2">DOI</subfield> <subfield code="a">10.1007/978-3-030-49613-5</subfield> <subfield code="q">ebook (v.1)</subfield> </datafield> """, { "_migration": { **get_helper_dict(record_type="document"), "record_type": "multipart", "volumes_identifiers": [{ "identifiers": [{ "value": "10.1007/978-3-030-49613-5", "material": "DIGITAL", "scheme": "DOI" }], "volume": "1", '_migration': { 'eitems_has_proxy': True, 'eitems_proxy': [{ 'open_access': False, 'url': { 'description': 'ebook ' '(v.1)', 'value': 'http://dx.doi.org/10.1007/978-3-030-49613-5' } }] } }], }, "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
def test_monograph_volume_barcode(app): """Test multipart volume with barcodes (= items).""" with app.app_context(): check_transformation( """ <datafield tag="088" ind1=" " ind2=" "> <subfield code="n">pt.A</subfield> <subfield code="x">73-0089-0</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "record_type": "multipart", "volumes": [{"barcode": "73-0089-0", "volume": "A"}], }, "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
def test_monograph_volume_url(app): """Test multipart volume with urls.""" with app.app_context(): check_transformation( """ <datafield tag="856" ind1="4" ind2=" "> <subfield code="u">https://cds.cern.ch/auth.py?r=EBLIB_P_1890382</subfield> <subfield code="y">e-book (v.1)</subfield> </datafield> """, { "_migration": { **get_helper_dict(record_type="multipart"), "volumes_urls": [{ "_migration": { "eitems_ebl": [{ "url": { "description": "e-book (v.1)", "value": "https://cds.cern.ch/auth.py?r=EBLIB_P_1890382" } }], "eitems_has_ebl": True, "eitems_external": [], "eitems_file_links": [], "eitems_proxy": [], "eitems_safari": [], "record_type": "document" }, "volume": "1", }], }, "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
def test_monograph_legacy_report_number(app): """Test multipart representation in CDS.""" with app.app_context(): check_transformation( """ <datafield tag="088" ind1=" " ind2=" "> <subfield code="a">IAEA-INIS-20-REV-0-D</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "record_type": "multipart", }, "mode_of_issuance": "MULTIPART_MONOGRAPH", "identifiers": [{ "scheme": "report_number", "value": "IAEA-INIS-20-REV-0-D", }], }, multipart_model, )
def test_monograph_legacy_representation(app): """Test multipart representation in CDS.""" with app.app_context(): check_transformation( """ <datafield tag="596" ind1=" " ind2=" "> <subfield code="a">MULTIVOLUMES-1</subfield> </datafield> <datafield tag="597" ind1=" " ind2=" "> <subfield code="a">Vol965</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "record_type": "multipart", "multipart_id": "Vol965", "multivolume_record": False, }, "mode_of_issuance": "MULTIPART_MONOGRAPH", }, multipart_model, )
class CDSStandard(CdsIlsOverdo): """Translation Index for CDS Books.""" __query__ = ( "003:SzGeCERN 690C_:STANDARD OR 980__:STANDARD " "-980__:DELETED -980__:MIGRATED" ) __ignore_keys__ = CDS_IGNORE_FIELDS _default_fields = {"_migration": {**get_helper_dict()}} def do( self, blob, ignore_missing=True, exception_handlers=None, init_fields=None, ): """Overwrite the do method.""" init_fields = deepcopy(self._default_fields) return super().do( blob, ignore_missing, exception_handlers, init_fields )
def replace_fields_in_volume(document_json_template, volume_json, json_record): """Replace values of volume json template with new data.""" # clean the template document_json_template["_migration"] = \ get_helper_dict(record_type="document") document_json_template["_migration"]["legacy_recid"] = json_record[ "legacy_recid"] if "urls" in document_json_template: del document_json_template["urls"] if "identifiers" in document_json_template: del document_json_template["identifiers"] document_json_template["title"] = json_record.get("title") current_volume_index = volume_json.get("volume") volume_title = volume_json.get("title") volume_publication_year = volume_json.get("publication_year") # additional info for each volume volumes_items_list = json_record["_migration"]["items"] volumes_identifiers_list = json_record["_migration"]["volumes_identifiers"] volumes_urls_list = json_record["_migration"]["volumes_urls"] if volume_title: document_json_template["title"] = volume_title # split items per volume volume_items = [ item for item in volumes_items_list if item.get("volume") == current_volume_index ] if volume_items: document_json_template["_migration"]["items"] = volume_items # split urls per volume volume_urls = [ entry.get("urls") for entry in volumes_urls_list if entry.get("urls") and entry.get("volume") == current_volume_index ] if volume_urls: document_json_template["urls"] = volume_urls[0] volume_eitems = [ entry["_migration"] for entry in volumes_urls_list if "_migration" in entry and entry.get("volume") == current_volume_index ] if len(volume_eitems) == 1: document_json_template["_migration"].update(**volume_eitems[0]) else: for entry in volumes_urls_list: if entry.get("volume") == current_volume_index: document_json_template["_migration"]["eitems_ebl"] \ += entry.get("_migration", {}).get("eitems_ebl", []) document_json_template["_migration"]["eitems_safari"] \ += entry.get("_migration", {}).get("eitems_safari", []) document_json_template["_migration"]["eitems_external"] \ += entry.get("_migration", {}).get("eitems_external", []) document_json_template["_migration"]["eitems_proxy"] \ += entry.get("_migration", {}).get("eitems_proxy", []) document_json_template["_migration"]["eitems_file_links"] \ += entry.get("_migration", {}).get("eitems_file_links", []) document_json_template["_migration"]["eitems_has_ebl"] = bool( document_json_template["_migration"]["eitems_ebl"]) document_json_template["_migration"][ "eitems_has_proxy"] = bool( document_json_template["_migration"]["eitems_proxy"]) document_json_template["_migration"][ "eitems_has_safari"] = bool( document_json_template["_migration"]["eitems_safari"]) document_json_template["_migration"]["eitems_has_files"] = bool( document_json_template["_migration"]["eitems_file_links"]) document_json_template["_migration"][ "eitems_has_external"] = bool( document_json_template["_migration"] ["eitems_external"]) # split identifiers per volume volume_identifiers = [ volume_identifier["identifiers"][0] for volume_identifier in volumes_identifiers_list if volume_identifier.get("volume") == current_volume_index ] # add DOIs to the future eitems for volume_identifier in volumes_identifiers_list: if volume_identifier.get("volume") == current_volume_index: eitems_proxy = volume_identifier.get("_migration", {}) \ .get("eitems_proxy") if eitems_proxy: document_json_template["_migration"]["eitems_proxy"] += \ eitems_proxy document_json_template["_migration"]["eitems_has_proxy"] = True if volume_identifiers: document_json_template["identifiers"] = volume_identifiers if volume_publication_year: document_json_template["publication_year"] = volume_publication_year
def test_monograph_with_electronic_isbns(app): """Test multipart monographs with electronic isbns.""" with app.app_context(): check_transformation( """ <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">0817631852</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">0817631852</subfield> <subfield code="u">print version (v.2)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">0817631879</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9780817631857</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9780817631871</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9781461239406</subfield> <subfield code="b">electronic version (v.2)</subfield> <subfield code="u">electronic version (v.2)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9781461251545</subfield> <subfield code="b">electronic version (v.1)</subfield> <subfield code="u">electronic version (v.1)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9781461295891</subfield> <subfield code="u">print version (v.1)</subfield> </datafield> """, { "identifiers": [ { "scheme": "ISBN", "value": "0817631852" }, { "scheme": "ISBN", "value": "0817631879" }, { "scheme": "ISBN", "value": "9780817631857" }, { "scheme": "ISBN", "value": "9780817631871" }, ], "mode_of_issuance": "MULTIPART_MONOGRAPH", "_migration": { **get_helper_dict(), "record_type": "multipart", "volumes_identifiers": [ { "is_electronic": False, "physical_description": "print version", "volume": "2", "isbn": "0817631852", }, { "is_electronic": True, "physical_description": "electronic version", "volume": "2", "isbn": "9781461239406", }, { "is_electronic": True, "physical_description": "electronic version", "volume": "1", "isbn": "9781461251545", }, { "is_electronic": False, "physical_description": "print version", "volume": "1", "isbn": "9781461295891", }, ], }, }, multipart_model, )
def test_monograph(app): """Test monographs.""" with app.app_context(): check_transformation( """ <datafield tag="245" ind1=" " ind2=" "> <subfield code="a">La fisica di Amaldi</subfield> <subfield code="b">idee ed esperimenti : con CD-ROM</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.1</subfield> <subfield code="p">Introduzione alla fisica meccanica</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.2</subfield> <subfield code="p">Termologia, onde, relatività</subfield> </datafield> <datafield tag="300" ind1=" " ind2=" "> <subfield code="a">2 v. ; 2 CD-ROM suppl</subfield> </datafield> """, { "title": "La fisica di Amaldi", "alternative_titles": [{ "value": "idee ed esperimenti : con CD-ROM", "type": "SUBTITLE", }], "mode_of_issuance": "MULTIPART_MONOGRAPH", "number_of_volumes": "2", "_migration": { **get_helper_dict(), "record_type": "multipart", "volumes": [ { "title": "Introduzione alla fisica meccanica", "volume": "1", }, { "title": "Termologia, onde, relatività", "volume": "2", }, ], "is_multipart": True, }, }, multipart_model, ) check_transformation( """ <datafield tag="245" ind1=" " ind2=" "> <subfield code="a">La fisica di Amaldi</subfield> <subfield code="b">idee ed esperimenti : con CD-ROM</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.2</subfield> <subfield code="p">Termologia, onde, relatività</subfield> </datafield> <datafield tag="300" ind1=" " ind2=" "> <subfield code="a">2 v. ; 2 CD-ROM suppl</subfield> </datafield> """, { "title": "La fisica di Amaldi", "alternative_titles": [{ "value": "idee ed esperimenti : con CD-ROM", "type": "SUBTITLE", }], "mode_of_issuance": "MULTIPART_MONOGRAPH", "number_of_volumes": "2", "_migration": { **get_helper_dict(), "is_multipart": True, "record_type": "multipart", "volumes": [{ "title": "Termologia, onde, relatività", "volume": "2", }], }, }, multipart_model, ) check_transformation( """ <datafield tag="245" ind1=" " ind2=" "> <subfield code="a">La fisica di Amaldi</subfield> <subfield code="b">idee ed esperimenti : con CD-ROM</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.2</subfield> <subfield code="p">Termologia, onde, relatività</subfield> </datafield> <datafield tag="300" ind1=" " ind2=" "> <subfield code="a">2 p ; 2 CD-ROM suppl</subfield> </datafield> """, { "title": "La fisica di Amaldi", "alternative_titles": [{ "value": "idee ed esperimenti : con CD-ROM", "type": "SUBTITLE", }], "mode_of_issuance": "MULTIPART_MONOGRAPH", "_migration": { **get_helper_dict(), "is_multipart": True, "record_type": "multipart", "volumes": [{ "title": "Termologia, onde, relatività", "volume": "2", }], }, }, multipart_model, ) check_transformation( """ <datafield tag="245" ind1=" " ind2=" "> <subfield code="a">La fisica di Amaldi</subfield> <subfield code="b">idee ed esperimenti : con CD-ROM</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.2</subfield> <subfield code="p">Termologia, onde, relatività</subfield> </datafield> <datafield tag="300" ind1=" " ind2=" "> <subfield code="a">multi. p ; 2 CD-ROM suppl</subfield> </datafield> """, { "title": "La fisica di Amaldi", "alternative_titles": [{ "value": "idee ed esperimenti : con CD-ROM", "type": "SUBTITLE", }], "mode_of_issuance": "MULTIPART_MONOGRAPH", "_migration": { **get_helper_dict(), "is_multipart": True, "record_type": "multipart", "volumes": [{ "title": "Termologia, onde, relatività", "volume": "2", }], }, }, multipart_model, ) with pytest.raises(UnexpectedValue): check_transformation( """ <datafield tag="245" ind1=" " ind2=" "> <subfield code="a">La fisica di Amaldi</subfield> <subfield code="b">idee ed esperimenti : con CD-ROM</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="a">v.2</subfield> <subfield code="b">Termologia, onde, relatività</subfield> </datafield> <datafield tag="300" ind1=" " ind2=" "> <subfield code="a">2 v. ; 2 CD-ROM suppl</subfield> </datafield> """, { "title": "La fisica di Amaldi", "alternative_titles": [ { "value": "idee ed esperimenti : con CD-ROM", "type": "SUBTITLE", }, { "type": "ALTERNATIVE_TITLE", "value": "v.2" }, { "type": "SUBTITLE", "value": "Termologia, onde, relatività", }, ], "mode_of_issuance": "MULTIPART_MONOGRAPH", "number_of_volumes": "2", "_migration": { **get_helper_dict(), "is_multipart": False, "record_type": "multipart", "volumes": [], }, }, multipart_model, ) with pytest.raises(MissingRequiredField): check_transformation( """ <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.2</subfield> <subfield code="p">Termologia, onde, relatività</subfield> </datafield> <datafield tag="300" ind1=" " ind2=" "> <subfield code="a">2 v. ; 2 CD-ROM suppl</subfield> </datafield> """, { "title": "La fisica di Amaldi", "alternative_titles": [{ "value": "idee ed esperimenti : con CD-ROM", "type": "SUBTITLE", }], "mode_of_issuance": "MULTIPART_MONOGRAPH", "number_of_volumes": "2", "_migration": { **get_helper_dict(), "is_multipart": True, "record_type": "multipart", "volumes": [], }, }, multipart_model, )
def test_monograph_migration(app): with app.app_context(): check_transformation( """ <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">1108052819</subfield> <subfield code="u">print version, paperback (v.3)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9781108052818</subfield> <subfield code="u">print version, paperback (v.3)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9781108052801</subfield> <subfield code="u">print version, paperback (v.2)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">1108052800</subfield> <subfield code="u">print version, paperback (v.2)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9781108052825</subfield> <subfield code="u">print version, paperback (set)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">9781108052795</subfield> <subfield code="u">print version, paperback (v.1)</subfield> </datafield> <datafield tag="020" ind1=" " ind2=" "> <subfield code="a">1108052797</subfield> <subfield code="u">print version, paperback (v.1)</subfield> </datafield> <datafield tag="245" ind1=" " ind2=" "> <subfield code="a">Wissenschaftliche Abhandlungen</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.1</subfield> <subfield code="p">1865-1874</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.2</subfield> <subfield code="p">1875-1881</subfield> </datafield> <datafield tag="246" ind1=" " ind2=" "> <subfield code="n">v.3</subfield> <subfield code="p">1882-1905</subfield> </datafield> <datafield tag="300" ind1=" " ind2=" "> <subfield code="a">3 v</subfield> </datafield> """, { "_migration": { **get_helper_dict(), "volumes_identifiers": [ { "volume": "3", "isbn": "1108052819", "physical_description": "print version, paperback", "is_electronic": False, }, { "volume": "3", "isbn": "9781108052818", "physical_description": "print version, paperback", "is_electronic": False, }, { "volume": "2", "isbn": "9781108052801", "physical_description": "print version, paperback", "is_electronic": False, }, { "volume": "2", "isbn": "1108052800", "physical_description": "print version, paperback", "is_electronic": False, }, { "volume": "1", "isbn": "9781108052795", "physical_description": "print version, paperback", "is_electronic": False, }, { "volume": "1", "isbn": "1108052797", "physical_description": "print version, paperback", "is_electronic": False, }, ], "volumes": [ { "title": "1865-1874", "volume": "1" }, { "title": "1875-1881", "volume": "2" }, { "title": "1882-1905", "volume": "3" }, ], "record_type": "multipart", "is_multipart": True, }, "title": "Wissenschaftliche Abhandlungen", "mode_of_issuance": "MULTIPART_MONOGRAPH", "number_of_volumes": "3", "identifiers": [{ "scheme": "ISBN", "value": "9781108052825" }], "physical_description": "print version, paperback", }, multipart_model, )