app/soc/views/helper/surveys.py
author Lennard de Rijk <ljvderijk@gmail.com>
Fri, 23 Oct 2009 13:25:28 -0700
changeset 3032 f3886d1b00a5
parent 2798 ec1857f0d0c7
child 3069 1b9c554ca96d
permissions -rw-r--r--
Changed checkCanMakeRequestToGroup to use Logic instance instead of module. This method now also directly queries for the keyname of the group. Also some whitespace fixes in the access module.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/python2.5
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     2
#
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     3
# Copyright 2009 the Melange authors.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     4
#
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     5
# Licensed under the Apache License, Version 2.0 (the "License");
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     6
# you may not use this file except in compliance with the License.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     7
# You may obtain a copy of the License at
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     8
#
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
     9
#   http://www.apache.org/licenses/LICENSE-2.0
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    10
#
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    11
# Unless required by applicable law or agreed to in writing, software
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    12
# distributed under the License is distributed on an "AS IS" BASIS,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    14
# See the License for the specific language governing permissions and
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    15
# limitations under the License.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    16
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    17
"""Custom widgets used for Survey form fields, plus the SurveyContent form.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    18
"""
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    19
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    20
__authors__ = [
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    21
  '"Daniel Diniz" <ajaksu@gmail.com>',
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    22
  '"James Levy" <jamesalexanderlevy@gmail.com>',
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    23
  '"Lennard de Rijk" <ljvderijk@gmail.com>',
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    24
  ]
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    25
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    26
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    27
from itertools import chain
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
    28
import csv
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    29
import datetime
2442
dd1f94c3594c Start on adding ProjectSurvey and GradingProjectSurvey.
Daniel Diniz <ajaksu@gmail.com>
parents: 2439
diff changeset
    30
import logging
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
    31
import StringIO
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    32
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
    33
from google.appengine.ext import db
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    34
from google.appengine.ext.db import djangoforms
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    35
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    36
from django import forms
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    37
from django.forms import widgets
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    38
from django.forms.fields import CharField
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    39
from django.template import loader
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
    40
from django.utils.datastructures import SortedDict
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    41
from django.utils.encoding import force_unicode
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    42
from django.utils.html import escape
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    43
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    44
from soc.logic import dicts
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    45
from soc.logic.lists import Lists
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
    46
from soc.models.survey import COMMENT_PREFIX
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    47
from soc.models.survey import SurveyContent
2798
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
    48
from soc.views.helper import widgets as custom_widgets
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    49
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    50
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    51
CHOICE_TYPES = set(('selection', 'pick_multi', 'choice', 'pick_quant'))
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    52
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    53
# TODO(ajaksu) add this to template
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    54
REQUIRED_COMMENT_TPL = """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    55
  <label for="required_for_{{ name }}">Required</label>
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    56
  <select id="required_for_{{ name }}" name="required_for_{{ name }}">
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    57
    <option value="True" {% if is_required %} selected='selected' {% endif %}
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    58
     >True</option>
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    59
    <option value="False" {% if not is_required %} selected='selected'
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    60
     {% endif %}>False</option>
2526
8f29bfb9eb52 Survey editing/taking Javascript and CSS fixes.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2520
diff changeset
    61
  </select>
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    62
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    63
  <label for="comment_for_{{ name }}">Allow Comments</label>
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    64
  <select id="comment_for_{{ name }}" name="comment_for_{{ name }}">
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    65
    <option value="True" {% if has_comment %} selected='selected' {% endif %}
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    66
     >True</option>
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    67
    <option value="False" {% if not has_comment %} selected='selected'
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    68
     {% endif %}>False</option>
2526
8f29bfb9eb52 Survey editing/taking Javascript and CSS fixes.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2520
diff changeset
    69
  </select>
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    70
"""
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    71
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    72
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    73
class SurveyTakeForm(djangoforms.ModelForm):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    74
  """SurveyContent form for recording survey answers.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    75
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    76
  This class is used to produce survey forms for survey taking:
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    77
    - User taking survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    78
    - User updating already taken survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    79
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    80
  Using dynamic properties of the survey model (if passed as an arg) the
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    81
  survey form is dynamically formed.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    82
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    83
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    84
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    85
    """Store special kwargs as attributes.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    86
2520
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
    87
    params:
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    88
      survey_content: a SuveryContent entity.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    89
      survey_logic: instance of SurveyLogic.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    90
      survey_record: a SurveyRecord entity.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    91
      read_only: controls whether the survey taking UI allows data entry.
2527
ce657149b90a Add a grade field to the Grading Project Survey form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2526
diff changeset
    92
      data: dictionary mapping fields to data for validation.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    93
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    94
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    95
    self.kwargs = kwargs
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    96
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
    97
    self.survey_content = self.kwargs.pop('survey_content', None)
2463
05af53239799 Add more flexibility to the Survey helper for use with the new Survey types.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2451
diff changeset
    98
    self.survey_logic = self.kwargs.pop('survey_logic', None)
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
    99
    self.survey_record = self.kwargs.pop('survey_record', None)
