app/soc/views/helper/surveys.py
author Daniel Hans <Daniel.M.Hans@gmail.com>
Fri, 30 Oct 2009 23:59:47 +0100
changeset 3070 afd98e17a2b2
parent 3069 1b9c554ca96d
permissions -rw-r--r--
Minor (mostly stylish and whitespace) fixes in GHOP access.py module. Also missing authors added to some files.
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>',
3070
afd98e17a2b2 Minor (mostly stylish and whitespace) fixes in GHOP access.py module.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 3069
diff changeset
    22
  '"Daniel Hans" <daniel.m.hans@gmail.com>',
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    23
  '"James Levy" <jamesalexanderlevy@gmail.com>',
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    24
  '"Lennard de Rijk" <ljvderijk@gmail.com>',
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
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    28
from itertools import chain
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
    29
import csv
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    30
import datetime
2442
dd1f94c3594c Start on adding ProjectSurvey and GradingProjectSurvey.
Daniel Diniz <ajaksu@gmail.com>
parents: 2439
diff changeset
    31
import logging
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
    32
import StringIO
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    33
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
    34
from google.appengine.ext import db
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    35
from google.appengine.ext.db import djangoforms
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    36
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    37
from django import forms
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    38
from django.forms import widgets
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    39
from django.forms.fields import CharField
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    40
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
    41
from django.utils.datastructures import SortedDict
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    42
from django.utils.encoding import force_unicode
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    43
from django.utils.html import escape
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    44
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    45
from soc.logic import dicts
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    46
from soc.logic.lists import Lists
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
    47
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
    48
from soc.models.survey import SurveyContent
2798
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
    49
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
    50
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    51
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    52
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
    53
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    54
# 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
    55
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
    56
  <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
    57
  <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
    58
    <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
    59
     >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
    60
    <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
    61
     {% endif %}>False</option>
2526
8f29bfb9eb52 Survey editing/taking Javascript and CSS fixes.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2520
diff changeset
    62
  </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
    63
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    64
  <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
    65
  <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
    66
    <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
    67
     >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
    68
    <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
    69
     {% endif %}>False</option>
2526
8f29bfb9eb52 Survey editing/taking Javascript and CSS fixes.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2520
diff changeset
    70
  </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
    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
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
    73
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    74
class SurveyTakeForm(djangoforms.ModelForm):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    75
  """SurveyContent form for recording survey answers.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    76
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    77
  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
    78
    - User taking survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    79
    - User updating already taken survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    80
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    81
  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
    82
  survey form is dynamically formed.
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
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    85
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    86
    """Store special kwargs as attributes.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    87
2520
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
    88
    params:
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    89
      survey_content: a SuveryContent entity.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    90
      survey_logic: instance of SurveyLogic.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    91
      survey_record: a SurveyRecord entity.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    92
      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
    93
      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
    94
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    95
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
    96
    self.kwargs = kwargs
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
    97
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
    98
    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
    99
    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
   100
    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
   101
    # 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
   102
    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
   103
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   104
    self.fields_map = dict(
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   105
        long_answer=self.addLongField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   106
        short_answer=self.addShortField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   107
        selection=self.addSingleField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   108
        pick_multi=self.addMultiField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   109
        pick_quant=self.addQuantField,
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   110
        )
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   111
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   112
    # 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
   113
    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
   114
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   115
    # 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
   116
    if data:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   117
      # 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
   118
      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
   119
    else:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   120
      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
   121
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   122
    # 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
   123
    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
   124
        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
   125
        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
   126
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   127
    # 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
   128
    if data:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   129
      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
   130
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   131
    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
   132
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   133
    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
   134
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   135
  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
   136
    """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
   137
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   138
    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
   139
    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
   140
    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
   141
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   142
    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
   143
81b36f56d61a Ensure that the Grade field data stays in clean_data.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2560
diff changeset
   144
    Args:
81b36f56d61a Ensure that the Grade field data stays in clean_data.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2560
diff changeset
   145
      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
   146
    """
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   147
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   148
    # 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
   149
    clean = 'clean_'
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   150
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   151
    # 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
   152
    data = {}
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   153
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   154
    # 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
   155
    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
   156
