diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py index 29149bce3f..6b5388622e 100644 --- a/django/contrib/auth/models.py +++ b/django/contrib/auth/models.py @@ -26,9 +26,8 @@ class Group(models.Model): verbose_name = _('Group') verbose_name_plural = _('Groups') ordering = ('name',) - admin = models.Admin( - search_fields = ('name',), - ) + class Admin: + search_fields = ('name',) def __repr__(self): return self.name @@ -69,18 +68,17 @@ class User(models.Model): verbose_name_plural = _('Users') ordering = ('username',) exceptions = ('SiteProfileNotAvailable',) - admin = models.Admin( - fields = ( - (None, {'fields': ('username', 'password')}), - (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), - (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}), - (_('Important dates'), {'fields': ('last_login', 'date_joined')}), - (_('Groups'), {'fields': ('groups',)}), - ), - list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff'), - list_filter = ('is_staff', 'is_superuser'), - search_fields = ('username', 'first_name', 'last_name', 'email'), + class Admin: + fields = ( + (None, {'fields': ('username', 'password')}), + (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), + (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}), + (_('Important dates'), {'fields': ('last_login', 'date_joined')}), + (_('Groups'), {'fields': ('groups',)}), ) + list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff') + list_filter = ('is_staff', 'is_superuser') + search_fields = ('username', 'first_name', 'last_name', 'email') def __repr__(self): return self.username diff --git a/django/contrib/comments/models.py b/django/contrib/comments/models.py index 8d9880289d..5505b8a26f 100644 --- a/django/contrib/comments/models.py +++ b/django/contrib/comments/models.py @@ -91,18 +91,17 @@ class Comment(models.Model): verbose_name = _('Comment') verbose_name_plural = _('Comments') ordering = ('-submit_date',) - admin = models.Admin( - fields = ( - (None, {'fields': ('content_type', 'object_id', 'site')}), - ('Content', {'fields': ('user', 'headline', 'comment')}), - ('Ratings', {'fields': ('rating1', 'rating2', 'rating3', 'rating4', 'rating5', 'rating6', 'rating7', 'rating8', 'valid_rating')}), - ('Meta', {'fields': ('is_public', 'is_removed', 'ip_address')}), - ), - list_display = ('user', 'submit_date', 'content_type', 'get_content_object'), - list_filter = ('submit_date',), - date_hierarchy = 'submit_date', - search_fields = ('comment', 'user__username'), + class Admin: + fields = ( + (None, {'fields': ('content_type', 'object_id', 'site')}), + ('Content', {'fields': ('user', 'headline', 'comment')}), + ('Ratings', {'fields': ('rating1', 'rating2', 'rating3', 'rating4', 'rating5', 'rating6', 'rating7', 'rating8', 'valid_rating')}), + ('Meta', {'fields': ('is_public', 'is_removed', 'ip_address')}), ) + list_display = ('user', 'submit_date', 'content_type', 'get_content_object') + list_filter = ('submit_date',) + date_hierarchy = 'submit_date' + search_fields = ('comment', 'user__username') def __repr__(self): return "%s: %s..." % (self.get_user().username, self.comment[:100]) @@ -179,17 +178,16 @@ class FreeComment(models.Model): verbose_name = _('Free comment') verbose_name_plural = _('Free comments') ordering = ('-submit_date',) - admin = models.Admin( - fields = ( - (None, {'fields': ('content_type', 'object_id', 'site')}), - ('Content', {'fields': ('person_name', 'comment')}), - ('Meta', {'fields': ('submit_date', 'is_public', 'ip_address', 'approved')}), - ), - list_display = ('person_name', 'submit_date', 'content_type', 'get_content_object'), - list_filter = ('submit_date',), - date_hierarchy = 'submit_date', - search_fields = ('comment', 'person_name'), + class Admin: + fields = ( + (None, {'fields': ('content_type', 'object_id', 'site')}), + ('Content', {'fields': ('person_name', 'comment')}), + ('Meta', {'fields': ('submit_date', 'is_public', 'ip_address', 'approved')}), ) + list_display = ('person_name', 'submit_date', 'content_type', 'get_content_object') + list_filter = ('submit_date',) + date_hierarchy = 'submit_date' + search_fields = ('comment', 'person_name') def __repr__(self): return "%s: %s..." % (self.person_name, self.comment[:100]) diff --git a/django/contrib/flatpages/models.py b/django/contrib/flatpages/models.py index 18599f8ea1..9378e4d99d 100644 --- a/django/contrib/flatpages/models.py +++ b/django/contrib/flatpages/models.py @@ -18,14 +18,13 @@ class FlatPage(models.Model): verbose_name = _('flat page') verbose_name_plural = _('flat pages') ordering = ('url',) - admin = models.Admin( - fields = ( - (None, {'fields': ('url', 'title', 'content', 'sites')}), - ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}), - ), - list_filter = ('sites',), - search_fields = ('url', 'title'), + class Admin: + fields = ( + (None, {'fields': ('url', 'title', 'content', 'sites')}), + ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}), ) + list_filter = ('sites',) + search_fields = ('url', 'title') def __repr__(self): return "%s -- %s" % (self.url, self.title) diff --git a/django/contrib/redirects/models.py b/django/contrib/redirects/models.py index 98d03a9ade..d4e75527e2 100644 --- a/django/contrib/redirects/models.py +++ b/django/contrib/redirects/models.py @@ -14,10 +14,9 @@ class Redirect(models.Model): db_table = 'django_redirects' unique_together=(('site', 'old_path'),) ordering = ('old_path',) - admin = models.Admin( - list_filter = ('site',), - search_fields = ('old_path', 'new_path'), - ) + class Admin: + list_filter = ('site',) + search_fields = ('old_path', 'new_path') def __repr__(self): return "%s ---> %s" % (self.old_path, self.new_path) diff --git a/django/contrib/sites/models.py b/django/contrib/sites/models.py index cbeb26ff42..ec769bc9a9 100644 --- a/django/contrib/sites/models.py +++ b/django/contrib/sites/models.py @@ -14,10 +14,9 @@ class Site(models.Model): verbose_name = _('site') verbose_name_plural = _('sites') ordering = ('domain',) - admin = models.Admin( - list_display = ('domain', 'name'), - search_fields = ('domain', 'name'), - ) + class Admin: + list_display = ('domain', 'name') + search_fields = ('domain', 'name') def __repr__(self): return self.domain diff --git a/django/core/management.py b/django/core/management.py index ec86d59cc5..6a89eade46 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -806,8 +806,8 @@ def get_validation_errors(outfile): # Check admin attribute. if opts.admin is not None: - if not isinstance(opts.admin, models.Admin): - e.add(opts, '"admin" attribute, if given, must be set to a models.Admin() instance.') + if not isinstance(opts.admin, models.AdminOptions): + e.add(opts, '"admin" attribute, if given, must be set to a models.AdminOptions() instance.') else: # list_display if not isinstance(opts.admin.list_display, (list, tuple)): diff --git a/django/db/models/__init__.py b/django/db/models/__init__.py index a36869e5e4..60fbab8b10 100644 --- a/django/db/models/__init__.py +++ b/django/db/models/__init__.py @@ -9,7 +9,7 @@ from django.utils.text import capfirst from django.db.models.loading import get_installed_models, get_installed_model_modules from django.db.models.query import Q from django.db.models.manager import Manager -from django.db.models.base import Model +from django.db.models.base import Model, AdminOptions from django.db.models.fields import * from django.db.models.fields.related import * diff --git a/django/db/models/base.py b/django/db/models/base.py index 7513f5190f..4daab37fb7 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -1,10 +1,10 @@ import django.db.models.manipulators import django.db.models.manager -from django.db.models.fields import AutoField, ImageField, Admin +from django.db.models.fields import AutoField, ImageField from django.db.models.fields.related import OneToOne, ManyToOne from django.db.models.related import RelatedObject from django.db.models.query import orderlist2sql -from django.db.models.options import Options +from django.db.models.options import Options, AdminOptions from django.db import connection, backend from django.db.models import signals from django.dispatch import dispatcher @@ -20,7 +20,7 @@ import os if not hasattr(__builtins__, 'set'): from sets import Set as set -attribute_transforms = {'Admin': lambda cls: Admin(**cls.__dict__)} +attribute_transforms = {'Admin': lambda cls: AdminOptions(**dict([(k,v) for (k,v) in cls.__dict__.items() if not k.startswith('_')]))} class ModelBase(type): "Metaclass for all models" diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index b4a090dc73..f2312c5b16 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -790,35 +790,3 @@ class FieldSet(object): def __len__(self): return len(self.field_lines) - -class Admin: - def __init__(self, fields=None, js=None, list_display=None, list_filter=None, date_hierarchy=None, - save_as=False, ordering=None, search_fields=None, save_on_top=False, list_select_related=False): - self.fields = fields - self.js = js or [] - self.list_display = list_display or ['__repr__'] - self.list_filter = list_filter or [] - self.date_hierarchy = date_hierarchy - self.save_as, self.ordering = save_as, ordering - self.search_fields = search_fields or [] - self.save_on_top = save_on_top - self.list_select_related = list_select_related - - def get_field_sets(self, opts): - 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: - name = fieldset[0] - 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)) - return new_fieldset_list - - def contribute_to_class(self, cls, name): - cls._meta.admin = self \ No newline at end of file diff --git a/django/db/models/options.py b/django/db/models/options.py index b939fc9174..afe0567a93 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 +from django.db.models.fields import AutoField, FieldSet from django.db.models.loading import get_installed_model_modules from django.db.models.query import orderlist2sql from django.db.models.exceptions import FieldDoesNotExist @@ -216,3 +216,36 @@ class Options: else: self._field_types[field_type] = False return self._field_types[field_type] + + +class AdminOptions: + def __init__(self, fields=None, js=None, list_display=None, list_filter=None, date_hierarchy=None, + save_as=False, ordering=None, search_fields=None, save_on_top=False, list_select_related=False): + self.fields = fields + self.js = js or [] + self.list_display = list_display or ['__repr__'] + self.list_filter = list_filter or [] + self.date_hierarchy = date_hierarchy + self.save_as, self.ordering = save_as, ordering + self.search_fields = search_fields or [] + self.save_on_top = save_on_top + self.list_select_related = list_select_related + + def get_field_sets(self, opts): + 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: + name = fieldset[0] + 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)) + return new_fieldset_list + + def contribute_to_class(self, cls, name): + cls._meta.admin = self \ No newline at end of file