From 4e8f490714b78e82436073e724960b56b441bdfa Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Mon, 16 May 2011 08:56:01 -0400 Subject: [PATCH] Enable registering of models in settings. --- categories/__init__.py | 55 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/categories/__init__.py b/categories/__init__.py index f83f522..a57b861 100644 --- a/categories/__init__.py +++ b/categories/__init__.py @@ -21,17 +21,17 @@ registry = {} try: import fields - + from django.db.models import FieldDoesNotExist - + class AlreadyRegistered(Exception): """ An attempt was made to register a model more than once. """ pass - + registry = {} - + def register_m2m(model, field_name='categories', extra_params={}): return _register(model, field_name, extra_params, fields.CategoryM2MField) @@ -40,6 +40,7 @@ try: def _register(model, field_name, extra_params={}, field=fields.CategoryFKField): registry_name = "%s.%s" % (model.__name__, field_name) + if registry_name in registry: return #raise AlreadyRegistered registry[registry_name] = model @@ -48,5 +49,51 @@ try: opts.get_field(field_name) except FieldDoesNotExist: field(**extra_params).contribute_to_class(model, field_name) + + from categories import settings + from django.core.exceptions import ImproperlyConfigured + from django.db.models import get_model + + for key, value in settings.FK_REGISTRY.items(): + model = get_model(*key.split('.')) + if model is None: + raise ImproperlyConfigured('%s is not a model' % key) + if isinstance(value, (tuple, list)): + for item in value: + if isinstance(item, basestring): + register_fk(model, item) + elif isinstance(item, dict): + field_name = item.pop('name') + register_fk(model, field_name, extra_params=item) + else: + raise ImproperlyConfigured("CATEGORY_SETTINGS['FK_REGISTRY'] doesn't recognize the value of %s" % key) + elif isinstance(value, basestring): + register_fk(model, value) + elif isinstance(item, dict): + field_name = item.pop('name') + register_fk(model, field_name, extra_params=item) + else: + raise ImproperlyConfigured("CATEGORY_SETTINGS['FK_REGISTRY'] doesn't recognize the value of %s" % key) + for key, value in settings.M2M_REGISTRY.items(): + model = get_model(*key.split('.')) + if model is None: + raise ImproperlyConfigured('%s is not a model' % key) + if isinstance(value, (tuple, list)): + for item in value: + if isinstance(item, basestring): + register_m2m(model, item) + elif isinstance(item, dict): + field_name = item.pop('name') + register_m2m(model, field_name, extra_params=item) + else: + raise ImproperlyConfigured("CATEGORY_SETTINGS['M2M_REGISTRY'] doesn't recognize the value of %s: %s" % (key, item)) + elif isinstance(value, basestring): + register_m2m(model, value) + elif isinstance(value, dict): + field_name = value.pop('name') + register_m2m(model, field_name, extra_params=value) + else: + raise ImproperlyConfigured("CATEGORY_SETTINGS['M2M_REGISTRY'] doesn't recognize the value of %s" % key) + except ImportError: pass