folio-migration-tools 1.9.0rc11__tar.gz → 1.9.0rc12__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.0rc11 → folio_migration_tools-1.9.0rc12}/PKG-INFO +2 -2
  2. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/pyproject.toml +2 -2
  3. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/__main__.py +1 -2
  4. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/organization_mapper.py +4 -4
  5. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/holdings_statementsparser.py +7 -14
  6. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/rules_mapper_bibs.py +5 -5
  7. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/rules_mapper_holdings.py +29 -29
  8. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/holdings_marc_transformer.py +19 -12
  9. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/transaction_migration/legacy_loan.py +2 -1
  10. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/translations/en.json +4 -2
  11. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/LICENSE +0 -0
  12. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/README.md +0 -0
  13. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/__init__.py +0 -0
  14. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/circulation_helper.py +0 -0
  15. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/colors.py +0 -0
  16. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/config_file_load.py +0 -0
  17. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/custom_dict.py +0 -0
  18. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/custom_exceptions.py +0 -0
  19. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/extradata_writer.py +0 -0
  20. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/folder_structure.py +0 -0
  21. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/helper.py +0 -0
  22. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/holdings_helper.py +0 -0
  23. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/i18n_config.py +0 -0
  24. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/library_configuration.py +0 -0
  25. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapper_base.py +0 -0
  26. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/__init__.py +0 -0
  27. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/courses_mapper.py +0 -0
  28. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/holdings_mapper.py +0 -0
  29. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/item_mapper.py +0 -0
  30. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/manual_fee_fines_mapper.py +0 -0
  31. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/mapping_file_mapper_base.py +0 -0
  32. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/notes_mapper.py +0 -0
  33. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/order_mapper.py +0 -0
  34. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/ref_data_mapping.py +0 -0
  35. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/mapping_file_transformation/user_mapper.py +0 -0
  36. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/__init__.py +0 -0
  37. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/conditions.py +0 -0
  38. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/hrid_handler.py +0 -0
  39. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/loc_language_codes.xml +0 -0
  40. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/marc_file_processor.py +0 -0
  41. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/marc_reader_wrapper.py +0 -0
  42. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/rules_mapper_authorities.py +0 -0
  43. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/marc_rules_transformation/rules_mapper_base.py +0 -0
  44. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_report.py +0 -0
  45. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/__init__.py +0 -0
  46. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/authority_transformer.py +0 -0
  47. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/batch_poster.py +0 -0
  48. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/bibs_transformer.py +0 -0
  49. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/courses_migrator.py +0 -0
  50. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/holdings_csv_transformer.py +0 -0
  51. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/items_transformer.py +0 -0
  52. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/loans_migrator.py +0 -0
  53. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/manual_fee_fines_transformer.py +0 -0
  54. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/migration_task_base.py +0 -0
  55. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/orders_transformer.py +0 -0
  56. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/organization_transformer.py +0 -0
  57. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/requests_migrator.py +0 -0
  58. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/reserves_migrator.py +0 -0
  59. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/migration_tasks/user_transformer.py +0 -0
  60. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/task_configuration.py +0 -0
  61. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/test_infrastructure/__init__.py +0 -0
  62. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/test_infrastructure/mocked_classes.py +0 -0
  63. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/transaction_migration/__init__.py +0 -0
  64. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/transaction_migration/legacy_request.py +0 -0
  65. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/transaction_migration/legacy_reserve.py +0 -0
  66. {folio_migration_tools-1.9.0rc11 → folio_migration_tools-1.9.0rc12}/src/folio_migration_tools/transaction_migration/transaction_result.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: folio_migration_tools
3
- Version: 1.9.0rc11
3
+ Version: 1.9.0rc12
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
@@ -20,7 +20,7 @@ Requires-Dist: art (>=6.5,<7.0)
20
20
  Requires-Dist: deepdiff (>=6.2.3,<7.0.0)
21
21
  Requires-Dist: defusedxml (>=0.7.1,<0.8.0)
22
22
  Requires-Dist: folio-uuid (>=0.2.8,<0.3.0)
