From 87fc49b36d47af931415177d442ee7310172e4eb Mon Sep 17 00:00:00 2001 From: Brian Rosner Date: Fri, 22 Jan 2010 09:23:39 +0000 Subject: [PATCH] Fixed #95 -- don't stomp over attributes/fields of a model in tagging.register git-svn-id: https://django-tagging.googlecode.com/svn/trunk@174 83e7428b-ec2a-0410-86f2-bf466d0e5e72 --- tagging/__init__.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/tagging/__init__.py b/tagging/__init__.py index 9a6b78e4..281a63fa 100644 --- a/tagging/__init__.py +++ b/tagging/__init__.py @@ -1,30 +1,50 @@ -from django.utils.translation import ugettext as _ - from tagging.managers import ModelTaggedItemManager, TagDescriptor + + VERSION = (0, 4, 'pre') + + class AlreadyRegistered(Exception): """ An attempt was made to register a model more than once. """ pass + registry = [] + def register(model, tag_descriptor_attr='tags', tagged_item_manager_attr='tagged'): """ Sets the given model class up for working with tags. """ + if model in registry: - raise AlreadyRegistered( - _('The model %s has already been registered.') % model.__name__) - registry.append(model) + raise AlreadyRegistered("The model '%s' has already been " + "registered." % model._meta.object_name) + if hasattr(model, tag_descriptor_attr): + raise AttributeError("'%s' already has an attribute '%s'. You must " + "provide a custom tag_descriptor_attr to register." % ( + model._meta.object_name, + tag_descriptor_attr, + ) + ) + if hasattr(model, tagged_item_manager_attr): + raise AttributeError("'%s' already has an attribute '%s'. You must " + "provide a custom tagged_item_manager_attr to register." % ( + model._meta.object_name, + tagged_item_manager_attr, + ) + ) # Add tag descriptor setattr(model, tag_descriptor_attr, TagDescriptor()) # Add custom manager - ModelTaggedItemManager().contribute_to_class(model, - tagged_item_manager_attr) + ModelTaggedItemManager().contribute_to_class(model, tagged_item_manager_attr) + + # Finally register in registry + registry.append(model)