Django

Code

Changeset 4343

Show
Ignore:
Timestamp:
01/16/07 23:39:29 (1 year ago)
Author:
adrian
Message:

newforms-admin: Finished migrating AdminOptions? to ModelForm?. AdminOptions? no longer exists. Things are still a bit messy.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin/django/contrib/admin/options.py

    r4342 r4343  
    3131    return "".join(res) 
    3232 
     33class 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 
     53class 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 
    3370class ModelAdmin(object): 
    3471    "Encapsulates all admin options and functionality for a given model." 
     
    4582    ordering = None 
    4683    js = None 
     84    fields = None 
    4785 
    4886    def __init__(self, model): 
     
    74112        else: 
    75113            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 
    76129 
    77130    def has_add_permission(self, request): 
     
    174227            c['object_id'] = object_id_override 
    175228 
    176         return render_change_form(model, manipulator, c, add=True) 
     229        return render_change_form(self, model, manipulator, c, add=True) 
    177230 
    178231    def change_view(self, request, object_id): 
     
    273326            'is_popup': request.REQUEST.has_key('_popup'), 
    274327        }) 
    275         return render_change_form(model, manipulator, c, change=True) 
     328        return render_change_form(self, model, manipulator, c, change=True) 
    276329 
    277330    def change_list_view(self, request): 
  • django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py

    r4333 r4343  
    4242        'show_delete_link': (not is_popup and context['has_delete_permission'] 
    4343                              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']), 
    4646        'show_save_and_continue': not is_popup and context['has_change_permission'], 
    4747        'show_save': True 
  • django/branches/newforms-admin/django/contrib/admin/views/main.py

    r4342 r4343  
    5858    if opts.get_ordered_objects(): 
    5959        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) 
    6262    seen_collapse = False 
    6363    for field_set in field_sets: 
     
    8282    if not model._meta.admin: 
    8383        raise Http404("This object has no admin interface.") 
    84     mav = model._meta.ModelAdmin(model) 
     84    mav = model._meta.admin(model) 
    8585    return mav(request, rest_of_url) 
    8686model_admin_view = staff_member_required(never_cache(model_admin_view)) 
     
    167167        return len(self.bound_field_lines) 
    168168 
    169 def render_change_form(model, manipulator, context, add=False, change=False, form_url=''): 
     169def render_change_form(model_admin, model, manipulator, context, add=False, change=False, form_url=''): 
    170170    opts = model._meta 
    171171    app_label = opts.app_label 
    172172    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) 
    174174    original = getattr(manipulator, 'original_object', None) 
    175175    bound_field_sets = [field_set.bind(context['form'], original, AdminBoundFieldSet) for field_set in field_sets] 
     
    193193        'opts': opts, 
    194194        '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, 
    196196    } 
    197197    context.update(extra_context) 
     
    306306        self.list_select_related = list_select_related 
    307307        self.list_per_page = list_per_page 
     308        self.model_admin = model_admin 
    308309 
    309310        # Get search parameters from the query string. 
     
    400401        # order descending by ID by default. Finally, look for manually-specified 
    401402        # 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] 
    403404 
    404405        # Normalize it to new-style ordering. 
  • django/branches/newforms-admin/django/core/management.py

    r4332 r4343  
    980980        # Check admin attribute. 
    981981        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.') 
    984985            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: 
    1023987                    try: 
    1024                         f = opts.get_field(opts.ModelAdmin.date_hierarchy
     988                        f = opts.get_field(fn
    1025989                    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) 
    10271024 
    10281025        # Check ordering attribute. 
  • django/branches/newforms-admin/django/db/models/base.py

    r4342 r4343  
    66from django.db.models.fields.related import OneToOneRel, ManyToOneRel 
    77from django.db.models.query import delete_objects 
    8 from django.db.models.options import Options, AdminOptions 
     8from django.db.models.options import Options 
    99from django.db import connection, backend, transaction 
    1010from django.db.models import signals 
     
    136136            # resulting class is same as if the 'class Admin' were a subclass 
    137137            # 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), {}) 
    142139        elif hasattr(value, 'contribute_to_class'): 
    143140            value.contribute_to_class(cls, name) 
  • django/branches/newforms-admin/django/db/models/__init__.py

    r4265 r4343  
    66from django.db.models.query import Q 
    77from django.db.models.manager import Manager 
    8 from django.db.models.base import Model, AdminOptions 
     8from django.db.models.base import Model 
    99from django.db.models.fields import * 
    1010from 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  
    197197                self._field_types[field_type] = False 
    198198        return self._field_types[field_type] 
    199  
    200 class AdminOptions(object): 
    201     def __init__(self, fields=None): 
    202         self.fields = fields 
    203  
    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.fields 
    210         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_list 
    218  
    219     def contribute_to_class(self, cls, name): 
    220         cls._meta.admin = self 
    221  
    222 class AdminFieldSet(object): 
    223     def __init__(self, name, classes, field_locator_func, line_specs, description): 
    224         self.name = name 
    225         self.field_lines = [AdminFieldLine(field_locator_func, line_spec) for line_spec in line_specs] 
    226         self.classes = classes 
    227         self.description = description 
    228  
    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_line 
    238  
    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 field 
    255  
    256     def __len__(self): 
    257         return len(self.fields) 
  • django/branches/newforms-admin/tests/regressiontests/invalid_admin_options/models.py

    r4273 r4343  
    99model_errors = "" 
    1010 
    11 # TODO: Invalid admin options should not cause a metaclass error 
    12 ##This should fail gracefully but is causing a metaclass error 
    13 #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          
    2311class ListDisplayBadOne(models.Model): 
    2412    "Test list_display, list_display must be a list or tuple"