| 49 | | }, context); |
|---|
| 50 | | context.pop() |
|---|
| 51 | | return output; |
|---|
| 52 | | |
|---|
| 53 | | class AdminFieldBoundNode(template.Node): |
|---|
| 54 | | def __init__(self, argument): |
|---|
| 55 | | self.argument = argument |
|---|
| 56 | | |
|---|
| 57 | | def render(self, context): |
|---|
| 58 | | argument_val = template.resolve_variable(self.argument, context) |
|---|
| 59 | | if (isinstance(argument_val, list)): |
|---|
| 60 | | bound_fields = argument_val |
|---|
| 61 | | else: |
|---|
| 62 | | bound_fields = [argument_val] |
|---|
| 63 | | add = context['add'] |
|---|
| 64 | | change = context['change'] |
|---|
| 65 | | |
|---|
| 66 | | context.push() |
|---|
| 67 | | context['bound_fields'] = bound_fields |
|---|
| 68 | | context['class_names'] = " ".join(self.get_class_names(bound_fields)) |
|---|
| 69 | | t = template_loader.get_template("admin_field") |
|---|
| 70 | | output = t.render(context) |
|---|
| 71 | | context.pop() |
|---|
| 72 | | |
|---|
| 73 | | return output |
|---|
| 74 | | |
|---|
| 75 | | def get_class_names(self, bound_fields): |
|---|
| 76 | | |
|---|
| 77 | | class_names = ['form-row'] |
|---|
| 78 | | for bound_field in bound_fields: |
|---|
| 79 | | for f in bound_field.form_fields: |
|---|
| 80 | | if f.errors(): |
|---|
| 81 | | class_names.append('errors') |
|---|
| 82 | | break |
|---|
| 83 | | |
|---|
| 84 | | # Assumes BooleanFields won't be stacked next to each other! |
|---|
| 85 | | if isinstance(bound_fields[0].field, meta.BooleanField): |
|---|
| 86 | | class_names.append('checkbox-row') |
|---|
| 87 | | |
|---|
| 88 | | return class_names |
|---|
| 89 | | |
|---|
| | 44 | } |
|---|
| | 45 | |
|---|
| | 46 | srdec = inclusion_tag('admin_submit_line', takes_context=True) |
|---|
| | 47 | submit_row = srdec(submit_row) |
|---|
| | 48 | |
|---|
| | 49 | #@simple_tag |
|---|
| | 50 | def field_label(bound_field): |
|---|
| | 51 | class_names = [] |
|---|
| | 52 | if isinstance(bound_field.field, meta.BooleanField): |
|---|
| | 53 | class_names.append("vCheckboxLabel") |
|---|
| | 54 | else: |
|---|
| | 55 | if not bound_field.field.blank: |
|---|
| | 56 | class_names.append('required') |
|---|
| | 57 | if not bound_field.first: |
|---|
| | 58 | class_names.append('inline') |
|---|
| | 59 | |
|---|
| | 60 | class_str = class_names and ' class="%s"' % ' '.join(class_names) or '' |
|---|
| | 61 | return '<label for="%s"%s>%s:</label> ' % \ |
|---|
| | 62 | (bound_field.element_id, class_str, |
|---|
| | 63 | capfirst(bound_field.field.verbose_name) ) |
|---|
| | 64 | field_label = simple_tag(field_label) |
|---|
| | 65 | |
|---|
| | 66 | |
|---|
| 103 | | t = None |
|---|
| 104 | | while klass: |
|---|
| 105 | | try: |
|---|
| 106 | | field_class_name = klass.__name__ |
|---|
| 107 | | template_name = "widget/%s" % \ |
|---|
| 108 | | class_name_to_underscored(field_class_name) |
|---|
| 109 | | |
|---|
| 110 | | t = template_loader.get_template(template_name) |
|---|
| 111 | | break |
|---|
| 112 | | except template.TemplateDoesNotExist: |
|---|
| 113 | | klass = (len(klass.__bases__) > 0) and klass.__bases__[0] or None |
|---|
| 114 | | |
|---|
| 115 | | if t == None: |
|---|
| 116 | | t = template_loader.get_template("widget/default") |
|---|
| 117 | | |
|---|
| 118 | | output = t.render(context) |
|---|
| | 83 | if not self.nodelists.has_key(klass): |
|---|
| | 84 | t = None |
|---|
| | 85 | while klass: |
|---|
| | 86 | try: |
|---|
| | 87 | field_class_name = klass.__name__ |
|---|
| | 88 | template_name = "widget/%s" % \ |
|---|
| | 89 | class_name_to_underscored(field_class_name) |
|---|
| | 90 | t = template_loader.get_template(template_name) |
|---|
| | 91 | break |
|---|
| | 92 | except template.TemplateDoesNotExist: |
|---|
| | 93 | klass = bool(klass.__bases__) and klass.__bases__[0] or None |
|---|
| | 94 | |
|---|
| | 95 | if t == None: |
|---|
| | 96 | nodelist = self.default |
|---|
| | 97 | else: |
|---|
| | 98 | nodelist = t.nodelist |
|---|
| | 99 | |
|---|
| | 100 | self.nodelists[klass] = nodelist |
|---|
| | 101 | |
|---|
| | 102 | output = self.nodelists[klass].render(context) |
|---|
| 180 | | |
|---|
| 181 | | class FieldLabelNode(template.Node): |
|---|
| 182 | | def __init__(self, bound_field_var): |
|---|
| 183 | | self.bound_field_var = bound_field_var |
|---|
| 184 | | |
|---|
| 185 | | def render(self, context): |
|---|
| 186 | | bound_field = template.resolve_variable(self.bound_field_var, context) |
|---|
| 187 | | class_names = [] |
|---|
| 188 | | if isinstance(bound_field.field, meta.BooleanField): |
|---|
| 189 | | class_names.append("vCheckboxLabel") |
|---|
| 190 | | else: |
|---|
| 191 | | if not bound_field.field.blank: |
|---|
| 192 | | class_names.append('required') |
|---|
| 193 | | if not bound_field.first: |
|---|
| 194 | | class_names.append('inline') |
|---|
| 195 | | |
|---|
| 196 | | class_str = class_names and ' class="%s"' % ' '.join(class_names) or '' |
|---|
| 197 | | return '<label for="%s"%s>%s:</label> ' % (bound_field.element_id, class_str, capfirst(bound_field.field.verbose_name) ) |
|---|
| 198 | | |
|---|
| 199 | | class OutputAllNode(template.Node): |
|---|
| 200 | | def __init__(self, form_fields_var): |
|---|
| 201 | | self.form_fields_var = form_fields_var |
|---|
| 202 | | |
|---|
| 203 | | def render(self, context): |
|---|
| 204 | | form_fields = template.resolve_variable(self.form_fields_var, context) |
|---|
| 205 | | return ''.join([str(f) for f in form_fields]) |
|---|
| 206 | | |
|---|
| 207 | | class AutoPopulatedFieldScriptNode(template.Node): |
|---|
| 208 | | def __init__(self, auto_pop_var): |
|---|
| 209 | | self.auto_pop_var = auto_pop_var |
|---|
| 210 | | |
|---|
| 211 | | def render(self,context): |
|---|
| 212 | | auto_pop_fields = template.resolve_variable(self.auto_pop_var, context) |
|---|
| 213 | | change = context['change'] |
|---|
| 214 | | for field in auto_pop_fields: |
|---|
| 215 | | t = [] |
|---|
| 216 | | if change: |
|---|
| 217 | | t.append('document.getElementById("id_%s")._changed = true;' % field.name ) |
|---|
| 218 | | else: |
|---|
| 219 | | t.append('document.getElementById("id_%s").onchange = function() { this._changed = true; };' % field.name) |
|---|
| 220 | | |
|---|
| 221 | | add_values = ' + " " + '.join(['document.getElementById("id_%s").value' % g for g in field.prepopulate_from]) |
|---|
| 222 | | for f in field.prepopulate_from: |
|---|
| 223 | | t.append('document.getElementById("id_%s").onkeyup = function() { var e = document.getElementById("id_%s"); if(e._changed) { e.value = URLify(%s, %s);} } ' % (f, field.name, add_values, field.maxlength) ) |
|---|
| 224 | | |
|---|
| 225 | | return ''.join(t) |
|---|
| 226 | | |
|---|
| 227 | | class FilterInterfaceScriptMaybeNode(template.Node): |
|---|
| 228 | | def __init__(self, bound_field_var): |
|---|
| 229 | | self.bound_field_var = bound_field_var |
|---|
| 230 | | |
|---|
| 231 | | def render(self, context): |
|---|
| 232 | | bound_field = template.resolve_variable(self.bound_field_var, context) |
|---|
| 233 | | f = bound_field.field |
|---|
| 234 | | if f.rel and isinstance(f.rel, meta.ManyToMany) and f.rel.filter_interface: |
|---|
| 235 | | return '<script type="text/javascript">addEvent(window, "load", function(e) { SelectFilter.init("id_%s", "%s", %s, %r); });</script>\n' % (f.name, f.verbose_name, f.rel.filter_interface-1, ADMIN_MEDIA_PREFIX) |
|---|
| | 164 | |
|---|
| | 165 | |
|---|
| | 166 | #@simple_tag |
|---|
| | 167 | def output_all(form_fields): |
|---|
| | 168 | return ''.join([str(f) for f in form_fields]) |
|---|
| | 169 | output_all = simple_tag(output_all) |
|---|
| | 170 | |
|---|
| | 171 | |
|---|
| | 172 | #@simple_tag |
|---|
| | 173 | def auto_populated_field_script(auto_pop_fields, change = False): |
|---|
| | 174 | for field in auto_pop_fields: |
|---|
| | 175 | t = [] |
|---|
| | 176 | if change: |
|---|
| | 177 | t.append('document.getElementById("id_%s")._changed = true;' % field.name ) |
|---|
| 237 | | return '' |
|---|
| 238 | | |
|---|
| 239 | | |
|---|
| 240 | | |
|---|
| 241 | | |
|---|
| 242 | | def do_submit_row(parser, token): |
|---|
| 243 | | return SubmitRowNode() |
|---|
| 244 | | |
|---|
| | 179 | t.append('document.getElementById("id_%s").onchange = function() { this._changed = true; };' % field.name) |
|---|
| | 180 | |
|---|
| | 181 | add_values = ' + " " + '.join(['document.getElementById("id_%s").value' % g for g in field.prepopulate_from]) |
|---|
| | 182 | for f in field.prepopulate_from: |
|---|
| | 183 | t.append('document.getElementById("id_%s").onkeyup = function() { var e = document.getElementById("id_%s"); if(e._changed) { e.value = URLify(%s, %s);} } ' % (f, field.name, add_values, field.maxlength) ) |
|---|
| | 184 | |
|---|
| | 185 | return ''.join(t) |
|---|
| | 186 | auto_populated_field_script = simple_tag(auto_populated_field_script) |
|---|
| | 187 | |
|---|
| | 188 | #@simple_tag |
|---|
| | 189 | def filter_interface_script_maybe(bound_field): |
|---|
| | 190 | f = bound_field.field |
|---|
| | 191 | if f.rel and isinstance(f.rel, meta.ManyToMany) and f.rel.filter_interface: |
|---|
| | 192 | return '<script type="text/javascript">addEvent(window, "load", function(e) { SelectFilter.init("id_%s", "%s", %s, %r); });</script>\n' % (f.name, f.verbose_name, f.rel.filter_interface-1, ADMIN_MEDIA_PREFIX) |
|---|
| | 193 | else: |
|---|
| | 194 | return '' |
|---|
| | 195 | filter_interface_script_maybe = simple_tag(filter_interface_script_maybe) |
|---|
| 275 | | template.register_tag('submit_row', do_submit_row ) |
|---|
| | 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 |
|---|
| | 223 | else: |
|---|
| | 224 | bound_fields = [argument_val] |
|---|
| | 225 | add = context['add'] |
|---|
| | 226 | change = context['change'] |
|---|
| | 227 | |
|---|
| | 228 | class_names = ['form-row'] |
|---|
| | 229 | for bound_field in bound_fields: |
|---|
| | 230 | for f in bound_field.form_fields: |
|---|
| | 231 | if f.errors(): |
|---|
| | 232 | class_names.append('errors') |
|---|
| | 233 | break |
|---|
| | 234 | |
|---|
| | 235 | # Assumes BooleanFields won't be stacked next to each other! |
|---|
| | 236 | if isinstance(bound_fields[0].field, meta.BooleanField): |
|---|
| | 237 | class_names.append('checkbox-row') |
|---|
| | 238 | |
|---|
| | 239 | return { |
|---|
| | 240 | 'add' : context['add'], |
|---|
| | 241 | 'change' : context['change'], |
|---|
| | 242 | 'bound_fields' : bound_fields, |
|---|
| | 243 | '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 | |
|---|