Django

Code

Changeset 6072

Show
Ignore:
Timestamp:
09/09/07 14:10:52 (1 year ago)
Author:
jkocherhans
Message:

newforms-admin: Refactored edit inline support classes.

Files:

Legend:

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

    r6029 r6072  
    119119    filter_vertical = () 
    120120    filter_horizontal = () 
     121    prepopulated_fields = {} 
     122 
    121123    def formfield_for_dbfield(self, db_field, **kwargs): 
    122124        """ 
     
    161163        # For any other type of field, just call its formfield() method. 
    162164        return db_field.formfield(**kwargs) 
     165 
     166    def fieldsets(self, request): 
     167        """ 
     168        Generator that yields Fieldset objects for use on add and change admin 
     169        form pages. 
     170 
     171        This default implementation looks at self.fields, but subclasses can 
     172        override this implementation and do something special based on the 
     173        given HttpRequest object. 
     174        """ 
     175        if self.fields is None: 
     176            default_fields = [f.name for f in self.opts.fields + self.opts.many_to_many if f.editable and not isinstance(f, models.AutoField)] 
     177            yield Fieldset(fields=default_fields) 
     178        else: 
     179            for name, options in self.fields: 
     180                yield Fieldset(name, options['fields'], classes=options.get('classes', '').split(' '), description=options.get('description')) 
    163181 
    164182class ModelAdmin(BaseModelAdmin): 
     
    176194    save_on_top = False 
    177195    ordering = None 
    178     prepopulated_fields = {} 
    179196    inlines = [] 
    180197 
    181     def __init__(self, model): 
     198    def __init__(self, model, admin_site): 
    182199        self.model = model 
    183200        self.opts = model._meta 
     201        self.admin_site = admin_site 
     202        self.inline_instances = [] 
     203        for inline_class in self.inlines: 
     204            inline_instance = inline_class(self.model, self.admin_site) 
     205            self.inline_instances.append(inline_instance) 
    184206 
    185207    def __call__(self, request, url): 
     
    222244    media = property(_media) 
    223245     
    224     def fieldsets(self, request): 
    225         """ 
    226         Generator that yields Fieldset objects for use on add and change admin 
    227         form pages. 
    228  
    229         This default implementation looks at self.fields, but subclasses can 
    230         override this implementation and do something special based on the 
    231         given HttpRequest object. 
    232         """ 
    233         if self.fields is None: 
    234             default_fields = [f.name for f in self.opts.fields + self.opts.many_to_many if f.editable and not isinstance(f, models.AutoField)] 
    235             yield Fieldset(fields=default_fields) 
    236         else: 
    237             for name, options in self.fields: 
    238                 yield Fieldset(name, options['fields'], classes=options.get('classes', '').split(' '), description=options.get('description')) 
    239  
    240246    def fieldsets_add(self, request): 
    241247        "Hook for specifying Fieldsets for the add form." 
     
    428434        for fs in inline_formsets: 
    429435            media = media + fs.media 
    430              
     436 
     437        inline_admin_formsets = [] 
     438        for inline, formset in zip(self.inline_instances, inline_formsets): 
     439            fieldsets = list(inline.fieldsets(request)) 
     440            inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets) 
     441            inline_admin_formsets.append(inline_admin_formset) 
     442 
    431443        c = template.RequestContext(request, { 
    432444            'title': _('Add %s') % opts.verbose_name, 
     
    435447            'show_delete': False, 
    436448            'media': media, 
    437             'bound_inlines': [BoundInline(i, fs) for i, fs in zip(self.inlines, inline_formsets)]
     449            'inline_admin_formsets': inline_admin_formsets
    438450        }) 
    439451        return render_change_form(self, model, model.AddManipulator(), c, add=True) 
     
    498510        for fs in inline_formsets: 
    499511            media = media + fs.media 
    500              
     512 
     513        inline_admin_formsets = [] 
     514        for inline, formset in zip(self.inline_instances, inline_formsets): 
     515            fieldsets = list(inline.fieldsets(request)) 
     516            inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets) 
     517            inline_admin_formsets.append(inline_admin_formset) 
     518 
    501519        c = template.RequestContext(request, { 
    502520            'title': _('Change %s') % opts.verbose_name, 
     
    506524            'is_popup': request.REQUEST.has_key('_popup'), 
    507525            'media': media, 
    508             'bound_inlines': [BoundInline(i, fs) for i, fs in zip(self.inlines, inline_formsets)]
     526            'inline_admin_formsets': inline_admin_formsets
    509527        }) 
    510528        return render_change_form(self, model, model.ChangeManipulator(object_id), c, change=True) 
     
    610628 
    611629    def get_inline_formsets(self): 
    612         inline_formset_classes = [] 
    613         for opts in self.inlines: 
    614             inline = forms.inline_formset(self.model, opts.model, formfield_callback=opts.formfield_for_dbfield, fields=opts.fields, extra=opts.extra) 
    615             inline_formset_classes.append(inline) 
    616         return inline_formset_classes 
     630        for inline in self.inline_instances: 
     631            yield inline.formset_class 
    617632 
    618633class InlineModelAdmin(BaseModelAdmin): 
     
    624639    ``ForeignKey`` to its parent. 
    625640    """ 
    626     def __init__(self, model, name=None, extra=3, fields=None, template=None, raw_id_fields=None): 
    627         self.model = model 
    628         self.opts = model._meta 
    629         self.name = name 
    630         self.extra = extra 
    631         self.fields = fields 
    632         self.template = template or self.default_template 
    633         self.verbose_name = model._meta.verbose_name 
    634         self.verbose_name_plural = model._meta.verbose_name_plural 
    635         self.prepopulated_fields = {} 
    636         self.raw_id_fields = raw_id_fields or () 
    637  
    638 class StackedInline(InlineModelAdmin): 
    639     default_template = 'admin/edit_inline_stacked.html' 
    640  
    641 class TabularInline(InlineModelAdmin): 
    642     default_template = 'admin/edit_inline_tabular.html' 
    643  
    644 class BoundInline(object): 
    645     def __init__(self, inline_admin, formset): 
    646         self.inline_admin = inline_admin 
    647         self.formset = formset 
    648         self.template = inline_admin.template 
    649  
    650     def __iter__(self): 
    651         for form, original in zip(self.formset.change_forms, self.formset.get_inline_objects()): 
    652             yield BoundInlineObject(self.formset, form, original, self.inline_admin) 
    653         for form in self.formset.add_forms: 
    654             yield BoundInlineObject(self.formset, form, None, self.inline_admin) 
    655  
    656     def fields(self): 
    657         return self.formset.form_class.base_fields.values() 
    658  
    659     def verbose_name(self): 
    660         return self.inline_admin.verbose_name 
    661  
    662     def verbose_name_plural(self): 
    663         return self.inline_admin.verbose_name_plural 
    664  
    665 class BoundInlineObject(object): 
    666     def __init__(self, formset, form, original, inline_admin): 
    667         self.formset = formset 
    668         self.inline_admin = inline_admin 
    669         self.base_form = form 
    670         self.form = AdminForm(form, self.fieldsets(), inline_admin.prepopulated_fields) 
    671         self.original = original 
    672  
    673     def fieldsets(self): 
     641    model = None 
     642    fk_name = None 
     643    extra = 3 
     644    template = None 
     645    label = None 
     646 
     647    def __init__(self, parent_model, admin_site): 
     648        self.admin_site = admin_site 
     649        self.parent_model = parent_model 
     650        self.opts = self.model._meta 
     651        # TODO: pass a fields arg into forms.inline_formset if/when we have one 
     652        self.formset_class = forms.inline_formset(parent_model, self.model, fk_name=self.fk_name, formfield_callback=self.formfield_for_dbfield, extra=self.extra) 
     653 
     654    def fieldsets(self, request): 
    674655        """ 
    675656        Generator that yields Fieldset objects for use on add and change admin 
     
    680661        given HttpRequest object. 
    681662        """ 
    682         if self.inline_admin.fields is None: 
    683             default_fields = [f for f in self.base_form.base_fields] 
    684             yield Fieldset(fields=default_fields) 
    685         else: 
    686             for name, options in self.opts.fields: 
     663        if self.fields is None: 
     664            yield Fieldset(fields=self.formset_class.form_class.base_fields) 
     665        else: 
     666            for name, options in self.fields: 
    687667                yield Fieldset(name, options['fields'], classes=options.get('classes', '').split(' '), description=options.get('description')) 
    688668 
     669class StackedInline(InlineModelAdmin): 
     670    template = 'admin/edit_inline_stacked.html' 
     671 
     672    def get_label(self): 
     673        return self.label or self.model._meta.verbose_name 
     674 
     675class TabularInline(InlineModelAdmin): 
     676    template = 'admin/edit_inline_tabular.html' 
     677 
     678    def get_label(self): 
     679        return self.label or self.model._meta.verbose_name_plural 
     680 
     681class InlineAdminFormSet(object): 
     682    """ 
     683    A wrapper around an inline formset for use in the admin system. 
     684    """ 
     685    def __init__(self, inline, formset, fieldsets): 
     686        self.opts = inline 
     687        self.formset = formset 
     688        self.fieldsets = fieldsets 
     689 
     690    def __iter__(self): 
     691        for form, original in zip(self.formset.change_forms, self.formset.get_inline_objects()): 
     692            yield InlineAdminForm(self.formset, form, self.fieldsets, self.opts.prepopulated_fields, original) 
     693        for form in self.formset.add_forms: 
     694            yield InlineAdminForm(self.formset, form, self.fieldsets, self.opts.prepopulated_fields, None) 
     695 
     696    def fields(self): 
     697        # TODO: this needs to respect the field order of self.fieldsets 
     698        return self.formset.form_class.base_fields.values() 
     699 
     700class InlineAdminForm(AdminForm): 
     701    """ 
     702    A wrapper around an inline form for use in the admin system. 
     703    """ 
     704    def __init__(self, formset, form, fieldsets, prepopulated_fields, original): 
     705        self.formset = formset 
     706        self.original = original 
     707        super(InlineAdminForm, self).__init__(form, fieldsets, prepopulated_fields) 
     708 
    689709    def pk_field(self): 
    690         return BoundField(self.base_form, self.formset._pk_field_name, False) 
     710        return BoundField(self.form, self.formset._pk_field_name, False) 
    691711 
    692712    def deletion_field(self): 
    693713        from django.newforms.formsets import DELETION_FIELD_NAME 
    694         return BoundField(self.base_form, DELETION_FIELD_NAME, False) 
     714        return BoundField(self.form, DELETION_FIELD_NAME, False) 
    695715 
    696716    def ordering_field(self): 
    697717        from django.newforms.formsets import ORDERING_FIELD_NAME 
    698         return BoundField(self.base_form, ORDERING_FIELD_NAME, False) 
     718        return BoundField(self.form, ORDERING_FIELD_NAME, False) 
  • django/branches/newforms-admin/django/contrib/admin/sites.py

    r6000 r6072  
    7878            if model in self._registry: 
    7979                raise AlreadyRegistered('The model %s is already registered' % model.__name__) 
    80             self._registry[model] = admin_class(model
     80            self._registry[model] = admin_class(model, self
    8181 
    8282    def unregister(self, model_or_iterable): 
  • django/branches/newforms-admin/django/contrib/admin/templates/admin/edit_inline_stacked.html

    r6055 r6072  
    1 {{ bound_inline.formset.management_form }} 
    2 {% for bound_inline_object in bound_inline %} 
     1{{ inline_admin_formset.formset.management_form }} 
     2{% for inline_admin_form in inline_admin_formset %} 
    33<fieldset class="module aligned {{ bfset.fieldset.classes }}"> 
    4   <h2>{{ bound_inline.verbose_name|title }}&nbsp;#{{ forloop.counter }}</h2> 
    5   {% for bfset in bound_inline_object.form %} 
    6       {% if bfset.fieldset.name %}<h2>{{ bfset.fieldset.name }}</h2>{% endif %} 
    7       {% if bfset.fieldset.description %}<div class="description">{{ bfset.fieldset.description }}</div>{% endif %} 
     4  <h2>{{ inline_admin_formset.opts.get_label|title }}&nbsp;#{{ forloop.counter }}</h2> 
     5  {% for bfset in inline_admin_form %} 
     6    <!-- fieldsets, headers, and descriptions are commented out until we have decent styles for them --> 
     7    <!--<fieldset>--> 
     8      <!--{% if bfset.fieldset.name %}<h2>{{ bfset.fieldset.name }}</h2>{% endif %}--> 
     9      <!--{% if bfset.fieldset.description %}<div class="description">{{ bfset.fieldset.description }}</div>{% endif %}--> 
    810      {% for line in bfset %} 
    911          <div class="form-row{% if line.errors %} errors{% endif %}"> 
     
    1921          </div> 
    2022      {% endfor %} 
    21       {{ bound_inline_object.pk_field.field }} 
    22       {% if bound_inline.formset.deletable %}<div class="form-row">{{ bound_inline_object.deletion_field.field }} {{ bound_inline_object.deletion_field.label_tag }}</div>{% endif %} 
     23    <!--</fieldset>--> 
    2324  {% endfor %} 
     25  {{ inline_admin_form.pk_field.field }} 
     26  {% if inline_admin_formset.formset.deletable %}<div class="form-row">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</div>{% endif %} 
    2427</fieldset> 
    2528{% endfor %} 
  • django/branches/newforms-admin/django/contrib/admin/templates/admin/edit_inline_tabular.html

    r6036 r6072  
    11{% load i18n %} 
    2 {{ bound_inline.formset.management_form }} 
     2{{ inline_admin_formset.formset.management_form }} 
    33<fieldset class="module"> 
    4    <h2>{{ bound_inline.verbose_name_plural|capfirst|escape }}</h2> 
     4   <h2>{{ inline_admin_formset.opts.get_label|capfirst|escape }}</h2> 
    55   <table> 
    66     <thead><tr> 
    7      {% if bound_inline.formset.deletable %}<th>{% trans "Delete" %}?</th>{% endif %} 
    8      {% for field in bound_inline.fields %} 
     7     {% if inline_admin_formset.formset.deletable %}<th>{% trans "Delete" %}?</th>{% endif %} 
     8     {% for field in inline_admin_formset.fields %} 
    99       {% if not field.is_hidden %} 
    1010         <th>{{ field.label|capfirst|escape }}</th> 
     
    1313     </tr></thead> 
    1414    
    15      {% for bound_inline_object in bound_inline %} 
     15     {% for inline_admin_form in inline_admin_formset %} 
    1616    
    1717        <!-- still need optional original object --> 
    1818         
    19         {% if bound_inline_object.form.form.errors %} 
     19        {% if inline_admin_form.form.errors %} 
    2020           <tr class="errorlist"><td colspan="{{ bound_inline.fields|length }}"> 
    21               {{ bound_inline_object.form.form.errors }} 
     21              {{ inline_admin_form.form.errors }} 
    2222           </tr> 
    2323        {% endif %} 
    2424         
    2525        <tr class="{% cycle row1,row2 %}"> 
    26         {{ bound_inline_object.pk_field.field }} 
    27         {% if bound_inline.formset.deletable %}<td>{{ bound_inline_object.deletion_field.field }}</td>{% endif %} 
    28         {% for bfset in bound_inline_object.form %} 
     26        {{ inline_admin_form.pk_field.field }} 
     27        {% if inline_admin_formset.formset.deletable %}<td>{{ inline_admin_form.deletion_field.field }}</td>{% endif %} 
     28        {% for bfset in inline_admin_form %} 
    2929          {% for line in bfset %} 
    3030            {% for field in line %}