diff --git a/django_sorcery/db/__init__.py b/django_sorcery/db/__init__.py index 3b32748..9505a14 100644 --- a/django_sorcery/db/__init__.py +++ b/django_sorcery/db/__init__.py @@ -143,8 +143,18 @@ from __future__ import absolute_import, print_function, unicode_literals +from . import middleware from .sqlalchemy import SQLAlchemy # noqa from .utils import dbdict databases = dbdict() + + +class SQLAlchemyMiddleware(middleware.SQLAlchemyDBMiddleware): + + db = databases + + +# For backwards compat, we set it back to the middleware module +middleware.SQLAlchemyMiddleware = SQLAlchemyMiddleware diff --git a/django_sorcery/db/fields.py b/django_sorcery/db/fields.py index d390dda..ade2833 100644 --- a/django_sorcery/db/fields.py +++ b/django_sorcery/db/fields.py @@ -9,6 +9,8 @@ from django.core import validators as django_validators from django.forms import fields as djangofields +from .. import fields as sorceryfields + __all__ = [ "BigIntegerField", @@ -208,9 +210,7 @@ def get_type(self, type_class, type_kwargs): def get_form_class(self, kwargs): if self.type.enum_class: - from ..fields import EnumField - - return EnumField + return sorceryfields.EnumField return djangofields.TypedChoiceField diff --git a/django_sorcery/db/meta/__init__.py b/django_sorcery/db/meta/__init__.py index 884992c..830f24e 100644 --- a/django_sorcery/db/meta/__init__.py +++ b/django_sorcery/db/meta/__init__.py @@ -1,9 +1,32 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, print_function, unicode_literals +import sys +import types -if True: # skipping importanize, imports need to be in this order for py2 - from .column import * # noqa - from .model import * # noqa - from .composite import * # noqa - from .relations import * # noqa +class lazy_module(types.ModuleType): + def __init__(self, name, old_module, origins): + super(lazy_module, self).__init__(name) + self.origins = origins or {} + self.__dict__.update( + { + "__file__": old_module.__file__, + "__package__": old_module.__package__, + "__path__": old_module.__path__, + "__doc__": old_module.__doc__, + } + ) + + def __getattr__(self, name): + if name in self.origins: + module = __import__(self.__name__ + "." + self.origins[name], None, None, [name]) + return getattr(module, name) + return types.ModuleType.__getattribute__(self, name) + + +old_module = sys.modules[__name__] +sys.modules[__name__] = lazy_module( + __name__, + old_module, + {"model_info": "model", "Identity": "model", "relation_info": "relations", "column_info": "column"}, +) diff --git a/django_sorcery/db/meta/relations.py b/django_sorcery/db/meta/relations.py index a045b60..4f56e43 100644 --- a/django_sorcery/db/meta/relations.py +++ b/django_sorcery/db/meta/relations.py @@ -6,6 +6,8 @@ from django.core.exceptions import ImproperlyConfigured +from ...fields import ModelChoiceField, ModelMultipleChoiceField + class relation_info(object): """ @@ -114,8 +116,6 @@ def formfield(self, form_class=None, **kwargs): return form_class(self.related_model, **field_kwargs) def get_form_class(self): - from ...fields import ModelChoiceField, ModelMultipleChoiceField - if self.uselist: return ModelMultipleChoiceField diff --git a/django_sorcery/db/middleware.py b/django_sorcery/db/middleware.py index 9f2e9cf..6d55626 100644 --- a/django_sorcery/db/middleware.py +++ b/django_sorcery/db/middleware.py @@ -2,7 +2,6 @@ from __future__ import absolute_import, print_function, unicode_literals import logging -from . import databases from .signals import all_signals @@ -78,8 +77,3 @@ def commit(self, request, response): def remove(self, request, response): self.db.remove() - - -class SQLAlchemyMiddleware(SQLAlchemyDBMiddleware): - - db = databases diff --git a/django_sorcery/db/models.py b/django_sorcery/db/models.py index 94b7127..3d587c5 100644 --- a/django_sorcery/db/models.py +++ b/django_sorcery/db/models.py @@ -12,6 +12,7 @@ from django.utils.text import camel_case_to_spaces +from ..forms import model_to_dict as real_model_to_dict from . import meta, signals from .mixins import CleanMixin @@ -39,9 +40,7 @@ def get_identity_key(model, kwargs): def model_to_dict(instance, fields=None, exclude=None): warnings.warn("Deprecated, use django_sorcery.forms.model_to_dict instead.", DeprecationWarning) - from ..forms import model_to_dict - - return model_to_dict(instance, fields=fields, exclude=exclude) + return real_model_to_dict(instance, fields=fields, exclude=exclude) def simple_repr(instance, fields=None): diff --git a/django_sorcery/db/sqlalchemy.py b/django_sorcery/db/sqlalchemy.py index a918c9b..ff66d01 100644 --- a/django_sorcery/db/sqlalchemy.py +++ b/django_sorcery/db/sqlalchemy.py @@ -14,6 +14,7 @@ from ..utils import make_args from . import fields from .composites import BaseComposite, CompositeField +from .middleware import SQLAlchemyDBMiddleware from .models import Base, BaseMeta from .query import Query, QueryProperty from .relations import RelationsMixin @@ -239,8 +240,6 @@ def make_middleware(self): """ Creates a middleware to be used in a django application """ - from .middleware import SQLAlchemyDBMiddleware - return type(str("{}SQLAlchemyMiddleware".format(self.alias)), (SQLAlchemyDBMiddleware,), {"db": self}) def args(self, *args, **kwargs): diff --git a/django_sorcery/fields.py b/django_sorcery/fields.py index 5ea1c30..4518304 100644 --- a/django_sorcery/fields.py +++ b/django_sorcery/fields.py @@ -9,6 +9,7 @@ from django.forms import fields as djangofields from django.utils.translation import gettext_lazy +from .db import meta from .utils import suppress @@ -110,7 +111,6 @@ def __init__( self._choices = None self.model = model - from .db import meta self.model_info = meta.model_info(model) self.session = session diff --git a/django_sorcery/validators/__init__.py b/django_sorcery/validators/__init__.py index 7caeb01..65b39ea 100644 --- a/django_sorcery/validators/__init__.py +++ b/django_sorcery/validators/__init__.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, print_function, unicode_literals - -if True: - from .runner import ValidationRunner # noqa - from .base import * # noqa +from .base import * # noqa +from .runner import ValidationRunner # noqa diff --git a/django_sorcery/validators/base.py b/django_sorcery/validators/base.py index 169c623..b7512df 100644 --- a/django_sorcery/validators/base.py +++ b/django_sorcery/validators/base.py @@ -7,6 +7,8 @@ from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ +from ..db import meta + class ValidateTogetherModelFields(object): """ @@ -67,8 +69,6 @@ def __init__(self, session, *args, **kwargs): def __call__(self, m): clauses = [getattr(m.__class__, attr) == getattr(m, attr) for attr in self.attrs] - from ..db import meta - info = meta.model_info(m) state = info.sa_state(m) if state.persistent: diff --git a/tests/db/meta/test_column.py b/tests/db/meta/test_column.py index 2445318..983f174 100644 --- a/tests/db/meta/test_column.py +++ b/tests/db/meta/test_column.py @@ -75,12 +75,12 @@ def test_column_info_enum(self): def test_column_info_enum_from_class_from_info(self): col = sa.Column(sa.Enum(VehicleType), info={"form_class": djangofields.IntegerField}) info = meta.column_info(col, name="test") - self.assertIsInstance(info, meta.enum_column_info) + self.assertIsInstance(info, meta.column.enum_column_info) self.assertEqual(info.form_class, djangofields.IntegerField) def test_column_info_boolean_from_class_from_info(self): info = meta.column_info(sa.Column(sa.Boolean(), info={"form_class": djangofields.IntegerField}), name="test") - self.assertIsInstance(info, meta.boolean_column_info) + self.assertIsInstance(info, meta.column.boolean_column_info) self.assertEqual(info.form_class, djangofields.IntegerField) def test_column_info_validators(self):