|James Levy||Project description|
Surveys are used in GSoC for two general purposes:
-General polling/survey (can be restricted to mentors, students, etc.)
-Midterm/Final surveys for students and mentors associated with a certain program to take.
Each year the questions asked change slightly.
The intent of surveys is that the program admin can set up the questions and collect the answers.
Surveys, or at least the techniques used to achieve them, could be used more widely to make existing Models extensible. Issue 520 (on Google Code) and Issue 100 (on Google Code) are related to this.
A past GSOC survey is viewable here: https://spreadsheets.google.com/viewform?formkey=cjV0aVVtcGhtdEdhSnp5bTl6b2Fob1E6MA
Creating a survey is a simple 3-step process.
The first step is to configure the administrative attributes of the survey, such as its name and read/write access privileges. These attributes are comparable to those for documents and other Melange entities.
The second step is to determine who the survey is for. A survey can be open to anyone, or it can also be used for a midterm/final evaluation. If the survey is being used for an evaluation, two surveys should be made - one for students, and one for mentors. (The student projects shared by these students and mentors is used to link pairs of mentor/student surveys so they can be retrieved together)
The third step is to create the survey content itself. This should be an intuitive process. Note that you can set custom prompts for questions and re-order options for select fields and checkbox fields.
(this walkthrough will be expanded when midterm features for GSOC2009 are finalized)
There are three model classes used for surveys - Survey, SurveyContent, and SurveyRecord.
The Survey model describes read/write permissions and metadata of the survey entity, such as whether it is featured, and who has created and edited it.
The SurveyContent model is a db.Expando() class where each property is the name of a field of the survey, and the value of the property contains information such as the prompt for the question and choices for a selection field. A schema property included in each instance is a dictionary describing what type of question each field is, such as selection (choice), short answer, or long answer.
The SurveyRecord model is also a db.Expando() class, and each property is the name of a field for the given survey and the value is the supplied answer. The SurveyRecord refers to the user who took the survey and the Survey entity in question.
Working with db.Expando() classes is mostly very straightforward. Python‘s getattr() and setattr() method are used to access survey fields since we don’t know the name of the property/field in advance.
The Survey view and logic mostly inherited from the base classes, with some modifications since the properties saved and retrieved are dynamic in nature.
There are also classes in views/helper/surveys.py to render widgets used to create, edit, and take surveys, and list survey results.
The survey listing functionality is significantly modified from the base List class, also because the properties used to generate the list form are not hard-coded into the model class.
The take_survey.js and edit_survey.js modules facilitate the creation and taking of surveys on the front-end. It is mostly straightforward jQuery DOM manipulation.
A requirement for the midterm administration of surveys will be that survey results can be graded using a binary distinction like pass/fail. Since this feature won't be universal to surveys, the SurveyRecord class has been subclassed as MidtermRecord, with an additional ‘project’ and ‘grade’ property.
Assuming that mentors aren't graded as students are, the grading feature should be conditional on a student taking the test, and to access the test, the student must have a project associated with the program associated with the survey.
The scope_path property of the survey can be used to get the program associated with the survey, and verify that the survey-taker has permission to take the survey. The Survey model inherits from the soc.models.work.Work class, so it uses the Linkable class to give it a scope_path containing the program id.
On the front-end, the grading feature for the survey edit view can be added by editing the row template for the results list so that each row includes a widget beside it consisting of two buttons to toggle pass/fail for the survey result on that row. A “save survey grades” button is added at the bottom.
On submission, a serialized array is sent in the POST that has pass/fail/none as options that are saved as a ‘grade’ property for the particular SurveyResult entity. The id of the survey result can be used as an identifier for this process.
The grade property of the SurveyResult can then be retrieved for any other view, given a project entity or a program entity.
(James) A view for org_admins to see completed records and uncompleted surveys for projects.
Better handling of cases where POST is not successfully sent. (Confirmation e-mail, etc.)
Send notifications to users who have not yet taken surveys. This would most likely be in the form of a button on the create/edit page.
Test Suite, Integration with seed_db, etc.