Source code for app_utils.scripts

"""Utilities and helpers for Python scripts."""

import inspect
import os
import sys
from pathlib import Path
from typing import Optional


[docs] def start_django( max_hops=10, django_project_name="myauth", settings_module="myauth.settings.local", silent=False, ) -> None: """Start the current Django project. This function encapsulates the boilerplate code needed to start the current Django project in a normal Python script. It will also try to detect the path to the current Django project. If it can not be found, the function will exit with code 1. Args: - max_hops: Max number of hops up on the main path to check - django_project_name: Name of the Django project - settings_module: Qualified name of the settings module in the Django project - silent: When True will not produce any output Here is an example how to use this function in a script: .. code-block:: python from app_utils.scripts import start_django start_django() def main(): # put Django imports here ... if __name__ == "__main__": main() ''' """ # calc path of caller script previous_frame = inspect.currentframe().f_back traceback = inspect.getframeinfo(previous_frame) caller_path = Path(traceback.filename).parent django_path = _find_django_path(caller_path, max_hops, django_project_name) if not django_path: if not silent: print( f"FATAL: Could not find the {django_project_name} " f"folder within {max_hops} hops in the path above {caller_path}" ) sys.exit(1) sys.path.insert(0, str(django_path)) if not silent: print(f"Starting Django ({django_path})") import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", settings_module) django.setup()
def _find_django_path( start_path: Path, max_search_depth: int, django_project_name: str ) -> Optional[Path]: parent_path = start_path for _ in range(max_search_depth): django_path = parent_path / django_project_name if django_path.exists() and (django_path / "manage.py").exists(): return django_path parent_path = parent_path.parent return None