Refactored the registry into a registry of models and fields. This will make it easier for migrations.

This commit is contained in:
Corey Oordt 2011-08-01 09:08:31 -04:00
parent 28bb8e53fd
commit 7e83b12a41
2 changed files with 24 additions and 9 deletions

View file

@ -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

View file

@ -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: