Changeset 4343
- Timestamp:
- 01/16/07 23:39:29 (1 year ago)
- Files:
-
- django/branches/newforms-admin/django/contrib/admin/options.py (modified) (5 diffs)
- django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py (modified) (1 diff)
- django/branches/newforms-admin/django/contrib/admin/views/main.py (modified) (6 diffs)
- django/branches/newforms-admin/django/core/management.py (modified) (1 diff)
- django/branches/newforms-admin/django/db/models/base.py (modified) (2 diffs)
- django/branches/newforms-admin/django/db/models/__init__.py (modified) (1 diff)
- django/branches/newforms-admin/django/db/models/options.py (modified) (1 diff)
- django/branches/newforms-admin/tests/regressiontests/invalid_admin_options/models.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/newforms-admin/django/contrib/admin/options.py
r4342 r4343 31 31 return "".join(res) 32 32 33 class AdminFieldSet(object): 34 def __init__(self, name, classes, field_locator_func, line_specs, description): 35 self.name = name 36 self.field_lines = [AdminFieldLine(field_locator_func, line_spec) for line_spec in line_specs] 37 self.classes = classes 38 self.description = description 39 40 def __repr__(self): 41 return "FieldSet: (%s, %s)" % (self.name, self.field_lines) 42 43 def bind(self, field_mapping, original, bound_field_set_class): 44 return bound_field_set_class(self, field_mapping, original) 45 46 def __iter__(self): 47 for field_line in self.field_lines: 48 yield field_line 49 50 def __len__(self): 51 return len(self.field_lines) 52 53 class AdminFieldLine(object): 54 def __init__(self, field_locator_func, linespec): 55 if isinstance(linespec, basestring): 56 self.fields = [field_locator_func(linespec)] 57 else: 58 self.fields = [field_locator_func(field_name) for field_name in linespec] 59 60 def bind(self, field_mapping, original, bound_field_line_class): 61 return bound_field_line_class(self, field_mapping, original) 62 63 def __iter__(self): 64 for field in self.fields: 65 yield field 66 67 def __len__(self): 68 return len(self.fields) 69 33 70 class ModelAdmin(object): 34 71 "Encapsulates all admin options and functionality for a given model." … … 45 82 ordering = None 46 83 js = None 84 fields = None 47 85 48 86 def __init__(self, model): … … 74 112 else: 75 113 return self.change_view(request, unquote(url)) 114 115 def get_field_sets(self, opts): 116 "Returns a list of AdminFieldSet objects." 117 if self.fields is None: 118 field_struct = ((None, {'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, models.AutoField)]}),) 119 else: 120 field_struct = self.fields 121 new_fieldset_list = [] 122 for fieldset in field_struct: 123 fs_options = fieldset[1] 124 classes = fs_options.get('classes', ()) 125 description = fs_options.get('description', '') 126 new_fieldset_list.append(AdminFieldSet(fieldset[0], classes, 127 opts.get_field, fs_options['fields'], description)) 128 return new_fieldset_list 76 129 77 130 def has_add_permission(self, request): … … 174 227 c['object_id'] = object_id_override 175 228 176 return render_change_form( model, manipulator, c, add=True)229 return render_change_form(self, model, manipulator, c, add=True) 177 230 178 231 def change_view(self, request, object_id): … … 273 326 'is_popup': request.REQUEST.has_key('_popup'), 274 327 }) 275 return render_change_form( model, manipulator, c, change=True)328 return render_change_form(self, model, manipulator, c, change=True) 276 329 277 330 def change_list_view(self, request): django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py
r4333 r4343 42 42 'show_delete_link': (not is_popup and context['has_delete_permission'] 43 43 and (change or context['show_delete'])), 44 'show_save_as_new': not is_popup and change and opts. ModelAdmin.save_as,45 'show_save_and_add_another': not is_popup and (not opts. ModelAdmin.save_as or context['add']),44 'show_save_as_new': not is_popup and change and opts.admin.save_as, 45 'show_save_and_add_another': not is_popup and (not opts.admin.save_as or context['add']), 46 46 'show_save_and_continue': not is_popup and context['has_change_permission'], 47 47 'show_save': True django/branches/newforms-admin/django/contrib/admin/views/main.py
r4342 r4343 58 58 if opts.get_ordered_objects(): 59 59 js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' , 'js/admin/ordering.js']) 60 if opts. ModelAdmin.js:61 js.extend(opts. ModelAdmin.js)60 if opts.admin.js: 61 js.extend(opts.admin.js) 62 62 seen_collapse = False 63 63 for field_set in field_sets: … … 82 82 if not model._meta.admin: 83 83 raise Http404("This object has no admin interface.") 84 mav = model._meta. ModelAdmin(model)84 mav = model._meta.admin(model) 85 85 return mav(request, rest_of_url) 86 86 model_admin_view = staff_member_required(never_cache(model_admin_view)) … … 167 167 return len(self.bound_field_lines) 168 168 169 def render_change_form(model , manipulator, context, add=False, change=False, form_url=''):169 def render_change_form(model_admin, model, manipulator, context, add=False, change=False, form_url=''): 170 170 opts = model._meta 171 171 app_label = opts.app_label 172 172 auto_populated_fields = [f for f in opts.fields if f.prepopulate_from] 173 field_sets = opts.admin.get_field_sets(opts)173 field_sets = model_admin.get_field_sets(opts) 174 174 original = getattr(manipulator, 'original_object', None) 175 175 bound_field_sets = [field_set.bind(context['form'], original, AdminBoundFieldSet) for field_set in field_sets] … … 193 193 'opts': opts, 194 194 'content_type_id': ContentType.objects.get_for_model(model).id, 195 'save_on_top': opts.ModelAdmin.save_on_top,195 'save_on_top': model_admin.save_on_top, 196 196 } 197 197 context.update(extra_context) … … 306 306 self.list_select_related = list_select_related 307 307 self.list_per_page = list_per_page 308 self.model_admin = model_admin 308 309 309 310 # Get search parameters from the query string. … … 400 401 # order descending by ID by default. Finally, look for manually-specified 401 402 # ordering from the query string. 402 ordering = lookup_opts.ModelAdmin.ordering or lookup_opts.ordering or ['-' + lookup_opts.pk.name]403 ordering = self.model_admin.ordering or lookup_opts.ordering or ['-' + lookup_opts.pk.name] 403 404 404 405 # Normalize it to new-style ordering. django/branches/newforms-admin/django/core/management.py
r4332 r4343 980 980 # Check admin attribute. 981 981 if opts.admin is not None: 982 if not isinstance(opts.admin, models.AdminOptions): 983 e.add(opts, '"admin" attribute, if given, must be set to a models.AdminOptions() instance.') 982 # list_display 983 if not isinstance(opts.admin.list_display, (list, tuple)): 984 e.add(opts, '"admin.list_display", if given, must be set to a list or tuple.') 984 985 else: 985 # list_display 986 if not isinstance(opts.ModelAdmin.list_display, (list, tuple)): 987 e.add(opts, '"admin.list_display", if given, must be set to a list or tuple.') 988 else: 989 for fn in opts.ModelAdmin.list_display: 990 try: 991 f = opts.get_field(fn) 992 except models.FieldDoesNotExist: 993 if not hasattr(cls, fn): 994 e.add(opts, '"admin.list_display" refers to %r, which isn\'t an attribute, method or property.' % fn) 995 else: 996 if isinstance(f, models.ManyToManyField): 997 e.add(opts, '"admin.list_display" doesn\'t support ManyToManyFields (%r).' % fn) 998 # list_display_links 999 if opts.ModelAdmin.list_display_links and not opts.ModelAdmin.list_display: 1000 e.add(opts, '"admin.list_display" must be defined for "admin.list_display_links" to be used.') 1001 if not isinstance(opts.ModelAdmin.list_display_links, (list, tuple)): 1002 e.add(opts, '"admin.list_display_links", if given, must be set to a list or tuple.') 1003 else: 1004 for fn in opts.ModelAdmin.list_display_links: 1005 try: 1006 f = opts.get_field(fn) 1007 except models.FieldDoesNotExist: 1008 if not hasattr(cls, fn): 1009 e.add(opts, '"admin.list_display_links" refers to %r, which isn\'t an attribute, method or property.' % fn) 1010 if fn not in opts.ModelAdmin.list_display: 1011 e.add(opts, '"admin.list_display_links" refers to %r, which is not defined in "admin.list_display".' % fn) 1012 # list_filter 1013 if not isinstance(opts.ModelAdmin.list_filter, (list, tuple)): 1014 e.add(opts, '"admin.list_filter", if given, must be set to a list or tuple.') 1015 else: 1016 for fn in opts.ModelAdmin.list_filter: 1017 try: 1018 f = opts.get_field(fn) 1019 except models.FieldDoesNotExist: 1020 e.add(opts, '"admin.list_filter" refers to %r, which isn\'t a field.' % fn) 1021 # date_hierarchy 1022 if opts.ModelAdmin.date_hierarchy: 986 for fn in opts.admin.list_display: 1023 987 try: 1024 f = opts.get_field( opts.ModelAdmin.date_hierarchy)988 f = opts.get_field(fn) 1025 989 except models.FieldDoesNotExist: 1026 e.add(opts, '"admin.date_hierarchy" refers to %r, which isn\'t a field.' % opts.ModelAdmin.date_hierarchy) 990 if not hasattr(cls, fn): 991 e.add(opts, '"admin.list_display" refers to %r, which isn\'t an attribute, method or property.' % fn) 992 else: 993 if isinstance(f, models.ManyToManyField): 994 e.add(opts, '"admin.list_display" doesn\'t support ManyToManyFields (%r).' % fn) 995 # list_display_links 996 if opts.admin.list_display_links and not opts.admin.list_display: 997 e.add(opts, '"admin.list_display" must be defined for "admin.list_display_links" to be used.') 998 if not isinstance(opts.admin.list_display_links, (list, tuple)): 999 e.add(opts, '"admin.list_display_links", if given, must be set to a list or tuple.') 1000 else: 1001 for fn in opts.admin.list_display_links: 1002 try: 1003 f = opts.get_field(fn) 1004 except models.FieldDoesNotExist: 1005 if not hasattr(cls, fn): 1006 e.add(opts, '"admin.list_display_links" refers to %r, which isn\'t an attribute, method or property.' % fn) 1007 if fn not in opts.admin.list_display: 1008 e.add(opts, '"admin.list_display_links" refers to %r, which is not defined in "admin.list_display".' % fn) 1009 # list_filter 1010 if not isinstance(opts.admin.list_filter, (list, tuple)): 1011 e.add(opts, '"admin.list_filter", if given, must be set to a list or tuple.') 1012 else: 1013 for fn in opts.admin.list_filter: 1014 try: 1015 f = opts.get_field(fn) 1016 except models.FieldDoesNotExist: 1017 e.add(opts, '"admin.list_filter" refers to %r, which isn\'t a field.' % fn) 1018 # date_hierarchy 1019 if opts.admin.date_hierarchy: 1020 try: 1021 f = opts.get_field(opts.admin.date_hierarchy) 1022 except models.FieldDoesNotExist: 1023 e.add(opts, '"admin.date_hierarchy" refers to %r, which isn\'t a field.' % opts.admin.date_hierarchy) 1027 1024 1028 1025 # Check ordering attribute. django/branches/newforms-admin/django/db/models/base.py
r4342 r4343 6 6 from django.db.models.fields.related import OneToOneRel, ManyToOneRel 7 7 from django.db.models.query import delete_objects 8 from django.db.models.options import Options , AdminOptions8 from django.db.models.options import Options 9 9 from django.db import connection, backend, transaction 10 10 from django.db.models import signals … … 136 136 # resulting class is same as if the 'class Admin' were a subclass 137 137 # of ModelAdmin. 138 cls._meta.ModelAdmin = type('ModelAdmin', (value, ModelAdmin), {}) 139 # This AdminOptions stuff is legacy and will eventually be removed. 140 value = AdminOptions(**dict([(k, v) for k, v in value.__dict__.items() if not k.startswith('_') and k not in ('list_display', 'list_display_links', 'list_filter', 'date_hierarchy', 'save_as', 'search_fields', 'list_select_related', 'list_per_page', 'ordering', 'save_on_top', 'js', 'manager')])) 141 value.contribute_to_class(cls, name) 138 cls._meta.admin = type('ModelAdmin', (value, ModelAdmin), {}) 142 139 elif hasattr(value, 'contribute_to_class'): 143 140 value.contribute_to_class(cls, name) django/branches/newforms-admin/django/db/models/__init__.py
r4265 r4343 6 6 from django.db.models.query import Q 7 7 from django.db.models.manager import Manager 8 from django.db.models.base import Model , AdminOptions8 from django.db.models.base import Model 9 9 from django.db.models.fields import * 10 10 from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel, TABULAR, STACKED django/branches/newforms-admin/django/db/models/options.py
r4342 r4343 197 197 self._field_types[field_type] = False 198 198 return self._field_types[field_type] 199 200 class AdminOptions(object):201 def __init__(self, fields=None):202 self.fields = fields203 204 def get_field_sets(self, opts):205 "Returns a list of AdminFieldSet objects for this AdminOptions object."206 if self.fields is None:207 field_struct = ((None, {'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, AutoField)]}),)208 else:209 field_struct = self.fields210 new_fieldset_list = []211 for fieldset in field_struct:212 fs_options = fieldset[1]213 classes = fs_options.get('classes', ())214 description = fs_options.get('description', '')215 new_fieldset_list.append(AdminFieldSet(fieldset[0], classes,216 opts.get_field, fs_options['fields'], description))217 return new_fieldset_list218 219 def contribute_to_class(self, cls, name):220 cls._meta.admin = self221 222 class AdminFieldSet(object):223 def __init__(self, name, classes, field_locator_func, line_specs, description):224 self.name = name225 self.field_lines = [AdminFieldLine(field_locator_func, line_spec) for line_spec in line_specs]226 self.classes = classes227 self.description = description228 229 def __repr__(self):230 return "FieldSet: (%s, %s)" % (self.name, self.field_lines)231 232 def bind(self, field_mapping, original, bound_field_set_class):233 return bound_field_set_class(self, field_mapping, original)234 235 def __iter__(self):236 for field_line in self.field_lines:237 yield field_line238 239 def __len__(self):240 return len(self.field_lines)241 242 class AdminFieldLine(object):243 def __init__(self, field_locator_func, linespec):244 if isinstance(linespec, basestring):245 self.fields = [field_locator_func(linespec)]246 else:247 self.fields = [field_locator_func(field_name) for field_name in linespec]248 249 def bind(self, field_mapping, original, bound_field_line_class):250 return bound_field_line_class(self, field_mapping, original)251 252 def __iter__(self):253 for field in self.fields:254 yield field255 256 def __len__(self):257 return len(self.fields)django/branches/newforms-admin/tests/regressiontests/invalid_admin_options/models.py
r4273 r4343 9 9 model_errors = "" 10 10 11 # TODO: Invalid admin options should not cause a metaclass error12 ##This should fail gracefully but is causing a metaclass error13 #class BadAdminOption(models.Model):14 # "Test nonexistent admin option"15 # name = models.CharField(maxlength=30)16 #17 # class Admin:18 # nonexistent = 'option'19 #20 #model_errors += """invalid_admin_options.badadminoption: "admin" attribute, if given, must be set to a models.AdminOptions() instance.21 #"""22 23 11 class ListDisplayBadOne(models.Model): 24 12 "Test list_display, list_display must be a list or tuple"
