2 """Main module to migrate admin data.""" 9 from ody_migr_config
import (INSERT,
19 ADMIN_CUSURVEY_ID_MAP_CSV_FILE,
20 CUADMINPROGS_PERMISSIONS_MAPPING)
22 from ody_migr_transaction
import PgTransaction
23 from ody_migr_transaction
import pg_crsr_hndlr_decrtr
24 import ody_migr_db_handler
as pg_handler
25 from ody_migr_mmth_endpoint
import MammothMigration
26 from ody_migr_utils
import (get_valid_json,
31 LOGGER = logging.getLogger(__name__)
39 """Migrate admin data in a single transaction 42 admin_transaction: transaction to commit all insertions for admin 43 _mmth_admin_dict: response dictionary from Mammoth for admin 44 _verbose: verbosity flag 45 _cu: current credit union code 48 psycopg2.Error, psycopg2.Warning on db operation errors 50 mmth_admin_data = _mmth_admin_dict[
"data"]
52 progress_dict = {
"completed": 0,
"total": 16}
55 mmth_admin_users_coll = mmth_admin_data[
"adminusers"]
56 for adminuser_dict
in mmth_admin_users_coll:
57 cuadminusers_coll = adminuser_dict[
"cuadminusers"]
60 if type(cuadminusers_coll) == list:
61 assert len(cuadminusers_coll) == 0
62 cuadminusers_coll = {}
65 assert type(cuadminusers_coll) == dict
66 mfaquest = get_valid_json({})
67 mfaquest_dict = {
"answers": {}}
73 cuadmquestselect_coll = adminuser_dict[
"cuadmquestselect"]
74 if len(cuadmquestselect_coll) != 0:
75 for cuquest_record
in cuadmquestselect_coll:
76 if cuadminusers_coll != {}:
77 qid = cuquest_record[
"quest_id"].strip()
78 ans = cuquest_record[
"answer"].strip()
79 mfaquest_dict[
"answers"][qid] = ans
82 if cuadminusers_coll != {}:
83 mfaquest = get_valid_json(mfaquest_dict)
84 cuadminusers_coll[
"mfaquest"] = mfaquest
86 cuadminusers_coll[
"user_name"] = cuadminusers_coll[
91 list(cuadminusers_coll.keys()),
92 list(cuadminusers_coll.values())
96 for tbl_allow_exclude_progs
in [
"cuadminallow",
"cuadminexclude"]:
99 cuadmin_allow_exclude_data = adminuser_dict[
100 tbl_allow_exclude_progs]
102 for ind
in range(len(cuadmin_allow_exclude_data)):
103 cuadminallow_rec = cuadmin_allow_exclude_data[ind]
104 cuadminallow_program = get_strip_value_dict(
"program",
108 cuadminallow_rec[
"user_name"] =\
109 cuadminallow_rec[
"user_name"].lower()
111 if cuadminallow_program
in CUADMINPROGS_PERMISSIONS_MAPPING:
112 cuadminallow_rec[
"program"] = \
113 CUADMINPROGS_PERMISSIONS_MAPPING[cuadminallow_program]
117 tbl_allow_exclude_progs,
118 collection=cuadmin_allow_exclude_data
123 cuauditadmin_coll = adminuser_dict[
"cuauditadmin"]
125 for cuaudadm_rec
in cuauditadmin_coll:
128 cuaudadm_rec[
"user_name"] = cuaudadm_rec[
"user_name"].lower()
130 mmth_cu = get_strip_value_dict(
132 assert mmth_cu == _cu
133 del cuaudadm_rec[
"admuser"]
134 cuaudadm_rec[
"auditdate"] = get_strip_value_dict(
135 "chdate", cuaudadm_rec, pop=
True)
136 cuaudadm_rec[
"auditaction"] = get_strip_value_dict(
137 "action", cuaudadm_rec, pop=
True)
138 cuaudadm_rec[
"auditsrctype"] =
"A" 139 cuaudadm_rec[
"auditsrcuser_name"] = get_strip_value_dict(
140 "user_name", cuaudadm_rec)
141 cuaudadm_rec[
"auditsrcemail"] = get_strip_value_dict(
142 "email", cuaudadm_rec, pop=
True, default=
"a@b.cde")
143 cuaudadm_rec[
"auditsrcip"] =
"127.0.0.1" 148 collection=cuauditadmin_coll
151 progress_dict[
"completed"] += 4
152 log_progress(progress_dict)
154 cusurvey_surveyid_map = {}
155 mmth_cusurveymaster_records = mmth_admin_data[
"cusurveymaster"]
156 for cusurvey_rec
in mmth_cusurveymaster_records:
157 old_id = cusurvey_rec[
"surveyid"].strip()
158 del cusurvey_rec[
"surveyid"]
162 list(cusurvey_rec.keys()),
163 list(cusurvey_rec.values()),
164 returning_col=
"surveyid" 166 new_id = admin_transaction.cur.fetchone()[0]
167 cusurvey_surveyid_map[old_id] = new_id
169 adm_tbls_cusurvey = [
"cusurveyquest",
"cusurveydetail"]
170 for tbl_cusurvey
in adm_tbls_cusurvey:
171 tbl_coll = mmth_admin_data[tbl_cusurvey]
173 for cusurvey_other_rec
in tbl_coll:
174 assert "surveyid" in cusurvey_other_rec
175 cusurvey_other_rec[
"surveyid"] = cusurvey_surveyid_map[
176 cusurvey_other_rec[
"surveyid"].strip()]
184 with open(ADMIN_CUSURVEY_ID_MAP_CSV_FILE.format(_cu.lower()),
186 newline=
'')
as cusurvey_csvfile:
187 cusurvey_csvwriter = csv.writer(
188 cusurvey_csvfile, delimiter=
',',
190 quoting=csv.QUOTE_MINIMAL
192 cusurvey_csvwriter.writerow([
"cusurveymaster_surveyid_old, cusurveymaster_surveyid_new"])
193 for survey_oldid, survey_newid
in cusurvey_surveyid_map.items():
194 cusurvey_csvwriter.writerow([survey_oldid, survey_newid])
198 adm_tbls_no_schema_chng = [
205 for tbl
in adm_tbls_no_schema_chng:
209 collection=mmth_admin_data[tbl]
213 mmth_admin_cualertmsgs_coll = mmth_admin_data[
"cualertmsgs"]
214 for cualertmsgs_record
in mmth_admin_cualertmsgs_coll:
216 del cualertmsgs_record[
"alertid"]
221 collection=mmth_admin_cualertmsgs_coll
224 progress_dict[
"completed"] += 9
225 log_progress(progress_dict)
228 cucontact_coll = mmth_admin_data[
"cucontact"]
232 collection=cucontact_coll
235 progress_dict[
"completed"] += 1
236 log_progress(progress_dict)
239 extkey_coll = mmth_admin_data[
"extkey"]
240 for extkey_rec
in extkey_coll:
241 extk_accnum = get_strip_value_dict(
"accountnumber", extkey_rec)
242 assert extk_accnum
is not None 243 user_id = admin_transaction(
245 "{}memberacct".format(_cu.lower()),
246 where_conditions={
"accountnumber": extk_accnum},
247 select_columns=[
"primary_user"]
250 if len(user_id) == 1:
251 user_id = user_id[0][0]
256 extkey_rec[
"user_id"] = user_id
260 "{}extkey".format(_cu.lower()),
261 collection=extkey_coll
263 progress_dict[
"completed"] += 1
264 log_progress(progress_dict)
268 cualtroute_coll = mmth_admin_data[
"cualtroute"]
272 collection=cualtroute_coll
275 progress_dict[
"completed"] += 1
276 log_progress(progress_dict)
280 @pg_crsr_hndlr_decrtr
282 """Cleanup memhist content 284 If kwargs.get('commit_later') flag is True, we do not commit the 285 transaction here (and only cleanup database tables, not the branding 286 files), meaning that the the cleanup may have been executed before actual 287 migration and we do not want to commit the database delete just yet. 288 If commit_later flag is False, we commit the transaction here and proceed 289 with the file cleanup. 292 del_memhist_transaction: instance of PgTransaction to which this 293 cleanup process is part of 294 _cu: current credit union code 295 **kwargs: Optional parameters: 296 commit_later: flag to commit transaction later 298 accountnumber: if we want to filter delete 299 based on account number 302 SystemExit: if IOError, NameError or PermissionError is caught 303 psycopg2.Error, psycopg2.Warning on db operation errors 305 commit_later = kwargs.get(
"commit_later",
False)
307 where_condition_cu = {
"cu": _cu}
308 for tbl
in [
"cuauditadmin",
"cuadminallow",
"cuadminexclude"]:
309 del_admin_transaction(
312 where_conditions=where_condition_cu
315 admin_unames = del_admin_transaction(
318 select_columns=[
"user_name"],
319 where_conditions=where_condition_cu
322 for tbl
in [
"cucontact"]:
323 for admin_uname
in admin_unames:
324 del_admin_transaction(
327 where_conditions={
"user_name": admin_uname}
330 del_admin_transaction(
333 where_conditions=where_condition_cu
336 adm_tbls_no_schema_chng = [
348 for tbl
in adm_tbls_no_schema_chng:
349 del_admin_transaction(
352 where_conditions=where_condition_cu
355 del_admin_transaction(
357 "{}extkey".format(_cu.lower())
360 if os.path.exists(ADMIN_CUSURVEY_ID_MAP_CSV_FILE.format(_cu.lower())):
361 os.remove(ADMIN_CUSURVEY_ID_MAP_CSV_FILE.format(_cu.lower()))
365 del_admin_transaction.commit()
366 del_admin_transaction(
373 @pg_crsr_hndlr_decrtr
375 """Entry point to the admin migration. 378 cu: current credit union code 379 server: Mammoth endpoint server 380 action: one of the migration options to be 381 performed on settings data category 382 user: Mammoth monitor username 383 passwd: Mammoth monitor password 384 verbose: level of verbosity 385 reset: flag to cleanup tables before migration 388 psycopg2.Error, psycopg2.Warning on db operation errors 391 with pg_handler.PGSession()
as conn:
392 with conn.cursor()
as cur:
396 do_not_exist_list) = tables_exist_transaction(
402 if not tables_exist_flag:
403 error_msg = (
"Stopping migration. Following table" 404 " schemas do not exist: {}").format(
405 get_valid_json(
", ".join(do_not_exist_list)))
406 LOGGER.error(error_msg)
407 raise SystemExit(error_msg)
410 "All required target tables exist! Continuing migration..")
413 if action == ACTION_OPT_MIGRATE:
416 with pg_handler.PGSession()
as conn:
417 with conn.cursor()
as cur:
429 admin_migration.run()
431 LOGGER.info(
"Initiating migrating response data to odyssey")
436 with pg_handler.PGSession()
as conn:
437 with conn.cursor()
as cur:
453 admin_migration.response,
457 admin_transaction.commit()
467 LOGGER.info(
"Admin migration completed!")
470 elif action == ACTION_OPT_CLEAN:
471 with pg_handler.PGSession()
as conn:
472 with conn.cursor()
as cur:
476 LOGGER.info(
"Admin clean up completed!")
479 elif action == ACTION_OPT_SUMMARY:
480 with pg_handler.PGSession()
as conn:
481 with conn.cursor()
as cur:
def move_admin(admin_transaction, _mmth_admin_dict, _verbose, _cu)
def cleanup_admin(del_admin_transaction, _cu, **kwargs)
def migrate_admin(cu, server, action, user, passwd, verbose, reset)