2539
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   157
    schema = {}
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   158
    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
   159
      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
   160
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   161
    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
   162
      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
   163
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   164
        # 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
   165
        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
   166
                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
   167
                )
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   168
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   169
      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
   170
        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
   171
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   172
        #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
   173
        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
   174
                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
   175
                )
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   176
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   177
        # 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
   178
        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
   179
          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
   180
        else:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   181
          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
   182
        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
   183
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   184
      # 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
   185
      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
   186
      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
   187
        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
   188
          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
   189
        else:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   190
          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
   191
      else:
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   192
        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
   193
        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
   194
          # 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
   195
          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
   196
        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
   197
          # 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
   198
          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
   199
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   200
      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
   201
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   202
    return data
dd0322a37e44 Ensure that long questions and comments are stored as db.Text.
Daniel Diniz <ajaksu@gmail.com>
parents: 2533
diff changeset
   203
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   204
  def getFields(self, post_dict=None):
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   205
    """Build the SurveyContent (questions) form fields.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   206
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   207
    params:
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   208
      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
   209
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   210
    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
   211
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   212
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   213
    if not self.survey_content:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   214
      return
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   215
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   216
    post_dict = post_dict or {}
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   217
    self.survey_fields = {}
2442
dd1f94c3594c Start on adding ProjectSurvey and GradingProjectSurvey.
Daniel Diniz <ajaksu@gmail.com>
parents: 2439
diff changeset
   218
    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
   219
    attrs = {}
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   220
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   221
    # 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
   222
    read_only = self.read_only
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   223
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   224
    if not read_only:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   225
      survey_content = self.survey_content
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   226
      survey_entity = self.survey_logic.getSurveyForContent(survey_content)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   227
      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
   228
      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
   229
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   230
    if read_only:
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   231
      attrs['disabled'] = 'disabled'
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   232
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   233
    # add unordered fields to self.survey_fields
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   234
    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
   235
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   236
      value = post_dict.get(field)
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   237
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   238
      # 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
   239
      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
   240
        continue
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   241
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   242
      label = schema.getLabel(field)
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   243
      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
   244
        # 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
   245
        continue
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   246
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   247
      # find correct field type
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   248
      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
   249
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   250
      # 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
   251
      required = schema.getRequired(field)
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   252
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   253
      tip = schema.getTip(field)
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   254
      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
   255
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   256
      # copy attrs
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   257
      extra_attrs = attrs.copy()
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   258
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   259
      # 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
   260
      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
   261
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   262
      # 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
   263
      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
   264
        comment = post_dict.get(COMMENT_PREFIX + field)
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
   265
        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
   266
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   267
    return self.insertFields()
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   268
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   269
  def insertFields(self):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   270
    """Add ordered fields to self.fields.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   271
    """
2542
a9dec4763c6b POST data always overwrites survey_record data when used to populate form.
Daniel Diniz <ajaksu@gmail.com>
parents: 2539
diff changeset
   272
    fields = SortedDict()
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   273
    survey_order = self.survey_content.getSurveyOrder()
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   274
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   275
    # 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
   276
    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
   277
      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
   278
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   279
      # 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
   280
      property = COMMENT_PREFIX + property
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   281
      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
   282
        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
   283
    return fields
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   284
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   285
  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
   286
                   tip='', comment=''):
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   287
    """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
   288
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   289
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   290
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   291
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   292
      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
   293
      schema: schema for survey
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   294
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   295
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   296
      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
   297
      comment: initial comment value for field
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   298
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   299
2670
884f808d8469 fix for issue 653 by adding wrap=hard attr to textareas for surveys
James Levy <jamesalexanderlevy@gmail.com>
parents: 2659
diff changeset
   300
    #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
   301
    attrs['wrap'] = 'hard'
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   302
    widget = widgets.Textarea(attrs=attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   303
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   304
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   305
      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
   306
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   307
    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
   308
                         widget=widget, initial=value)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   309
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   310
    self.survey_fields[field] = question
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   311
2468
0273c1a8d708 Fixed too long line in Surveys helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2465
diff changeset
   312
  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
   313
                    tip='', comment=''):
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   314
    """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
   315
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   316
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   317
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   318
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   319
      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
   320
      schema: schema for survey
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   321
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   322
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   323
      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
   324
      comment: initial comment value for field
2432
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
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   327
    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
   328
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   329
    widget = widgets.TextInput(attrs=attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   330
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   331
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   332
      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
   333
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   334
    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
   335
                         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
   336
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   337
    self.survey_fields[field] = question
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   338
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   339
  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
   340
                     tip='', comment=''):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   341
    """Add a selection field to this form.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   342
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   343
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   344
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   345
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   346
      attrs: additional attributes for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   347
      schema: schema for survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   348
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   349
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   350
      tip: tooltip text for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   351
      comment: initial comment value for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   352
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   353
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   354
    widget = PickOneSelect(attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   355
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   356
    these_choices = []
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   357
    # add all properties, but select chosen one
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   358
    # 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
   359
    options = getattr(self.survey_content, field)
2533
941732c52b67 Fixed broken selection questions from refactoring SurveyForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2530
diff changeset
   360
    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
   361
      these_choices.append((value, value))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   362
      if value in options:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   363
        options.remove(value)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   364
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   365
    for option in options:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   366
      these_choices.append((option, option))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   367
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   368
      tip = 'Please select an answer this question.'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   369
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   370
    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
   371
                            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
   372
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   373
    self.survey_fields[field] = question
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   374
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   375
  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
   376
                    tip='', comment=''):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   377
    """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
   378
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   379
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   380
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   381
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   382
      attrs: additional attributes for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   383
      schema: schema for survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   384
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   385
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   386
      tip: tooltip text for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   387
      comment: initial comment value for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   388
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   389
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   390
    widget = PickManyCheckbox(attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   391
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   392
    # 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
   393
    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
   394
      # 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
   395
      value = value.split(',')
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   396
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   397
    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
   398
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   399
      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
   400
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   401
    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
   402
                             choices=tuple(these_choices), widget=widget,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   403
                             initial=value)
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   404
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   405
    self.survey_fields[field] = question
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   406
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   407
  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
   408
                    tip='', comment=''):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   409
    """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
   410
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   411
    params:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   412
      field: the current field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   413
      value: the initial value for this field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   414
      attrs: additional attributes for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   415
      schema: schema for survey
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   416
      req: required bool
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   417
      label: label for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   418
      tip: tooltip text for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   419
      comment: initial comment value for field
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   420
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   421
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   422
    widget = PickQuantRadio(attrs)
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   423
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   424
    if self.survey_record:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   425
      value = value
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   426
    else:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   427
      value = None
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   428
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   429
    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
   430
    if not tip:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   431
      tip = 'Please select one of these choices.'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   433
    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
   434
                             choices=tuple(these_choices), widget=widget,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   435
                             initial=value)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   436
    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
   437
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   438
  def addCommentField(self, field, comment, attrs, tip):
