From 4aa8b5810a86d6dbea82ae025f405db051d09550 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Mon, 28 May 2007 09:17:30 +0000 Subject: [PATCH] Separating out utility functions into their own files. - Legacy-Id: 168 --- ietf/utils/__init__.py | 85 ++------------------------------- ietf/utils/cache_foreign_key.py | 45 +++++++++++++++++ ietf/utils/templated_form.py | 33 +++++++++++++ 3 files changed, 81 insertions(+), 82 deletions(-) create mode 100644 ietf/utils/cache_foreign_key.py create mode 100644 ietf/utils/templated_form.py diff --git a/ietf/utils/__init__.py b/ietf/utils/__init__.py index 0bbf1a1ee..e364f6058 100644 --- a/ietf/utils/__init__.py +++ b/ietf/utils/__init__.py @@ -1,85 +1,6 @@ from listop import orl, flattenl from log import log +from cache_foreign_key import FKAsOneToOne +from templated_form import makeTemplatedForm -from django.utils.html import escape -# look at snippets 59, 148, 99 for newforms helpers - - -# Caching accessor for the reverse of a ForeignKey relatinoship -# Started by axiak on #django -class FKAsOneToOne(object): - def __init__(self, field, reverse = False, query = None): - self.field = field - self.reverse = reverse - self.query = query - - def __get_attr(self, instance): - if self.reverse: - field_name = '%s_set' % self.field - else: - field_name = self.field - return getattr(instance, field_name) - - def __get__(self, instance, Model): - if not hasattr(instance, '_field_values'): - instance._field_values = {} - try: - return instance._field_values[self.field] - except KeyError: - pass - - if self.reverse: - value_set = self.__get_attr(instance).all() - if self.query: - value_set = value_set.filter(self.query) - try: - instance._field_values[self.field] = value_set[0] - except IndexError: - instance._field_values[self.field] = None - else: - instance._field_values[self.field] = self.__get_attr(instance) - - return instance._field_values[self.field] - - def __set__(self, instance, value): - if self.reverse: - # this is dangerous - #other_instance = self.__get_attr(instance).all()[0] - #setattr(other_instance, self.field, value) - #other_instance.save() - raise NotImplemented - else: - setattr(instance, self.field, value) - - -def makeFormattingForm(template=None): - """Create a form class which formats its fields using the provided template - - The template is provided with a dictionary containing the following keys, value - pairs: - - "label": field label, if any, - "errors": list of errors, if any, - "field": widget rendering for an unbound form / field value for a bound form, - "help_text": field help text, if any - - """ - from django.template import loader - import django.newforms as forms - - class FormattingForm(forms.BaseForm): - _template = template - def __getitem__(self, name): - "Returns a BoundField with the given name." - #syslog.syslog("FormattingForm.__getitem__(%s)" % (name, )) - try: - field = self.fields[name] - except KeyError: - raise KeyError('Key %r not found in Form' % name) - if not isinstance(field, forms.fields.Field): - return field - bf = forms.forms.BoundField(self, field, name) - errors = [escape(error) for error in bf.errors] - rendering = loader.render_to_string(self._template, { "errors": errors, "label": bf.label, "text": unicode(bf), "help_text": field.help_text, "field":field }) - return rendering - return FormattingForm +makeFormattingForm = makeTemplatedForm diff --git a/ietf/utils/cache_foreign_key.py b/ietf/utils/cache_foreign_key.py new file mode 100644 index 000000000..a3a4bad84 --- /dev/null +++ b/ietf/utils/cache_foreign_key.py @@ -0,0 +1,45 @@ +# Caching accessor for the reverse of a ForeignKey relatinoship +# Started by axiak on #django +class FKAsOneToOne(object): + def __init__(self, field, reverse = False, query = None): + self.field = field + self.reverse = reverse + self.query = query + + def __get_attr(self, instance): + if self.reverse: + field_name = '%s_set' % self.field + else: + field_name = self.field + return getattr(instance, field_name) + + def __get__(self, instance, Model): + if not hasattr(instance, '_field_values'): + instance._field_values = {} + try: + return instance._field_values[self.field] + except KeyError: + pass + + if self.reverse: + value_set = self.__get_attr(instance).all() + if self.query: + value_set = value_set.filter(self.query) + try: + instance._field_values[self.field] = value_set[0] + except IndexError: + instance._field_values[self.field] = None + else: + instance._field_values[self.field] = self.__get_attr(instance) + + return instance._field_values[self.field] + + def __set__(self, instance, value): + if self.reverse: + # this is dangerous + #other_instance = self.__get_attr(instance).all()[0] + #setattr(other_instance, self.field, value) + #other_instance.save() + raise NotImplemented + else: + setattr(instance, self.field, value) diff --git a/ietf/utils/templated_form.py b/ietf/utils/templated_form.py new file mode 100644 index 000000000..15cc15bb6 --- /dev/null +++ b/ietf/utils/templated_form.py @@ -0,0 +1,33 @@ +from django.utils.html import escape + +def makeTemplatedForm(template=None): + """Create a form class which formats its fields using the provided template + + The template is provided with a dictionary containing the following keys, value + pairs: + + "label": field label, if any, + "errors": list of errors, if any, + "field": widget rendering for an unbound form / field value for a bound form, + "help_text": field help text, if any + + """ + from django.template import loader + import django.newforms as forms + + class TemplatedForm(forms.BaseForm): + _template = template + def __getitem__(self, name): + "Returns a BoundField with the given name." + #syslog.syslog("FormattingForm.__getitem__(%s)" % (name, )) + try: + field = self.fields[name] + except KeyError: + raise KeyError('Key %r not found in Form' % name) + if not isinstance(field, forms.fields.Field): + return field + bf = forms.forms.BoundField(self, field, name) + errors = [escape(error) for error in bf.errors] + rendering = loader.render_to_string(self._template, { "errors": errors, "label": bf.label, "text": unicode(bf), "help_text": field.help_text, "field":field }) + return rendering + return TemplatedForm