Source code for shopyo.api.database

import importlib
import os
import sys

import click

from shopyo.api.constants import SEP_CHAR
from shopyo.api.constants import SEP_NUM


[docs] def autoload_models(verbose=False): """ Auto imports models from modules/ in desired file. Used so that flask_migrate does not miss models when migrating Returns ------- None """ click.echo("Auto importing models...") click.echo(SEP_CHAR * SEP_NUM) for folder in os.listdir("modules"): if folder.startswith("__"): continue elif folder.startswith("box__"): for sub_folder in os.listdir(os.path.join("modules", folder)): if sub_folder.startswith("__"): # ignore __pycache__ continue elif sub_folder.endswith(".json"): # box_info.json continue try: to_load_submodel = f"modules.{folder}.{sub_folder}.models" mod = importlib.import_module(to_load_submodel) if verbose: click.echo(f"[x] imported {to_load_submodel}") from init import db for attr_name in dir(mod): attr = getattr(mod, attr_name) if ( isinstance(attr, type) and issubclass(attr, db.Model) and attr != db.Model ): click.echo(f" - Found model: {attr.__name__}") except Exception as e: if verbose: click.echo(f"[ ] {e}") else: try: to_load = f"modules.{folder}.models" mod = importlib.import_module(to_load) if verbose: click.echo(f"[x] imported {to_load}") from init import db for attr_name in dir(mod): attr = getattr(mod, attr_name) if ( isinstance(attr, type) and issubclass(attr, db.Model) and attr != db.Model ): click.echo(f" - Found model: {attr.__name__}") except Exception as e: if verbose: click.echo(f"[ ] {e}") # installed modules try: from init import installed_packages except ImportError: installed_packages = [] for plugin in installed_packages: try: to_load_models = f"{plugin}.models" mod = importlib.import_module(to_load_models) if verbose: click.echo(f"[x] imported {to_load_models}") from init import db for attr_name in dir(mod): attr = getattr(mod, attr_name) if ( isinstance(attr, type) and issubclass(attr, db.Model) and attr != db.Model ): click.echo(f" - Found model: {attr.__name__}") except Exception as e: if verbose: click.echo(f"[ ] {e}") # manually initialized extensions try: from flask import current_app if current_app: for ext_name in current_app.extensions: if ext_name.startswith("shopyo_"): try: to_load_models = f"{ext_name}.models" mod = importlib.import_module(to_load_models) if verbose: click.echo(f"[x] imported {to_load_models} from extensions") from init import db for attr_name in dir(mod): attr = getattr(mod, attr_name) if ( isinstance(attr, type) and issubclass(attr, db.Model) and attr != db.Model ): click.echo(f" - Found model: {attr.__name__}") except ImportError: pass except Exception as e: if verbose: click.echo(f"[ ] Error loading models for {ext_name}: {e}") except RuntimeError: pass # No application context click.echo("")