2520
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   439
    """Add comment field to a question.
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   440
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   441
    params:
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   442
      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
   443
      comment: the initial value of this field.
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   444
      attrs: the attrs for the widget
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   445
      tip: tooltip text for this field
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   446
    """
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   447
2526
8f29bfb9eb52 Survey editing/taking Javascript and CSS fixes.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2520
diff changeset
   448
    attrs['class'] = 'comment'
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   449
    attrs['rows'] = '1'
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   450
    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
   451
    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
   452
        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
   453
    self.survey_fields[COMMENT_PREFIX + field] = comment_field
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
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   456
  class Meta(object):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   457
    model = SurveyContent
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   458
    exclude = ['schema']
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   459
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   460
2798
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   461
class SurveyRecordForm(SurveyTakeForm):
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   462
  """SurveyContent form for showing record of survey answers.
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
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   465
  def addLongField(self, field, value, attrs, schema, **kwargs):
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   466
    """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
   467
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   468
    params:
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   469
      field: the current field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   470
      value: the initial value for this field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   471
      attrs: additional attributes for field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   472
      schema: schema for survey
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
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   475
    question = CharField(widget=custom_widgets.PlainTextWidget, initial=value)
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   476
    self.survey_fields[field] = question
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   477
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   478
  def addShortField(self, field, value, attrs, schema, **kwargs):
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   479
    """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
   480
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   481
    params:
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   482
      field: the current field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   483
      value: the initial value for this field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   484
      attrs: additional attributes for field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   485
      schema: schema for survey
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
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   488
    question = CharField(widget=custom_widgets.PlainTextWidget, initial=value)
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   489
    self.survey_fields[field] = question
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   490
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   491
  def addCommentField(self, field, comment, attrs, tip):
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   492
    """Add plain text comment field to a question.
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   493
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   494
    params:
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   495
      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
   496
      comment: the initial value of this field.
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   497
      attrs: the attrs for the widget
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   498
      tip: tooltip text for this field
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
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   501
    widget = custom_widgets.PlainTextWidget
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   502
    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
   503
    self.survey_fields[COMMENT_PREFIX + field] = comment_field
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   504
ec1857f0d0c7 Added SurveyRecordForm for viewing a SurveyRecord.
James Levy <jamesalexanderlevy@gmail.com>
parents: 2683
diff changeset
   505
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   506
class SurveyEditForm(djangoforms.ModelForm):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   507
  """SurveyContent form for editing a survey.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   508
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   509
  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
   510
    - Admin creating survey from scratch
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   511
    - Admin updating existing survey
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   512
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   513
  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
   514
  survey form is dynamically formed.
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
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   517
  def __init__(self, *args, **kwargs):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   518
    """Store special kwargs as attributes.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   519
