diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py index 73ced0c33d..1faf3fb9e6 100644 --- a/django/contrib/admin/templatetags/admin_modify.py +++ b/django/contrib/admin/templatetags/admin_modify.py @@ -5,7 +5,7 @@ from django.utils.html import escape from django.utils.text import capfirst from django.utils.functional import curry from django.db import models -from django.db.models.fields import BoundField, Field +from django.db.models.fields import Field from django.db.models.related import BoundRelatedObject from django.conf import settings import re @@ -205,7 +205,7 @@ def edit_inline(parser, token): edit_inline = register.tag(edit_inline) def admin_field_line(context, argument_val): - if isinstance(argument_val, BoundField): + if isinstance(argument_val, AdminBoundField): bound_fields = [argument_val] else: bound_fields = [bf for bf in argument_val] diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index ea764476d4..1cac88dec5 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -6,7 +6,6 @@ from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist, Per from django.core.paginator import ObjectPaginator, InvalidPage from django.shortcuts import get_object_or_404, render_to_response from django.db import models -from django.db.models.fields import BoundField, BoundFieldLine, BoundFieldSet from django.db.models.query import handle_legacy_orderlist from django.http import Http404, HttpResponse, HttpResponseRedirect from django.template import loader @@ -77,10 +76,11 @@ def get_javascript_imports(opts, auto_populated_fields, field_sets): break return js -class AdminBoundField(BoundField): +class AdminBoundField(object): def __init__(self, field, field_mapping, original): - super(AdminBoundField, self).__init__(field, field_mapping, original) - + self.field = field + self.original = original + self.form_fields = [field_mapping[name] for name in self.field.get_manipulator_field_names('')] self.element_id = self.form_fields[0].get_id() self.has_label_first = not isinstance(self.field, models.BooleanField) self.raw_id_admin = use_raw_id_admin(field) @@ -102,6 +102,10 @@ class AdminBoundField(BoundField): if field.rel: self.related_url = '../../../%s/%s/' % (field.rel.to._meta.app_label, field.rel.to._meta.object_name.lower()) + def original_value(self): + if self.original: + return self.original.__dict__[self.field.column] + def existing_display(self): try: return self._display @@ -125,18 +129,34 @@ class AdminBoundField(BoundField): return url_method() return '' -class AdminBoundFieldLine(BoundFieldLine): +class AdminBoundFieldLine(object): def __init__(self, field_line, field_mapping, original): - super(AdminBoundFieldLine, self).__init__(field_line, field_mapping, original, AdminBoundField) + self.bound_fields = [field.bind(field_mapping, original, AdminBoundField) for field in field_line] for bound_field in self: bound_field.first = True break -class AdminBoundFieldSet(BoundFieldSet): - def __init__(self, field_set, field_mapping, original): - super(AdminBoundFieldSet, self).__init__(field_set, field_mapping, original, AdminBoundFieldLine) + def __iter__(self): + for bound_field in self.bound_fields: + yield bound_field -class BoundManipulator(object): + def __len__(self): + return len(self.bound_fields) + +class AdminBoundFieldSet(object): + def __init__(self, field_set, field_mapping, original): + self.name = field_set.name + self.classes = field_set.classes + self.bound_field_lines = [field_line.bind(field_mapping, original, AdminBoundFieldLine) for field_line in field_set] + + def __iter__(self): + for bound_field_line in self.bound_field_lines: + yield bound_field_line + + def __len__(self): + return len(self.bound_field_lines) + +class AdminBoundManipulator(object): def __init__(self, model, manipulator, field_mapping): self.model = model self.opts = model._meta @@ -144,10 +164,6 @@ class BoundManipulator(object): self.original = getattr(manipulator, 'original_object', None) self.bound_field_sets = [field_set.bind(field_mapping, self.original, AdminBoundFieldSet) for field_set in self.opts.admin.get_field_sets(self.opts)] - -class AdminBoundManipulator(BoundManipulator): - def __init__(self, model, manipulator, field_mapping): - super(AdminBoundManipulator, self).__init__(model, manipulator, field_mapping) self.first_form_field_id = self.bound_field_sets[0].bound_field_lines[0].bound_fields[0].form_fields[0].get_id(); self.ordered_object_pk_names = [o.pk.name for o in self.opts.get_ordered_objects()] diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 9326789040..39d0b86438 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -36,19 +36,6 @@ def manipulator_validator_unique(f, opts, self, field_data, all_data): return raise validators.ValidationError, _("%(optname)s with this %(fieldname)s already exists.") % {'optname': capfirst(opts.verbose_name), 'fieldname': f.verbose_name} -class BoundField(object): - def __init__(self, field, field_mapping, original): - self.field = field - self.original = original - self.form_fields = [field_mapping[name] for name in self.field.get_manipulator_field_names('')] - - def original_value(self): - if self.original: - return self.original.__dict__[self.field.column] - - def __repr__(self): - return "BoundField:(%s, %s)" % (self.field.name, self.form_fields) - # A guide to Field parameters: # # * name: The name of the field specifed in the model. @@ -313,7 +300,7 @@ class Field(object): else: return self.editable - def bind(self, fieldmapping, original, bound_field_class=BoundField): + def bind(self, fieldmapping, original, bound_field_class): return bound_field_class(self, fieldmapping, original) class AutoField(Field): @@ -706,63 +693,3 @@ class OrderingField(IntegerField): def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True): return [forms.HiddenField(name_prefix + self.name)] - -class BoundFieldLine(object): - def __init__(self, field_line, field_mapping, original, bound_field_class=BoundField): - self.bound_fields = [field.bind(field_mapping, original, bound_field_class) for field in field_line] - - def __iter__(self): - for bound_field in self.bound_fields: - yield bound_field - - def __len__(self): - return len(self.bound_fields) - -class FieldLine(object): - def __init__(self, field_locator_func, linespec): - if isinstance(linespec, basestring): - self.fields = [field_locator_func(linespec)] - else: - self.fields = [field_locator_func(field_name) for field_name in linespec] - - def bind(self, field_mapping, original, bound_field_line_class=BoundFieldLine): - return bound_field_line_class(self, field_mapping, original) - - def __iter__(self): - for field in self.fields: - yield field - - def __len__(self): - return len(self.fields) - -class BoundFieldSet(object): - def __init__(self, field_set, field_mapping, original, bound_field_line_class=BoundFieldLine): - self.name = field_set.name - self.classes = field_set.classes - self.bound_field_lines = [field_line.bind(field_mapping,original, bound_field_line_class) for field_line in field_set] - - def __iter__(self): - for bound_field_line in self.bound_field_lines: - yield bound_field_line - - def __len__(self): - return len(self.bound_field_lines) - -class FieldSet(object): - def __init__(self, name, classes, field_locator_func, line_specs): - self.name = name - self.field_lines = [FieldLine(field_locator_func, line_spec) for line_spec in line_specs] - self.classes = classes - - def __repr__(self): - return "FieldSet: (%s, %s)" % (self.name, self.field_lines) - - def bind(self, field_mapping, original, bound_field_set_class=BoundFieldSet): - return bound_field_set_class(self, field_mapping, original) - - def __iter__(self): - for field_line in self.field_lines: - yield field_line - - def __len__(self): - return len(self.field_lines) diff --git a/django/db/models/options.py b/django/db/models/options.py index d2b9af7214..229b95af34 100644 --- a/django/db/models/options.py +++ b/django/db/models/options.py @@ -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, FieldSet +from django.db.models.fields import AutoField from django.db.models.loading import get_installed_model_modules from django.db.models.query import orderlist2sql from django.db.models.exceptions import FieldDoesNotExist @@ -237,8 +237,44 @@ class AdminOptions: fs_options = fieldset[1] classes = fs_options.get('classes', ()) line_specs = fs_options['fields'] - new_fieldset_list.append(FieldSet(name, classes, opts.get_field, line_specs)) + new_fieldset_list.append(AdminFieldSet(name, classes, opts.get_field, line_specs)) return new_fieldset_list def contribute_to_class(self, cls, name): - cls._meta.admin = self \ No newline at end of file + cls._meta.admin = self + +class AdminFieldLine(object): + def __init__(self, field_locator_func, linespec): + if isinstance(linespec, basestring): + self.fields = [field_locator_func(linespec)] + else: + self.fields = [field_locator_func(field_name) for field_name in linespec] + + def bind(self, field_mapping, original, bound_field_line_class): + return bound_field_line_class(self, field_mapping, original) + + def __iter__(self): + for field in self.fields: + yield field + + def __len__(self): + return len(self.fields) + +class AdminFieldSet(object): + def __init__(self, name, classes, field_locator_func, line_specs): + self.name = name + self.field_lines = [AdminFieldLine(field_locator_func, line_spec) for line_spec in line_specs] + self.classes = classes + + def __repr__(self): + return "FieldSet: (%s, %s)" % (self.name, self.field_lines) + + def bind(self, field_mapping, original, bound_field_set_class): + return bound_field_set_class(self, field_mapping, original) + + def __iter__(self): + for field_line in self.field_lines: + yield field_line + + def __len__(self): + return len(self.field_lines)