| #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.  | 
 |   |