2520
859ada69db69 Style fixes in Survey helper.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2518
diff changeset
   520
    params:
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   521
      survey_content: a SurveyContent entity.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   522
      survey_logic: an instance of SurveyLogic.
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
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   525
    self.kwargs = kwargs
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   526
    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
   527
    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
   528
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   529
    super(SurveyEditForm, self).__init__(*args, **self.kwargs)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   530
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   531
  def getFields(self):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   532
    """Build the SurveyContent (questions) form fields.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   533
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   534
    params:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   535
      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
   536
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   537
    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
   538
    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
   539
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   540
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   541
    if not self.survey_content:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   542
      return
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   543
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   544
    self.survey_fields = {}
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   545
    schema = SurveyContentSchema(self.survey_content.schema)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   546
    extra_attrs = {}
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   547
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   548
    # add unordered fields to self.survey_fields
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   549
    for field in self.survey_content.dynamic_properties():
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   550
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   551
      # use prompts set by survey creator
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   552
      value = getattr(self.survey_content, field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   553
      from_content = True
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   554
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   555
      label = schema.getLabel(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   556
      if label is None:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   557
        continue
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   558
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   559
      tip = schema.getTip(field)
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   560
      kwargs = schema.getEditFieldArgs(field, value, tip, label)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   561
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   562
      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
   563
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   564
      # add new field
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   565
      self.survey_fields[field] = schema.getEditField(field)(**kwargs)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   566
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   567
    # 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
   568
    return self.insertFields()
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   569
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   570
  def insertFields(self):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   571
    """Add ordered fields to self.fields.
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
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   574
    survey_order = self.survey_content.getSurveyOrder()
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   575
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   576
    # insert dynamic survey fields
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   577
    for position, property in survey_order.items():
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   578
      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
   579
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   580
    return self.fields
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   581
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   582
  class Meta(object):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   583
    model = SurveyContent
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   584
    exclude = ['schema']
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   585
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   586
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   587
class SurveyContentSchema(object):
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   588
  """Abstract question metadata handling.
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
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   591
  def __init__(self, schema):
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   592
    """Set the dictionary that this class encapsulates.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   593
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   594
    Args:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   595
      schema: schema as stored in SurveyConent entity
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   596
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   597
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   598
    self.schema = eval(schema)
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   599
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   600
  def getType(self, field):
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   601
    """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
   602
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   603
    Args:
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   604
      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
   605
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   606
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   607
    return self.schema[field]["type"]
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   608
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   609
  def getTip(self, field):
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   610
    """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
   611
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   612
    Args:
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   613
      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
   614
    """
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   615
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   616
    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
   617
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   618
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   619
  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
   620
    """Check whether survey question is required.
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   621
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   622
    Args:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   623
      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
   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
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   626
    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
   627
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   628
  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
   629
    """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
   630
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   631
    Args:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   632
      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
   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
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   635
    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
   636
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   637
  def getRender(self, field):
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   638
    """Get rendering options for choice questions.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   639
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   640
    Args:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   641
      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
   642
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   643
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   644
    return self.schema[field]["render"]
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   645
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   646
  def getEditField(self, field):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   647
    """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
   648
    """
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   649
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   650
    kind = self.getType(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   651
    if kind in CHOICE_TYPES:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   652
      Field = PickOneField
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   653
    else:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   654
      Field = CharField
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   655
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   656
    return Field
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   657
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   658
  def getEditFieldArgs(self, field, value, tip, label):
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   659
    """Build edit view field arguments.
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   660
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   661
    params:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   662
      field: field name
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   663
      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
   664
      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
   665
      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
   666
    """
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   667
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   668
    kind = self.getType(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   669
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   670
    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
   671
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   672
    if kind in CHOICE_TYPES:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   673
      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
   674
    else:
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   675
      kwargs['initial'] = tip
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   676
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   677
    return kwargs
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   678
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   679
  def getEditWidget(self, field, attrs, tip):
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   680
    """Get survey editing widget for questions.
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
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   683
    kind = self.getType(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   684
    is_required = self.getRequired(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   685
    has_comment = self.getHasComment(field)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   686
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   687
    if kind in CHOICE_TYPES:
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   688
      widget = UniversalChoiceEditor
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   689
      render = self.getRender(field)
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   690
      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
   691
    else:
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   692
      args = is_required, has_comment
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   693
      if kind == 'long_answer':
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   694
        widget = LongTextarea
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   695
      elif kind == 'short_answer':
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   696
        widget = ShortTextInput
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   697
      attrs = attrs.copy()
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   698
      attrs['class'] = kind
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   699
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   700
    kwargs = dict(attrs=attrs)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   701
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   702
    return widget(*args, **kwargs)
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   703
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   704
  def getLabel(self, field):
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   705
    """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
   706
    """
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   707
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   708
    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
   709
      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
   710
                    (field, str(self.schema)))
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   711
      return
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   712
    else:
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   713
      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
   714
2451
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   715
    return label
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   716
c58a7ea6c126 Added SurveyContentSchema to improve readability for the survey helper.
Daniel Diniz <ajaksu@gmail.com>
parents: 2442
diff changeset
   717
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   718
class UniversalChoiceEditor(widgets.Widget):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   719
  """Edit interface for choice questions.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   720
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   721
  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
   722
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   723
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   724
  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
   725
               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
   726
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   727
    params:
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   728
      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
   729
      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
   730
      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
   731
      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
   732
    """
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   733
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   734
    self.attrs = attrs or {}
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   735
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   736
    # 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
   737
    # 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
   738
    # more than once.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   739
    self.choices = list(choices)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   740
    self.kind = kind
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   741
    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
   742
    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
   743
    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
   744
    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
   745
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   746
  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
   747
    """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
   748
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   749
    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
   750
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   751
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   752
    if value is None:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   753
      value = ''
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   754
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   755
    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
   756
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   757
    # 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
   758
    selected = 'selected="selected"'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   759
    context =  dict(
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   760
        name=name,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   761
        is_selection=selected * (self.kind == 'selection'),
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   762
        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
   763
        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
   764
        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
   765
        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
   766
        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
   767
        )
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   768
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   769
    # 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
   770
    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
   771
        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
   772
        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
   773
        ))
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   774
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   775
    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
   776
    chained_choices = enumerate(chain(self.choices, choices))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   777
    choices = {}
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   778
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   779
    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
   780
      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
   781
      choices[i] = option_value
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   782
    context['choices'] = choices
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   783
2560
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   784
    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
   785
    context['tooltip_content'] = tooltip_content
