From 7051fa73c6745033950090436cfd30b02d02ba4f Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Fri, 28 Jun 2024 10:32:34 -0500 Subject: Enable logging in script. --- scripts/migrate_existing_data.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/migrate_existing_data.py b/scripts/migrate_existing_data.py index 336ce72..1261462 100644 --- a/scripts/migrate_existing_data.py +++ b/scripts/migrate_existing_data.py @@ -6,6 +6,7 @@ import sys import json import time import random +import logging from pathlib import Path from uuid import UUID, uuid4 @@ -24,9 +25,11 @@ from gn_auth.auth.authorisation.resources.groups.models import ( from gn_auth.auth.authorisation.resources.models import ( Resource, ResourceCategory, __assign_resource_owner_role__) + class DataNotFound(Exception): """Raise if no admin user exists.""" + def sys_admins(conn: authdb.DbConnection) -> tuple[User, ...]: """Retrieve all the existing system admins.""" with authdb.cursor(conn) as cursor: @@ -38,6 +41,7 @@ def sys_admins(conn: authdb.DbConnection) -> tuple[User, ...]: return tuple(User.from_sqlite3_row(row) for row in cursor.fetchall()) return tuple() + def choose_admin(enum_admins: dict[int, User]) -> int: """Prompt and read user choice.""" while True: @@ -54,6 +58,7 @@ def choose_admin(enum_admins: dict[int, User]) -> int: sys.exit(0) print(f"\nERROR: Invalid choice '{choice}'!") + def select_sys_admin(admins: tuple[User, ...]) -> User: """Pick one admin out of list.""" if len(admins) > 0: @@ -67,6 +72,7 @@ def select_sys_admin(admins: tuple[User, ...]) -> User: raise DataNotFound( "No administrator user found. Create an administrator user first.") + def admin_group(conn: authdb.DbConnection, admin: User) -> Group: """Retrieve the admin's user group. If none exist, create one.""" with authdb.cursor(conn) as cursor: @@ -114,6 +120,7 @@ def admin_group(conn: authdb.DbConnection, admin: User) -> Group: cursor, admin, UUID(grp_res["resource_id"]), "group-leader") return new_group + def __resource_category_by_key__( cursor: authdb.DbCursor, category_key: str) -> ResourceCategory: """Retrieve a resource category by its ID.""" @@ -128,6 +135,7 @@ def __resource_category_by_key__( row["resource_category_key"], row["resource_category_description"]) + def __create_resources__(cursor: authdb.DbCursor) -> tuple[Resource, ...]: """Create default resources.""" resources = tuple(Resource( @@ -147,6 +155,7 @@ def __create_resources__(cursor: authdb.DbCursor) -> tuple[Resource, ...]: } for res in resources)) return resources + def default_resources(conn: authdb.DbConnection, group: Group) -> tuple[ Resource, ...]: """Create default resources, or return them if they exist.""" @@ -175,10 +184,12 @@ def default_resources(conn: authdb.DbConnection, group: Group) -> tuple[ tuple() ) for row in rows) + def delay(): """Delay a while: anything from 2 seconds to 15 seconds.""" time.sleep(random.choice(range(2,16))) + def __assigned_mrna__(authconn): """Retrieve assigned mRNA items.""" with authdb.cursor(authconn) as cursor: @@ -189,6 +200,7 @@ def __assigned_mrna__(authconn): (row["SpeciesId"], row["InbredSetId"], row["ProbeFreezeId"], row["ProbeSetFreezeId"]) for row in cursor.fetchall()) + def __unassigned_mrna__(bioconn, assigned): """Retrieve unassigned mRNA data items.""" query = ( @@ -210,6 +222,7 @@ def __unassigned_mrna__(bioconn, assigned): cursor.execute(query, tuple(item for row in assigned for item in row)) return (row for row in cursor.fetchall()) + def __assign_mrna__(authconn, bioconn, resource, group): "Assign any unassigned mRNA data to resource." while True: @@ -238,6 +251,7 @@ def __assign_mrna__(authconn, bioconn, resource, group): print(f"-> mRNA: Linked {len(unassigned)}") delay() + def __assigned_geno__(authconn): """Retrieve assigned genotype data.""" with authdb.cursor(authconn) as cursor: @@ -268,6 +282,7 @@ def __unassigned_geno__(bioconn, assigned): cursor.execute(query, tuple(item for row in assigned for item in row)) return (row for row in cursor.fetchall()) + def __assign_geno__(authconn, bioconn, resource, group): "Assign any unassigned Genotype data to resource." while True: @@ -296,6 +311,7 @@ def __assign_geno__(authconn, bioconn, resource, group): print(f"-> Genotype: Linked {len(unassigned)}") delay() + def __assigned_pheno__(authconn): """Retrieve assigned phenotype data.""" with authdb.cursor(authconn) as cursor: @@ -306,6 +322,7 @@ def __assigned_pheno__(authconn): row["SpeciesId"], row["InbredSetId"], row["PublishFreezeId"], row["PublishXRefId"]) for row in cursor.fetchall()) + def __unassigned_pheno__(bioconn, assigned): """Retrieve all unassigned Phenotype data.""" query = ( @@ -332,6 +349,7 @@ def __unassigned_pheno__(bioconn, assigned): cursor.execute(query, tuple(item for row in assigned for item in row)) return (row for row in cursor.fetchall()) + def __assign_pheno__(authconn, bioconn, resource, group): """Assign any unassigned Phenotype data to resource.""" while True: @@ -360,6 +378,7 @@ def __assign_pheno__(authconn, bioconn, resource, group): print(f"-> Phenotype: Linked {len(unassigned)}") delay() + def assign_data_to_resource( authconn, bioconn, resource: Resource, group: Group): """Assign existing data, not linked to any group to the resource.""" @@ -371,6 +390,7 @@ def assign_data_to_resource( return assigner_fns[resource.resource_category.resource_category_key]( authconn, bioconn, resource, group) + def entry(authdbpath, mysqldburi): """Entry-point for data migration.""" if not Path(authdbpath).exists(): @@ -394,12 +414,18 @@ def entry(authdbpath, mysqldburi): print(dnf.args[0], file=sys.stderr) sys.exit(1) + @click.command() @click.argument("authdbpath") # "Path to the Auth(entic|oris)ation database" @click.argument("mysqldburi") # "URI to the MySQL database with the biology data" -def run(authdbpath, mysqldburi): +@click.option("--loglevel", default="WARNING", show_default=True, + type=click.Choice(["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"])) +def run(authdbpath, mysqldburi, loglevel): """Setup command-line arguments.""" + globallogger = logging.getLogger() + globallogger.setLevel(loglevel) entry(authdbpath, mysqldburi) + if __name__ == "__main__": run() # pylint: disable=[no-value-for-parameter] -- cgit v1.2.3