1
0
mirror of https://github.com/django/django.git synced 2025-06-05 03:29:12 +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): class FieldDoesNotExist(Exception):
pass pass
class FieldCollision(Exception):
pass
def manipulator_validator_unique(f, opts, self, field_data, all_data): def manipulator_validator_unique(f, opts, self, field_data, all_data):
"Validates that the value is unique for this field." "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.related import RelatedObject
from django.db.models.fields.related import ManyToMany 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.loading import get_models
from django.db.models.query import orderlist2sql from django.db.models.query import orderlist2sql
from bisect import bisect from bisect import bisect
@ -123,7 +123,23 @@ class Options:
for klass in get_models(): for klass in get_models():
for f in klass._meta.fields: for f in klass._meta.fields:
if f.rel and self == f.rel.to._meta: 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 self._all_related_objects = rel_objs
return rel_objs return rel_objs
@ -157,7 +173,23 @@ class Options:
for klass in get_models(): for klass in get_models():
for f in klass._meta.many_to_many: for f in klass._meta.many_to_many:
if f.rel and self == f.rel.to._meta: 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 self._all_related_many_to_many_objects = rel_objs
return rel_objs return rel_objs