|
1 | 1 | from listop import orl, flattenl |
2 | 2 | from log import log |
| 3 | +from cache_foreign_key import FKAsOneToOne |
| 4 | +from templated_form import makeTemplatedForm |
3 | 5 |
|
4 | | -from django.utils.html import escape |
5 | | -# look at snippets 59, 148, 99 for newforms helpers |
6 | | - |
7 | | - |
8 | | -# Caching accessor for the reverse of a ForeignKey relatinoship |
9 | | -# Started by axiak on #django |
10 | | -class FKAsOneToOne(object): |
11 | | - def __init__(self, field, reverse = False, query = None): |
12 | | - self.field = field |
13 | | - self.reverse = reverse |
14 | | - self.query = query |
15 | | - |
16 | | - def __get_attr(self, instance): |
17 | | - if self.reverse: |
18 | | - field_name = '%s_set' % self.field |
19 | | - else: |
20 | | - field_name = self.field |
21 | | - return getattr(instance, field_name) |
22 | | - |
23 | | - def __get__(self, instance, Model): |
24 | | - if not hasattr(instance, '_field_values'): |
25 | | - instance._field_values = {} |
26 | | - try: |
27 | | - return instance._field_values[self.field] |
28 | | - except KeyError: |
29 | | - pass |
30 | | - |
31 | | - if self.reverse: |
32 | | - value_set = self.__get_attr(instance).all() |
33 | | - if self.query: |
34 | | - value_set = value_set.filter(self.query) |
35 | | - try: |
36 | | - instance._field_values[self.field] = value_set[0] |
37 | | - except IndexError: |
38 | | - instance._field_values[self.field] = None |
39 | | - else: |
40 | | - instance._field_values[self.field] = self.__get_attr(instance) |
41 | | - |
42 | | - return instance._field_values[self.field] |
43 | | - |
44 | | - def __set__(self, instance, value): |
45 | | - if self.reverse: |
46 | | - # this is dangerous |
47 | | - #other_instance = self.__get_attr(instance).all()[0] |
48 | | - #setattr(other_instance, self.field, value) |
49 | | - #other_instance.save() |
50 | | - raise NotImplemented |
51 | | - else: |
52 | | - setattr(instance, self.field, value) |
53 | | - |
54 | | - |
55 | | -def makeFormattingForm(template=None): |
56 | | - """Create a form class which formats its fields using the provided template |
57 | | -
|
58 | | - The template is provided with a dictionary containing the following keys, value |
59 | | - pairs: |
60 | | -
|
61 | | - "label": field label, if any, |
62 | | - "errors": list of errors, if any, |
63 | | - "field": widget rendering for an unbound form / field value for a bound form, |
64 | | - "help_text": field help text, if any |
65 | | -
|
66 | | - """ |
67 | | - from django.template import loader |
68 | | - import django.newforms as forms |
69 | | - |
70 | | - class FormattingForm(forms.BaseForm): |
71 | | - _template = template |
72 | | - def __getitem__(self, name): |
73 | | - "Returns a BoundField with the given name." |
74 | | - #syslog.syslog("FormattingForm.__getitem__(%s)" % (name, )) |
75 | | - try: |
76 | | - field = self.fields[name] |
77 | | - except KeyError: |
78 | | - raise KeyError('Key %r not found in Form' % name) |
79 | | - if not isinstance(field, forms.fields.Field): |
80 | | - return field |
81 | | - bf = forms.forms.BoundField(self, field, name) |
82 | | - errors = [escape(error) for error in bf.errors] |
83 | | - rendering = loader.render_to_string(self._template, { "errors": errors, "label": bf.label, "text": unicode(bf), "help_text": field.help_text, "field":field }) |
84 | | - return rendering |
85 | | - return FormattingForm |
| 6 | +makeFormattingForm = makeTemplatedForm |
0 commit comments