Django

Code

Changeset 986

Show
Ignore:
Timestamp:
10/20/05 18:27:27 (3 years ago)
Author:
rjwittams
Message:

Changed how edit_inline works in the admin. Now it is done by a subclass of BoundRelatedObject?.
This means anyone using edit_inline="path/to/template" will need to subclass this ( or
TabularBoundRelatedObject? or StackedBoundRelatedObject?). The functionality may be restored if
it becomes obvious exactly what information should be available to these templates; before it
was kind of random.

So you can do
class MyBoundRelatedObject?(TabularBoundRelatedObject?):

def template_name(self):

return "path/to/template"

and then edit_inline=MyBoundRelatedObject? to duplicate the previous functionality.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/new-admin/django/contrib/admin/templates/admin/edit_inline_stacked.html

    r966 r986  
    11<fieldset class="module aligned"> 
    2    {% for fcw in form_field_collection_wrapper_list %}  
    3       <h2>{{relation.opts.verbose_name|capfirst }}&nbsp;#{{ forloop.counter }}</h2> 
    4       {% if fcw.show_url %}{% if fcw.obj.original %} 
     2   {% for fcw in bound_related_object.form_field_collection_wrappers %}  
     3      <h2>{{ bound_related_object.relation.opts.verbose_name|capfirst }}&nbsp;#{{ forloop.counter }}</h2> 
     4      {% if bound_related_object.show_url %}{% if fcw.obj.original %} 
    55      <p><a href="/r/{{ fcw.obj.original.content_type_id }}/{{ fcw.obj.original.id }}/">View on site</a></p> 
    66      {% endif %}{% endif %} 
     
    1414    {%endfor%} 
    1515</fieldset> 
    16  
  • django/branches/new-admin/django/contrib/admin/templates/admin/edit_inline_tabular.html

    r966 r986  
    11<fieldset class="module"> 
    2    <h2>{{relation.opts.verbose_name_plural|capfirst}}</h2><table> 
     2   <h2>{{bound_related_object.relation.opts.verbose_name_plural|capfirst}}</h2><table> 
    33   <thead><tr> 
    4    {% for fw in field_wrapper_list %} 
     4   {% for fw in bound_related_object.field_wrapper_list %} 
    55      {% if fw.needs_header %} 
    66         <th{{fw.header_class_attribute}}> {{fw.field.verbose_name|capfirst}}  </th> 
    77      {% endif %} 
    88   {% endfor %} 
    9    {% for fcw in form_field_collection_wrapper_list %}  
     9   {% for fcw in bound_related_object.form_field_collection_wrappers %}  
    1010        
    1111      {% if change %}{% if original_row_needed %} 
     
    2727         {% endif %} 
    2828      {% endfor %} 
    29       {% if fcw.show_url %}<td> 
     29      {% if bound_related_object.show_url %}<td> 
    3030         {% if fcw.obj.original %}<a href="/r/{{ fcw.obj.original.content_type_id }}/{{ fcw.obj.original.id }}/">View on site</a>{% endif %}  
    3131      </td>{% endif %} 
     
    3434   {% endfor %} </table> 
    3535 
    36    {% for fcw in form_field_collection_wrapper_list %} 
     36   {% for fcw in bound_related_object.form_field_collection_wrapper_list %} 
    3737      {% for bound_field in fcw.bound_fields %} 
    3838         {% if bound_field.not_in_table %} 
  • django/branches/new-admin/django/contrib/admin/templatetags/admin_modify.py

    r966 r986  
    55from django.utils.html import escape 
    66from django.utils.functional import curry 
    7  
    87from django.core.template.decorators import simple_tag, inclusion_tag 
    9  
    108from django.contrib.admin.views.main import AdminBoundField 
    119from django.core.meta.fields import BoundField, Field 
     10from django.core.meta import BoundRelatedObject, TABULAR, STACKED 
     11 
    1212import re 
    1313 
     
    123123                and self.field.rel.raw_id_admin 
    124124 
     125 
    125126class FormFieldCollectionWrapper(object): 
    126127    def __init__(self, field_mapping, fields): 
    127128        self.field_mapping = field_mapping 
    128129        self.fields = fields 
    129         self.bound_fields = [ AdminBoundField(field, self.field_mapping, field_mapping['original']) for field in self.fields ] 
    130  
    131     def showurl(self): 
    132         return False 
     130        self.bound_fields = [AdminBoundField(field, self.field_mapping, field_mapping['original']) for field in self.fields ] 
     131         
     132class TabularBoundRelatedObject(BoundRelatedObject): 
     133    def __init__(self, related_object, field_mapping, original): 
     134        super(TabularBoundRelatedObject, self).__init__(related_object, field_mapping, original) 
     135        self.field_wrapper_list = self.relation.editable_fields(FieldWrapper) 
     136        fields = self.relation.editable_fields() 
     137        self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping ,fields)  
     138                                                   for field_mapping in self.field_mappings]  
     139        self.original_row_needed = max([fw.use_raw_id_admin() for fw in self.field_wrapper_list])  
     140        self.show_url = original and hasattr(self.relation.opts, 'get_absolute_url') 
     141 
     142    def template_name(self): 
     143        return "admin/edit_inline_tabular" 
     144         
     145class StackedBoundRelatedObject(BoundRelatedObject): 
     146    def __init__(self, related_object, field_mapping, original): 
     147        super(StackedBoundRelatedObject, self).__init__(related_object, field_mapping, original) 
     148        fields = self.relation.editable_fields() 
     149        self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping ,fields)  
     150                                                   for field_mapping in self.field_mappings]  
     151        self.show_url = original and hasattr(self.relation.opts, 'get_absolute_url') 
     152                                                    
     153    def template_name(self): 
     154        return "admin/edit_inline_stacked" 
     155     
     156bound_related_object_overrides = { 
     157    TABULAR : TabularBoundRelatedObject, 
     158    STACKED : StackedBoundRelatedObject 
     159
    133160 
    134161class EditInlineNode(template.Node): 
     
    138165    def render(self, context): 
    139166        relation = template.resolve_variable(self.rel_var, context) 
    140         add, change = context['add'], context['change'] 
    141          
     167 
    142168        context.push() 
    143169 
    144         self.fill_context(relation, add, change, context) 
    145          
    146         t = template_loader.get_template(relation.field.rel.edit_inline) 
     170        klass = relation.field.rel.edit_inline 
     171        bound_related_object_class = bound_related_object_overrides.get(klass, klass) 
     172         
     173        original = context.get('original', None) 
     174         
     175        bound_related_object = relation.bind(context['form'], original, bound_related_object_class)  
     176        context['bound_related_object'] = bound_related_object 
     177         
     178        t = template_loader.get_template( bound_related_object.template_name() ) 
    147179         
    148180        output = t.render(context) 
     
    150182        context.pop() 
    151183        return output 
    152  
    153     def fill_context(self, relation, add, change, context): 
    154         field_wrapper_list = relation.editable_fields(FieldWrapper) 
    155  
    156         var_name = relation.opts.object_name.lower() 
    157          
    158         form = template.resolve_variable('form', context) 
    159         form_field_collections = form[relation.opts.module_name] 
    160         fields = relation.editable_fields() 
    161         form_field_collection_wrapper_list = [FormFieldCollectionWrapper(field_mapping ,fields) for field_mapping in form_field_collections]  
    162     
    163         context['field_wrapper_list'] = field_wrapper_list 
    164         context['form_field_collection_wrapper_list'] = form_field_collection_wrapper_list  
    165         context['num_headers'] = len(field_wrapper_list) 
    166         context['original_row_needed'] = max([fw.use_raw_id_admin() for fw in field_wrapper_list])  
    167184 
    168185 
     
    202219    if len(tokens) != 2: 
    203220        raise template.TemplateSyntaxError("%s takes 1 argument" % tokens[0]) 
    204     return node_factory(tokens[1])  
     221    return node_factory(tokens[1]) 
    205222 
    206223 
  • django/branches/new-admin/django/core/meta/fields.py

    r982 r986  
    1717 
    1818# Values for Relation.edit_inline. 
    19 TABULAR, STACKED = "admin/edit_inline_tabular", "admin/edit_inline_stacked" 
     19TABULAR, STACKED = 1, 2 
    2020 
    2121RECURSIVE_RELATIONSHIP_CONSTANT = 'self' 
  • django/branches/new-admin/django/core/meta/__init__.py

    r982 r986  
    147147    pass 
    148148 
    149  
     149class BoundRelatedObject(object): 
     150    def __init__(self,related_object, field_mapping, original): 
     151        self.relation = related_object 
     152        self.field_mappings = field_mapping[related_object.opts.module_name] 
     153     
     154    def template_name(self): 
     155        raise NotImplementedException 
     156     
     157    def __repr__(self): 
     158        return repr(self.__dict__) 
     159         
    150160class RelatedObject(object): 
    151161    def __init__(self,parent_opts, opts, field): 
     
    250260 
    251261        return fields 
    252  
    253 class BoundRelatedObject(object): 
    254     pass 
     262     
     263    def bind(self, field_mapping, original, bound_related_object_class=BoundRelatedObject): 
     264        return bound_related_object_class(self, field_mapping, original) 
    255265 
    256266class Options: 
     
    470480        return self._ordered_objects 
    471481 
    472     def has_field_type(self, field_type, follow): 
     482    def has_field_type(self, field_type, follow = None): 
    473483        """ 
    474484        Returns True if this object's admin form has at least one of the given 
     
    17551765def manipulator_validator_unique_together(field_name_list, opts, self, field_data, all_data): 
    17561766    from django.utils.text import get_text_list 
     1767     
    17571768    field_list = [opts.get_field(field_name) for field_name in field_name_list] 
    17581769    if isinstance(field_list[0].rel, ManyToOne): 
     
    17611772        kwargs = {'%s__iexact' % field_name_list[0]: field_data} 
    17621773    for f in field_list[1:]: 
     1774        # This is really not going to work for fields that have different form fields, eg DateTime  
     1775        # This validation needs to occur after html2python to be effective.  
    17631776        field_val = all_data.get(f.column, None) 
    17641777        if field_val is None: 
  • django/branches/new-admin/django/core/template/__init__.py

    r981 r986  
    196196                return True 
    197197        return False 
     198     
     199    def get(self, key, otherwise): 
     200        for dict in self.dicts: 
     201            if dict.has_key(key): 
     202                return dict[key] 
     203        return otherwise 
    198204 
    199205    def update(self, other_dict): 
  • django/branches/new-admin/django/core/template/loaders/app_directories.py

    r982 r986  
    88app_template_dirs = [] 
    99for app in INSTALLED_APPS: 
    10     try: 
    11         i = app.rfind('.') 
    12         m, a = app[:i], app[i+1:] 
    13         mod = getattr(__import__(m, '', '', [a]), a) 
    14         template_dir = os.path.join(os.path.dirname(mod.__file__), 'templates') 
    15         if os.path.isdir(template_dir): 
    16             app_template_dirs.append(template_dir) 
    17     except Exception, e: 
    18         print "exception loading" 
    19         print e 
    20         raise e 
     10    i = app.rfind('.') 
     11    m, a = app[:i], app[i+1:] 
     12    mod = getattr(__import__(m, '', '', [a]), a) 
     13    template_dir = os.path.join(os.path.dirname(mod.__file__), 'templates') 
     14    if os.path.isdir(template_dir): 
     15        app_template_dirs.append(template_dir) 
     16 
    2117         
    2218# It won't change, so convert it to a tuple to save memory. 
  • django/branches/new-admin/tests/runtests.py

    r982 r986  
    101101            try: 
    102102                cursor.execute("CREATE DATABASE %s" % TEST_DATABASE_NAME) 
    103                 print "created" 
    104103            except Exception, e: 
    105104                self.output(0, "There was an error creating the test database:%s " % str(e))