2798
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   100
    # TODO: This should be removed since readonly is covered by the RecordForm
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   101
    self.read_only = self.kwargs.pop('read_only', None)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   102
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   103
    self.fields_map = dict(
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   104
        long_answer=self.addLongField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   105
        short_answer=self.addShortField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   106
        selection=self.addSingleField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   107
        pick_multi=self.addMultiField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   108
        pick_quant=self.addQuantField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   109
        )
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   110
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   111
    # get the POST data dict if present
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   112
    data = self.kwargs.pop('data', None)
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   113
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   114
    # set cleaner methods for fields, only needed if we have POST data
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   115
    if data:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   116
      # prepare to render a bound, validating form
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   117
      clean_data = self.setCleaners(data)
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   118
    else:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   119
      clean_data = self.setCleaners()
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   120
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   121
    # update with fields from subclasses
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   122
    if hasattr(self, 'data') and self.data:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   123
        clean_data.update(self.data)
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   124
        delattr(self, 'data')
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   125
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   126
    # pass data, so form is bound
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   127
    if data:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   128
      self.kwargs['data'] = clean_data
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   129
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   130
    super(SurveyTakeForm, self).__init__(*args, **self.kwargs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   131
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   132
    self.fields = self.getFields(clean_data)
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   133
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   134
  def setCleaners(self, post_dict=None):
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   135
    """Set cleaner methods for dynamic fields.
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   136
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   137
    Used for storing textual input as Text instead of StringProperty. If
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   138
    passed a dict of field names/values (as the kwarg 'data' to __init__),
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   139
    it's possible to set clean_[field_id] methods for validation.
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   140
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   141
    This method populates the 'data' dict used for generating form fields.
2564
81b36f56d61a Ensure that the Grade field data stays in clean_data.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2560
diff changeset
   142
81b36f56d61a Ensure that the Grade field data stays in clean_data.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2560
diff changeset
   143
    Args:
81b36f56d61a Ensure that the Grade field data stays in clean_data.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2560
diff changeset
   144
      post_dict: dictionary used to populate the fields
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   145
    """
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   146
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   147
    # prefix for method names
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   148
    clean = 'clean_'
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   149
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   150
    # data is passed to super's __init__ as the 'data' kwarg
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   151
    data = {}
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   152
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   153
    # flag whether we can use getlist to retrieve multiple values
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   154
    is_post = hasattr(post_dict, 'getlist')
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   155
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   156
    schema = {}
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   157
    if self.survey_content:
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   158
      schema = eval(self.survey_content.schema)
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   159
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   160
    for key, val in schema.items():
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   161
      if val['type'] == 'long_answer':
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   162
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   163
        # store > 500 chars per long answer
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   164
        setattr(self, clean + key,
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   165
                lambda key=key: db.Text(self.cleaned_data.get(key))
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   166
                )
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   167
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   168
      if val['has_comment']:
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   169
        comment = COMMENT_PREFIX + key
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   170
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   171
        #store > 500 chars per comment field
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   172
        setattr(self, clean + comment,
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   173
                lambda comment=comment: db.Text(self.cleaned_data.get(comment))
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   174
                )
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   175
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   176
        # put comment in self.data
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   177
        if post_dict:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   178
          comment_val = post_dict.get(comment) or None
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   179
        else:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   180
          comment_val = getattr(self.survey_record, comment, None)
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   181
        data[comment] = comment_val
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   182
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   183
      # put POST or record value for field in self.data
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   184
      is_multi = val['type'] == 'pick_multi'
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   185
      if post_dict:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   186
        if is_multi and is_post:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   187
          key_val = post_dict.getlist(key)
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   188
        else:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   189
          key_val = post_dict.get(key)
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   190
      else:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   191
        key_val = getattr(self.survey_record, key, None)
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   192
        if is_multi and isinstance(key_val, basestring):
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   193
          # TODO(ajaksu): find out if we still need this safety net
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   194
          key_val = key_val.split(',')
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   195
        elif not is_multi and isinstance(key_val, list):
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   196
          # old pick_multi record for a question that is now single choice
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   197
          key_val = key_val[0] if key_val else ''
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   198
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   199
      data[key] = key_val
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   200
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   201
    return data
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   202
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   203
  def getFields(self, post_dict=None):
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   204
    """Build the SurveyContent (questions) form fields.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   205
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   206
    params:
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   207
      post_dict: dict with POST data that will be used for validation
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   208
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   209
    Populates self.survey_fields, which will be ordered in self.insertFields.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   210
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   211
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   212
    if not self.survey_content:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   213
      return
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   214
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   215
    post_dict = post_dict or {}
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   216
    self.survey_fields = {}
2442
dd1f94c3594c Start on adding ProjectSurvey and GradingProjectSurvey.
Daniel Diniz <ajaksu@gmail.com>
parents: 2439
diff changeset
   217
    schema = SurveyContentSchema(self.survey_content.schema)
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   218
    attrs = {}
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   219
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   220
    # figure out whether we want a read-only view
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   221
    read_only = self.read_only
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   222
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   223
    if not read_only:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   224
      survey_content = self.survey_content
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   225
      survey_entity = self.survey_logic.getSurveyForContent(survey_content)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   226
      deadline = survey_entity.survey_end
2518
66405056baf8 Only initialize a SurveyTakeForm in take instead of in takeGet and takePost.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2517
diff changeset
   227
      read_only = deadline and (datetime.datetime.now() > deadline)
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   228
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   229
    if read_only:
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   230
      attrs['disabled'] = 'disabled'
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   231
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   232
    # add unordered fields to self.survey_fields
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   233
    for field in self.survey_content.dynamic_properties():
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   234
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   235
      value = post_dict.get(field)
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   236
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   237
      # skip comments, as they should go below their corresponding questions
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   238
      if field.startswith(COMMENT_PREFIX):
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   239
        continue
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   240
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   241
      label = schema.getLabel(field)
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   242
      if label is None:
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   243
        # we log this error in getLabel
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   244
        continue
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   245
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   246
      # find correct field type
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   247
      addField = self.fields_map[schema.getType(field)]
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   248
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   249
      # check if question is required, it's never required when editing
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   250
      required = schema.getRequired(field)
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   251
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   252
      tip = schema.getTip(field)
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   253
      kwargs = dict(label=label, req=required, tip=tip)
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   254
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   255
      # copy attrs
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   256
      extra_attrs = attrs.copy()
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   257
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   258
      # add new field
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   259
      addField(field, value, extra_attrs, schema, **kwargs)
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   260
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   261
      # handle comments if question allows them
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   262
      if schema.getHasComment(field):
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   263
        comment = post_dict.get(COMMENT_PREFIX + field)
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   264
        self.addCommentField(field, comment, extra_attrs, tip='Add a comment.')
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   265
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   266
    return self.insertFields()
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   267
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   268
  def insertFields(self):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   269
    """Add ordered fields to self.fields.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   270
    """
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   271
    fields = SortedDict()
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   272
    survey_order = self.survey_content.getSurveyOrder()
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   273
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   274
    # first, insert dynamic survey fields
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   275
    for position, property in sorted(survey_order.items()):
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   276
      fields.insert(len(fields) + 1, property, self.survey_fields[property])
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   277
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   278
      # add comment if field has one and this isn't an edit view
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   279
      property = COMMENT_PREFIX + property
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   280
      if property in self.survey_fields:
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   281
        fields.insert(len(fields) + 1, property, self.survey_fields[property])
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   282
    return fields
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   283
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   284
  def addLongField(self, field, value, attrs, schema, req=True, label='',
2470
6c3b7dd8b770 Style fix in Survey views helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2468
diff changeset
   285
                   tip='', comment=''):
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   286
    """Add a long answer fields to this form.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   287
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   288
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   289
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   290
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   291
      attrs: additional attributes for field
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   292
      schema: schema for survey
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   293
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   294
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   295
      tip: tooltip text for field
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   296
      comment: initial comment value for field
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   297
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   298
2670
884f808d8469 fix for issue 653 by adding wrap=hard attr to textareas for surveys
James Levy <jamesalexanderlevy@gmail.com>
parents: 2659
diff changeset
   299
    #fix growfield wrapping
884f808d8469 fix for issue 653 by adding wrap=hard attr to textareas for surveys
James Levy <jamesalexanderlevy@gmail.com>
parents: 2659
diff changeset
   300
    attrs['wrap'] = 'hard'
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   301
    widget = widgets.Textarea(attrs=attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   302
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   303
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   304
      tip = 'Please provide a long answer to this question.'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   305
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   306
    question = CharField(help_text=tip, required=req, label=label,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   307
                         widget=widget, initial=value)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   308
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   309
    self.survey_fields[field] = question
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   310
2468
0273c1a8d708 Fixed too long line in Surveys helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2465
diff changeset
   311
  def addShortField(self, field, value, attrs, schema, req=False, label='',
0273c1a8d708 Fixed too long line in Surveys helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2465
diff changeset
   312
                    tip='', comment=''):
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   313
    """Add a short answer fields to this form.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   314
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   315
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   316
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   317
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   318
      attrs: additional attributes for field
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   319
      schema: schema for survey
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   320
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   321
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   322
      tip: tooltip text for field
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   323
      comment: initial comment value for field
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   324
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   325
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   326
    attrs['class'] = "text_question"
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   327
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   328
    widget = widgets.TextInput(attrs=attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   329
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   330
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   331
      tip = 'Please provide a short answer to this question.'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   332
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   333
    question = CharField(help_text=tip, required=req, label=label,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   334
                         widget=widget, max_length=140, initial=value)
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   335
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   336
    self.survey_fields[field] = question
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   337
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   338
  def addSingleField(self, field, value, attrs, schema, req=False, label='',
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   339
                     tip='', comment=''):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   340
    """Add a selection field to this form.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   341
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   342
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   343
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   344
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   345
      attrs: additional attributes for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   346
      schema: schema for survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   347
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   348
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   349
      tip: tooltip text for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   350
      comment: initial comment value for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   351
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   352
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   353
    widget = PickOneSelect(attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   354
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   355
    these_choices = []
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   356
    # add all properties, but select chosen one
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   357
    # TODO(ajaksu): this breaks ordering and blocks merging choice methods
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   358
    options = getattr(self.survey_content, field)
2533
941732c52b67 Fixed broken selection questions from refactoring SurveyForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2530
diff changeset
   359
    if self.survey_record and hasattr(self.survey_record, field):
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   360
      these_choices.append((value, value))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   361
      if value in options:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   362
        options.remove(value)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   363
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   364
    for option in options:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   365
      these_choices.append((option, option))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   366
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   367
      tip = 'Please select an answer this question.'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   368
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   369
    question = PickOneField(help_text=tip, required=req, label=label,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   370
                            choices=tuple(these_choices), widget=widget)
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   371
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   372
    self.survey_fields[field] = question
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   373
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   374
  def addMultiField(self, field, value, attrs, schema, req=False, label='',
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   375
                    tip='', comment=''):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   376
    """Add a pick_multi field to this form.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   377
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   378
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   379
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   380
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   381
      attrs: additional attributes for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   382
      schema: schema for survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   383
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   384
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   385
      tip: tooltip text for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   386
      comment: initial comment value for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   387
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   388
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   389
    widget = PickManyCheckbox(attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   390
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   391
    # TODO(ajaksu) need to allow checking checkboxes by default
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   392
    if self.survey_record and isinstance(value, basestring):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   393
      # pass value as 'initial' so MultipleChoiceField renders checked boxes
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   394
      value = value.split(',')
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   395
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   396
    these_choices = [(v,v) for v in getattr(self.survey_content, field)]
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   397
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   398
      tip = 'Please select one or more of these choices.'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   399
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   400
    question = PickManyField(help_text=tip, required=req, label=label,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   401
                             choices=tuple(these_choices), widget=widget,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   402
                             initial=value)
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   403
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   404
    self.survey_fields[field] = question
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   405
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   406
  def addQuantField(self, field, value, attrs, schema, req=False, label='',
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   407
                    tip='', comment=''):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   408
    """Add a pick_quant field to this form.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   409
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   410
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   411
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   412
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   413
      attrs: additional attributes for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   414
      schema: schema for survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   415
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   416
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   417
      tip: tooltip text for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   418
      comment: initial comment value for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   419
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   420
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   421
    widget = PickQuantRadio(attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   422
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   423
    if self.survey_record:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   424
      value = value
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   425
    else:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   426
      value = None
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   427
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   428
    these_choices = [(v,v) for v in getattr(self.survey_content, field)]
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   429
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   430
      tip = 'Please select one of these choices.'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   431
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   432
    question = PickQuantField(help_text=tip, required=req, label=label,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   433
                             choices=tuple(these_choices), widget=widget,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   434
                             initial=value)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   435
    self.survey_fields[field] = question
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   436
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   437
  def addCommentField(self, field, comment, attrs, tip):
2520
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   438
    """Add comment field to a question.
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   439
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   440
    params:
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   441
      field: the name of the field to add the comment field to
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   442
      comment: the initial value of this field.
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   443
      attrs: the attrs for the widget
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   444
      tip: tooltip text for this field
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   445
    """
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   446
2526
8f29bfb9eb52 Survey editing/taking Javascript and CSS fixes.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2520
diff changeset
   447
    attrs['class'] = 'comment'
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   448
    attrs['rows'] = '1'
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   449
    widget = widgets.Textarea(attrs=attrs)
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   450
    comment_field = CharField(help_text=tip, required=False,
2526
8f29bfb9eb52 Survey editing/taking Javascript and CSS fixes.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2520
diff changeset
   451
        label='Add a Comment (optional)', widget=widget, initial=comment)
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   452
    self.survey_fields[COMMENT_PREFIX + field] = comment_field
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   453
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   454
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   455
  class Meta(object):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   456
    model = SurveyContent
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   457
    exclude = ['schema']
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   458
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   459
2798
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   460
class SurveyRecordForm(SurveyTakeForm):
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   461
  """SurveyContent form for showing record of survey answers.
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   462
  """
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   463
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   464
  def addLongField(self, field, value, attrs, schema, **kwargs):
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   465
    """Add plain text long answer fields to this form.
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   466
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   467
    params:
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   468
      field: the current field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   469
      value: the initial value for this field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   470
      attrs: additional attributes for field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   471
      schema: schema for survey
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   472
    """
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   473
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   474
    question = CharField(widget=custom_widgets.PlainTextWidget, initial=value)
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   475
    self.survey_fields[field] = question
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   476
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   477
  def addShortField(self, field, value, attrs, schema, **kwargs):
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   478
    """Add plain text short answer fields to this form.
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   479
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   480
    params:
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   481
      field: the current field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   482
      value: the initial value for this field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   483
      attrs: additional attributes for field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   484
      schema: schema for survey
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   485
    """
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   486
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   487
    question = CharField(widget=custom_widgets.PlainTextWidget, initial=value)
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   488
    self.survey_fields[field] = question
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   489
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   490
  def addCommentField(self, field, comment, attrs, tip):
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   491
    """Add plain text comment field to a question.
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   492
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   493
    params:
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   494
      field: the name of the field to add the comment field to
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   495
      comment: the initial value of this field.
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   496
      attrs: the attrs for the widget
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   497
      tip: tooltip text for this field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   498
    """
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   499
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   500
    widget = custom_widgets.PlainTextWidget
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   501
    comment_field = CharField(label='Comment', widget=widget, initial=comment)
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   502
    self.survey_fields[COMMENT_PREFIX + field] = comment_field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   503
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   504
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   505
class SurveyEditForm(djangoforms.ModelForm):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   506
  """SurveyContent form for editing a survey.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   507
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   508
  This class is used to produce survey forms for several circumstances:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   509
    - Admin creating survey from scratch
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   510
    - Admin updating existing survey
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   511
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   512
  Using dynamic properties of the survey model (if passed as an arg) the
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   513
  survey form is dynamically formed.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   514
  """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   515
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   516
  def __init__(self, *args, **kwargs):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   517
    """Store special kwargs as attributes.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   518
2520
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   519
    params:
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   520
      survey_content: a SurveyContent entity.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   521
      survey_logic: an instance of SurveyLogic.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   522
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   523
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   524
    self.kwargs = kwargs
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   525
    self.survey_content = self.kwargs.pop('survey_content', None)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   526
    self.survey_logic = self.kwargs.pop('survey_logic', None)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   527
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   528
    super(SurveyEditForm, self).__init__(*args, **self.kwargs)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   529
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   530
  def getFields(self):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   531
    """Build the SurveyContent (questions) form fields.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   532
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   533
    params:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   534
      post_dict: dict with POST data that will be used for validation
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   535
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   536
    Populates self.survey_fields, which will be ordered in self.insert_fields.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   537
    Also populates self.data, which will be used in form validation.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   538
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   539
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   540
    if not self.survey_content:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   541
      return
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   542
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   543
    self.survey_fields = {}
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   544
    schema = SurveyContentSchema(self.survey_content.schema)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   545
    extra_attrs = {}
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   546
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   547
    # add unordered fields to self.survey_fields
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   548
    for field in self.survey_content.dynamic_properties():
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   549
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   550
      # use prompts set by survey creator
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   551
      value = getattr(self.survey_content, field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   552
      from_content = True
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   553
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   554
      label = schema.getLabel(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   555
      if label is None:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   556
        continue
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   557
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   558
      tip = schema.getTip(field)
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   559
      kwargs = schema.getEditFieldArgs(field, value, tip, label)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   560
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   561
      kwargs['widget'] = schema.getEditWidget(field, extra_attrs, tip)
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   562
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   563
      # add new field
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   564
      self.survey_fields[field] = schema.getEditField(field)(**kwargs)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   565
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   566
    # TODO(ajaksu): find a new way to keep fields in order
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   567
    return self.insertFields()
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   568
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   569
  def insertFields(self):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   570
    """Add ordered fields to self.fields.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   571
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   572
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   573
    survey_order = self.survey_content.getSurveyOrder()
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   574
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   575
    # insert dynamic survey fields
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   576
    for position, property in survey_order.items():
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   577
      self.fields.insert(position, property, self.survey_fields[property])
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   578
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   579
    return self.fields
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   580
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   581
  class Meta(object):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   582
    model = SurveyContent
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   583
    exclude = ['schema']
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   584
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   585
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   586
class SurveyContentSchema(object):
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   587
  """Abstract question metadata handling.
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   588
  """
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   589
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   590
  def __init__(self, schema):
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   591
    """Set the dictionary that this class encapsulates.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   592
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   593
    Args:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   594
      schema: schema as stored in SurveyConent entity
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   595
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   596
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   597
    self.schema = eval(schema)
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   598
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   599
  def getType(self, field):
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   600
    """Fetch question type for field e.g. short_answer, pick_multi, etc.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   601
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   602
    Args:
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   603
      field: name of the field to get the type for
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   604
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   605
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   606
    return self.schema[field]["type"]
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   607
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   608
  def getTip(self, field):
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   609
    """Fetch question help text, used for tooltips.
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   610
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   611
    Args:
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   612
      field: name of the field to get the tooltip for
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   613
    """
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   614
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   615
    return self.schema[field].get('tip', '')
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   616
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   617
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   618
  def getRequired(self, field):
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   619
    """Check whether survey question is required.
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   620
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   621
    Args:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   622
      field: name of the field to check the required property for
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   623
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   624
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   625
    return self.schema[field]["required"]
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   626
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   627
  def getHasComment(self, field):
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   628
    """Check whether survey question allows adding a comment.
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   629
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   630
    Args:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   631
      field: name of the field to get the hasComment property for
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   632
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   633
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   634
    return self.schema[field]["has_comment"]
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   635
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   636
  def getRender(self, field):
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   637
    """Get rendering options for choice questions.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   638
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   639
    Args:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   640
      field: name of the field to get the rendering option for
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   641
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   642
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   643
    return self.schema[field]["render"]
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   644
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   645
  def getEditField(self, field):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   646
    """For a given question kind, get the correct edit view field.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   647
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   648
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   649
    kind = self.getType(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   650
    if kind in CHOICE_TYPES:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   651
      Field = PickOneField
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   652
    else:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   653
      Field = CharField
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   654
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   655
    return Field
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   656
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   657
  def getEditFieldArgs(self, field, value, tip, label):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   658
    """Build edit view field arguments.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   659
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   660
    params:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   661
      field: field name
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   662
      value: field value (text for text questions, list for choice questions)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   663
      tipe: help text, to be used in a tooltip
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   664
      label: the field's question (or identifier if question is missing)
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   665
    """
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   666
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   667
    kind = self.getType(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   668
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   669
    kwargs = dict(help_text=tip, required=False, label=label)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   670
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   671
    if kind in CHOICE_TYPES:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   672
      kwargs['choices'] = tuple([(val, val) for val in value])
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   673
    else:
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   674
      kwargs['initial'] = tip
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   675
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   676
    return kwargs
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   677
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   678
  def getEditWidget(self, field, attrs, tip):
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   679
    """Get survey editing widget for questions.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   680
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   681
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   682
    kind = self.getType(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   683
    is_required = self.getRequired(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   684
    has_comment = self.getHasComment(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   685
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   686
    if kind in CHOICE_TYPES:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   687
      widget = UniversalChoiceEditor
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   688
      render = self.getRender(field)
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   689
      args = kind, render, is_required, has_comment, tip
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   690
    else:
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   691
      args = is_required, has_comment
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   692
      if kind == 'long_answer':
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   693
        widget = LongTextarea
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   694
      elif kind == 'short_answer':
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   695
        widget = ShortTextInput
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   696
      attrs = attrs.copy()
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   697
      attrs['class'] = kind
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   698
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   699
    kwargs = dict(attrs=attrs)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   700
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   701
    return widget(*args, **kwargs)
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   702
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   703
  def getLabel(self, field):
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   704
    """Fetch the free text 'question' or use field name as label.
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   705
    """
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   706
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   707
    if field not in self.schema:
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   708
      logging.error('field %s not found in schema %s' %
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   709
                    (field, str(self.schema)))
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   710
      return
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   711
    else:
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   712
      label = self.schema[field].get('question') or field
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   713
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   714
    return label
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   715
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   716
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   717
class UniversalChoiceEditor(widgets.Widget):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   718
  """Edit interface for choice questions.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   719
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   720
  Allows adding and removing options, re-ordering and editing option text.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   721
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   722
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   723
  def __init__(self, kind, render, is_required, has_comment, tip,
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   724
               attrs=None, choices=()):
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   725
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   726
    params:
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   727
      kind: question kind (one of selection, pick_multi or pick_quant)
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   728
      render: question widget (single_select, multi_checkbox or quant_radio)
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   729
      is_required: bool, controls selection in the required_for field
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   730
      has_comments: bool, controls selection in the has_comments field
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   731
    """
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   732
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   733
    self.attrs = attrs or {}
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   734
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   735
    # Choices can be any iterable, but we may need to render this widget
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   736
    # multiple times. Thus, collapse it into a list so it can be consumed
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   737
    # more than once.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   738
    self.choices = list(choices)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   739
    self.kind = kind
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   740
    self.render_as = render
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   741
    self.is_required = is_required
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   742
    self.has_comment = has_comment
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   743
    self.tooltip_content = tip or ''
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   744
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   745
  def render(self, name, value, attrs=None, choices=()):
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   746
    """Render UCE widget.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   747
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   748
    Option reordering, editing, addition and deletion are added here.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   749
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   750
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   751
    if value is None:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   752
      value = ''
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   753
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   754
    final_attrs = self.build_attrs(attrs, name=name)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   755
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   756
    # find out which options should be selected in type and render drop-downs.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   757
    selected = 'selected="selected"'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   758
    context =  dict(
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   759
        name=name,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   760
        is_selection=selected * (self.kind == 'selection'),
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   761
        is_pick_multi=selected * (self.kind == 'pick_multi'),
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   762
        is_pick_quant=selected * (self.kind == 'pick_quant'),
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   763
        is_select=selected * (self.render_as == 'single_select'),
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   764
        is_checkboxes=selected * (self.render_as == 'multi_checkbox'),
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   765
        is_radio_buttons=selected * (self.render_as == 'quant_radio'),
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   766
        )
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   767
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   768
    # set required and has_comment selects
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   769
    context.update(dict(
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   770
        is_required = self.is_required,
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   771
        has_comment = self.has_comment,
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   772
        ))
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   773
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   774
    str_value = forms.util.smart_unicode(value) # normalize to string.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   775
    chained_choices = enumerate(chain(self.choices, choices))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   776
    choices = {}
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   777
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   778
    for i, (option_value, option_label) in chained_choices:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   779
      option_value = escape(forms.util.smart_unicode(option_value))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   780
      choices[i] = option_value
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   781
    context['choices'] = choices
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   782
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   783
    tooltip_content = escape(forms.util.smart_unicode(self.tooltip_content))
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   784
    context['tooltip_content'] = tooltip_content
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   785
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   786
    template = 'soc/survey/universal_choice_editor.html'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   787
    return loader.render_to_string(template, context)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   788
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   789
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   790
class PickOneField(forms.ChoiceField):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   791
  """Stub for customizing the single choice field.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   792
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   793
  #TODO(james): Ensure that more than one option cannot be selected
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   794
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   795
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   796
    super(PickOneField, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   797
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   798
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   799
class PickManyField(forms.MultipleChoiceField):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   800
  """Stub for customizing the multiple choice field.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   801
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   802
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   803
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   804
    super(PickManyField, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   805
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   806
2530
d7a0ab3f1965 Make sure that radio button questions validate correctly and allow only one choice.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2527
diff changeset
   807
class PickQuantField(forms.ChoiceField):
d7a0ab3f1965 Make sure that radio button questions validate correctly and allow only one choice.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2527
diff changeset
   808
  """Stub for customizing the choice field.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   809
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   810
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   811
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   812
    super(PickQuantField, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   813
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   814
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   815
class LongTextarea(widgets.Textarea):
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   816
  """Set whether long question is required or allows comments.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   817
  """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   818
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   819
  def __init__(self, is_required, has_comment, attrs=None):
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   820
    """Initialize widget and store editing mode.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   821
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   822
    params:
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   823
      is_required: bool, controls selection in the 'required' extra field
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   824
      has_comments: bool, controls selection in the 'has_comment' extra field
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   825
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   826
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   827
    self.is_required = is_required
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   828
    self.has_comment = has_comment
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   829
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   830
    super(LongTextarea, self).__init__(attrs)
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   831
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   832
  def render(self, name, value, attrs=None):
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   833
    """Render plain textarea or widget with extra fields.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   834
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   835
    Extra fields are 'required' and 'has_comment'.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   836
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   837
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   838
    # plain text area
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   839
    output = super(LongTextarea, self).render(name, value, attrs)
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   840
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   841
    # add 'required' and 'has_comment' fields
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   842
    context = dict(name=name, is_required=self.is_required,
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   843
                   has_comment=self.has_comment)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   844
    template = loader.get_template_from_string(REQUIRED_COMMENT_TPL)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   845
    rendered = template.render(context=loader.Context(dict_=context))
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   846
    output =  rendered + output
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   847
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   848
    output = '<fieldset>' + output + '</fieldset>'
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   849
    return output
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   850
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   851
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   852
class ShortTextInput(widgets.TextInput):
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   853
  """Set whether short answer question is required or allows comments.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   854
  """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   855
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   856
  def __init__(self, is_required, has_comment, attrs=None):
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   857
    """Initialize widget and store editing mode.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   858
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   859
    params:
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   860
      is_required: bool, controls selection in the 'required' extra field
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   861
      has_comments: bool, controls selection in the 'has_comment' extra field
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   862
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   863
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   864
    self.is_required = is_required
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   865
    self.has_comment = has_comment
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   866
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   867
    super(ShortTextInput, self).__init__(attrs)
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   868
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   869
  def render(self, name, value, attrs=None):
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   870
    """Render plain text input or widget with extra fields.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   871
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   872
    Extra fields are 'required' and 'has_comment'.
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   873
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   874
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   875
    # plain text area
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   876
    output = super(ShortTextInput, self).render(name, value, attrs)
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   877
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   878
    # add 'required' and 'has_comment' fields
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   879
    context = dict(name=name, is_required=self.is_required,
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   880
                   has_comment=self.has_comment)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   881
    template = loader.get_template_from_string(REQUIRED_COMMENT_TPL)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   882
    rendered = template.render(context=loader.Context(dict_=context))
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   883
    output =  rendered + output
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   884
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   885
    output = '<fieldset>' + output + '</fieldset>'
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   886
    return output
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   887
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   888
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   889
class PickOneSelect(forms.Select):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   890
  """Stub for customizing the single choice select widget.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   891
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   892
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   893
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   894
    super(PickOneSelect, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   895
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   896
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   897
class PickManyCheckbox(forms.CheckboxSelectMultiple):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   898
  """Customized multiple choice checkbox widget.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   899
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   900
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   901
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   902
    super(PickManyCheckbox, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   903
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   904
  def render(self, name, value, attrs=None, choices=()):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   905
    """Render checkboxes as list items grouped in a fieldset.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   906
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   907
    This is the pick_multi widget for survey taking
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   908
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   909
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   910
    if value is None:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   911
      value = []
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   912
    has_id = attrs and attrs.has_key('id')
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   913
    final_attrs = self.build_attrs(attrs, name=name)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   914
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   915
    # normalize to strings.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   916
    str_values = set([forms.util.smart_unicode(v) for v in value])
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   917
    is_checked = lambda value: value in str_values
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   918
    smart_unicode = forms.util.smart_unicode
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   919
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   920
    # set container fieldset and list
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   921
    output = [u'<fieldset id="id_%s">\n  <ul class="pick_multi">' % name]
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   922
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   923
    # add numbered checkboxes wrapped in list items
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   924
    chained_choices = enumerate(chain(self.choices, choices))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   925
    for i, (option_value, option_label) in chained_choices:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   926
      option_label = escape(smart_unicode(option_label))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   927
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   928
      # If an ID attribute was given, add a numeric index as a suffix,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   929
      # so that the checkboxes don't all have the same ID attribute.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   930
      if has_id:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   931
        final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   932
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   933
      cb = widgets.CheckboxInput(final_attrs, check_test=is_checked)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   934
      rendered_cb = cb.render(name, option_value)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   935
      cb_label = (rendered_cb, option_label)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   936
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   937
      output.append(u'    <li><label>%s %s</label></li>' % cb_label)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   938
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   939
    output.append(u'  </ul>\n</fieldset>')
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   940
    return u'\n'.join(output)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   941
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   942
  def id_for_label(self, id_):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   943
    # see the comment for RadioSelect.id_for_label()
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   944
    if id_:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   945
      id_ += '_fieldset'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   946
    return id_
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   947
  id_for_label = classmethod(id_for_label)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   948
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   949
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   950
class PickQuantRadioRenderer(widgets.RadioFieldRenderer):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   951
  """Used by PickQuantRadio to enable customization of radio widgets.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   952
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   953
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   954
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   955
    super(PickQuantRadioRenderer, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   956
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   957
  def render(self):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   958
    """Outputs set of radio fields in a div.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   959
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   960
2680
b96ba702e82c Every radio button is now properly shown on a new line.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2670
diff changeset
   961
    from django.utils.html import linebreaks
b96ba702e82c Every radio button is now properly shown on a new line.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2670
diff changeset
   962
b96ba702e82c Every radio button is now properly shown on a new line.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2670
diff changeset
   963
    return linebreaks(u'<div class="quant_radio">%s</div>'
2683
8ea17736a10d Two style fixes.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2680
diff changeset
   964
                      % u'\n'.join([u'%s' % force_unicode(w) for w in self]))
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   965
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   966
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   967
class PickQuantRadio(forms.RadioSelect):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   968
  """TODO(James,Ajaksu) Fix Docstring
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   969
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   970
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   971
  renderer = PickQuantRadioRenderer
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   972
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   973
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   974
    super(PickQuantRadio, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   975
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   976
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   977
# in the future, we'll have more widget types here
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   978
WIDGETS = {'multi_checkbox': PickManyCheckbox,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   979
           'single_select': PickOneSelect,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   980
           'quant_radio': PickQuantRadio}
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   981
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   982
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   983
class HelperForm(object):
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   984
  """Thin wrapper for adding values to params['edit_form'].fields.
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   985
  """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   986
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   987
  def __init__(self, form=None):
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   988
    """Store the edit_form.
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   989
    """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   990
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   991
    self.form = form
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   992
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   993
  def __call__(self, instance=None):
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   994
    """Transparently instantiate and add initial values to the edit_form.
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   995
    """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   996
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   997
    form = self.form(instance=instance)
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   998
    form.fields['created_by'].initial = instance.author.name
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   999
    form.fields['last_modified_by'].initial = instance.modified_by.name
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1000
    form.fields['doc_key_name'].initial = instance.key().id_or_name()
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1001
    return form
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1002
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1003
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1004
def getCSVHeader(survey_entity):
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1005
  """CSV header helper, needs support for comment lines in CSV.
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1006
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1007
  Args:
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1008
      survey_entity: Survey entity
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1009
  """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1010
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1011
  tpl = '# %s: %s\n'
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1012
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1013
  # add static properties
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1014
  fields = ['# Melange Survey export for \n#  %s\n#\n' % survey_entity.title]
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1015
  fields += [tpl % (k,v) for k,v in survey_entity.toDict().items()]
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1016
  fields += [tpl % (f, str(getattr(survey_entity, f))) for f in PLAIN.split()]
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1017
  fields += [tpl % (f, str(getattr(survey_entity, f).link_id))
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1018
             for f in FIELDS.split()]
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1019
  fields.sort()
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1020
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1021
  # add dynamic properties
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1022
  fields += ['#\n#---\n#\n']
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1023
  dynamic = survey_entity.survey_content.dynamic_properties()
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1024
  dynamic = [(prop, getattr(survey_entity.survey_content, prop))
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1025
             for prop in dynamic]
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1026
  fields += [tpl % (k,v) for k,v in sorted(dynamic)]
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1027
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1028
  # add schema
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1029
  fields += ['#\n#---\n#\n']
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1030
  schema =  survey_entity.survey_content.schema
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1031
  indent = '},\n#' + ' ' * 9
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1032
  fields += [tpl % ('Schema', schema.replace('},', indent)) + '#\n']
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1033
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1034
  return ''.join(fields).replace('\n', '\r\n')
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1035
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1036
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1037
def getRecords(recs, props):
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1038
  """Fetch properties from SurveyRecords for CSV export.
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1039
  """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1040
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1041
  records = []
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1042
  props = props[1:]
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1043
  for rec in recs:
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1044
    values = tuple(getattr(rec, prop, None) for prop in props)
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1045
    leading = (rec.user.link_id,)
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1046
    records.append(leading + values)
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1047
  return records
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1048
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1049
2658
34b414a80d42 Several style fixes and code cleaning for surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2576
diff changeset
  1050
def toCSV(survey_view):
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1051
  """CSV exporter.
2492
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1052
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1053
  Args:
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1054
      survey_view: instance of the SurveyView
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1055
  """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1056
2492
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1057
  def wrapper(survey):
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1058
    """Wrapper function.
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1059
    """
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1060
    survey_logic = survey_view.getParams()['logic']
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1061
    record_logic = survey_logic.getRecordLogic()
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1062
2492
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1063
    # get header and properties
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1064
    header = getCSVHeader(survey)
2492
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1065
    leading = ['user', 'created', 'modified']
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1066
    properties = leading + survey.survey_content.orderedProperties()
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1067
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1068
    # retrieve the query of the data to export
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1069
    fields = {'survey': survey}
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1070
    record_query = record_logic.getQueryForFields(fields)
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1071
2492
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1072
    try:
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1073
      first = record_query.run().next()
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1074
    except StopIteration:
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1075
      # bail out early if survey_records.run() is empty
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1076
      return header, survey.link_id
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
  1077
2492
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1078
    # generate results list
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1079
    recs = record_query.run()
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1080
    recs = getRecords(recs, properties)
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
  1081
2492
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1082
    # write results to CSV
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1083
    output = StringIO.StringIO()
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1084
    writer = csv.writer(output)
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1085
    writer.writerow(properties)
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1086
    writer.writerows(recs)
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
  1087
2492
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1088
    return header + output.getvalue(), survey.link_id
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1089
  return wrapper