1
0
mirror of https://github.com/django/django.git synced 2025-04-19 06:44:36 +00:00

magic-removal: Added checks to prevent creation of models with related/m2m field names that collide with defined field names

git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2146 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2006-01-28 17:58:44 +00:00
parent ce71979e53
commit feee6d8805
2 changed files with 37 additions and 3 deletions

View File

@ -27,6 +27,8 @@ get_ul_class = lambda x: 'radiolist%s' % ((x == HORIZONTAL) and ' inline' or '')
class FieldDoesNotExist(Exception):
pass
class FieldCollision(Exception):
pass
def manipulator_validator_unique(f, opts, self, field_data, all_data):
"Validates that the value is unique for this field."

View File

@ -1,6 +1,6 @@
from django.db.models.related import RelatedObject
from django.db.models.fields.related import ManyToMany
from django.db.models.fields import AutoField, FieldDoesNotExist
from django.db.models.fields import AutoField, FieldDoesNotExist, FieldCollision
from django.db.models.loading import get_models
from django.db.models.query import orderlist2sql
from bisect import bisect
@ -123,7 +123,23 @@ class Options:
for klass in get_models():
for f in klass._meta.fields:
if f.rel and self == f.rel.to._meta:
rel_objs.append(RelatedObject(f.rel.to, klass, f))
rel_obj = RelatedObject(f.rel.to, klass, f)
# Check to see if the new related field will clash with any
# existing fields, m2m fields, m2m related objects or related objects
if rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.fields]:
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
'.' + f.name + ' clashes with existing field on ' + self.object_name
elif rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.many_to_many]:
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
'.' + f.name + ' clashes with existing m2m field on ' + self.object_name
elif rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.get_all_related_many_to_many_objects()]:
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
'.' + f.name + ' clashes with existing related m2m field on ' + self.object_name
elif rel_obj.OLD_get_accessor_name() in [r.OLD_get_accessor_name() for r in rel_objs]:
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
'.' + f.name + ' clashes with existing related field on ' + self.object_name
else:
rel_objs.append(rel_obj)
self._all_related_objects = rel_objs
return rel_objs
@ -157,7 +173,23 @@ class Options:
for klass in get_models():
for f in klass._meta.many_to_many:
if f.rel and self == f.rel.to._meta:
rel_objs.append(RelatedObject(f.rel.to, klass, f))
rel_obj = RelatedObject(f.rel.to, klass, f)
# Check to see if the new related field will clash with any
# existing fields, m2m fields, m2m related objects or related objects
if rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.fields]:
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
'.' + f.name + ' clashes with existing field on ' + self.object_name
elif rel_obj.OLD_get_accessor_name() in [r.name for r in f.rel.to._meta.many_to_many]:
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
'.' + f.name + ' clashes with existing m2m field on ' + self.object_name
elif rel_obj.OLD_get_accessor_name() in [r.OLD_get_accessor_name() for r in f.rel.to._meta.get_all_related_objects()]:
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
'.' + f.name + ' clashes with existing related field on ' + self.object_name
elif rel_obj.OLD_get_accessor_name() in [r.name for r in rel_objs]:
raise FieldCollision, 'Related field ' + klass._meta.object_name + \
'.' + f.name + ' clashes with existing related m2m field on ' + self.object_name
else:
rel_objs.append(rel_obj)
self._all_related_many_to_many_objects = rel_objs
return rel_objs