folio-migration-tools 1.9.1__tar.gz → 1.9.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/PKG-INFO +1 -1
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/pyproject.toml +1 -1
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/holdings_mapper.py +18 -1
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/mapping_file_mapper_base.py +15 -6
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/rules_mapper_base.py +10 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/rules_mapper_bibs.py +1 -1
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/holdings_csv_transformer.py +0 -17
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/LICENSE +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/README.md +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/__init__.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/__main__.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/circulation_helper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/colors.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/config_file_load.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/custom_dict.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/custom_exceptions.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/extradata_writer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/folder_structure.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/helper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/holdings_helper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/i18n_config.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/library_configuration.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapper_base.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/__init__.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/courses_mapper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/item_mapper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/manual_fee_fines_mapper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/notes_mapper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/order_mapper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/organization_mapper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/ref_data_mapping.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/user_mapper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/__init__.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/conditions.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/holdings_statementsparser.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/hrid_handler.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/loc_language_codes.xml +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/marc_file_processor.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/marc_reader_wrapper.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/rules_mapper_authorities.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/rules_mapper_holdings.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_report.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/__init__.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/authority_transformer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/batch_poster.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/bibs_transformer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/courses_migrator.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/holdings_marc_transformer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/items_transformer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/loans_migrator.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/manual_fee_fines_transformer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/migration_task_base.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/orders_transformer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/organization_transformer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/requests_migrator.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/reserves_migrator.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/user_transformer.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/task_configuration.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/test_infrastructure/__init__.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/test_infrastructure/mocked_classes.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/__init__.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/legacy_loan.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/legacy_request.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/legacy_reserve.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/transaction_result.py +0 -0
- {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/translations/en.json +0 -0
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import ast
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
2
4
|
|
|
3
5
|
import i18n
|
|
4
6
|
from folio_uuid.folio_uuid import FOLIONamespaces
|
|
5
7
|
from folioclient import FolioClient
|
|
6
8
|
|
|
7
|
-
from folio_migration_tools.custom_exceptions import TransformationRecordFailedError
|
|
9
|
+
from folio_migration_tools.custom_exceptions import TransformationProcessError, TransformationRecordFailedError
|
|
8
10
|
from folio_migration_tools.library_configuration import (
|
|
9
11
|
FileDefinition,
|
|
10
12
|
LibraryConfiguration,
|
|
@@ -59,6 +61,21 @@ class HoldingsMapper(MappingFileMapperBase):
|
|
|
59
61
|
"name",
|
|
60
62
|
"CallNumberTypeMapping",
|
|
61
63
|
)
|
|
64
|
+
self.holdings_sources = self.get_holdings_sources()
|
|
65
|
+
|
|
66
|
+
def get_holdings_sources(self):
|
|
67
|
+
res = {}
|
|
68
|
+
holdings_sources = list(
|
|
69
|
+
self.folio_client.folio_get_all("/holdings-sources", "holdingsRecordsSources")
|
|
70
|
+
)
|
|
71
|
+
logging.info("Fetched %s holdingsRecordsSources from tenant", len(holdings_sources))
|
|
72
|
+
res = {n["name"].upper(): n["id"] for n in holdings_sources}
|
|
73
|
+
if "FOLIO" not in res:
|
|
74
|
+
raise TransformationProcessError("", "No holdings source with name FOLIO in tenant")
|
|
75
|
+
if "MARC" not in res:
|
|
76
|
+
raise TransformationProcessError("", "No holdings source with name MARC in tenant")
|
|
77
|
+
logging.info(json.dumps(res, indent=4))
|
|
78
|
+
return res
|
|
62
79
|
|
|
63
80
|
def perform_additional_mappings(self, legacy_ids, folio_rec, file_def):
|
|
64
81
|
self.handle_suppression(folio_rec, file_def)
|
|
@@ -171,14 +171,15 @@ class MappingFileMapperBase(MapperBase):
|
|
|
171
171
|
object_type: FOLIONamespaces,
|
|
172
172
|
accept_duplicate_ids: bool = False,
|
|
173
173
|
):
|
|
174
|
+
folio_object = {}
|
|
174
175
|
if self.ignore_legacy_identifier:
|
|
175
|
-
|
|
176
|
+
folio_object.update(
|
|
176
177
|
{
|
|
177
178
|
"id": str(uuid.uuid4()),
|
|
178
179
|
"type": "object",
|
|
179
|
-
}
|
|
180
|
-
index_or_id,
|
|
180
|
+
}
|
|
181
181
|
)
|
|
182
|
+
return folio_object, index_or_id
|
|
182
183
|
|
|
183
184
|
if not (
|
|
184
185
|
legacy_id := " ".join(
|
|
@@ -205,13 +206,21 @@ class MappingFileMapperBase(MapperBase):
|
|
|
205
206
|
)
|
|
206
207
|
else:
|
|
207
208
|
self.unique_record_ids.add(generated_id)
|
|
208
|
-
|
|
209
|
+
folio_object.update(
|
|
209
210
|
{
|
|
210
211
|
"id": generated_id,
|
|
211
212
|
"type": "object",
|
|
212
|
-
}
|
|
213
|
-
legacy_id,
|
|
213
|
+
}
|
|
214
214
|
)
|
|
215
|
+
if object_type == FOLIONamespaces.holdings and hasattr(self, "holdings_sources"):
|
|
216
|
+
folio_object['sourceId'] = self.holdings_sources.get("FOLIO")
|
|
217
|
+
elif object_type == FOLIONamespaces.holdings and not hasattr(self, "holdings_sources"):
|
|
218
|
+
raise TransformationProcessError(
|
|
219
|
+
index_or_id,
|
|
220
|
+
"Holdings source not set in the mapper",
|
|
221
|
+
None
|
|
222
|
+
)
|
|
223
|
+
return folio_object, legacy_id
|
|
215
224
|
|
|
216
225
|
def get_statistical_code(self, legacy_item: dict, folio_prop_name: str, index_or_id):
|
|
217
226
|
if self.statistical_codes_mapping:
|
|
@@ -559,6 +559,16 @@ class RulesMapperBase(MapperBase):
|
|
|
559
559
|
if k == "authorityId" and (legacy_subfield_9 := marc_field.get("9")):
|
|
560
560
|
marc_field.add_subfield("0", legacy_subfield_9)
|
|
561
561
|
marc_field.delete_subfield("9")
|
|
562
|
+
if k == "authorityId" and (entity_subfields := entity_mapping.get("subfield", [])):
|
|
563
|
+
for subfield in entity_subfields:
|
|
564
|
+
if subfield != "9":
|
|
565
|
+
Helper.log_data_issue(
|
|
566
|
+
index_or_legacy_id,
|
|
567
|
+
f"authorityId mapping from ${subfield} is not supported. Data Import will fail. "
|
|
568
|
+
"Use only $9 for authority id mapping in MARC-to-Instance mapping rules.",
|
|
569
|
+
marc_field,
|
|
570
|
+
)
|
|
571
|
+
entity_mapping["subfield"] = ["9"]
|
|
562
572
|
if my_values := [
|
|
563
573
|
v
|
|
564
574
|
for v in self.apply_rules(marc_field, entity_mapping, index_or_legacy_id)
|
|
@@ -165,7 +165,7 @@ class BibsRulesMapper(RulesMapperBase):
|
|
|
165
165
|
Helper.log_data_issue(
|
|
166
166
|
legacy_ids,
|
|
167
167
|
"Multiple main entry fields in record. Record will fail Data Import. Creating Instance anyway.",
|
|
168
|
-
main_entry_fields
|
|
168
|
+
[str(field) for field in main_entry_fields]
|
|
169
169
|
)
|
|
170
170
|
if not main_entry_fields:
|
|
171
171
|
main_entry_fields += marc_record.get_fields("700", "710", "711", "730")
|
|
@@ -209,7 +209,6 @@ class HoldingsCsvTransformer(MigrationTaskBase):
|
|
|
209
209
|
self.holdings = {}
|
|
210
210
|
self.total_records = 0
|
|
211
211
|
self.holdings_id_map = self.load_id_map(self.folder_structure.holdings_id_map_path)
|
|
212
|
-
self.holdings_sources = self.get_holdings_sources()
|
|
213
212
|
self.results_path = self.folder_structure.created_objects_path
|
|
214
213
|
self.holdings_types = list(
|
|
215
214
|
self.folio_client.folio_get_all("/holdings-types", "holdingsTypes")
|
|
@@ -432,8 +431,6 @@ class HoldingsCsvTransformer(MigrationTaskBase):
|
|
|
432
431
|
if not folio_rec.get("holdingsTypeId", ""):
|
|
433
432
|
folio_rec["holdingsTypeId"] = self.fallback_holdings_type["id"]
|
|
434
433
|
|
|
435
|
-
folio_rec["sourceId"] = self.holdings_sources.get("FOLIO")
|
|
436
|
-
|
|
437
434
|
holdings_from_row = []
|
|
438
435
|
all_instance_ids = folio_rec.get("instanceId", [])
|
|
439
436
|
if len(all_instance_ids) == 1:
|
|
@@ -521,20 +518,6 @@ class HoldingsCsvTransformer(MigrationTaskBase):
|
|
|
521
518
|
self.holdings[holdings_key], new_holdings_record
|
|
522
519
|
)
|
|
523
520
|
|
|
524
|
-
def get_holdings_sources(self):
|
|
525
|
-
res = {}
|
|
526
|
-
holdings_sources = list(
|
|
527
|
-
self.mapper.folio_client.folio_get_all("/holdings-sources", "holdingsRecordsSources")
|
|
528
|
-
)
|
|
529
|
-
logging.info("Fetched %s holdingsRecordsSources from tenant", len(holdings_sources))
|
|
530
|
-
res = {n["name"].upper(): n["id"] for n in holdings_sources}
|
|
531
|
-
if "FOLIO" not in res:
|
|
532
|
-
raise TransformationProcessError("", "No holdings source with name FOLIO in tenant")
|
|
533
|
-
if "MARC" not in res:
|
|
534
|
-
raise TransformationProcessError("", "No holdings source with name MARC in tenant")
|
|
535
|
-
logging.info(json.dumps(res, indent=4))
|
|
536
|
-
return res
|
|
537
|
-
|
|
538
521
|
|
|
539
522
|
def explode_former_ids(folio_holding: dict):
|
|
540
523
|
temp_ids = []
|
|
File without changes
|
|
File without changes
|
{folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/__init__.py
RENAMED
|
File without changes
|
{folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/__main__.py
RENAMED
|
File without changes
|
|
File without changes
|
{folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/colors.py
RENAMED
|
File without changes
|
|
File without changes
|
{folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/custom_dict.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/helper.py
RENAMED
|
File without changes
|
|
File without changes
|
{folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/i18n_config.py
RENAMED
|
File without changes
|
|
File without changes
|
{folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapper_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|