a944c0169ad8 Added ability to add custom tooltips and UI improvements.
Daniel Diniz <ajaksu@gmail.com>
parents: 2542
diff changeset
   786
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   787
    template = 'soc/survey/universal_choice_editor.html'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   788
    return loader.render_to_string(template, context)
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
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   791
class PickOneField(forms.ChoiceField):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   792
  """Stub for customizing the single choice field.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   793
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   794
  #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
   795
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   796
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   797
    super(PickOneField, self).__init__(*args, **kwargs)
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
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   800
class PickManyField(forms.MultipleChoiceField):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   801
  """Stub for customizing the multiple choice field.
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
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   804
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   805
    super(PickManyField, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   806
3069
1b9c554ca96d Multiple choice nonrequired questions now accept empty answers.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2798
diff changeset
   807
  def clean(self, value):
1b9c554ca96d Multiple choice nonrequired questions now accept empty answers.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2798
diff changeset
   808
    """Validates that the input is a list or tuple. If no fields are marked,
1b9c554ca96d Multiple choice nonrequired questions now accept empty answers.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2798
diff changeset
   809
    an empty string is returned istead of an empty list.
1b9c554ca96d Multiple choice nonrequired questions now accept empty answers.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2798
diff changeset
   810
    """
1b9c554ca96d Multiple choice nonrequired questions now accept empty answers.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2798
diff changeset
   811
    
1b9c554ca96d Multiple choice nonrequired questions now accept empty answers.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2798
diff changeset
   812
    value = super(PickManyField, self).clean(value)
1b9c554ca96d Multiple choice nonrequired questions now accept empty answers.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2798
diff changeset
   813
    return value if value else ''
1b9c554ca96d Multiple choice nonrequired questions now accept empty answers.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2798
diff changeset
   814
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   815
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
   816
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
   817
  """Stub for customizing the choice field.
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   818
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   819
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   820
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   821
    super(PickQuantField, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   822
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   823
2502
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   824
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
   825
  """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
   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
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   828
  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
   829
    """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
   830
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   831
    params:
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   832
      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
   833
      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
   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
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   836
    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
   837
    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
   838
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   839
    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
   840
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   841
  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
   842
    """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
   843
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   844
    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
   845
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   846
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   847
    # 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
   848
    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
   849
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   850
    # add 'required' and 'has_comment' fields
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   851
    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
   852
                   has_comment=self.has_comment)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   853
    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
   854
    rendered = template.render(context=loader.Context(dict_=context))
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   855
    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
   856
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   857
    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
   858
    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
   859
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   860
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   861
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
   862
  """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
   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
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   865
  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
   866
    """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
   867
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   868
    params:
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   869
      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
   870
      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
   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
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   873
    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
   874
    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
   875
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   876
    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
   877
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   878
  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
   879
    """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
   880
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   881
    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
   882
    """
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   883
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   884
    # 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
   885
    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
   886
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   887
    # add 'required' and 'has_comment' fields
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   888
    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
   889
                   has_comment=self.has_comment)
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   890
    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
   891
    rendered = template.render(context=loader.Context(dict_=context))
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   892
    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
   893
