app/soc/views/helper/templatetags/forms_helpers.py
changeset 935 09f47e08f805
parent 835 1590625ead55
child 959 b6e8750c9407
--- a/app/soc/views/helper/templatetags/forms_helpers.py	Fri Jan 23 21:18:39 2009 +0000
+++ b/app/soc/views/helper/templatetags/forms_helpers.py	Fri Jan 23 21:20:33 2009 +0000
@@ -24,6 +24,8 @@
   ]
 
 
+from google.appengine.ext import db
+
 from django import template
 from django.forms import forms as forms_in
 from django.utils.encoding import force_unicode
@@ -112,36 +114,67 @@
           'field_value': field_value}
 
 
-@register.inclusion_tag('soc/templatetags/_as_table.html')
-def as_table(form):
+@register.inclusion_tag('soc/templatetags/_as_table.html', takes_context=True)
+def as_table(context, form):
+  """Outputs a form as a properly formatted html table.
+
+  Args:
+    form: the form that should be converted to a table
+  """
+
+  return as_table_helper(context, form)
+
+
+@register.inclusion_tag('soc/templatetags/_as_twoline_table.html',
+                        takes_context=True)
+def as_twoline_table(context, form):
   """Outputs a form as a properly formatted html table.
 
   Args:
     form: the form that should be converted to a table
   """
 
-  return as_table_helper(form)
+  return as_table_helper(context, form)
 
 
-@register.inclusion_tag('soc/templatetags/_as_twoline_table.html')
-def as_twoline_table(form):
-  """Outputs a form as a properly formatted html table.
+def get_reference_url(form, name):
+  """Retrieves the reference url from a field
 
   Args:
-    form: the form that should be converted to a table
+    form: the form the field is defined in
+    name: the name of the field
   """
 
-  return as_table_helper(form)
+  if not hasattr(form, 'Meta'):
+    return None
+
+  if not hasattr(form.Meta, 'model'):
+    return None
+
+  if not hasattr(form.Meta.model, name):
+    return None
+
+  field = getattr(form.Meta.model, name)
+
+  if not isinstance(field, db.ReferenceProperty):
+    return None
+
+  return getattr(field, 'redirect_url', None)
 
 
-def as_table_helper(form):
+def as_table_helper(context, form):
   fields = []
   hidden_fields = []
   hidden_fields_errors = []
+  entity = context['entity']
 
   # Iterate over all fields and prepare it for adding 
   for name, field in form.fields.items():
     bf = forms_in.BoundField(form, field, name)
+    reference = None
+
+    if name.endswith('_link_id'):
+      reference = get_reference_url(form, name[:-8])
 
     # If the field is hidden we display it elsewhere
     if not bf.is_hidden:
@@ -149,7 +182,7 @@
       if hasattr(field, 'example_text'):
         example_text = force_unicode(field.example_text)
 
-      item = (bf, field.required, example_text)
+      item = (bf, field.required, example_text, reference)
       fields.append(item)
     else:
       hidden_fields.append(unicode(bf))
@@ -158,17 +191,19 @@
         item = (name, force_unicode(e))
         hidden_fields_errors.append(item)
 
-  return {
+  context.update({
       'top_errors': form.non_field_errors() or '',
       'hidden_field_errors': hidden_fields_errors or '',
-      'form': form,
       'fields': fields or '',
       'hidden_fields': hidden_fields or '',
-      }
+      })
+
+  return context
 
 
-@register.inclusion_tag('soc/templatetags/_as_table_row.html')
-def as_table_row(form, field, required, example_text):
+@register.inclusion_tag('soc/templatetags/_as_table_row.html',
+                        takes_context=True)
+def as_table_row(context, field, required, example_text, reference):
   """Outputs a field as a properly formatted html row.
 
   Args:
@@ -176,29 +211,40 @@
     field: the field that should be converted to a row
     required: whether the field is required
     example_text: the example_text for this row
+    reference: the entity_suffix if the field is a reference
   """
 
-  return as_table_row_helper(form, field, required, example_text)
+  return as_table_row_helper(context, field, required, example_text, reference)
+
+
+@register.inclusion_tag('soc/templatetags/_as_twoline_table_row.html',
+                        takes_context=True)
+def as_twoline_table_row(context, field, required, example_text, reference):
+  """See as_table_row().
+  """
+
+  return as_table_row_helper(context, field, required, example_text, reference)
 
 
-@register.inclusion_tag('soc/templatetags/_as_twoline_table_row.html')
-def as_twoline_table_row(form, field, required, example_text):
-  """Outputs a field as a properly formatted html row.
-
-  Args:
-    form: the form that the row belongs to
-    field: the field that should be converted to a row
-    required: whether the field is required
-    example_text: the example_text for this row
+def as_table_row_helper(context, field, required, example_text, reference):
+  """See as_table_row().
   """
 
-  return as_table_row_helper(form, field, required, example_text)
-
-
-def as_table_row_helper(form, field, required, example_text):
   # Escape and cache in local variable.
   errors = [force_unicode(escape(error)) for error in field.errors]
 
+  form = context['form']
+  entity = context['entity']
+
+  if reference:
+    from soc.views.helper import redirects
+    params = {
+        'url_name': reference,
+        'field_name': field.name,
+        'return_url': context['return_url']
+        }
+    select_url = redirects.getSelectRedirect(entity, params)
+
   if field.label:
     label = escape(force_unicode(field.label))
 
@@ -212,12 +258,15 @@
 
   help_text = field.help_text
 
-  return {
+  context.update({
       'help_text': force_unicode(help_text) if help_text else '',
       'field_class_type': field_class_type,
       'label': force_unicode(label) if field.label else '',
       'field': unicode(field),
       'required': required,
       'example_text': example_text,
+      'select_url': select_url if reference else None,
       'errors': errors,
-      }
+      })
+
+  return context