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.
Files changed (66) hide show
  1. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/PKG-INFO +1 -1
  2. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/pyproject.toml +1 -1
  3. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/holdings_mapper.py +18 -1
  4. {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
  5. {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
  6. {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
  7. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/holdings_csv_transformer.py +0 -17
  8. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/LICENSE +0 -0
  9. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/README.md +0 -0
  10. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/__init__.py +0 -0
  11. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/__main__.py +0 -0
  12. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/circulation_helper.py +0 -0
  13. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/colors.py +0 -0
  14. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/config_file_load.py +0 -0
  15. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/custom_dict.py +0 -0
  16. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/custom_exceptions.py +0 -0
  17. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/extradata_writer.py +0 -0
  18. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/folder_structure.py +0 -0
  19. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/helper.py +0 -0
  20. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/holdings_helper.py +0 -0
  21. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/i18n_config.py +0 -0
  22. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/library_configuration.py +0 -0
  23. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapper_base.py +0 -0
  24. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/__init__.py +0 -0
  25. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/courses_mapper.py +0 -0
  26. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/item_mapper.py +0 -0
  27. {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
  28. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/notes_mapper.py +0 -0
  29. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/order_mapper.py +0 -0
  30. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/organization_mapper.py +0 -0
  31. {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
  32. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/mapping_file_transformation/user_mapper.py +0 -0
  33. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/__init__.py +0 -0
  34. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/conditions.py +0 -0
  35. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/holdings_statementsparser.py +0 -0
  36. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/marc_rules_transformation/hrid_handler.py +0 -0
  37. {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
  38. {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
  39. {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
  40. {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
  41. {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
  42. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_report.py +0 -0
  43. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/__init__.py +0 -0
  44. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/authority_transformer.py +0 -0
  45. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/batch_poster.py +0 -0
  46. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/bibs_transformer.py +0 -0
  47. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/courses_migrator.py +0 -0
  48. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/holdings_marc_transformer.py +0 -0
  49. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/items_transformer.py +0 -0
  50. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/loans_migrator.py +0 -0
  51. {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
  52. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/migration_task_base.py +0 -0
  53. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/orders_transformer.py +0 -0
  54. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/organization_transformer.py +0 -0
  55. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/requests_migrator.py +0 -0
  56. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/reserves_migrator.py +0 -0
  57. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/migration_tasks/user_transformer.py +0 -0
  58. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/task_configuration.py +0 -0
  59. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/test_infrastructure/__init__.py +0 -0
  60. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/test_infrastructure/mocked_classes.py +0 -0
  61. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/__init__.py +0 -0
  62. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/legacy_loan.py +0 -0
  63. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/legacy_request.py +0 -0
  64. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/legacy_reserve.py +0 -0
  65. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/transaction_migration/transaction_result.py +0 -0
  66. {folio_migration_tools-1.9.1 → folio_migration_tools-1.9.2}/src/folio_migration_tools/translations/en.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: folio_migration_tools
3
- Version: 1.9.1
3
+ Version: 1.9.2
4
4
  Summary: A tool allowing you to migrate data from legacy ILS:s (Library systems) into FOLIO LSP
5
5
  License: MIT
6
6
  Keywords: FOLIO,ILS,LSP,Library Systems,MARC21,Library data
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "folio_migration_tools"
3
- version = "1.9.1"
3
+ version = "1.9.2"
4
4
  description = "A tool allowing you to migrate data from legacy ILS:s (Library systems) into FOLIO LSP"
5
5
  authors = [
6
6
  {name = "Theodor Tolstoy", email = "github.teddes@tolstoy.se"},
@@ -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
- return (
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
- return (
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 = []