2517
97117d341f62 Split SurveyForm into SurveyTakeForm and SurveyEditForm.
Daniel Diniz <ajaksu@gmail.com>
parents: 2507
diff changeset
   894
    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
   895
    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
   896
2e096acc8720 Surveys can now have required questions and comments can be turned on/off.
Daniel Diniz <ajaksu@gmail.com>
parents: 2501
diff changeset
   897
2432
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   898
class PickOneSelect(forms.Select):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   899
  """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
   900
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   901
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   902
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   903
    super(PickOneSelect, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   904
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   905
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   906
class PickManyCheckbox(forms.CheckboxSelectMultiple):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   907
  """Customized multiple choice checkbox widget.
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
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   911
    super(PickManyCheckbox, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   912
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   913
  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
   914
    """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
   915
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   916
    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
   917
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   918
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   919
    if value is None:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   920
      value = []
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   921
    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
   922
    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
   923
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   924
    # normalize to strings.
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   925
    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
   926
    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
   927
    smart_unicode = forms.util.smart_unicode
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   928
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   929
    # set container fieldset and list
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   930
    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
   931
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   932
    # add numbered checkboxes wrapped in list items
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   933
    chained_choices = enumerate(chain(self.choices, choices))
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   934
    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
   935
      option_label = escape(smart_unicode(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
      # 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
   938
      # 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
   939
      if has_id:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   940
        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
   941
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   942
      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
   943
      rendered_cb = cb.render(name, option_value)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   944
      cb_label = (rendered_cb, option_label)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   945
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   946
      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
   947
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   948
    output.append(u'  </ul>\n</fieldset>')
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   949
    return u'\n'.join(output)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   950
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   951
  def id_for_label(self, id_):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   952
    # 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
   953
    if id_:
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   954
      id_ += '_fieldset'
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   955
    return id_
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   956
  id_for_label = classmethod(id_for_label)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   957
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   958
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   959
class PickQuantRadioRenderer(widgets.RadioFieldRenderer):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   960
  """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
   961
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   962
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   963
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   964
    super(PickQuantRadioRenderer, self).__init__(*args, **kwargs)
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
  def render(self):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   967
    """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
   968
    """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   969
2680
b96ba702e82c Every radio button is now properly shown on a new line.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2670
diff changeset
   970
    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
   971
b96ba702e82c Every radio button is now properly shown on a new line.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2670
diff changeset
   972
    return linebreaks(u'<div class="quant_radio">%s</div>'
2683
8ea17736a10d Two style fixes.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2680
diff changeset
   973
                      % 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
   974
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
class PickQuantRadio(forms.RadioSelect):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   977
  """TODO(James,Ajaksu) Fix Docstring
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   978
  """
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   979
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   980
  renderer = PickQuantRadioRenderer
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
  def __init__(self, *args, **kwargs):
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   983
    super(PickQuantRadio, self).__init__(*args, **kwargs)
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   984
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   985
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   986
# 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
   987
WIDGETS = {'multi_checkbox': PickManyCheckbox,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   988
           'single_select': PickOneSelect,
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   989
           'quant_radio': PickQuantRadio}
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   990
636dfd5381c2 Added Survey Views Helper for rendering several widgets.
James Levy <jamesalexanderlevy@gmail.com>
parents:
diff changeset
   991
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   992
class HelperForm(object):
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   993
  """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
   994
  """
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
  def __init__(self, form=None):
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   997
    """Store the edit_form.
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   998
    """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
   999
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1000
    self.form = form
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1001
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1002
  def __call__(self, instance=None):
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1003
    """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
  1004
    """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1005
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1006
    form = self.form(instance=instance)
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1007
    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
  1008
    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
  1009
    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
  1010
    return form
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1011
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1012
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1013
def getCSVHeader(survey_entity):
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1014
  """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
  1015
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1016
  Args:
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1017
      survey_entity: Survey entity
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1018
  """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1019
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1020
  tpl = '# %s: %s\n'
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1021
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1022
  # add static properties
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1023
  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
  1024
  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
  1025
  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
  1026
  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
  1027
             for f in FIELDS.split()]
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1028
  fields.sort()
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1029
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1030
  # add dynamic properties
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1031
  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
  1032
  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
  1033
  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
  1034
             for prop in dynamic]
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1035
  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
  1036
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1037
  # add schema
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1038
  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
  1039
  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
  1040
  indent = '},\n#' + ' ' * 9
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1041
  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
  1042
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1043
  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
  1044
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1045
2659
8df08a3b17db More style fixes due to code reviews for Surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2658
diff changeset
  1046
