Added Survey and SurveyContent model.
authorJames Levy <jamesalexanderlevy@gmail.com>
Sun, 28 Jun 2009 13:07:18 +0200
changeset 2428 8ca9f32d3fc4
parent 2427 0dee663d6582
child 2429 a0a1dd1cc69e
Added Survey and SurveyContent model. They are currently located in a single file this can be undone later on. Patch by: James Levy, Daniel Diniz, Lennard de Rijk Reviewed by: Lennard de Rijk
app/soc/models/survey.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/models/survey.py	Sun Jun 28 13:07:18 2009 +0200
@@ -0,0 +1,158 @@
+#!/usr/bin/python2.5
+#
+# Copyright 2009 the Melange authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This module contains the Survey models.
+
+Survey describes meta-information and permissions.
+SurveyContent contains the fields (questions) and their metadata.
+"""
+
+__authors__ = [
+  '"Daniel Diniz" <ajaksu@gmail.com>',
+  '"James Levy" <jamesalexanderlevy@gmail.com>',
+  '"Lennard de Rijk" <ljvderijk@gmail.com>',
+]
+
+
+from google.appengine.ext import db
+
+from django.utils.translation import ugettext
+
+import soc.models.work
+
+
+class SurveyContent(db.Expando):
+  """Fields (questions) and schema representation of a Survey.
+
+  Each survey content entity consists of properties where names and default
+  values are set by the survey creator as survey fields.
+
+    schema: A dictionary (as text) storing, for each field:
+      - type
+      - index
+      - order (for choice questions)
+      - render (for choice questions)
+      - question (free form text question, used as label)
+  """
+
+  #:Field storing the content of the survey in the form of a dictionary.
+  schema = db.TextProperty()
+
+  #: Fields storing the created on and last modified on dates.
+  created = db.DateTimeProperty(auto_now_add=True)
+  modified = db.DateTimeProperty(auto_now=True)
+
+  def getSurveyOrder(self):
+    """Make survey questions always appear in the same (creation) order.
+    """
+    survey_order = {}
+    schema = eval(self.schema)
+    for property in self.dynamic_properties():
+      # map out the order of the survey fields
+      index = schema[property]["index"]
+      if index not in survey_order:
+        survey_order[index] = property
+      else:
+        # Handle duplicated indexes
+        survey_order[max(survey_order) + 1] = property
+    return survey_order
+
+  def orderedProperties(self):
+    """Helper for View.get_fields(), keep field order.
+    """
+    properties = []
+    survey_order = self.getSurveyOrder().items()
+    for position,key in survey_order:
+      properties.insert(position, key)
+    return properties
+
+
+class Survey(soc.models.work.Work):
+  """Model of a Survey.
+
+  This model describes meta-information and permissions.
+  The actual questions of the survey are contained
+  in the SurveyContent entity.
+  """
+
+  URL_NAME = 'survey'
+  # euphemisms like "student" and "mentor" should be used if possible
+  SURVEY_ACCESS = ['admin', 'restricted', 'member', 'user']
+
+  # these are GSoC specific, so eventually we can subclass this
+  SURVEY_TAKING_ACCESS = ['student', 
+                          'mentor',
+                          'student evaluation',
+                          'mentor evaluation',
+                          'org_admin',
+                          'user',
+                          'public']
+  GRADE_OPTIONS = {'midterm':['mid_term_passed', 'mid_term_failed'],
+                   'final':['final_passed', 'final_failed'],
+                   'N/A':[] }
+  prefix = db.StringProperty(default='program', required=True,
+      choices=['site', 'club', 'sponsor', 'program', 'org', 'user'],
+      verbose_name=ugettext('Prefix'))
+  prefix.help_text = ugettext(
+      'Indicates the prefix of the survey,'
+      ' determines which access scheme is used.')
+
+  #: Field storing the required access to read this survey.
+  read_access = db.StringProperty(default='restricted', required=True,
+      choices=SURVEY_ACCESS,
+      verbose_name=ugettext('Survey Read Access'))
+  read_access.help_text = ugettext(
+      'Indicates who can read the results of this survey.')
+
+  #: Field storing the required access to write to this survey.
+  write_access = db.StringProperty(default='admin', required=True,
+      choices=SURVEY_ACCESS,
+      verbose_name=ugettext('Survey Write Access'))
+  write_access.help_text = ugettext(
+      'Indicates who can edit this survey.')
+
+  #: Field storing the required access to write to this survey.
+  taking_access = db.StringProperty(default='student', required=True,
+      choices=SURVEY_TAKING_ACCESS,
+      verbose_name=ugettext('Survey Taking Access'))
+  taking_access.help_text = ugettext(
+      'Indicates who can take this survey. '
+      'Student/Mentor options are for Midterms and Finals.')
+
+  #: Field storing whether a link to the survey should be featured in
+  #: the sidebar menu (and possibly elsewhere); FAQs, Terms of Service,
+  #: and the like are examples of "featured" survey.
+  is_featured = db.BooleanProperty(
+      verbose_name=ugettext('Is Featured'))
+  is_featured.help_text = ugettext(
+      'Field used to indicate if a Survey should be featured, for example,'
+      ' in the sidebar menu.')
+
+  #: Date at which the survey becomes available for taking.
+  opening = db.DateTimeProperty(required=False)
+  opening.help_text = ugettext(
+      'Indicates a date before which this survey'
+      ' cannot be taken or displayed.')
+
+  #: Deadline for taking survey.
+  deadline = db.DateTimeProperty(required=False)
+  deadline.help_text = ugettext(
+      'Indicates a date after which this survey'
+      ' cannot be taken.')
+
+  #: Referenceproperty that specifies the content of this survey.
+  survey_content = db.ReferenceProperty(SurveyContent,
+                                     collection_name="survey_parent")