23
- Requires-Dist: folioclient (==0.70.1)
23
+ Requires-Dist: folioclient (>=0.70.1,<0.71.0)
24
24
  Requires-Dist: pyaml (>=21.10.1,<22.0.0)
25
25
  Requires-Dist: pydantic (>=1.10.2,<2.0.0)
26
26
  Requires-Dist: pyhumps (>=3.7.3,<4.0.0)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "folio_migration_tools"
3
- version = "1.9.0rc11"
3
+ version = "1.9.0rc12"
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"},
@@ -44,7 +44,7 @@ profile = "black"
44
44
 
45
45
  [tool.poetry.dependencies]
46
46
  python = "^3.9"
47
- folioclient = "0.70.1"
47
+ folioclient = "^0.70.1"
48
48
  pyhumps = "^3.7.3"
49
49
  defusedxml = "^0.7.1"
50
50
  python-dateutil = "^2.8.2"
@@ -157,7 +157,6 @@ def main():
157
157
  print("Task failure. Halting.")
158
158
  sys.exit(1)
159
159
  logging.info("Work done. Shutting down")
160
- sys.exit(0)
161
160
  except json.decoder.JSONDecodeError as json_error:
162
161
  logging.critical(json_error)
163
162
  print(json_error.doc)
@@ -198,7 +197,7 @@ def main():
198
197
  logging.exception("Unhandled exception")
199
198
  print(f"\n{ee}")
200
199
  sys.exit(ee.__class__.__name__)
201
-
200
+ sys.exit(0)
202
201
 
203
202
  def inheritors(base_class):
204
203
  subclasses = set()
@@ -79,28 +79,28 @@ class OrganizationMapper(MappingFileMapperBase):
79
79
  False,
80
80
  )
81
81
 
82
- elif re.compile("addresses\[(\d+)\]\.categories\[(\d+)\]").fullmatch(folio_prop_name):
82
+ elif re.compile(r"addresses\[(\d+)\]\.categories\[(\d+)\]").fullmatch(folio_prop_name):
83
83
  return self.get_mapped_ref_data_value(
84
84
  self.address_categories_map,
85
85
  *value_tuple,
86
86
  False,
87
87
  )
88
88
 
89
- elif re.compile("emails\[(\d+)\]\.categories\[(\d+)\]").fullmatch(folio_prop_name):
89
+ elif re.compile(r"emails\[(\d+)\]\.categories\[(\d+)\]").fullmatch(folio_prop_name):
90
90
  return self.get_mapped_ref_data_value(
91
91
  self.email_categories_map,
92
92
  *value_tuple,
93
93
  False,
94
94
  )
95
95
 
96
- elif re.compile("phoneNumbers\[(\d+)\]\.categories\[(\d+)\]").fullmatch(folio_prop_name):
96
+ elif re.compile(r"phoneNumbers\[(\d+)\]\.categories\[(\d+)\]").fullmatch(folio_prop_name):
97
97
  return self.get_mapped_ref_data_value(
98
98
  self.phone_categories_map,
99
99
  *value_tuple,
100
100
  False,
101
101
  )
102
102
 
