Django

Code

Changeset 802

Show
Ignore:
Timestamp:
10/08/05 09:28:21 (3 years ago)
Author:
rjwittams
Message:

Fixed token parsing bug in the error stuff.
Reorganisation and rationalisation of helper objects for admin templates.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/new-admin/django/conf/admin_templates/admin_change_form.html

    r780 r802  
    5151<b> 
    5252</b> 
    53 {% for fieldset in admin_fieldsets %} 
    54    <fieldset class="module aligned {{ fieldset.classes }}"> 
    55     {% if fieldset.name %} 
    56    <h2>{{fieldset.name }}</h2>  
     53{% for bound_field_set in bound_field_sets %} 
     54   <fieldset class="module aligned {{ bound_field_set.classes }}"> 
     55    {% if bound_field_set.name %} 
     56   <h2>{{bound_field_set.name }}</h2>  
    5757    {% endif %} 
    58     {% for bound_field_set in fieldset.bound_field_sets %} 
    59         {% for bound_field in bound_field_set %} 
    60             {% admin_field_bound bound_field %} 
     58    {% for bound_field_line in bound_field_set %} 
     59       {% admin_field_line bound_field_line %} 
     60        {% for bound_field in bound_field_line %} 
    6161            {% filter_interface_script_maybe bound_field %}  
    62         {% endfor %}  
     62        {% endfor %} 
    6363    {% endfor %} 
    6464   </fieldset> 
  • django/branches/new-admin/django/conf/admin_templates/admin_edit_inline_stacked.html

    r740 r802  
    99            {% field_widget bound_field %} 
    1010         {% else %} 
    11             {% admin_field_bound bound_field %} 
     11            {% admin_field_line bound_field %} 
    1212         {% endif %} 
    1313      {% endfor %} 
  • django/branches/new-admin/django/conf/admin_templates/admin_field_line.html

    r740 r802  
    1 <div class="{{ class_names }}"
     1<div class="{{ class_names }}"
    22   {% for bound_field in bound_fields %} 
    33      {{ bound_field.html_error_list }}  
    44   {% endfor %} 
    5  
     5    
    66   {% for bound_field in bound_fields %} 
    77      {% if bound_field.has_label_first %} 
     
    1717      {% if change %} 
    1818         {% if bound_field.field.primary_key %} 
    19             {{ bound_field.original_value }}  
    20          {% endif %} 
     19            {{ bound_field.original_value }}  
     20          {% endif %} 
    2121 
    2222         {% if bound_field.raw_id_admin %} 
     
    3232        </p> 
    3333      {% endif %} 
     34 
    3435   {% endfor %} 
    35  
    3636</div> 
  • django/branches/new-admin/django/core/meta/fields.py

    r773 r802  
    787787        self.raw_id_admin = raw_id_admin 
    788788 
     789 
     790 
     791class BoundField(object): 
     792    def __init__(self, field, field_mapping, original): 
     793        self.field = field 
     794        self.form_fields = self.resolve_form_fields(field_mapping) 
     795        self.original = original 
     796 
     797    def resolve_form_fields(self, field_mapping): 
     798        return [field_mapping[name] for name in self.field.get_manipulator_field_names('')] 
     799 
     800    def as_field_list(self): 
     801        return [self.field] 
     802 
     803    def original_value(self): 
     804        return self.original.__dict__[self.field.name]  
     805 
     806    def __repr__(self): 
     807        return "BoundField:(%s, %s)" %( self.field.name, self.form_fields) 
     808 
     809class BoundFieldLine(object): 
     810    def __init__(self, field_line, field_mapping, original, bound_field_class=BoundField): 
     811        self.bound_fields = [bound_field_class(field, field_mapping, original) for field in field_line] 
     812     
     813    def __iter__(self): 
     814        for bound_field in self.bound_fields: 
     815            yield bound_field 
     816     
     817    def __repr__(self): 
     818        return "%s:(%s)" % (self.__class__.__name__, self.bound_fields) 
     819     
     820    def __len__(self): 
     821        return len(self.bound_fields) 
     822     
     823class FieldLine(object): 
     824    def __init__(self, linespec, field_locator_func): 
     825        if isinstance(linespec, basestring): 
     826            self.fields = [field_locator_func(linespec)] 
     827        else: 
     828            self.fields = [field_locator_func(field_name) for field_name in linespec] 
     829 
     830    def bind(self, field_mapping, original, bound_field_line_class=BoundFieldLine): 
     831        return bound_field_line_class(self, field_mapping, original) 
     832 
     833    def __iter__(self): 
     834        for field in self.fields: 
     835            yield field 
     836     
     837    def __len__(self): 
     838        return len(self.fields)     
     839     
     840class BoundFieldSet(object): 
     841    def __init__(self, field_set, field_mapping, original, bound_field_line_class=BoundFieldLine): 
     842        self.name = field_set.name 
     843        self.classes = field_set.classes 
     844        self.bound_field_lines = [ field_line.bind(field_mapping,original, bound_field_line_class)  
     845                                   for field_line in field_set] 
     846    def __repr__(self): 
     847        return "%s:(%s,%s)" % (self.__class__.__name__, self.name, self.bound_field_lines) 
     848 
     849    def __iter__(self): 
     850        for bound_field_line in self.bound_field_lines: 
     851            yield bound_field_line 
     852    
     853    def __len__(self): 
     854        return len(self.bound_field_lines) 
     855    
     856class FieldSet(object): 
     857    def __init__(self, name, classes, field_lines): 
     858        self.name = name 
     859        self.field_lines = field_lines 
     860        self.classes = classes 
     861         
     862    def __repr__(self): 
     863         return "FieldSet:(%s,%s)" % (self.name, self.field_lines) 
     864 
     865    def bind(self, field_mapping, original, bound_field_set_class=BoundFieldSet): 
     866        return bound_field_set_class(self, field_mapping, original) 
     867 
     868    def __iter__(self): 
     869        for field_line in self.field_lines: 
     870            yield field_line 
     871 
     872    def __len__(self): 
     873        return len(self.field_lines) 
     874 
     875 
    789876class Admin: 
    790877    def __init__(self, fields=None, js=None, list_display=None, list_filter=None, date_hierarchy=None, 
     
    809896        fields is a list of subclasses of Field.  
    810897 
    811         Return value needs to be encapsulated. 
     898        TODO:Return value needs to be encapsulated. 
    812899        """ 
    813900        if self.fields is None: 
     
    828915            new_fieldset_list.append(new_fieldset) 
    829916        return new_fieldset_list 
     917     
     918    def get_field_sets(self, opts): 
     919        if self.fields is None: 
     920            field_struct = ((None, { 
     921                    'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, AutoField)] 
     922                    }),) 
     923        else: 
     924            field_struct = self.fields 
     925             
     926         
     927        new_fieldset_list = [] 
     928        for fieldset in field_struct: 
     929            name = fieldset[0] 
     930            fs_options = fieldset[1] 
     931            classes =  fs_options.get('classes', None) 
     932            line_specs = fs_options['fields'] 
     933            field_lines = [FieldLine(line_spec, opts.get_field) for line_spec in line_specs] 
     934            new_fieldset_list.append(FieldSet(name, classes, field_lines) ) 
     935        return new_fieldset_list 
     936         
  • django/branches/new-admin/django/core/template.py

    r796 r802  
    114114        "Compilation stage" 
    115115        self.nodelist = compile_string(template_string, filename) 
     116        from pprint import pprint, pformat 
     117        print "------------------------" 
     118        print filename 
     119        pprint(self.nodelist) 
     120        print "------------------------" 
    116121 
    117122    def __iter__(self): 
     
    213218        while linebreaks and line != lastline and linebreaks[line] <= upto: 
    214219           line += 1 
     220     
     221    last_bit = template_string[upto:] 
     222    if len(last_bit): 
     223        token_tups.append( (last_bit, line) ) 
     224  
    215225  
    216226    return [ create_token(tok, (filename, line)) for tok, line in token_tups] 
  • django/branches/new-admin/django/templatetags/admin_modify.py

    r783 r802  
    99 
    1010from django.views.admin.main import AdminBoundField 
     11from django.core.meta.fields import BoundField 
    1112import re 
    1213 
     
    2526#@inclusion_tag('admin_submit_line', takes_context=True) 
    2627def submit_row(context):         
    27         change = context['change'] 
    28        add = context['add'] 
    29        show_delete = context['show_delete'] 
    30        ordered_objects = context['ordered_objects'] 
    31        save_as = context['save_as'] 
    32        has_delete_permission = context['has_delete_permission'] 
    33         is_popup = context['is_popup'] 
    34           
    35         return { 
    36            'onclick_attrib' : (ordered_objects and change  
    37                                 and 'onclick="submitOrderForm();"' or ''),  
    38             'show_delete_link' : (not is_popup and has_delete_permission  
    39                                   and (change or show_delete)),  
    40             'show_save_as_new' : not is_popup and change and save_as, 
    41             'show_save_and_add_another': not is_popup and (not save_as or add), 
    42             'show_save_and_continue': not is_popup, 
    43             'show_save': True 
    44        
     28    change = context['change'] 
     29    add = context['add'] 
     30    show_delete = context['show_delete'] 
     31    ordered_objects = context['ordered_objects'] 
     32    save_as = context['save_as'] 
     33    has_delete_permission = context['has_delete_permission'] 
     34    is_popup = context['is_popup'] 
     35   
     36    return { 
     37        'onclick_attrib' : (ordered_objects and change  
     38                            and 'onclick="submitOrderForm();"' or ''),  
     39        'show_delete_link' : (not is_popup and has_delete_permission  
     40                              and (change or show_delete)),  
     41        'show_save_as_new' : not is_popup and change and save_as, 
     42        'show_save_and_add_another': not is_popup and (not save_as or add), 
     43        'show_save_and_continue': not is_popup, 
     44        'show_save': True 
     45   
    4546 
    4647srdec = inclusion_tag('admin_submit_line', takes_context=True) 
     
    119120 
    120121class FormFieldCollectionWrapper(object): 
    121     def __init__(self, obj, fields): 
    122         self.obj = obj 
     122    def __init__(self, field_mapping, fields): 
     123        self.field_mapping = field_mapping 
    123124        self.fields = fields 
    124         self.bound_fields = [ AdminBoundField(field, obj['original'],  True, self.obj) for field in self.fields ] 
     125        self.bound_fields = [ AdminBoundField(field, self.field_mapping, field_mapping['original']) for field in self.fields ] 
    125126 
    126127    def showurl(self): 
     
    146147        return output 
    147148 
    148         
    149149    def fill_context(self, relation, add, change, context): 
    150150        field_wrapper_list = relation.editable_fields(FieldWrapper) 
     
    155155        form_field_collections = form[relation.opts.module_name] 
    156156        fields = relation.editable_fields() 
    157         form_field_collection_wrapper_list = [FormFieldCollectionWrapper(o,fields) for o in form_field_collections]  
     157        form_field_collection_wrapper_list = [FormFieldCollectionWrapper(field_mapping ,fields) for field_mapping in form_field_collections]  
    158158    
    159159        context['field_wrapper_list'] = field_wrapper_list 
     
    161161        context['num_headers'] = len(field_wrapper_list) 
    162162        context['original_row_needed'] = max([fw.use_raw_id_admin() for fw in field_wrapper_list])  
    163 #        context['name_prefix'] = "%s." % (var_name,) 
    164163 
    165164 
     
    216215    register_one_arg_tag(node)     
    217216 
    218       
    219 #@inclusion_tag('admin_field', takes_context=True) 
    220 def admin_field_bound(context, argument_val): 
    221     if (isinstance(argument_val, list)): 
    222         bound_fields = argument_val  
     217 
     218#@inclusion_tag('admin_field_line', takes_context=True) 
     219def admin_field_line(context, argument_val): 
     220    if (isinstance(argument_val, BoundField)): 
     221        bound_fields = [argument_val]  
    223222    else: 
    224         bound_fields = [argument_val] 
     223        bound_fields = [bf for bf in argument_val] 
    225224    add = context['add'] 
    226225    change = context['change'] 
     
    237236        class_names.append('checkbox-row') 
    238237 
    239     return {  
     238    return { 
    240239        'add' : context['add'], 
    241240        'change' : context['change'], 
    242241        'bound_fields' :  bound_fields,  
    243242        'class_names' : " ".join(class_names) 
    244     }  
    245  
    246      
    247 afbdec = inclusion_tag('admin_field', takes_context=True)     
    248 admin_field_bound = afbdec(admin_field_bound
    249  
    250  
     243    } 
     244 
     245     
     246afbdec = inclusion_tag('admin_field_line', takes_context=True)     
     247admin_field_line = afbdec(admin_field_line
     248 
     249 
  • django/branches/new-admin/django/views/admin/main.py

    r796 r802  
    22 
    33from django.core import formfields, meta, template_loader, template 
     4from django.core.meta.fields import BoundField, BoundFieldLine, BoundFieldSet 
    45from django.core.exceptions import Http404, ObjectDoesNotExist, PermissionDenied 
    56from django.core.extensions import DjangoContext as Context 
     
    540541    return js 
    541542 
    542 class BoundField(object): 
    543     def __init__(self, field, original, rel, field_mapping): 
    544         self.field = field 
    545         self.form_fields = self.resolve_form_fields(field_mapping) 
    546         self.original = original 
    547         self.rel = rel 
    548  
    549     def resolve_form_fields(self, field_mapping): 
    550         return [field_mapping[name] for name in self.field.get_manipulator_field_names('')] 
    551  
    552     def as_field_list(self): 
    553         return [self.field] 
    554  
    555     def original_value(self): 
    556         return self.original.__dict__[self.field.name]  
    557   
     543 
    558544class AdminBoundField(BoundField): 
    559     def __init__(self, field, original, rel, field_mapping): 
    560         super(AdminBoundField, self).__init__(field,original, rel, field_mapping)      
     545    def __init__(self, field, field_mapping, original): 
     546        super(AdminBoundField, self).__init__(field,field_mapping,original)    
    561547 
    562548        self.element_id = self.form_fields[0].get_id()  
     
    578564        self._repr_filled = False 
    579565     
    580  
    581         
    582566    def _fetch_existing_repr(self, func_name): 
    583567        class_dict = self.original.__class__.__dict__ 
     
    592576             func_name = 'get_%s' % self.field.name 
    593577             self._repr = self._fetch_existing_repr(func_name) 
    594        elif isinstance(self.field.rel, meta.ManyToMany): 
    595             func_name = 'get_%s_list' % self.field.name  
    596             self._repr =  ",".join(self._fetch_existing_repr(func_name)) 
     578        elif isinstance(self.field.rel, meta.ManyToMany): 
     579            func_name = 'get_%s_list' % self.field.name  
     580            self._repr =  ",".join(self._fetch_existing_repr(func_name)) 
    597581        self._repr_filled = True 
    598582              
     
    608592 
    609593 
    610 class AdminFieldSet(object): 
    611     def __init__(self, fieldset_name, options, form, original): 
    612          self.name = fieldset_name 
    613          self.options = options 
    614          self.bound_field_sets = self.get_bound_field_sets(form, original) 
    615          self.classes = options.get('classes', '') 
    616       
    617     def __repr__(self): 
    618         return "Fieldset:(%s,%s)" % (self.name, self.bound_field_sets) 
    619  
    620     def get_bound_field_sets(self, form, original): 
    621         fields = self.options['fields'] 
    622         bound_field_sets = [ [AdminBoundField(f, original, False, form) for f in field  ] for field in fields] 
    623         for set in bound_field_sets: 
    624             first = True  
    625             for bound_field in set: 
    626                 bound_field.first = first 
    627                 first = False 
    628  
    629         return bound_field_sets 
    630  
     594class AdminBoundFieldLine(BoundFieldLine): 
     595    def __init__(self, field_line, field_mapping, original): 
     596        super(AdminBoundFieldLine, self).__init__(field_line, field_mapping, original, AdminBoundField) 
     597        for bound_field in self: 
     598            bound_field.first = True 
     599            break 
     600 
     601class AdminBoundFieldSet(BoundFieldSet): 
     602    def __init__(self, field_set, field_mapping, original): 
     603        super(AdminBoundFieldSet, self).__init__(field_set, field_mapping, original, AdminBoundFieldLine) 
     604         
     605         
    631606def fill_extra_context(opts, app_label, context, add=False, change=False, show_delete=False, form_url=''): 
    632607    admin_field_objs = opts.admin.get_field_objs(opts) 
     
    634609    auto_populated_fields = [f for f in opts.fields if f.prepopulate_from] 
    635610  
    636     javascript_imports = get_javascript_imports(opts,auto_populated_fields, ordered_objects, admin_field_objs); 
     611    javascript_imports = get_javascript_imports(opts, auto_populated_fields, ordered_objects, admin_field_objs); 
    637612     
    638613    if ordered_objects: 
     
    647622    form = context['form'] 
    648623    original = context['original'] 
    649     admin_fieldsets = [AdminFieldSet(name, options, form, original) for name, options in admin_field_objs]  
     624    bound_field_sets = [field_set.bind(form, original, AdminBoundFieldSet)  
     625                        for field_set in opts.admin.get_field_sets(opts)] 
     626                         
    650627    inline_related_objects = opts.get_inline_related_objects_wrapped() 
    651628     
     
    654631    extra_context = { 
    655632        'add': add,  
    656         'change': change,  
    657         'admin_field_objs' : admin_field_objs,  
     633        'change': change, 
    658634        'ordered_objects' : ordered_objects,  
     635        'ordered_object_names' : ordered_object_names, 
    659636        'auto_populated_fields' : auto_populated_fields, 
    660637        'javascript_imports' : javascript_imports,  
     
    662639        'has_absolute_url': has_absolute_url,  
    663640        'form_enc_attrib': form_enc_attrib, 
    664         'form_url' : form_url,  
    665         'admin_fieldsets' : admin_fieldsets,  
     641        'form_url' : form_url, 
     642        'bound_field_sets' : bound_field_sets, 
    666643        'inline_related_objects': inline_related_objects, 
    667         'ordered_object_names' : ordered_object_names,  
    668644        'content_type_id' : opts.get_content_type_id(), 
    669645        'save_on_top' : opts.admin.save_on_top,