From 7e83b12a41e12c4c5ac9824d557eb8d7acdf96ff Mon Sep 17 00:00:00 2001 From: Corey Oordt Date: Mon, 1 Aug 2011 09:08:31 -0400 Subject: [PATCH] Refactored the registry into a registry of models and fields. This will make it easier for migrations. --- categories/__init__.py | 27 +++++++++++++++++++++------ categories/admin.py | 6 +++--- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/categories/__init__.py b/categories/__init__.py index 213c686..8172e12 100644 --- a/categories/__init__.py +++ b/categories/__init__.py @@ -17,7 +17,8 @@ def get_version(): __version__ = get_version() -registry = {} +field_registry = {} +model_registry = {} try: import fields @@ -30,7 +31,16 @@ try: """ pass - registry = {} + # The field registry keeps track of the individual fields created. + # {'app.model.field': Field(**extra_params)} + # Useful for doing a schema migration + field_registry = {} + + # The model registry keeps track of which models have one or more fields + # registered. + # {'app': [model1, model2]} + # Useful for admin alteration + model_registry = {} def register_m2m(model, field_name='categories', extra_params={}): return _register(model, field_name, extra_params, fields.CategoryM2MField) @@ -39,16 +49,21 @@ try: return _register(model, field_name, extra_params, fields.CategoryFKField) def _register(model, field_name, extra_params={}, field=fields.CategoryFKField): - registry_name = "%s.%s" % (model.__name__, field_name) + app_label = model._meta.app_label + registry_name = ".".join((app_label, model.__name__, field_name)).lower() - if registry_name in registry: + if registry_name in field_registry: return #raise AlreadyRegistered - registry[registry_name] = model opts = model._meta try: opts.get_field(field_name) except FieldDoesNotExist: - field(**extra_params).contribute_to_class(model, field_name) + if app_label not in model_registry: + model_registry[app_label] = [] + if model not in model_registry[app_label]: + model_registry[app_label].append(model) + field_registry[registry_name] = field(**extra_params) + field_registry[registry_name].contribute_to_class(model, field_name) from categories import settings from django.core.exceptions import ImproperlyConfigured diff --git a/categories/admin.py b/categories/admin.py index a100e1c..933e712 100644 --- a/categories/admin.py +++ b/categories/admin.py @@ -8,7 +8,7 @@ from editor.tree_editor import TreeEditor from genericcollection import GenericCollectionTabularInline from settings import ALLOW_SLUG_CHANGE, RELATION_MODELS -from categories import registry +from categories import model_registry from models import Category class NullTreeNodeChoiceField(forms.ModelChoiceField): @@ -102,9 +102,9 @@ class CategoryAdmin(TreeEditor, admin.ModelAdmin): admin.site.register(Category, CategoryAdmin) for model, modeladmin in admin.site._registry.items(): - if model in registry.values() and modeladmin.fieldsets: + if model in model_registry.values() and modeladmin.fieldsets: fieldsets = getattr(modeladmin, 'fieldsets', ()) - fields = [cat.split('.')[1] for cat in registry if registry[cat] == model] + fields = [cat.split('.')[2] for cat in model_registry if model_registry[cat] == model] # check each field to see if already defined for cat in fields: for k,v in fieldsets: