common.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. _class_registry_cache = {}
  2. _field_list_cache = []
  3. def _import_class(cls_name):
  4. """Cache mechanism for imports.
  5. Due to complications of circular imports mongoengine needs to do lots of
  6. inline imports in functions. This is inefficient as classes are
  7. imported repeated throughout the mongoengine code. This is
  8. compounded by some recursive functions requiring inline imports.
  9. :mod:`mongoengine.common` provides a single point to import all these
  10. classes. Circular imports aren't an issue as it dynamically imports the
  11. class when first needed. Subsequent calls to the
  12. :func:`~mongoengine.common._import_class` can then directly retrieve the
  13. class from the :data:`mongoengine.common._class_registry_cache`.
  14. """
  15. if cls_name in _class_registry_cache:
  16. return _class_registry_cache.get(cls_name)
  17. doc_classes = ('Document', 'DynamicEmbeddedDocument', 'EmbeddedDocument',
  18. 'MapReduceDocument')
  19. # Field Classes
  20. if not _field_list_cache:
  21. from mongoengine.fields import __all__ as fields
  22. _field_list_cache.extend(fields)
  23. from mongoengine.base.fields import __all__ as fields
  24. _field_list_cache.extend(fields)
  25. field_classes = _field_list_cache
  26. queryset_classes = ('OperationError',)
  27. deref_classes = ('DeReference',)
  28. if cls_name == 'BaseDocument':
  29. from mongoengine.base import document as module
  30. import_classes = ['BaseDocument']
  31. elif cls_name in doc_classes:
  32. from mongoengine import document as module
  33. import_classes = doc_classes
  34. elif cls_name in field_classes:
  35. from mongoengine import fields as module
  36. import_classes = field_classes
  37. elif cls_name in queryset_classes:
  38. from mongoengine import queryset as module
  39. import_classes = queryset_classes
  40. elif cls_name in deref_classes:
  41. from mongoengine import dereference as module
  42. import_classes = deref_classes
  43. else:
  44. raise ValueError('No import set for: ' % cls_name)
  45. for cls in import_classes:
  46. _class_registry_cache[cls] = getattr(module, cls)
  47. return _class_registry_cache.get(cls_name)