Changeset 1395
- Timestamp:
- 11/23/05 22:58:46 (3 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/new-admin/django/contrib/admin/templatetags/admin_modify.py
r1286 r1395 1 1 from django.core import template, template_loader, meta 2 from django.core.template_loader import render_to_string 3 from django.conf.settings import ADMIN_MEDIA_PREFIX 2 from django.utils.html import escape 4 3 from django.utils.text import capfirst 5 from django.utils.html import escape6 4 from django.utils.functional import curry 7 5 from django.core.template.decorators import simple_tag, inclusion_tag … … 9 7 from django.core.meta.fields import BoundField, Field 10 8 from django.core.meta import BoundRelatedObject, TABULAR, STACKED 11 9 from django.conf.settings import ADMIN_MEDIA_PREFIX 12 10 import re 13 11 … … 15 13 16 14 def class_name_to_underscored(name): 17 return '_'.join([ s.lower() for s in word_re.findall(name)[:-1]])18 19 #@simple_tag 15 return '_'.join([s.lower() for s in word_re.findall(name)[:-1]]) 16 17 #@simple_tag 20 18 def include_admin_script(script_path): 21 return '<script type="text/javascript" src="%s%s"></script>' % \ 22 (ADMIN_MEDIA_PREFIX, script_path) 23 include_admin_script = simple_tag(include_admin_script) 24 19 return '<script type="text/javascript" src="%s%s"></script>' % (ADMIN_MEDIA_PREFIX, script_path) 20 include_admin_script = simple_tag(include_admin_script) 25 21 26 22 #@inclusion_tag('admin/submit_line', takes_context=True) … … 32 28 is_popup = context['is_popup'] 33 29 return { 34 'onclick_attrib' : (bound_manipulator.ordered_objects and change35 and 'onclick="submitOrderForm();"' or ''), 36 'show_delete_link' : (not is_popup and has_delete_permission37 and (change or show_delete)), 38 'show_save_as_new' : not is_popup and change and bound_manipulator.save_as,30 'onclick_attrib': (bound_manipulator.ordered_objects and change 31 and 'onclick="submitOrderForm();"' or ''), 32 'show_delete_link': (not is_popup and has_delete_permission 33 and (change or show_delete)), 34 'show_save_as_new': not is_popup and change and bound_manipulator.save_as, 39 35 'show_save_and_add_another': not is_popup and (not bound_manipulator.save_as or add), 40 36 'show_save_and_continue': not is_popup, … … 55 51 class_names.append('inline') 56 52 colon = ":" 57 58 53 class_str = class_names and ' class="%s"' % ' '.join(class_names) or '' 59 return '<label for="%s"%s>%s%s</label> ' % \ 60 (bound_field.element_id, class_str, 61 capfirst(bound_field.field.verbose_name), colon ) 54 return '<label for="%s"%s>%s%s</label> ' % (bound_field.element_id, class_str, \ 55 capfirst(bound_field.field.verbose_name), colon) 62 56 field_label = simple_tag(field_label) 63 64 57 65 58 class FieldWidgetNode(template.Node): 66 59 nodelists = {} 67 60 default = None 68 61 69 62 def __init__(self, bound_field_var): 70 63 self.bound_field_var = bound_field_var … … 85 78 cls.default = template_loader.get_template("widget/default").nodelist 86 79 nodelist = cls.default 87 80 88 81 cls.nodelists[klass] = nodelist 89 82 return nodelist 90 83 else: 91 84 return cls.nodelists[klass] 92 get_nodelist = classmethod(get_nodelist) 93 85 get_nodelist = classmethod(get_nodelist) 86 94 87 def render(self, context): 95 96 88 bound_field = template.resolve_variable(self.bound_field_var, context) 97 89 98 90 context.push() 99 91 context['bound_field'] = bound_field 100 92 101 93 output = self.get_nodelist(bound_field.field.__class__).render(context) 102 94 context.pop() … … 115 107 def use_raw_id_admin(self): 116 108 return isinstance(self.field.rel, (meta.ManyToOne, meta.ManyToMany)) \ 117 and self.field.rel.raw_id_admin109 and self.field.rel.raw_id_admin 118 110 119 111 class FormFieldCollectionWrapper(object): … … 121 113 self.field_mapping = field_mapping 122 114 self.fields = fields 123 self.bound_fields = [AdminBoundField(field, self.field_mapping, field_mapping['original']) 124 for field in self.fields ]125 115 self.bound_fields = [AdminBoundField(field, self.field_mapping, field_mapping['original']) 116 for field in self.fields] 117 126 118 class TabularBoundRelatedObject(BoundRelatedObject): 127 119 def __init__(self, related_object, field_mapping, original): 128 120 super(TabularBoundRelatedObject, self).__init__(related_object, field_mapping, original) 129 121 self.field_wrapper_list = [FieldWrapper(field) for field in self.relation.editable_fields()] 130 122 131 123 fields = self.relation.editable_fields() 132 133 self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping ,fields)134 for field_mapping in self.field_mappings]135 self.original_row_needed = max([fw.use_raw_id_admin() for fw in self.field_wrapper_list]) 124 125 self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping, fields) 126 for field_mapping in self.field_mappings] 127 self.original_row_needed = max([fw.use_raw_id_admin() for fw in self.field_wrapper_list]) 136 128 self.show_url = original and hasattr(self.relation.opts, 'get_absolute_url') 137 129 138 130 def template_name(self): 139 131 return "admin/edit_inline_tabular" 140 132 141 133 class StackedBoundRelatedObject(BoundRelatedObject): 142 134 def __init__(self, related_object, field_mapping, original): 143 135 super(StackedBoundRelatedObject, self).__init__(related_object, field_mapping, original) 144 136 fields = self.relation.editable_fields() 145 self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping ,fields) 146 for field_mapping in self.field_mappings]137 self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping ,fields) 138 for field_mapping in self.field_mappings] 147 139 self.show_url = original and hasattr(self.relation.opts, 'get_absolute_url') 148 140 149 141 def template_name(self): 150 142 return "admin/edit_inline_stacked" 151 143 152 144 bound_related_object_overrides = { 153 TABULAR : TabularBoundRelatedObject,154 STACKED : StackedBoundRelatedObject145 TABULAR: TabularBoundRelatedObject, 146 STACKED: StackedBoundRelatedObject, 155 147 } 156 148 … … 158 150 def __init__(self, rel_var): 159 151 self.rel_var = rel_var 160 152 161 153 def render(self, context): 162 154 relation = template.resolve_variable(self.rel_var, context) … … 166 158 klass = relation.field.rel.edit_inline 167 159 bound_related_object_class = bound_related_object_overrides.get(klass, klass) 168 160 169 161 original = context.get('original', None) 170 171 bound_related_object = relation.bind(context['form'], original, bound_related_object_class) 162 163 bound_related_object = relation.bind(context['form'], original, bound_related_object_class) 172 164 context['bound_related_object'] = bound_related_object 173 174 t = template_loader.get_template( bound_related_object.template_name())175 165 166 t = template_loader.get_template(bound_related_object.template_name()) 167 176 168 output = t.render(context) 177 169 178 170 context.pop() 179 171 return output 180 181 172 182 173 #@simple_tag … … 184 175 return ''.join([str(f) for f in form_fields]) 185 176 output_all = simple_tag(output_all) 186 187 177 188 178 #@simple_tag … … 191 181 t = [] 192 182 if change: 193 t.append('document.getElementById("id_%s")._changed = true;' % field.name )194 else: 183 t.append('document.getElementById("id_%s")._changed = true;' % field.name) 184 else: 195 185 t.append('document.getElementById("id_%s").onchange = function() { this._changed = true; };' % field.name) 196 186 … … 200 190 ' var e = document.getElementById("id_%s");' \ 201 191 ' if(!e._changed) { e.value = URLify(%s, %s);} }; ' % ( 202 f, field.name, add_values, field.maxlength) )192 f, field.name, add_values, field.maxlength)) 203 193 return ''.join(t) 204 194 auto_populated_field_script = simple_tag(auto_populated_field_script) … … 206 196 #@simple_tag 207 197 def filter_interface_script_maybe(bound_field): 208 f = bound_field.field 198 f = bound_field.field 209 199 if f.rel and isinstance(f.rel, meta.ManyToMany) and f.rel.filter_interface: 210 200 return '<script type="text/javascript">addEvent(window, "load", function(e) {' \ 211 201 ' SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' % ( 212 f.name, f.verbose_name, f.rel.filter_interface-1, ADMIN_MEDIA_PREFIX) 213 else: 202 f.name, f.verbose_name, f.rel.filter_interface-1, ADMIN_MEDIA_PREFIX) 203 else: 214 204 return '' 215 205 filter_interface_script_maybe = simple_tag(filter_interface_script_maybe) … … 221 211 return node_factory(tokens[1]) 222 212 223 224 one_arg_tag_nodes = [225 FieldWidgetNode,226 EditInlineNode,227 ]228 229 230 213 def register_one_arg_tag(node): 231 214 tag_name = class_name_to_underscored(node.__name__) … … 233 216 template.register_tag(tag_name, parse_func) 234 217 218 one_arg_tag_nodes = ( 219 FieldWidgetNode, 220 EditInlineNode, 221 ) 222 235 223 for node in one_arg_tag_nodes: 236 register_one_arg_tag(node) 237 224 register_one_arg_tag(node) 238 225 239 226 #@inclusion_tag('admin/field_line', takes_context=True) 240 227 def admin_field_line(context, argument_val): 241 228 if (isinstance(argument_val, BoundField)): 242 bound_fields = [argument_val] 229 bound_fields = [argument_val] 243 230 else: 244 231 bound_fields = [bf for bf in argument_val] 245 232 add = context['add'] 246 233 change = context['change'] 247 234 248 235 class_names = ['form-row'] 249 for bound_field in bound_fields: 236 for bound_field in bound_fields: 250 237 for f in bound_field.form_fields: 251 238 if f.errors(): 252 239 class_names.append('errors') 253 240 break 254 241 255 242 # Assumes BooleanFields won't be stacked next to each other! 256 243 if isinstance(bound_fields[0].field, meta.BooleanField): … … 258 245 259 246 return { 260 'add' : context['add'],261 'change' : context['change'],262 'bound_fields' : bound_fields,263 'class_names' : " ".join(class_names)247 'add': context['add'], 248 'change': context['change'], 249 'bound_fields': bound_fields, 250 'class_names': " ".join(class_names), 264 251 } 265 252 admin_field_line = inclusion_tag('admin/field_line', takes_context=True)(admin_field_line) … … 268 255 def object_pk(bound_manip, ordered_obj): 269 256 return bound_manip.get_ordered_object_pk(ordered_obj) 270 257 271 258 object_pk = simple_tag(object_pk) django/branches/new-admin/django/core/template/decorators.py
r883 r1395 1 from django.core.template import Context, Node, TemplateSyntaxError, register_tag, resolve_variable 2 from django.core.template_loader import get_template 3 from django.utils.functional import curry 1 4 from inspect import getargspec 2 from django.core.template import Context, Node, TemplateSyntaxError, register_tag, resolve_variable3 from django.core.template_loader import render_to_string, get_template4 from django.utils.functional import curry5 5 6 def gen _compile_func(params, defaults, name, node_class, parser, token):7 #look in tags for6 def generic_tag_compiler(params, defaults, name, node_class, parser, token): 7 "Returns a template.Node subclass." 8 8 bits = token.contents.split()[1:] 9 9 bmax = len(params) 10 10 def_len = defaults and len(defaults) or 0 11 11 bmin = bmax - def_len 12 if( len(bits) < bmin or len(bits) > bmax):12 if(len(bits) < bmin or len(bits) > bmax): 13 13 if bmin == bmax: 14 14 message = "%s takes %s arguments" % (name, bmin) 15 15 else: 16 16 message = "%s takes between %s and %s arguments" % (name, bmin, bmax) 17 raise TemplateSyntaxError (message)17 raise TemplateSyntaxError, message 18 18 return node_class(bits) 19 19 20 def simple_tag(func): 21 (params, xx, xxx, defaults) = getargspec(func) 20 22 21 def simple_tag(func):22 (params,_, _, defaults) = getargspec(func)23 23 class SimpleNode(Node): 24 24 def __init__(self, vars_to_resolve): 25 #get the vars to resolve 26 self.vars_to_resolve = vars_to_resolve 25 self.vars_to_resolve = vars_to_resolve 27 26 28 27 def render(self, context): 29 resolved_vars = [resolve_variable(var, context) 30 for var in self.vars_to_resolve] 28 resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve] 31 29 return func(*resolved_vars) 32 compile_func = curry(gen_compile_func, params, defaults, func.__name__, SimpleNode) 30 31 compile_func = curry(generic_tag_compiler, params, defaults, func.__name__, SimpleNode) 33 32 compile_func.__doc__ = func.__doc__ 34 33 register_tag(func.__name__, compile_func) 35 34 return func 36 35 37 38 36 def inclusion_tag(file_name, context_class=Context, takes_context=False): 39 37 def dec(func): 40 (params, _, _, defaults) = getargspec(func)38 (params, xx, xxx, defaults) = getargspec(func) 41 39 if takes_context: 42 40 if params[0] == 'context': 43 41 params = params[1:] 44 42 else: 45 raise TemplateSyntaxError("Any tag function decorated with takes_context=True must have a first argument of 'context'" ) 43 raise TemplateSyntaxError, "Any tag function decorated with takes_context=True must have a first argument of 'context'" 44 46 45 class InclusionNode(Node): 47 46 def __init__(self, vars_to_resolve): … … 49 48 50 49 def render(self, context): 51 resolved_vars = [resolve_variable(var, context) 52 for var in self.vars_to_resolve] 50 resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve] 53 51 if takes_context: 54 52 args = [context] + resolved_vars … … 57 55 58 56 dict = func(*args) 59 57 60 58 if not getattr(self, 'nodelist', False): 61 59 t = get_template(file_name) … … 63 61 return self.nodelist.render(context_class(dict)) 64 62 65 compile_func = curry(gen _compile_func, params, defaults, func.__name__, InclusionNode)63 compile_func = curry(generic_tag_compiler, params, defaults, func.__name__, InclusionNode) 66 64 compile_func.__doc__ = func.__doc__ 67 65 register_tag(func.__name__, compile_func) 68 66 return func 69 67 return dec 70
