| #summary Design/discussion for Surveys |
| #labels Importance-Useful,Phase-Requirements,Contents-Draft |
| |
| <wiki:toc max_depth="3" /> |
| |
| = GSoC Project Info = |
| |
| || James Levy || [http://socghop.appspot.com/student_project/show/google/gsoc2009/melange/t124022698643 Project description] || |
| |
| = Introduction = |
| |
| 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. |
| |
| * Planned Surveys |
| * Mid term progress (by student) |
| * Mid term progress (by mentor - determines whether student gets mid-term payment) |
| * Final survey (by student) |
| * Final survey (by mentor - determines whether student passes overall) |
| * Final survey (by admin(s)) - Feedback on orgs participation |
| * Ad-Hoc surveys |
| * Currently these are done using Google forms. In 2009 OSPO sent an additional survey to examine the relationship between numbers of student applications and quality. |
| |
| Surveys, or at least the techniques used to achieve them, could be used more widely to make existing Models extensible. Issue 520 and Issue 100 are related to this. |
| |
| A past GSOC survey is viewable here: https://spreadsheets.google.com/viewform?formkey=cjV0aVVtcGhtdEdhSnp5bTl6b2Fob1E6MA |
| |
| |
| |
| = Evaluation Walkthrough = |
| |
| |
| 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) |
| |
| |
| |
| = Models = |
| |
| 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. |
| |
| |
| = Views = |
| |
| |
| 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. |
| |
| |
| = Front-End = |
| |
| 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. |
| |
| |
| = Grading = |
| |
| 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. |
| |
| |
| |
| == TODO == |
| |
| - (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. |
| |