Author: adrian
Date: 2007-01-16 23:39:29 -0600 (Tue, 16 Jan 2007)
New Revision: 4343
Modified:
django/branches/newforms-admin/django/contrib/admin/options.py
django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py
django/branches/newforms-admin/django/contrib/admin/views/main.py
django/branches/newforms-admin/django/core/management.py
django/branches/newforms-admin/django/db/models/__init__.py
django/branches/newforms-admin/django/db/models/base.py
django/branches/newforms-admin/django/db/models/options.py
django/branches/newforms-admin/tests/regressiontests/invalid_admin_options/models.py
Log:
newforms-admin: Finished migrating AdminOptions to ModelForm. AdminOptions no
longer exists. Things are still a bit messy.
Modified: django/branches/newforms-admin/django/contrib/admin/options.py
===================================================================
--- django/branches/newforms-admin/django/contrib/admin/options.py
2007-01-17 02:13:06 UTC (rev 4342)
+++ django/branches/newforms-admin/django/contrib/admin/options.py
2007-01-17 05:39:29 UTC (rev 4343)
@@ -30,6 +30,43 @@
myappend('_' + item)
return "".join(res)
+class AdminFieldSet(object):
+ def __init__(self, name, classes, field_locator_func, line_specs,
description):
+ self.name = name
+ self.field_lines = [AdminFieldLine(field_locator_func, line_spec) for
line_spec in line_specs]
+ self.classes = classes
+ self.description = description
+
+ 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)
+
+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 ModelAdmin(object):
"Encapsulates all admin options and functionality for a given model."
@@ -44,6 +81,7 @@
save_on_top = False
ordering = None
js = None
+ fields = None
def __init__(self, model):
self.model = model
@@ -74,6 +112,21 @@
else:
return self.change_view(request, unquote(url))
+ def get_field_sets(self, opts):
+ "Returns a list of AdminFieldSet objects."
+ if self.fields is None:
+ field_struct = ((None, {'fields': [f.name for f in opts.fields +
opts.many_to_many if f.editable and not isinstance(f, models.AutoField)]}),)
+ else:
+ field_struct = self.fields
+ new_fieldset_list = []
+ for fieldset in field_struct:
+ fs_options = fieldset[1]
+ classes = fs_options.get('classes', ())
+ description = fs_options.get('description', '')
+ new_fieldset_list.append(AdminFieldSet(fieldset[0], classes,
+ opts.get_field, fs_options['fields'], description))
+ return new_fieldset_list
+
def has_add_permission(self, request):
"Returns True if the given request has permission to add an object."
opts = self.opts
@@ -173,7 +226,7 @@
if object_id_override is not None:
c['object_id'] = object_id_override
- return render_change_form(model, manipulator, c, add=True)
+ return render_change_form(self, model, manipulator, c, add=True)
def change_view(self, request, object_id):
"The 'change' admin view for this model."
@@ -272,7 +325,7 @@
'original': manipulator.original_object,
'is_popup': request.REQUEST.has_key('_popup'),
})
- return render_change_form(model, manipulator, c, change=True)
+ return render_change_form(self, model, manipulator, c, change=True)
def change_list_view(self, request):
"The 'change list' admin view for this model."
Modified:
django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py
===================================================================
---
django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py
2007-01-17 02:13:06 UTC (rev 4342)
+++
django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py
2007-01-17 05:39:29 UTC (rev 4343)
@@ -41,8 +41,8 @@
and 'onclick="submitOrderForm();"' or ''),
'show_delete_link': (not is_popup and context['has_delete_permission']
and (change or context['show_delete'])),
- 'show_save_as_new': not is_popup and change and
opts.ModelAdmin.save_as,
- 'show_save_and_add_another': not is_popup and (not
opts.ModelAdmin.save_as or context['add']),
+ 'show_save_as_new': not is_popup and change and opts.admin.save_as,
+ 'show_save_and_add_another': not is_popup and (not opts.admin.save_as
or context['add']),
'show_save_and_continue': not is_popup and
context['has_change_permission'],
'show_save': True
}
Modified: django/branches/newforms-admin/django/contrib/admin/views/main.py
===================================================================
--- django/branches/newforms-admin/django/contrib/admin/views/main.py
2007-01-17 02:13:06 UTC (rev 4342)
+++ django/branches/newforms-admin/django/contrib/admin/views/main.py
2007-01-17 05:39:29 UTC (rev 4343)
@@ -57,8 +57,8 @@
js.extend(['js/calendar.js', 'js/admin/DateTimeShortcuts.js'])
if opts.get_ordered_objects():
js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' ,
'js/admin/ordering.js'])
- if opts.ModelAdmin.js:
- js.extend(opts.ModelAdmin.js)
+ if opts.admin.js:
+ js.extend(opts.admin.js)
seen_collapse = False
for field_set in field_sets:
if not seen_collapse and 'collapse' in field_set.classes:
@@ -81,7 +81,7 @@
raise Http404("App %r, model %r, not found" % (app_label, model_name))
if not model._meta.admin:
raise Http404("This object has no admin interface.")
- mav = model._meta.ModelAdmin(model)
+ mav = model._meta.admin(model)
return mav(request, rest_of_url)
model_admin_view = staff_member_required(never_cache(model_admin_view))
@@ -166,11 +166,11 @@
def __len__(self):
return len(self.bound_field_lines)
-def render_change_form(model, manipulator, context, add=False, change=False,
form_url=''):
+def render_change_form(model_admin, model, manipulator, context, add=False,
change=False, form_url=''):
opts = model._meta
app_label = opts.app_label
auto_populated_fields = [f for f in opts.fields if f.prepopulate_from]
- field_sets = opts.admin.get_field_sets(opts)
+ field_sets = model_admin.get_field_sets(opts)
original = getattr(manipulator, 'original_object', None)
bound_field_sets = [field_set.bind(context['form'], original,
AdminBoundFieldSet) for field_set in field_sets]
first_form_field_id =
bound_field_sets[0].bound_field_lines[0].bound_fields[0].form_fields[0].get_id();
@@ -192,7 +192,7 @@
'form_url': form_url,
'opts': opts,
'content_type_id': ContentType.objects.get_for_model(model).id,
- 'save_on_top': opts.ModelAdmin.save_on_top,
+ 'save_on_top': model_admin.save_on_top,
}
context.update(extra_context)
return render_to_response([
@@ -305,6 +305,7 @@
self.search_fields = search_fields
self.list_select_related = list_select_related
self.list_per_page = list_per_page
+ self.model_admin = model_admin
# Get search parameters from the query string.
try:
@@ -399,7 +400,7 @@
# then check the object's default ordering. If neither of those exist,
# order descending by ID by default. Finally, look for
manually-specified
# ordering from the query string.
- ordering = lookup_opts.ModelAdmin.ordering or lookup_opts.ordering or
['-' + lookup_opts.pk.name]
+ ordering = self.model_admin.ordering or lookup_opts.ordering or ['-' +
lookup_opts.pk.name]
# Normalize it to new-style ordering.
ordering = handle_legacy_orderlist(ordering)
Modified: django/branches/newforms-admin/django/core/management.py
===================================================================
--- django/branches/newforms-admin/django/core/management.py 2007-01-17
02:13:06 UTC (rev 4342)
+++ django/branches/newforms-admin/django/core/management.py 2007-01-17
05:39:29 UTC (rev 4343)
@@ -979,51 +979,48 @@
# Check admin attribute.
if opts.admin is not None:
- if not isinstance(opts.admin, models.AdminOptions):
- e.add(opts, '"admin" attribute, if given, must be set to a
models.AdminOptions() instance.')
+ # list_display
+ if not isinstance(opts.admin.list_display, (list, tuple)):
+ e.add(opts, '"admin.list_display", if given, must be set to a
list or tuple.')
else:
- # list_display
- if not isinstance(opts.ModelAdmin.list_display, (list, tuple)):
- e.add(opts, '"admin.list_display", if given, must be set
to a list or tuple.')
- else:
- for fn in opts.ModelAdmin.list_display:
- try:
- f = opts.get_field(fn)
- except models.FieldDoesNotExist:
- if not hasattr(cls, fn):
- e.add(opts, '"admin.list_display" refers to
%r, which isn\'t an attribute, method or property.' % fn)
- else:
- if isinstance(f, models.ManyToManyField):
- e.add(opts, '"admin.list_display" doesn\'t
support ManyToManyFields (%r).' % fn)
- # list_display_links
- if opts.ModelAdmin.list_display_links and not
opts.ModelAdmin.list_display:
- e.add(opts, '"admin.list_display" must be defined for
"admin.list_display_links" to be used.')
- if not isinstance(opts.ModelAdmin.list_display_links, (list,
tuple)):
- e.add(opts, '"admin.list_display_links", if given, must be
set to a list or tuple.')
- else:
- for fn in opts.ModelAdmin.list_display_links:
- try:
- f = opts.get_field(fn)
- except models.FieldDoesNotExist:
- if not hasattr(cls, fn):
- e.add(opts, '"admin.list_display_links" refers
to %r, which isn\'t an attribute, method or property.' % fn)
- if fn not in opts.ModelAdmin.list_display:
- e.add(opts, '"admin.list_display_links" refers to %r, which
is not defined in "admin.list_display".' % fn)
- # list_filter
- if not isinstance(opts.ModelAdmin.list_filter, (list, tuple)):
- e.add(opts, '"admin.list_filter", if given, must be set to
a list or tuple.')
- else:
- for fn in opts.ModelAdmin.list_filter:
- try:
- f = opts.get_field(fn)
- except models.FieldDoesNotExist:
- e.add(opts, '"admin.list_filter" refers to %r,
which isn\'t a field.' % fn)
- # date_hierarchy
- if opts.ModelAdmin.date_hierarchy:
+ for fn in opts.admin.list_display:
try:
- f = opts.get_field(opts.ModelAdmin.date_hierarchy)
+ f = opts.get_field(fn)
except models.FieldDoesNotExist:
- e.add(opts, '"admin.date_hierarchy" refers to %r,
which isn\'t a field.' % opts.ModelAdmin.date_hierarchy)
+ if not hasattr(cls, fn):
+ e.add(opts, '"admin.list_display" refers to %r,
which isn\'t an attribute, method or property.' % fn)
+ else:
+ if isinstance(f, models.ManyToManyField):
+ e.add(opts, '"admin.list_display" doesn\'t support
ManyToManyFields (%r).' % fn)
+ # list_display_links
+ if opts.admin.list_display_links and not opts.admin.list_display:
+ e.add(opts, '"admin.list_display" must be defined for
"admin.list_display_links" to be used.')
+ if not isinstance(opts.admin.list_display_links, (list, tuple)):
+ e.add(opts, '"admin.list_display_links", if given, must be set
to a list or tuple.')
+ else:
+ for fn in opts.admin.list_display_links:
+ try:
+ f = opts.get_field(fn)
+ except models.FieldDoesNotExist:
+ if not hasattr(cls, fn):
+ e.add(opts, '"admin.list_display_links" refers to
%r, which isn\'t an attribute, method or property.' % fn)
+ if fn not in opts.admin.list_display:
+ e.add(opts, '"admin.list_display_links" refers to %r, which is
not defined in "admin.list_display".' % fn)
+ # list_filter
+ if not isinstance(opts.admin.list_filter, (list, tuple)):
+ e.add(opts, '"admin.list_filter", if given, must be set to a
list or tuple.')
+ else:
+ for fn in opts.admin.list_filter:
+ try:
+ f = opts.get_field(fn)
+ except models.FieldDoesNotExist:
+ e.add(opts, '"admin.list_filter" refers to %r, which
isn\'t a field.' % fn)
+ # date_hierarchy
+ if opts.admin.date_hierarchy:
+ try:
+ f = opts.get_field(opts.admin.date_hierarchy)
+ except models.FieldDoesNotExist:
+ e.add(opts, '"admin.date_hierarchy" refers to %r, which
isn\'t a field.' % opts.admin.date_hierarchy)
# Check ordering attribute.
if opts.ordering:
Modified: django/branches/newforms-admin/django/db/models/__init__.py
===================================================================
--- django/branches/newforms-admin/django/db/models/__init__.py 2007-01-17
02:13:06 UTC (rev 4342)
+++ django/branches/newforms-admin/django/db/models/__init__.py 2007-01-17
05:39:29 UTC (rev 4343)
@@ -5,7 +5,7 @@
from django.db.models.loading import get_apps, get_app, get_models, get_model,
register_models
from django.db.models.query import Q
from django.db.models.manager import Manager
-from django.db.models.base import Model, AdminOptions
+from django.db.models.base import Model
from django.db.models.fields import *
from django.db.models.fields.related import ForeignKey, OneToOneField,
ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel, TABULAR, STACKED
from django.db.models.fields.generic import GenericRelation, GenericRel,
GenericForeignKey
Modified: django/branches/newforms-admin/django/db/models/base.py
===================================================================
--- django/branches/newforms-admin/django/db/models/base.py 2007-01-17
02:13:06 UTC (rev 4342)
+++ django/branches/newforms-admin/django/db/models/base.py 2007-01-17
05:39:29 UTC (rev 4343)
@@ -5,7 +5,7 @@
from django.db.models.fields import AutoField, ImageField, FieldDoesNotExist
from django.db.models.fields.related import OneToOneRel, ManyToOneRel
from django.db.models.query import delete_objects
-from django.db.models.options import Options, AdminOptions
+from django.db.models.options import Options
from django.db import connection, backend, transaction
from django.db.models import signals
from django.db.models.loading import register_models, get_model
@@ -135,10 +135,7 @@
# of both ModelAdmin and the 'class Admin' on this model. The
# resulting class is same as if the 'class Admin' were a subclass
# of ModelAdmin.
- cls._meta.ModelAdmin = type('ModelAdmin', (value, ModelAdmin), {})
- # This AdminOptions stuff is legacy and will eventually be removed.
- 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')]))
- value.contribute_to_class(cls, name)
+ cls._meta.admin = type('ModelAdmin', (value, ModelAdmin), {})
elif hasattr(value, 'contribute_to_class'):
value.contribute_to_class(cls, name)
else:
Modified: django/branches/newforms-admin/django/db/models/options.py
===================================================================
--- django/branches/newforms-admin/django/db/models/options.py 2007-01-17
02:13:06 UTC (rev 4342)
+++ django/branches/newforms-admin/django/db/models/options.py 2007-01-17
05:39:29 UTC (rev 4343)
@@ -196,62 +196,3 @@
else:
self._field_types[field_type] = False
return self._field_types[field_type]
-
-class AdminOptions(object):
- def __init__(self, fields=None):
- self.fields = fields
-
- def get_field_sets(self, opts):
- "Returns a list of AdminFieldSet objects for this AdminOptions object."
- if self.fields is None:
- field_struct = ((None, {'fields': [f.name for f in opts.fields +
opts.many_to_many if f.editable and not isinstance(f, AutoField)]}),)
- else:
- field_struct = self.fields
- new_fieldset_list = []
- for fieldset in field_struct:
- fs_options = fieldset[1]
- classes = fs_options.get('classes', ())
- description = fs_options.get('description', '')
- new_fieldset_list.append(AdminFieldSet(fieldset[0], classes,
- opts.get_field, fs_options['fields'], description))
- return new_fieldset_list
-
- def contribute_to_class(self, cls, name):
- cls._meta.admin = self
-
-class AdminFieldSet(object):
- def __init__(self, name, classes, field_locator_func, line_specs,
description):
- self.name = name
- self.field_lines = [AdminFieldLine(field_locator_func, line_spec) for
line_spec in line_specs]
- self.classes = classes
- self.description = description
-
- 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)
-
-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)
Modified:
django/branches/newforms-admin/tests/regressiontests/invalid_admin_options/models.py
===================================================================
---
django/branches/newforms-admin/tests/regressiontests/invalid_admin_options/models.py
2007-01-17 02:13:06 UTC (rev 4342)
+++
django/branches/newforms-admin/tests/regressiontests/invalid_admin_options/models.py
2007-01-17 05:39:29 UTC (rev 4343)
@@ -8,18 +8,6 @@
from django.db import models
model_errors = ""
-# TODO: Invalid admin options should not cause a metaclass error
-##This should fail gracefully but is causing a metaclass error
-#class BadAdminOption(models.Model):
-# "Test nonexistent admin option"
-# name = models.CharField(maxlength=30)
-#
-# class Admin:
-# nonexistent = 'option'
-#
-#model_errors += """invalid_admin_options.badadminoption: "admin" attribute,
if given, must be set to a models.AdminOptions() instance.
-#"""
-
class ListDisplayBadOne(models.Model):
"Test list_display, list_display must be a list or tuple"
first_name = models.CharField(maxlength=30)
@@ -334,4 +322,4 @@
# manager = 'nonexistent'
#
#model_errors += """invalid_admin_options.managerbad: "admin.manager" refers to 'nonexistent', which isn't a Manager().
-#"""
\ No newline at end of file
+#"""
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Django
updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---