103
- elif re.compile("interfaces\[(\d+)\]\.interfaceCredential.interfaceId").fullmatch(
103
+ elif re.compile(r"interfaces\[(\d+)\]\.interfaceCredential.interfaceId").fullmatch(
104
104
  folio_prop_name
105
105
  ):
106
106
  return "replace_with_interface_id"
@@ -165,23 +165,16 @@ class HoldingsStatementsParser:
165
165
  TransformationFieldMappingError: _description_
166
166
  """
167
167
  for f in marc_record.get_fields(field_textual):
168
- codes = [sf.code for sf in f.subfields]
169
- if "a" not in codes and "z" not in codes and "x" not in codes:
170
- raise TransformationFieldMappingError(
171
- legacy_ids,
172
- i18n.t(
173
- "%{field} subfields a, x, and z missing from field", field=field_textual
174
- ),
175
- f,
176
- )
177
- if not (
178
- len(f.get_subfields("a")) == 0
179
- or len(f.get_subfields("z")) == 0
180
- or len(f.get_subfields("x")) == 0
168
+ if all(
169
+ [
170
+ len("".join(f.get_subfields("a")).strip()) == 0,
171
+ len("".join(f.get_subfields("z")).strip()) == 0,
172
+ len("".join(f.get_subfields("x")).strip()) == 0,
173
+ ]
181
174
  ):
182
175
  raise TransformationFieldMappingError(
183
176
  legacy_ids,
184
- i18n.t("%{field} a,x and z are all empty", field=field_textual),
177
+ i18n.t("%{field} a, x and z are missing or empty", field=field_textual),
185
178
  f,
186
179
  )
187
180
  return_dict["statements"].append(
@@ -10,7 +10,6 @@ from pathlib import Path
10
10
  from typing import Dict, Generator, List
11
11
 
12
12
  import i18n
13
- import pymarc
14
13
  from defusedxml.ElementTree import fromstring
15
14
  from folio_uuid.folio_namespaces import FOLIONamespaces
16
15
  from folio_uuid.folio_uuid import FolioUUID
@@ -144,7 +143,7 @@ class BibsRulesMapper(RulesMapperBase):
144
143
  self.report_folio_mapping(clean_folio_instance, self.schema)
145
144
  return [clean_folio_instance]
146
145
 
147
- def simple_bib_map(self, folio_instnace: dict, marc_record: Record, ignored_subsequent_fields: set, legacy_ids: List[str]):
146
+ def simple_bib_map(self, folio_instance: dict, marc_record: Record, ignored_subsequent_fields: set, legacy_ids: List[str]):
148
147
  """
149
148
  This method applies a much simplified MARC-to-instance
150
149
  mapping to create a minimal FOLIO Instance record to be
@@ -152,7 +151,7 @@ class BibsRulesMapper(RulesMapperBase):
152
151
  than creating SRS records during transformation.
153
152
 
154
153
  Args:
155
- folio_instnace (dict): _description_
154
+ folio_instance (dict): _description_
156
155
  marc_record (Record): _description_
157
156
  legacy_ids (List[str]): _description_
158
157
  file_def (FileDefinition): _description_
@@ -169,9 +168,10 @@ class BibsRulesMapper(RulesMapperBase):
169
168
  if not main_entry_fields:
170
169
  main_entry_fields += marc_record.get_fields("700", "710", "711", "730")
171
170
  main_entry_fields.sort(key=lambda x: int(x.tag))
172
- self.process_marc_field(folio_instnace, main_entry_fields[0], ignored_subsequent_fields, legacy_ids)
171
+ if main_entry_fields:
172
+ self.process_marc_field(folio_instance, main_entry_fields[0], ignored_subsequent_fields, legacy_ids)
173
173
  try:
174
- self.process_marc_field(folio_instnace, marc_record['245'], ignored_subsequent_fields, legacy_ids)
174
+ self.process_marc_field(folio_instance, marc_record['245'], ignored_subsequent_fields, legacy_ids)
175
175
  except KeyError:
176
176
  raise TransformationRecordFailedError(
177
177
  legacy_ids,
@@ -39,7 +39,7 @@ class RulesMapperHoldings(RulesMapperBase):
39
39
  task_configuration,
40
40
  library_configuration: LibraryConfiguration,
41
41
  parent_id_map: dict,
42
- boundwith_relationship_map,
42
+ boundwith_relationship_map_rows: List[Dict],
43
43
  ):
44
44
  self.task_configuration = task_configuration
45
45
  self.conditions = Conditions(
@@ -58,8 +58,8 @@ class RulesMapperHoldings(RulesMapperBase):
58
58
  self.conditions,
59
59
  parent_id_map,
60
60
  )
61
- self.boundwith_relationship_map = self.setup_boundwith_relationship_map(
62
- boundwith_relationship_map
61
+ self.boundwith_relationship_map: Dict = self.setup_boundwith_relationship_map(
62
+ boundwith_relationship_map_rows
63
63
  )
64
64
  self.location_map = self.validate_location_map(
65
65
  location_map,
@@ -402,20 +402,20 @@ class RulesMapperHoldings(RulesMapperBase):
402
402
  marc_record (Record): PyMARC record
403
403
  folio_holding (Dict): FOLIO holdings record
404
404
  """
405
- holdings_note_type_tuple = self.conditions.get_ref_data_tuple_by_name(
406
- self.folio.holding_note_types, "holding_note_types", self.task_configuration.mfhd_mrk_note_type
407
- )
408
- try:
409
- holdings_note_type_id = holdings_note_type_tuple[0]
410
- except Exception as ee:
411
- logging.error(ee)
412
- raise TransformationRecordFailedError(
413
- legacy_ids,
414
- f'Holdings note type mapping error.\tNote type name: {self.task_configuration.mfhd_mrk_note_type}\t'
415
- f"Note type not found in FOLIO.",
416
- self.task_configuration.mfhd_mrk_note_type,
417
- ) from ee
418
405
  if self.task_configuration.include_mfhd_mrk_as_note:
406
+ holdings_note_type_tuple = self.conditions.get_ref_data_tuple_by_name(
407
+ self.folio.holding_note_types, "holding_note_types", self.task_configuration.mfhd_mrk_note_type
408
+ )
409
+ try:
410
+ holdings_note_type_id = holdings_note_type_tuple[0]
411
+ except Exception as ee:
412
+ logging.error(ee)
413
+ raise TransformationRecordFailedError(
414
+ legacy_ids,
415
+ f'Holdings note type mapping error.\tNote type name: {self.task_configuration.mfhd_mrk_note_type}\t'
416
+ f"Note type not found in FOLIO.",
417
+ self.task_configuration.mfhd_mrk_note_type,
418
+ ) from ee
419
419
  folio_holding["notes"] = folio_holding.get("notes", []) + [
420
420
  {
421
421
  "note": str(marc_record),
@@ -433,20 +433,20 @@ class RulesMapperHoldings(RulesMapperBase):
433
433
  marc_record (Record): PyMARC record
434
434
  folio_holding (Dict): FOLIO holdings record
435
435
  """
436
- holdings_note_type_tuple = self.conditions.get_ref_data_tuple_by_name(
437
- self.folio.holding_note_types, "holding_note_types", self.task_configuration.mfhd_mrc_note_type
438
- )
439
- try:
440
- holdings_note_type_id = holdings_note_type_tuple[0]
441
- except Exception as ee:
442
- logging.error(ee)
443
- raise TransformationRecordFailedError(
444
- legacy_ids,
445
- f'Holdings note type mapping error.\tNote type name: {self.task_configuration.mfhd_mrc_note_type}\t'
446
- f"Note type not found in FOLIO.",
447
- self.task_configuration.mfhd_mrc_note_type,
448
- ) from ee
449
436
  if self.task_configuration.include_mfhd_mrc_as_note:
437
+ holdings_note_type_tuple = self.conditions.get_ref_data_tuple_by_name(
438
+ self.folio.holding_note_types, "holding_note_types", self.task_configuration.mfhd_mrc_note_type
439
+ )
440
+ try:
441
+ holdings_note_type_id = holdings_note_type_tuple[0]
442
+ except Exception as ee:
443
+ logging.error(ee)
444
+ raise TransformationRecordFailedError(
445
+ legacy_ids,
446
+ f'Holdings note type mapping error.\tNote type name: {self.task_configuration.mfhd_mrc_note_type}\t'
447
+ f"Note type not found in FOLIO.",
448
+ self.task_configuration.mfhd_mrc_note_type,
449
+ ) from ee
450
450
  folio_holding["notes"] = folio_holding.get("notes", []) + [
451
451
  {
452
452
  "note": marc_record.as_marc().decode("utf-8"),
@@ -242,19 +242,26 @@ class HoldingsMarcTransformer(MigrationTaskBase):
242
242
  )
243
243
 
244
244
  # Load Boundwith relationship map
245
- self.boundwith_relationship_map = []
245
+ self.boundwith_relationship_map_rows = []
246
246
  if self.task_config.boundwith_relationship_file_path:
247
- with open(
248
- self.folder_structure.legacy_records_folder
249
- / self.task_config.boundwith_relationship_file_path
250
- ) as boundwith_relationship_file:
251
- self.boundwith_relationship_map = list(
252
- csv.DictReader(boundwith_relationship_file, dialect="tsv")
247
+ try:
248
+ with open(
249
+ self.folder_structure.legacy_records_folder
250
+ / self.task_config.boundwith_relationship_file_path
251
+ ) as boundwith_relationship_file:
252
+ self.boundwith_relationship_map_rows = list(
253
+ csv.DictReader(boundwith_relationship_file, dialect="tsv")
254
+ )
255
+ logging.info(
256
+ "Rows in Bound with relationship map: %s",
257
+ len(self.boundwith_relationship_map_rows),
258
+ )
259
+ except FileNotFoundError:
260
+ raise TransformationProcessError(
261
+ "",
262
+ i18n.t("Provided boundwith relationship file not found"),
263
+ self.task_config.boundwith_relationship_file_path,
253
264
  )
254
- logging.info(
255
- "Rows in Bound with relationship map: %s",
256
- len(self.boundwith_relationship_map),
257
- )
258
265
 
259
266
  location_map_path = (
260
267
  self.folder_structure.mapping_files_folder
@@ -274,7 +281,7 @@ class HoldingsMarcTransformer(MigrationTaskBase):
274
281
  self.task_config,
275
282
  self.library_configuration,
276
283
  self.instance_id_map,
277
- self.boundwith_relationship_map,
284
+ self.boundwith_relationship_map_rows,
278
285
  )
279
286
  self.add_supplemental_mfhd_mappings()
280
287
  if (
@@ -1,5 +1,6 @@
1
1
  import json
2
2
  import logging
3
+ import i18n
3
4
  from datetime import datetime
4
5
  from zoneinfo import ZoneInfo
5
6
 
@@ -123,7 +124,7 @@ class LegacyLoan(object):
123
124
  if self.out_date.hour == 0:
124
125
  self.out_date = self.out_date.replace(hour=0, minute=1)
125
126
  if self.due_date <= self.out_date:
126
- raise TransformationProcessError(self.row, "Due date is before out date, or date information is missing from both", json.dumps(self.legacy_loan_dict, indent=2))
127
+ raise TransformationProcessError(self.row, i18n.t("Due date is before out date, or date information is missing from both"), json.dumps(self.legacy_loan_dict, indent=2))
127
128
 
128
129
  def to_dict(self):
129
130
  return {
@@ -3,7 +3,7 @@
3
3
  "%{action} error. http status: %{status}": "%{action} error. http status: %{status}",
4
4
  "%{action} error: %{message}": "%{action} error: %{message}",
5
5
  "%{fields_criteria} empty or not set": "%{fields_criteria} empty or not set",
6
- "%{field} a,x and z are all empty": "%{field} a,x and z are all empty",
6
+ "%{field} a, x and z are missing or empty": "%{field} a, x and z are missing or empty",
7
7
  "%{field} subfields a, x, and z missing from field": "%{field} subfields a, x, and z missing from field",
8
8
  "%{fro} mapped from %{record}": "%{fro} mapped from %{record}",
9
9
  "%{props} were concatenated": "%{props} were concatenated",
@@ -441,5 +441,7 @@
441
441
  "legacy id from %{fro}": "legacy id from %{fro}",
442
442
  "naturalId mapped from %{fro}": "naturalId mapped from %{fro}",
443
443
  "no matching identifier_types in %{names}": "no matching identifier_types in %{names}",
444
- "subfield present in %{linked_value_tag} but not in %{pattern_field}": "subfield present in %{linked_value_tag} but not in %{pattern_field}"
444
+ "subfield present in %{linked_value_tag} but not in %{pattern_field}": "subfield present in %{linked_value_tag} but not in %{pattern_field}",
445
+ "Provided boundwith relationship file not found": "Provided boundwith relationship file not found",
446
+ "Due date is before out date, or date information is missing from both": "Due date is before out date, or date information is missing from both"
445
447
  }