diff --git a/asyncron/apps.py b/asyncron/apps.py index 4d00a2e..63ce55e 100644 --- a/asyncron/apps.py +++ b/asyncron/apps.py @@ -3,7 +3,7 @@ from django.conf import settings from django.apps import apps import os, pathlib, importlib, types - +import tomllib class AsyncronConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' @@ -19,6 +19,7 @@ class AsyncronConfig(AppConfig): #if settings.DEBUG: # os.environ['PYTHONASYNCIODEBUG'] = "1" + self.load_model_auxilaries() self.load_extensions() #Init the asyncron worker for this process @@ -40,6 +41,45 @@ class AsyncronConfig(AppConfig): loader = importlib.machinery.SourceFileLoader( f"{app.name}.{name}", str(import_file) ) loader.exec_module( types.ModuleType(loader.name) ) + def load_model_auxilaries( self ): + """ + Loads auxilary (passive) data from the models.toml file of each app. + Data is either a keyword argument of a field, or an allowed Meta class value. + + There should be no database defining values set the toml file: + - ModelName.Meta.verbose_name -> Allowed + - ModelName.Meta.unique_together -> Bad Idea / Undefined Behaviour + - ModelName.help_text.a_field_name -> Allowed (string) + - ModelName.null.a_field_name -> Bad Idea / Undefined Behaviour + """ + + from .base.models import BaseModel + + for app in apps.get_app_configs(): + app_dir = pathlib.Path(app.path) + toml_file = app_dir / "models.toml" + if not toml_file.exists(): continue + + with open(toml_file, 'rb') as f: + model_auxilaries = tomllib.load(f) + + for model in app.get_models(): + + if not issubclass( model, BaseModel ): continue + if model.__name__ not in model_auxilaries: continue + aux = model_auxilaries[model.__name__] + + if 'Meta' in aux: + for k, v in aux.pop('Meta').items(): + setattr(model._meta, k, v) + + for field_kwarg, field_nv in aux.items(): + for field_name, field_kwarg_value in field_nv.items(): + if not hasattr(model, field_name): continue + + field = getattr(model, field_name).field + if not getattr(field, field_kwarg, None): #Set only as default or empty replacements + setattr(field, field_kwarg, field_kwarg_value) def load_extensions( self ): from .base.models import BaseModel diff --git a/asyncron/management/commands/_closet.py b/asyncron/management/commands/_closet.py new file mode 100644 index 0000000..a503bcb --- /dev/null +++ b/asyncron/management/commands/_closet.py @@ -0,0 +1,31 @@ +## +# +# Command: python manage.py startasyncron +# +## + +import traceback, logging +import asyncio +import time + +from django.core.management.base import BaseCommand, CommandError +from django.conf import settings + + +class Command( BaseCommand ): + help = "Asyncron's Closet Creation and Management tool" + + def handle( self, *args, **kwargs ): + print( self, args, kwargs ) + + + def add_arguments( self, parser ): + subparsers = parser.add_subparsers(title = "list of sub-commands") + + # create the parser for the "a" command + show_parser = subparsers.add_parser('show', help = 'show [app_name]') + show_parser.add_argument('app_name', default = "") + + # create the parser for the "b" command + create_parser = subparsers.add_parser('create', help='create app_name') + create_parser.add_argument('app_name')