folio-migration-tools 1.9.10__py3-none-any.whl → 1.10.0__py3-none-any.whl
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/__init__.py +3 -4
- folio_migration_tools/__main__.py +53 -31
- folio_migration_tools/circulation_helper.py +118 -108
- folio_migration_tools/custom_dict.py +2 -2
- folio_migration_tools/custom_exceptions.py +4 -5
- folio_migration_tools/folder_structure.py +17 -7
- folio_migration_tools/helper.py +8 -7
- folio_migration_tools/holdings_helper.py +4 -3
- folio_migration_tools/i18n_cache.py +79 -0
- folio_migration_tools/library_configuration.py +77 -37
- folio_migration_tools/mapper_base.py +45 -31
- folio_migration_tools/mapping_file_transformation/courses_mapper.py +1 -1
- folio_migration_tools/mapping_file_transformation/holdings_mapper.py +7 -3
- folio_migration_tools/mapping_file_transformation/item_mapper.py +13 -26
- folio_migration_tools/mapping_file_transformation/manual_fee_fines_mapper.py +1 -2
- folio_migration_tools/mapping_file_transformation/mapping_file_mapper_base.py +13 -11
- folio_migration_tools/mapping_file_transformation/order_mapper.py +6 -5
- folio_migration_tools/mapping_file_transformation/organization_mapper.py +3 -3
- folio_migration_tools/mapping_file_transformation/user_mapper.py +47 -28
- folio_migration_tools/marc_rules_transformation/conditions.py +82 -97
- folio_migration_tools/marc_rules_transformation/holdings_statementsparser.py +13 -5
- folio_migration_tools/marc_rules_transformation/hrid_handler.py +3 -2
- folio_migration_tools/marc_rules_transformation/marc_file_processor.py +26 -24
- folio_migration_tools/marc_rules_transformation/rules_mapper_base.py +56 -51
- folio_migration_tools/marc_rules_transformation/rules_mapper_bibs.py +28 -17
- folio_migration_tools/marc_rules_transformation/rules_mapper_holdings.py +68 -37
- folio_migration_tools/migration_report.py +18 -7
- folio_migration_tools/migration_tasks/batch_poster.py +285 -354
- folio_migration_tools/migration_tasks/bibs_transformer.py +14 -9
- folio_migration_tools/migration_tasks/courses_migrator.py +2 -3
- folio_migration_tools/migration_tasks/holdings_csv_transformer.py +23 -24
- folio_migration_tools/migration_tasks/holdings_marc_transformer.py +14 -24
- folio_migration_tools/migration_tasks/items_transformer.py +23 -34
- folio_migration_tools/migration_tasks/loans_migrator.py +67 -144
- folio_migration_tools/migration_tasks/manual_fee_fines_transformer.py +3 -3
- folio_migration_tools/migration_tasks/migration_task_base.py +47 -60
- folio_migration_tools/migration_tasks/orders_transformer.py +25 -42
- folio_migration_tools/migration_tasks/organization_transformer.py +9 -18
- folio_migration_tools/migration_tasks/requests_migrator.py +21 -24
- folio_migration_tools/migration_tasks/reserves_migrator.py +6 -5
- folio_migration_tools/migration_tasks/user_transformer.py +25 -20
- folio_migration_tools/task_configuration.py +6 -7
- folio_migration_tools/transaction_migration/legacy_loan.py +15 -27
- folio_migration_tools/transaction_migration/legacy_request.py +1 -1
- folio_migration_tools/translations/en.json +0 -7
- {folio_migration_tools-1.9.10.dist-info → folio_migration_tools-1.10.0.dist-info}/METADATA +19 -28
- folio_migration_tools-1.10.0.dist-info/RECORD +63 -0
- folio_migration_tools-1.10.0.dist-info/WHEEL +4 -0
- folio_migration_tools-1.10.0.dist-info/entry_points.txt +3 -0
- folio_migration_tools/marc_rules_transformation/rules_mapper_authorities.py +0 -241
- folio_migration_tools/migration_tasks/authority_transformer.py +0 -119
- folio_migration_tools/test_infrastructure/__init__.py +0 -0
- folio_migration_tools/test_infrastructure/mocked_classes.py +0 -406
- folio_migration_tools-1.9.10.dist-info/RECORD +0 -67
- folio_migration_tools-1.9.10.dist-info/WHEEL +0 -4
- folio_migration_tools-1.9.10.dist-info/entry_points.txt +0 -3
- folio_migration_tools-1.9.10.dist-info/licenses/LICENSE +0 -21
|
@@ -14,6 +14,7 @@ from folio_uuid.folio_namespaces import FOLIONamespaces
|
|
|
14
14
|
|
|
15
15
|
from folio_migration_tools.custom_dict import InsensitiveDictReader
|
|
16
16
|
from folio_migration_tools.custom_exceptions import TransformationProcessError
|
|
17
|
+
from folio_migration_tools.i18n_cache import i18n_t
|
|
17
18
|
from folio_migration_tools.library_configuration import (
|
|
18
19
|
FileDefinition,
|
|
19
20
|
LibraryConfiguration,
|
|
@@ -59,7 +60,7 @@ class ReservesMigrator(MigrationTaskBase):
|
|
|
59
60
|
self,
|
|
60
61
|
task_configuration: TaskConfiguration,
|
|
61
62
|
library_config: LibraryConfiguration,
|
|
62
|
-
folio_client
|
|
63
|
+
folio_client,
|
|
63
64
|
):
|
|
64
65
|
csv.register_dialect("tsv", delimiter="\t")
|
|
65
66
|
self.migration_report = MigrationReport()
|
|
@@ -90,7 +91,7 @@ class ReservesMigrator(MigrationTaskBase):
|
|
|
90
91
|
logging.info("Starting")
|
|
91
92
|
for num_reserves, legacy_reserve in enumerate(self.valid_reserves, start=1):
|
|
92
93
|
t0_migration = time.time()
|
|
93
|
-
self.migration_report.add_general_statistics(
|
|
94
|
+
self.migration_report.add_general_statistics(i18n_t("Processed reserves"))
|
|
94
95
|
try:
|
|
95
96
|
self.post_single_reserve(legacy_reserve)
|
|
96
97
|
except Exception as ee:
|
|
@@ -107,10 +108,10 @@ class ReservesMigrator(MigrationTaskBase):
|
|
|
107
108
|
path, legacy_reserve.to_dict(), "POST", i18n.t("Posted reserves")
|
|
108
109
|
):
|
|
109
110
|
self.migration_report.add_general_statistics(
|
|
110
|
-
|
|
111
|
+
i18n_t("Successfully posted reserves")
|
|
111
112
|
)
|
|
112
113
|
else:
|
|
113
|
-
self.migration_report.add_general_statistics(
|
|
114
|
+
self.migration_report.add_general_statistics(i18n_t("Failure to post reserve"))
|
|
114
115
|
except Exception as ee:
|
|
115
116
|
logging.error(ee)
|
|
116
117
|
|
|
@@ -123,7 +124,7 @@ class ReservesMigrator(MigrationTaskBase):
|
|
|
123
124
|
|
|
124
125
|
with open(self.folder_structure.migration_reports_file, "w+") as report_file:
|
|
125
126
|
self.migration_report.write_migration_report(
|
|
126
|
-
|
|
127
|
+
i18n_t("Reserves migration report"), report_file, self.start_datetime
|
|
127
128
|
)
|
|
128
129
|
self.clean_out_empty_logs()
|
|
129
130
|
|
|
@@ -4,7 +4,6 @@ import sys
|
|
|
4
4
|
from typing import Optional, Annotated
|
|
5
5
|
from pydantic import Field
|
|
6
6
|
|
|
7
|
-
import i18n
|
|
8
7
|
from folio_uuid.folio_namespaces import FOLIONamespaces
|
|
9
8
|
from art import tprint
|
|
10
9
|
|
|
@@ -13,6 +12,7 @@ from folio_migration_tools.custom_exceptions import (
|
|
|
13
12
|
TransformationRecordFailedError,
|
|
14
13
|
)
|
|
15
14
|
from folio_migration_tools.helper import Helper
|
|
15
|
+
from folio_migration_tools.i18n_cache import i18n_t
|
|
16
16
|
from folio_migration_tools.library_configuration import (
|
|
17
17
|
FileDefinition,
|
|
18
18
|
LibraryConfiguration,
|
|
@@ -49,41 +49,37 @@ class UserTransformer(MigrationTaskBase):
|
|
|
49
49
|
Field(
|
|
50
50
|
title="Group map path",
|
|
51
51
|
description="Define the path for group mapping",
|
|
52
|
-
)
|
|
52
|
+
),
|
|
53
53
|
]
|
|
54
54
|
departments_map_path: Annotated[
|
|
55
55
|
Optional[str],
|
|
56
56
|
Field(
|
|
57
57
|
title="Departments map path",
|
|
58
58
|
description=(
|
|
59
|
-
"Define the path for departments mapping. "
|
|
60
|
-
"Optional, by dfault is empty string"
|
|
59
|
+
"Define the path for departments mapping. Optional, by dfault is empty string"
|
|
61
60
|
),
|
|
62
|
-
)
|
|
61
|
+
),
|
|
63
62
|
] = ""
|
|
64
63
|
use_group_map: Annotated[
|
|
65
64
|
Optional[bool],
|
|
66
65
|
Field(
|
|
67
66
|
title="Use group map",
|
|
68
|
-
description=(
|
|
69
|
-
|
|
70
|
-
"Optional, by default is True"
|
|
71
|
-
),
|
|
72
|
-
)
|
|
67
|
+
description=("Specify whether to use group mapping. Optional, by default is True"),
|
|
68
|
+
),
|
|
73
69
|
] = True
|
|
74
70
|
user_mapping_file_name: Annotated[
|
|
75
71
|
str,
|
|
76
72
|
Field(
|
|
77
73
|
title="User mapping file name",
|
|
78
74
|
description="Specify the user mapping file name",
|
|
79
|
-
)
|
|
75
|
+
),
|
|
80
76
|
]
|
|
81
77
|
user_file: Annotated[
|
|
82
78
|
FileDefinition,
|
|
83
79
|
Field(
|
|
84
80
|
title="User file",
|
|
85
81
|
description="Select the user data file",
|
|
86
|
-
)
|
|
82
|
+
),
|
|
87
83
|
]
|
|
88
84
|
remove_id_and_request_preferences: Annotated[
|
|
89
85
|
Optional[bool],
|
|
@@ -93,7 +89,7 @@ class UserTransformer(MigrationTaskBase):
|
|
|
93
89
|
"Specify whether to remove user ID and request preferences. "
|
|
94
90
|
"Optional, by default is False"
|
|
95
91
|
),
|
|
96
|
-
)
|
|
92
|
+
),
|
|
97
93
|
] = False
|
|
98
94
|
remove_request_preferences: Annotated[
|
|
99
95
|
Optional[bool],
|
|
@@ -103,7 +99,17 @@ class UserTransformer(MigrationTaskBase):
|
|
|
103
99
|
"Specify whether to remove user request preferences. "
|
|
104
100
|
"Optional, by default is False"
|
|
105
101
|
),
|
|
106
|
-
)
|
|
102
|
+
),
|
|
103
|
+
] = False
|
|
104
|
+
remove_username: Annotated[
|
|
105
|
+
Optional[bool],
|
|
106
|
+
Field(
|
|
107
|
+
title="Remove username",
|
|
108
|
+
description=(
|
|
109
|
+
"Specify whether to remove username. Resulting objects are not compatible with"
|
|
110
|
+
" the mod-user-import. Optional, by default is False"
|
|
111
|
+
),
|
|
112
|
+
),
|
|
107
113
|
] = False
|
|
108
114
|
|
|
109
115
|
@staticmethod
|
|
@@ -212,13 +218,13 @@ class UserTransformer(MigrationTaskBase):
|
|
|
212
218
|
logging.info("## First FOLIO user")
|
|
213
219
|
logging.info(json.dumps(folio_user, indent=4, sort_keys=True))
|
|
214
220
|
self.mapper.migration_report.add_general_statistics(
|
|
215
|
-
|
|
221
|
+
i18n_t("Successful user transformations")
|
|
216
222
|
)
|
|
217
223
|
if num_users % 1000 == 0:
|
|
218
224
|
logging.info(f"{num_users} users processed.")
|
|
219
225
|
except TransformationRecordFailedError as tre:
|
|
220
226
|
self.mapper.migration_report.add_general_statistics(
|
|
221
|
-
|
|
227
|
+
i18n_t("Records failed")
|
|
222
228
|
)
|
|
223
229
|
Helper.log_data_issue(tre.index_or_id, tre.message, tre.data_value)
|
|
224
230
|
logging.error(tre)
|
|
@@ -235,7 +241,7 @@ class UserTransformer(MigrationTaskBase):
|
|
|
235
241
|
logging.error(num_users)
|
|
236
242
|
logging.error(json.dumps(legacy_user))
|
|
237
243
|
self.mapper.migration_report.add_general_statistics(
|
|
238
|
-
|
|
244
|
+
i18n_t("Failed user transformations")
|
|
239
245
|
)
|
|
240
246
|
logging.error(ee, exc_info=True)
|
|
241
247
|
|
|
@@ -249,7 +255,7 @@ class UserTransformer(MigrationTaskBase):
|
|
|
249
255
|
self.extradata_writer.flush()
|
|
250
256
|
with open(self.folder_structure.migration_reports_file, "w") as migration_report_file:
|
|
251
257
|
self.mapper.migration_report.write_migration_report(
|
|
252
|
-
|
|
258
|
+
i18n_t("Users transformation report"),
|
|
253
259
|
migration_report_file,
|
|
254
260
|
self.mapper.start_datetime,
|
|
255
261
|
)
|
|
@@ -306,8 +312,7 @@ def find_primary_addresses(addresses):
|
|
|
306
312
|
if "primaryAddress" not in address:
|
|
307
313
|
address["primaryAddress"] = False
|
|
308
314
|
elif (
|
|
309
|
-
isinstance(address["primaryAddress"], bool)
|
|
310
|
-
and address["primaryAddress"] is True
|
|
315
|
+
isinstance(address["primaryAddress"], bool) and address["primaryAddress"] is True
|
|
311
316
|
) or (
|
|
312
317
|
isinstance(address["primaryAddress"], str)
|
|
313
318
|
and address["primaryAddress"].lower() == "true"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from typing import Annotated
|
|
2
2
|
|
|
3
3
|
from humps import camelize
|
|
4
|
-
from pydantic import BaseModel
|
|
4
|
+
from pydantic import BaseModel, ConfigDict
|
|
5
5
|
from pydantic import Field
|
|
6
6
|
|
|
7
7
|
|
|
@@ -25,9 +25,7 @@ class AbstractTaskConfiguration(BaseModel):
|
|
|
25
25
|
str,
|
|
26
26
|
Field(
|
|
27
27
|
title="Migration task type",
|
|
28
|
-
description=(
|
|
29
|
-
"The type of migration task you want to perform."
|
|
30
|
-
),
|
|
28
|
+
description=("The type of migration task you want to perform."),
|
|
31
29
|
),
|
|
32
30
|
]
|
|
33
31
|
ecs_tenant_id: Annotated[
|
|
@@ -41,6 +39,7 @@ class AbstractTaskConfiguration(BaseModel):
|
|
|
41
39
|
),
|
|
42
40
|
] = ""
|
|
43
41
|
|
|
44
|
-
|
|
45
|
-
alias_generator
|
|
46
|
-
|
|
42
|
+
model_config = ConfigDict(
|
|
43
|
+
alias_generator=to_camel,
|
|
44
|
+
populate_by_name=True,
|
|
45
|
+
)
|
|
@@ -67,10 +67,11 @@ class LegacyLoan(object):
|
|
|
67
67
|
self.row,
|
|
68
68
|
f"Provided due_date is not UTC in {row=}, "
|
|
69
69
|
f"setting tz-info to tenant timezone ({self.tenant_timezone})",
|
|
70
|
-
json.dumps(self.legacy_loan_dict)
|
|
70
|
+
json.dumps(self.legacy_loan_dict),
|
|
71
71
|
)
|
|
72
72
|
self.report(
|
|
73
|
-
|
|
73
|
+
"Provided due_date is not UTC, setting tz-info to tenant "
|
|
74
|
+
f"timezone ({self.tenant_timezone})"
|
|
74
75
|
)
|
|
75
76
|
if temp_date_due.hour == 0 and temp_date_due.minute == 0:
|
|
76
77
|
temp_date_due = temp_date_due.replace(hour=23, minute=59)
|
|
@@ -78,16 +79,12 @@ class LegacyLoan(object):
|
|
|
78
79
|
self.row,
|
|
79
80
|
f"Hour and minute not specified for due date in {row=}. "
|
|
80
81
|
"Assuming end of local calendar day (23:59)...",
|
|
81
|
-
json.dumps(self.legacy_loan_dict)
|
|
82
|
-
)
|
|
83
|
-
self.report(
|
|
84
|
-
"Hour and minute not specified for due date"
|
|
82
|
+
json.dumps(self.legacy_loan_dict),
|
|
85
83
|
)
|
|
84
|
+
self.report("Hour and minute not specified for due date")
|
|
86
85
|
except (ParserError, OverflowError) as ee:
|
|
87
86
|
logging.error(ee)
|
|
88
|
-
self.errors.append(
|
|
89
|
-
(f"Parse date failure in {row=}. Setting UTC NOW", "due_date")
|
|
90
|
-
)
|
|
87
|
+
self.errors.append((f"Parse date failure in {row=}. Setting UTC NOW", "due_date"))
|
|
91
88
|
temp_date_due = datetime.now(ZoneInfo("UTC"))
|
|
92
89
|
try:
|
|
93
90
|
temp_date_out: datetime = parse(self.legacy_loan_dict["out_date"])
|
|
@@ -97,33 +94,28 @@ class LegacyLoan(object):
|
|
|
97
94
|
self.row,
|
|
98
95
|
f"Provided out_date is not UTC in {row=}, "
|
|
99
96
|
f"setting tz-info to tenant timezone ({self.tenant_timezone})",
|
|
100
|
-
json.dumps(self.legacy_loan_dict)
|
|
97
|
+
json.dumps(self.legacy_loan_dict),
|
|
101
98
|
)
|
|
102
99
|
self.report(
|
|
103
|
-
|
|
100
|
+
"Provided out_date is not UTC, setting tz-info to tenant "
|
|
101
|
+
f"timezone ({self.tenant_timezone})"
|
|
104
102
|
)
|
|
105
103
|
except (ParserError, OverflowError):
|
|
106
104
|
temp_date_out = datetime.now(
|
|
107
105
|
ZoneInfo("UTC")
|
|
108
106
|
) # TODO: Consider moving this assignment block above the temp_date_due
|
|
109
|
-
self.errors.append(
|
|
110
|
-
(f"Parse date failure in {row=}. Setting UTC NOW", "out_date")
|
|
111
|
-
)
|
|
107
|
+
self.errors.append((f"Parse date failure in {row=}. Setting UTC NOW", "out_date"))
|
|
112
108
|
|
|
113
109
|
# good to go, set properties
|
|
114
110
|
self.item_barcode: str = self.legacy_loan_dict["item_barcode"].strip()
|
|
115
111
|
self.patron_barcode: str = self.legacy_loan_dict["patron_barcode"].strip()
|
|
116
|
-
self.proxy_patron_barcode: str = self.legacy_loan_dict.get(
|
|
117
|
-
"proxy_patron_barcode", ""
|
|
118
|
-
)
|
|
112
|
+
self.proxy_patron_barcode: str = self.legacy_loan_dict.get("proxy_patron_barcode", "")
|
|
119
113
|
self.due_date: datetime = temp_date_due
|
|
120
114
|
self.out_date: datetime = temp_date_out
|
|
121
115
|
self.correct_for_1_day_loans()
|
|
122
116
|
self.make_utc()
|
|
123
117
|
self.renewal_count = self.set_renewal_count(self.legacy_loan_dict)
|
|
124
|
-
self.next_item_status = self.legacy_loan_dict.get(
|
|
125
|
-
"next_item_status", ""
|
|
126
|
-
).strip()
|
|
118
|
+
self.next_item_status = self.legacy_loan_dict.get("next_item_status", "").strip()
|
|
127
119
|
if self.next_item_status not in legal_statuses:
|
|
128
120
|
self.errors.append((f"Not an allowed status {row=}", self.next_item_status))
|
|
129
121
|
self.service_point_id = (
|
|
@@ -141,13 +133,11 @@ class LegacyLoan(object):
|
|
|
141
133
|
Helper.log_data_issue(
|
|
142
134
|
self.row,
|
|
143
135
|
i18n.t("Unresolvable %{renewal_count=} was replaced with 0."),
|
|
144
|
-
json.dumps(loan)
|
|
136
|
+
json.dumps(loan),
|
|
145
137
|
)
|
|
146
138
|
else:
|
|
147
139
|
Helper.log_data_issue(
|
|
148
|
-
self.row,
|
|
149
|
-
i18n.t("Missing renewal count was replaced with 0."),
|
|
150
|
-
json.dumps(loan)
|
|
140
|
+
self.row, i18n.t("Missing renewal count was replaced with 0."), json.dumps(loan)
|
|
151
141
|
)
|
|
152
142
|
return 0
|
|
153
143
|
|
|
@@ -160,9 +150,7 @@ class LegacyLoan(object):
|
|
|
160
150
|
if self.due_date <= self.out_date:
|
|
161
151
|
raise TransformationRecordFailedError(
|
|
162
152
|
self.row,
|
|
163
|
-
i18n.t(
|
|
164
|
-
"Due date is before out date, or date information is missing from both"
|
|
165
|
-
),
|
|
153
|
+
i18n.t("Due date is before out date, or date information is missing from both"),
|
|
166
154
|
json.dumps(self.legacy_loan_dict, indent=2),
|
|
167
155
|
)
|
|
168
156
|
|
|
@@ -122,7 +122,7 @@ class LegacyRequest(object):
|
|
|
122
122
|
missing = [r for r in required if not req.get(r, "")]
|
|
123
123
|
if any(missing):
|
|
124
124
|
raise TransformationRecordFailedError(
|
|
125
|
-
"", "Required properties missing
|
|
125
|
+
"", "Required properties missing:, ".join(missing)
|
|
126
126
|
)
|
|
127
127
|
return req
|
|
128
128
|
|
|
@@ -24,7 +24,6 @@
|
|
|
24
24
|
"Aged to lost and checked out": "Aged to lost and checked out",
|
|
25
25
|
"Already set to %{value}. %{leader_key} was %{leader}": "Already set to %{value}. %{leader_key} was %{leader}",
|
|
26
26
|
"An Unmapped": "An Unmapped",
|
|
27
|
-
"Authority records transformation report": "Authority records transformation report",
|
|
28
27
|
"BW Items found tied to previously created BW Holdings": "BW Items found tied to previously created BW Holdings",
|
|
29
28
|
"Bib identifier not in instances_id_map, no instance linked": "Bib identifier not in instances_id_map, no instance linked",
|
|
30
29
|
"Bib ids referenced in bound-with items": "Bib ids referenced in bound-with items",
|
|
@@ -264,12 +263,6 @@
|
|
|
264
263
|
"blurbs.AcquisitionMethodMapping.title": "POL Acquisition Method Mapping",
|
|
265
264
|
"blurbs.AddedValueFromParameter.description": "",
|
|
266
265
|
"blurbs.AddedValueFromParameter.title": "Added value from parameter since value is empty",
|
|
267
|
-
"blurbs.AuthorityEncodingLevel.description": "Library action: **All values that are not n or o will be set to n. If this is not what you want, you need to correct these values in your system. **<br/>An overview of the Encoding levels (Leader position 17) present in your source data. Allowed values according to the MARC standard are n or o",
|
|
268
|
-
"blurbs.AuthorityEncodingLevel.title": "Encoding level (leader pos 17)",
|
|
269
|
-
"blurbs.AuthoritySourceFileMapping.description": "Mappings based on FOLIO authority `naturalId` alpha prefix",
|
|
270
|
-
"blurbs.AuthoritySourceFileMapping.title": "Authority Source File Mapping Results",
|
|
271
|
-
"blurbs.AuthoritySources.description": "",
|
|
272
|
-
"blurbs.AuthoritySources.title": "Authorization sources and related information",
|
|
273
266
|
"blurbs.BoundWithMappings.description": "",
|
|
274
267
|
"blurbs.BoundWithMappings.title": "Bound-with mapping",
|
|
275
268
|
"blurbs.CallNumberTypeMapping.description": "Call number types in MFHDs are mapped from 852, Indicator 1 according to a certain scheme. (LOC documentation)[https://www.loc.gov/marc/holdings/hd852.html]",
|
|
@@ -1,33 +1,25 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
|
-
Name:
|
|
3
|
-
Version: 1.
|
|
2
|
+
Name: folio-migration-tools
|
|
3
|
+
Version: 1.10.0
|
|
4
4
|
Summary: A tool allowing you to migrate data from legacy ILS:s (Library systems) into FOLIO LSP
|
|
5
|
-
License-Expression: MIT
|
|
6
|
-
License-File: LICENSE
|
|
7
5
|
Keywords: FOLIO,ILS,LSP,Library Systems,MARC21,Library data
|
|
8
|
-
Author: Theodor Tolstoy
|
|
9
|
-
Author-email: github.teddes@tolstoy.se
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Requires-Dist: argparse-prompt
|
|
19
|
-
Requires-Dist:
|
|
20
|
-
Requires-Dist:
|
|
21
|
-
Requires-Dist:
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist: folio-
|
|
24
|
-
Requires-
|
|
25
|
-
Requires-Dist: pyaml (>=21.10.1,<22.0.0)
|
|
26
|
-
Requires-Dist: pydantic (>=1.10.2,<2.0.0)
|
|
27
|
-
Requires-Dist: pyhumps (>=3.7.3,<4.0.0)
|
|
28
|
-
Requires-Dist: pymarc (>=5.2.3,<6.0.0)
|
|
29
|
-
Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
|
|
30
|
-
Requires-Dist: python-i18n (>=0.3.9,<0.4.0)
|
|
6
|
+
Author: Theodor Tolstoy, Lisa Sjögren, Brooks Travis, Jeremy Nelson, Clinton Bradford
|
|
7
|
+
Author-email: Theodor Tolstoy <github.teddes@tolstoy.se>, Brooks Travis <brooks.travis@gmail.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
Requires-Dist: folioclient>=1.0.4
|
|
10
|
+
Requires-Dist: pyhumps>=3.7.3,<4.0.0
|
|
11
|
+
Requires-Dist: defusedxml>=0.7.1,<1.0.0
|
|
12
|
+
Requires-Dist: python-dateutil>=2.8.2,<3.0.0
|
|
13
|
+
Requires-Dist: folio-uuid>=1.0.0,<2.0.0
|
|
14
|
+
Requires-Dist: pymarc>=5.2.3,<6.0.0
|
|
15
|
+
Requires-Dist: pydantic>=2.12.3,<3.0.0
|
|
16
|
+
Requires-Dist: argparse-prompt>=0.0.5,<1.0.0
|
|
17
|
+
Requires-Dist: deepdiff>=6.2.3,<7.0.0
|
|
18
|
+
Requires-Dist: pyaml>=21.10.1,<22.0.0
|
|
19
|
+
Requires-Dist: python-i18n>=0.3.9,<1.0.0
|
|
20
|
+
Requires-Dist: art>=6.5,<7.0
|
|
21
|
+
Requires-Dist: folio-data-import>=0.5.0,<0.6.0
|
|
22
|
+
Requires-Python: >=3.10, <4.0
|
|
31
23
|
Project-URL: Documentation, https://folio-migration-tools.readthedocs.io/en/latest/
|
|
32
24
|
Project-URL: Homepage, https://github.com/folio-fse/folio_migration_tools
|
|
33
25
|
Project-URL: Repository, https://github.com/FOLIO-FSE/folio_migration_tools
|
|
@@ -166,4 +158,3 @@ Translate all new strings, which begin with `TRANSLATE`, then commit.
|
|
|
166
158
|
# Running the scripts
|
|
167
159
|
For information on syntax, what files are needed and produced by the toolkit, refer to the documentation and example files in the [template repository](https://github.com/FOLIO-FSE/migration_repo_template). We are building out the docs section in this repository as well:[Documentation](https://folio-migration-tools.readthedocs.io/en/latest/)
|
|
168
160
|
¨
|
|
169
|
-
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
folio_migration_tools/__init__.py,sha256=lnYgqA47l0iA-iORkVH3dgevk7gyGxVwg3MnLltA-U8,223
|
|
2
|
+
folio_migration_tools/__main__.py,sha256=KJdmLkKwAygTKuIKfvDL3M0JdVgsCbf2_LTL1FP6GxU,9233
|
|
3
|
+
folio_migration_tools/circulation_helper.py,sha256=CIrr_8DVDlFN8gvNKRBxgOqW8zNRamP7SZtxOdzz5PQ,14713
|
|
4
|
+
folio_migration_tools/colors.py,sha256=GP0wdI_GZ2WD5SjrbPN-S3u8vvN_u6rGQIBBcWv_0ZM,227
|
|
5
|
+
folio_migration_tools/config_file_load.py,sha256=zHHa6NDkN6EJiQE4DgjrFQPVKsd70POsfbGkB8308jg,2822
|
|
6
|
+
folio_migration_tools/custom_dict.py,sha256=rRd9_RQqI85171p7wTfpMM0Mladh-LChbgMSmLvN7N0,680
|
|
7
|
+
folio_migration_tools/custom_exceptions.py,sha256=BLP1gMPbTHSN-rqxzTawT4sRLiyAU3blBdkUBwiiPRk,2642
|
|
8
|
+
folio_migration_tools/extradata_writer.py,sha256=fuchNcMc6BYb9IyfAcvXg7X4J2TfX6YiROfT2hr0JMw,1678
|
|
9
|
+
folio_migration_tools/folder_structure.py,sha256=YTLCjmiY0RhQwsCiXSQ0awkLOncZZmLdFuaP7rDVAIY,7301
|
|
10
|
+
folio_migration_tools/helper.py,sha256=t2SgSkNKqdz1eenZjpqgokrLnFQcx7vO7xeQ-UxTniE,3020
|
|
11
|
+
folio_migration_tools/holdings_helper.py,sha256=Thx8vJyEZKuJTQvgPODtaUv73Dhmqb_Nb4JprGyhV4U,7611
|
|
12
|
+
folio_migration_tools/i18n_cache.py,sha256=wOJc3OkHwItlFNC2jQB5R9AoIga0g0P1YhQqHgjeqK4,2858
|
|
13
|
+
folio_migration_tools/i18n_config.py,sha256=3AH_2b9zTsxE4XTe4isM_zYtPJSlK0ix6eBmV7kAYUM,228
|
|
14
|
+
folio_migration_tools/library_configuration.py,sha256=lgfnY1yXIK-sNlfooV646H6O0QEUvF-yRRh-YdOGjG4,8993
|
|
15
|
+
folio_migration_tools/mapper_base.py,sha256=sSnPK9yicr7fJEvlfG8AHN2Ght4FVwiqcUR3gRKHYS8,23777
|
|
16
|
+
folio_migration_tools/mapping_file_transformation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
folio_migration_tools/mapping_file_transformation/courses_mapper.py,sha256=ZRQ8KNgmM4Ki3ZQ3eqwyceOM55Bn8t3ZT8Pn3T-wmK8,8092
|
|
18
|
+
folio_migration_tools/mapping_file_transformation/holdings_mapper.py,sha256=1y64W1i4v3lV7LD0_QwrHBPx6HkA1o5muyXpWKiH2Hk,8305
|
|
19
|
+
folio_migration_tools/mapping_file_transformation/item_mapper.py,sha256=t2s0ShczOzz67pHwngKpxkpxDVnSNHLD3S1tJm83yOg,10257
|
|
20
|
+
folio_migration_tools/mapping_file_transformation/manual_fee_fines_mapper.py,sha256=CarOu2tUVXZ0mVxlM4Ahrxlc87znlLZWKLp4ZBTgols,13415
|
|
21
|
+
folio_migration_tools/mapping_file_transformation/mapping_file_mapper_base.py,sha256=M7Abf2Vh81vzTkmTmZSYAE6SjIQAjXzLOGUWJ1923TI,38474
|
|
22
|
+
folio_migration_tools/mapping_file_transformation/notes_mapper.py,sha256=vCmZmjrjyYtXeFCyVqvWfnP8y1jGGu15RXzXIHh12xY,3530
|
|
23
|
+
folio_migration_tools/mapping_file_transformation/order_mapper.py,sha256=VUcbeBGlQ7KsDPgJlaOOe8bO0y5IRLTCBH_IQKcaqiA,18267
|
|
24
|
+
folio_migration_tools/mapping_file_transformation/organization_mapper.py,sha256=MKlN3doQ_R-Y3klkbCFL4qHUfhMATBsIhvq1jpmajqQ,14641
|
|
25
|
+
folio_migration_tools/mapping_file_transformation/ref_data_mapping.py,sha256=rROcBiL5TE7bWsJ95A6shurPZ1e4In6PTwR5BN9amzU,8991
|
|
26
|
+
folio_migration_tools/mapping_file_transformation/user_mapper.py,sha256=nqyoSQAo3IGAAzXVRM-R0M5Q83zS3uU6jvKx4_c1mt8,8940
|
|
27
|
+
folio_migration_tools/marc_rules_transformation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
folio_migration_tools/marc_rules_transformation/conditions.py,sha256=-5U6nBGcBO49C9MMyxOL2wMhHGxUawkIM9e-MwNaM_4,46938
|
|
29
|
+
folio_migration_tools/marc_rules_transformation/holdings_statementsparser.py,sha256=-mOGtoPa3qmEqGWtyBTN-fQ743ZmT8caDLc9ES9J74Y,13667
|
|
30
|
+
folio_migration_tools/marc_rules_transformation/hrid_handler.py,sha256=WudBOzCwcJAuhEm4urLhAk5OQWGfbKz9_4Ou8fmjm1E,10022
|
|
31
|
+
folio_migration_tools/marc_rules_transformation/loc_language_codes.xml,sha256=ztn2_yKws6qySL4oSsZh7sOjxq5bCC1PhAnXJdtgmJ0,382912
|
|
32
|
+
folio_migration_tools/marc_rules_transformation/marc_file_processor.py,sha256=o03d_G-4MR4e5VPfu7ljxAVDl79o2ONpQIqQ-V2RCdA,12523
|
|
33
|
+
folio_migration_tools/marc_rules_transformation/marc_reader_wrapper.py,sha256=9ATjYMRAjy0QcXtmNZaHVhHLJ5hE1WUgOcF6KMJjbgo,5309
|
|
34
|
+
folio_migration_tools/marc_rules_transformation/rules_mapper_base.py,sha256=xxLH27uGGUyMjpE_Hdh1c1kGhg4X0eANm3dq49TfqNs,45909
|
|
35
|
+
folio_migration_tools/marc_rules_transformation/rules_mapper_bibs.py,sha256=f62Ig0Nqe0szUHzr7th6V65kcsfzhtzKzjGkxAc7ui4,30480
|
|
36
|
+
folio_migration_tools/marc_rules_transformation/rules_mapper_holdings.py,sha256=zMmS2j4_HegVFlQMerTuZzH0WyGILJcRITzrGSeyll4,29236
|
|
37
|
+
folio_migration_tools/migration_report.py,sha256=Hecfb9XcXhH01VgHWD4D0e4dQwGMlanm6mgVuLBolu4,4589
|
|
38
|
+
folio_migration_tools/migration_tasks/__init__.py,sha256=ZkbY_yGyB84Ke8OMlYUzyyBj4cxxNrhMTwQlu_GbdDs,211
|
|
39
|
+
folio_migration_tools/migration_tasks/batch_poster.py,sha256=XKtCM0HgHJNuWR4NGA2r9bedvO_KLPlzPwHg4qQrzsg,46254
|
|
40
|
+
folio_migration_tools/migration_tasks/bibs_transformer.py,sha256=zAKKAyLmqv2-AaJsP0sLHg4lQVEJtVyJjKJwmVG_xys,6391
|
|
41
|
+
folio_migration_tools/migration_tasks/courses_migrator.py,sha256=sKIeyUlc7o189lw88XbGILVkwnR9krqO0PgS-vLCCm8,7039
|
|
42
|
+
folio_migration_tools/migration_tasks/holdings_csv_transformer.py,sha256=-SKgDJLNAWamLAfXEyJVC9vZCKUY3eyZqVfA_oaVmmU,21955
|
|
43
|
+
folio_migration_tools/migration_tasks/holdings_marc_transformer.py,sha256=L4oY0N25NLk_rbzO6HsMbGRh-aeG7LWgr_xypFOJzGw,14231
|
|
44
|
+
folio_migration_tools/migration_tasks/items_transformer.py,sha256=GKDer0Nwff_1Wv5wOofElC84I4ZDRg0w2oTZZB-xGCU,19551
|
|
45
|
+
folio_migration_tools/migration_tasks/loans_migrator.py,sha256=vSmhcyUJraPRY3GNc4F4sUN3GHYHQCO_Nfc1XJaL3tY,38837
|
|
46
|
+
folio_migration_tools/migration_tasks/manual_fee_fines_transformer.py,sha256=qFu5QcaFIvo7K8DD6VEgtJ1h9InHr1x5-D3pdcXt4bg,7287
|
|
47
|
+
folio_migration_tools/migration_tasks/migration_task_base.py,sha256=rhIYFZ_dYWEyopkR2shht5ybKk4JQzxctSlBizml50g,22551
|
|
48
|
+
folio_migration_tools/migration_tasks/orders_transformer.py,sha256=XaQ0q6Hoe2n-NsrjxE_iB5n5CC69F4-WW6xN_EC5WHI,13937
|
|
49
|
+
folio_migration_tools/migration_tasks/organization_transformer.py,sha256=5s-ACb9-R8JLlPnROOq1ZnDIRCLQeWaxORDn0SrhQqs,16747
|
|
50
|
+
folio_migration_tools/migration_tasks/requests_migrator.py,sha256=6WtYyMNGEQgyCHwgUWj9K_fpWtXfcCiZFy56Y2ZJSIw,14820
|
|
51
|
+
folio_migration_tools/migration_tasks/reserves_migrator.py,sha256=RQdAQQORgHUJzA3DyVLVJ9N_fqNj2mDG688fWRSvda0,10005
|
|
52
|
+
folio_migration_tools/migration_tasks/user_transformer.py,sha256=p_B-Ywnk4d6c-gEyU24sv2YpZYByJFfDJRGlidXSed0,12661
|
|
53
|
+
folio_migration_tools/task_configuration.py,sha256=6eqbjjSWfi-qgp0bhCsuBVE3gTK4HaXzXsAo68JPGc0,1146
|
|
54
|
+
folio_migration_tools/transaction_migration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
|
+
folio_migration_tools/transaction_migration/legacy_loan.py,sha256=A5qvThfP3g62YnykLyti_tqTY7dq1SbLi3WZz7QXk6s,7399
|
|
56
|
+
folio_migration_tools/transaction_migration/legacy_request.py,sha256=Kv7jpBIuZ_qyay8BdaeCPJID67l43Cl6x-ws9Lt49NI,6121
|
|
57
|
+
folio_migration_tools/transaction_migration/legacy_reserve.py,sha256=qzw0okg4axAE_ezXopP9gFsQ_e60o0zh7zqRzFBSWHY,1806
|
|
58
|
+
folio_migration_tools/transaction_migration/transaction_result.py,sha256=cTdCN0BnlI9_ZJB2Z3Fdkl9gpymIi-9mGZsRFlQcmDk,656
|
|
59
|
+
folio_migration_tools/translations/en.json,sha256=pS7dhHmj4XBqTcFNIcqFgRMY557fQan1RomdNg6PtdA,40941
|
|
60
|
+
folio_migration_tools-1.10.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
|
|
61
|
+
folio_migration_tools-1.10.0.dist-info/entry_points.txt,sha256=mJRRiCNP9j7_NpVXamHEiW8pDEjWQs1vEqD89G354cM,79
|
|
62
|
+
folio_migration_tools-1.10.0.dist-info/METADATA,sha256=siV2h9AlkY0MczWX75nmZip0zJtw4y5JBAiiwkKYYBM,7207
|
|
63
|
+
folio_migration_tools-1.10.0.dist-info/RECORD,,
|