def getRecords(recs, props):
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1047
  """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
  1048
  """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1049
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1050
  records = []
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1051
  props = props[1:]
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1052
  for rec in recs:
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1053
    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
  1054
    leading = (rec.user.link_id,)
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1055
    records.append(leading + values)
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1056
  return records
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1057
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1058
2658
34b414a80d42 Several style fixes and code cleaning for surveys.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2576
diff changeset
  1059
def toCSV(survey_view):
2478
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1060
  """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
  1061
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1062
  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
  1063
      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
  1064
  """
985fd974e095 Clean up and other fixes for Survey modules.
Daniel Diniz <ajaksu@gmail.com>
parents: 2470
diff changeset
  1065
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
  1066
  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
  1067
    """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
  1068
    """
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
    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
  1070
    record_logic = survey_logic.getRecordLogic()
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
    # 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
  1073
    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
  1074
    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
  1075
    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
  1076
6eac6cd88dad Made the CSV exporter for Survey not rely on the BackReferenceProperty in Survey.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 2489
diff changeset
  1077
    # 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
  1078
    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
  1079
    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
  1080
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
  1081
    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
  1082
      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
  1083
    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
  1084
      # 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
  1085
      return header, survey.link_id
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
  1086
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
  1087
    # 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
  1088
    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
  1089
    recs = getRecords(recs, properties)
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
  1090
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
  1091
    # 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
  1092
    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
  1093
    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
  1094
    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
  1095
    writer.writerows(recs)
2501
d612b48e6e12 Added Survey From Field validation.
Daniel Diniz <ajaksu@gmail.com>
parents: 2492
diff changeset
  1096
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
  1097
    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
  1098
  return wrapper