Ensure that long questions and comments are stored as db.Text.
authorDaniel Diniz <ajaksu@gmail.com>
Sat, 04 Jul 2009 17:23:19 +0200
changeset 2539 dd0322a37e44
parent 2538 c82fbf7fbad0
child 2540 1e44d71c0e3e
Ensure that long questions and comments are stored as db.Text. This is done by adding the setCleaners methods which sets the appropriate cleaners for dynamic fields. Reviewed by: Lennard de Rijk
app/soc/views/helper/surveys.py
--- a/app/soc/views/helper/surveys.py	Sat Jul 04 17:16:16 2009 +0200
+++ b/app/soc/views/helper/surveys.py	Sat Jul 04 17:23:19 2009 +0200
@@ -30,6 +30,7 @@
 import logging
 import StringIO
 
+from google.appengine.ext import db
 from google.appengine.ext.db import djangoforms
 
 from django import forms
@@ -106,9 +107,56 @@
         pick_quant=self.addQuantField,
         )
 
-    self.kwargs['data'] = data
+    # set cleaner methods for fields
+    self.kwargs['data'] = self.setCleaners()
+
     super(SurveyTakeForm, self).__init__(*args, **self.kwargs)
 
+  def setCleaners(self):
+    """Set cleaner methods for dynamic fields.
+
+    Used for storing textual input as Text instead of StringProperty. Passing
+    a dict of field names/values (from survey_content/survey_record) as the
+    kwarg 'data', it's possible to set clean_[field_id] methods for validation.
+    This method populates the data dict and uses setattr to add field cleaner
+    methods.
+    """
+
+    # prefix for method names
+    clean = 'clean_'
+
+    # data is passed to super's __init__ as the 'data' kwarg
+    data = {}
+
+    schema = {}
+    if self.survey_content:
+      schema = eval(self.survey_content.schema)
+
+    for key, val in schema.items():
+      if val['type'] == 'long_answer':
+
+        # store > 500 chars per long answer
+        setattr(self, clean + key,
+                lambda key=key: db.Text(self.cleaned_data.get(key))
+                )
+
+      if val['has_comment']:
+        comment = COMMENT_PREFIX + key
+
+        #store > 500 chars per comment field
+        setattr(self, clean + comment,
+                lambda comment=comment: db.Text(self.cleaned_data.get(comment))
+                )
+
+        # put comment in self.data
+        data[comment] = getattr(self.survey_record, comment, None)
+
+      # put user's (record) or default (content) value for field in self.data
+      data[key] = (getattr(self.survey_record, key, None) or
+                   getattr(self.survey_content, key))
+
+    return data
+
   def getFields(self, post_dict=None):
     """Build the SurveyContent (questions) form fields.
 
@@ -182,8 +230,8 @@
         value = []
 
       # record field value for validation
-      #if not from_content:
-      self.data[field] = value
+      if not from_content:
+        self.data[field] = value
 
       # find correct field type
       addField = self.fields_map[schema.getType(field)]
@@ -382,7 +430,7 @@
     """
     attrs['class'] = 'comment'
     widget = widgets.Textarea(attrs=attrs)
-    comment_field = CharField(help_text=tip, required=False, 
+    comment_field = CharField(help_text=tip, required=False,
         label='Add a Comment (optional)', widget=widget, initial=comment)
     self.survey_fields[COMMENT_PREFIX + field] = comment_field