#summary This page contains Change Logs for Melange.
#labels Importance-Featured,Featured

= Changelog for 0-7-20100404 =

 * Allow name attributes (Gilles Bedel)
 * Disable converting html/xml quotes elements to their real equivalent (Matthew Wilkes)
 * Add testcase for issue 838 (Matthew Wilkes)
 * Add failing test for preserving anchors (Sverre Rabbelier)
 * HtmlCleaner: add test for XSS attack (Sverre Rabbelier)

= Changelog for 0-7-20100402 =

 * Patch up the Html Sanitizer some more (Matthew Wilkes)
 * Add failing test case for cleaner (Sverre Rabbelier)
 * Fix tests since new getSidebar in core (Sverre Rabbelier)
 * Pre-load stats.py with GSoC classes (Sverre Rabbelier)
 * Spelling error fixed in student proposal model. (Daniel Hans)
 * Fixed wrong redirect in "New review" message for StudentProposals. (Lennard de Rijk)
 * On creation of a student entity make sure its status is active. (Lennard de Rijk)

= Changelog for 0-7-20100331 =

 * Add disable_tinymce preference (Sverre Rabbelier)
 * Edited the student role management page to be more verbose. (Lennard de Rijk)
 * Actually refresh list data from server when requested. (Mario Ferraro)

= Changelog for 0-7-20100330 =

 * Fix html cleaning bugs (Matthew Wilkes)
 * Do not use jLinq to sort if there is no data in list. (Mario Ferraro)

= Changelog for 0-7-20100329 =

 * Removed wrap string from the paranoid filters to fix doubling of line endings. (Lennard)
 * Trigger reload grid after fetch of each batch of data. (Mario Ferraro)
 * Fixed the "I am willing to mentor this student" button on the review page. (Lennard de Rijk)
 * Simplified if statement for showing Register as student link. (Lennard de Rijk)
 * Register as a student link now showing if you are not signed in. (Lennard de Rijk)

= Changelog for 0-7-20100328 =

 * Pretty-print request status (Sverre Rabbelier)
 * Refactoring of list code. (Mario Ferraro)
 * Move contributor template to the bottom of the org public page (Sverre Rabbelier)
 * Edited help text for link id on edit User Profile page. (Lennard de Rijk)

= Changelog for 0-7-20100322 =

 * Properly render safe urls (Sverre Rabbelier)

= Changelog for 0-7-20100321 =

 * fix list of list using the wrong params (Sverre Rabbelier)
 * profiler: data being removed from memcache is not an error (Sverre Rabbelier)
 * Group menu now includes short name of scope if applicable. (Lennard de Rijk)
 * Updated ListProposals page name to include program short name. (Lennard de Rijk)
 * Now properly 404'ing on a role's manage page when no role is found. (Lennard de Rijk)
 * Inactive group menus are now collapsed by default. (Lennard de Rijk)
 * The process request page now has some additional help information. (Lennard de Rijk)
 * Orgs that have not completed their profile yet are shown at the bottom. (Lennard)

= Changelog for 0-7-20100317 =

 * On student proposal review form mentor is preselected in admin options. (Daniel Hans)
 * Updated the Accepted Organization message for GSoC2010. (Lennard de Rijk)
 * Adds a stubout for select method in View (Madhusudan.C.S)
 * Merged with Madhusudan. (Daniel Hans)
 * Fix the access type for suggest task to suggest_task. (Madhusudan.C.S)
 * Change the dates in fixtures for tests to be set from today's date. (Madhusudan.C.S)
 * Summary of scores does not display zero scores. (Daniel Hans)
 * Group model now also contains two lines for street addresses. (Lennard de Rijk)
 * Added recipient name and one extra line for addresses to roles. (Lennard de Rijk)
 * Don't escape fields with no data, to prevent shown "None" in lists. (Lennard)
 * Add version and timestamp to ProfileData (Sverre Rabbelier)
 * Make ProfileData key based (Sverre Rabbelier)
 * Pass filter to base.list in assignSlots (Sverre Rabbelier)
 * Remove debug logging from profiling.storage (Sverre Rabbelier)
 * Repeat the task only before the accepted student projects are announced. (Madhusudan.C.S)
 * Fix typo which passed wrong parameters to redirect_fun. (Madhusudan.C.S)
 * The accepted org app lists on the participating orgs now hides itself. (Lennard)
 * Max bucket size is 20 (Sverre Rabbelier)

= Changelog for 0-7-20100313 =

 * Move view related code to viewer module and persist profiles (Sverre Rabbelier)
 * Add license and authors to ppstats module (Sverre Rabbelier)
 * Add a storage class for ProfileData (Sverre Rabbelier)
 * Add a new queue for the profiler (Sverre Rabbelier)
 * Fix has_profiler method and add missing parens (Sverre Rabbelier)
 * Integerate app_profiler with Melange (Sverre Rabbelier)
 * Fix sidebar caching (Sverre Rabbelier)
 * Add check for &#34; which is another numerical entity for ". (Mario Ferraro)
 * Fix handling of " and &quot; on CSV exports. (Mario Ferraro)

= Changelog for 0-7-20100312 =

 * Extend the overview list for OrgApps to include the questions and answers. (Lennard)
 * Add temporary placeholder text before list creation. (Mario Ferraro)
 * Placeholder text for lists if Javascript is disabled. (Mario Ferraro)
 * Fix SurveyRecord forms not showing questions but question ID's. (Lennard de Rijk)
 * The search menu is now only shown when a search key is defined. (Lennard de Rijk)
 * Changed soc.models.logic.site import to a shorter input. (Lennard de Rijk)
 * Added Leon Palm to AUTHORS. (Leon Palm)
 * Added CSE search to Melange. (Leon Palm)
 * Fixed ProjectSurvey Access check to allow for inactive roles. (Lennard de Rijk)
 * Add antlr and coverage to the pythonpath used by buildout. (Matthew Wilkes)
 * Add public_conf_min_num option (Sverre Rabbelier)
 * Fix urlize (Sverre Rabbelier)
 * Now logging if a selected notification is not found. (Lennard de Rijk)
 * Removed the Possible mentors field from the list. (Lennard de Rijk)
 * Updated StudentProposal mail for GSoC2010. (Lennard de Rijk)
 * Fix prefetchField to not die on unset reference (Sverre Rabbelier)
 * Fixed missing error message in GSoC access module. (Lennard de Rijk)

= Changelog for 0-7-20100308 =

 * Raise default entity fetch limit to 150 (Sverre Rabbelier)
 * Prefetch all fields accessed in public_field_extra (Sverre Rabbelier)
 * Convert list field prefetchign to the new list system (Sverre Rabbelier)
 * Split getListConfiguration off from getListData (Sverre Rabbelier)
 * Fetch only duplicates that are known to have duplicate proposals. (Madhusudan.C.S)
 * Fix the url for student proposals in duplicates list. (Madhusudan.C.S)
 * Fix confirmation dialogs on the StudentProposal Review page. (Mario Ferraro)
 * Moved prefix code to own helper module and use it for Documents as well. (Lennard)
 * Removed the add argument for adjustPossibleMentors. (Lennard de Rijk)
 * Marking a StudentProposal as ineligble is now a POST operation. (Lennard de Rijk)
 * The "want to mentor buttons" on the StudentProposal page are now POST. (Lennard)
 * Change the subscription button to work on a POST request basis. (Lennard de Rijk)
 * Subscribe button on StudentProposal page is now a single button. (Lennard de Rijk)
 * Removed several unused entries from the GSoCTimeline model. (Lennard de Rijk)
 * Removed reviewAfterDeadline from StudentProposal. (Lennard)
 * Show tooltips when hovering over a checkbox. (Mario Ferraro)
 * Middle click and CTRL+Left click now opens list items in a new tab. (Mario Ferraro)
 * Generalize enable/disable buttons logic to make it work onSelectAll. (Mario Ferraro)
 * Fixes the selection list not showing a cickable ideas URL and tags. (Lennard)

= Changelog for 0-7-20100307 =

 * Fixed wrong redirect being shown on the ProjectSurvey list on Manage page. (Lennard)
 * Fixed the amount of slots not being shown on the listProposals page. (Lennard de Rijk)
 * Reduce the query limit so we perform more but smaller ones. (Lennard de Rijk)

= Changelog for 0-7-20100306 =

 * Removed unused list_heading and list_row entries for Core and GSoC modules. (Lennard)
 * Survey Results view now uses the right list model to display the Records. (Lennard)
 * Fixed redirects for reminder emails to work with module system. (Lennard de Rijk)
 * Survey list view now passes along the correct filter and any other kwargs. (Lennard)
 * Fix the Survey viewResults view to properly filter on records. (Lennard de Rijk)
 * Changed Survey View list to not ignore filter keyarg when it is given. (Lennard)
 * Close of the Survey Results view since the new lists have made it borked. (Lennard)
 * Fix imports for several tasks related to surveys. (Lennard de Rijk)
 * ?_field_hidden now hides the fields defined in ?_field_keys by default. (Lennard)
 * Pass on the fields to self.list (Sverre Rabbelier)
 * Give the right entity to getTakeProjectSurveyRedirect (Sverre Rabbelier)
 * Don't crash if there are no records yet (Sverre Rabbelier)
 * Use document prefix to query for surveys to be shown in a Program menu. (Lennard)
 * Add hidden fields back to student proposals (Sverre Rabbelier)
 * Add public_field_hidden to make it easy to add hidden fields (Sverre Rabbelier)
 * Optionally turn off closure by passing -c to build.sh (Sverre Rabbelier)
 * Fixed the Home link not showing up for all groups in their menu. (Lennard de Rijk)
 * Fixed Student listProjects view to pass the access check properly. (Lennard de Rijk)
 * Teach gen_app_yaml a --override-version argument (Sverre Rabbelier)
 * (Proposal)Reviews no longer display that a score of 0 has been given. (Lennard)
 * More style fixes to accept_proposals (Sverre Rabbelier)
 * Transitions new proposal to pending when a mentor is assigned . (Lennard de Rijk)
 * Add an non-optional program argument to accept_proposals (Sverre Rabbelier)
 * Project Acceptance using Task API (John Westbrook)
 * Remove the "willing to mentor button" when someone is the assigned mentor. (Lennard)
 * Fix notifcations sent for new Requests to properly display the information. (Lennard)
 * The list of Request now shows a verbose name instead of an internal one. (Lennard)
 * Move list of requests for a user to user_self to match how Roles does it. (Lennard)
 * Fix access check for StudentProposal Review and Comment views. (Lennard de Rijk)
 * Change access_type to allow where necessary. (Lennard de Rijk)
 * Added the Task to the URL patterns in the duplicates view. (Madhusudan.C.S)
 * Added task to calculate all the duplicates within one GSoCProgram. (Madhusudan.C.S)
 * Fixed reference to non-existing variable in PDS Logic. (Madhusudan.C.S)
 * Make the recalculate button not show up when task is running. (Madhusudan.C.S)
 * Added method to delete all ProposalsDuplicates for a program. (Lennard de Rijk)
 * Added property to check if a PD entity really has duplicates. (Madhusudan.C.S)
 * Fixed access_type for list_orgs in StudentProposal. (Lennard de Rijk)
 * Check for check role property Request View. (Lennard de Rijk)
 * Fixed list_requests view throwing access errors. (Lennard de Rijk)
 * Clarified help text for link_id to say alphanumeric characters. (Lennard de Rijk)
 * Syntax error in access control helper that prevented student signup. (Matthew Wilkes)
 * Escape all list data (except excluded fields) (Sverre Rabbelier)
 * Make lists.urlize return a (appropriately escaped) safe link (Sverre Rabbelier)
 * Add dicts.cleanDict function (Sverre Rabbelier)
 * Remove no-longer used list_key_order (Sverre Rabbelier)
 * Added list_participants view to Program. (Lennard de Rijk)
 * Added allow access type that always allows access. (Lennard de Rijk)
 * Per default unspecified access checks should bounce. (Lennard de Rijk)
 * Show list of proposals you are mentoring only if you are a Mentor. (Lennard de Rijk)
 * Proposal's /review view cannot be accessed after deadline. (Daniel Hans)
 * Use checkTimelineCondition in retrieveKeyNameFromPath to get KeyName. (Daniel Hans)
 * retrieveKeyNameFromPath function added to base logic. (Daniel Hans)
 * CheckIsBeforeEvent function added. (Daniel Hans)
 * Rows of list of proposals redirect to /comment view after the deadline. (Daniel Hans)
 * getProposalCommentRedirect added. (Daniel Hans)
 * Move is_publicly_visible field between additional_info and mentor. (Daniel Hans)
 * verbose_name added for is_publicly_visible field. (Daniel Hans)
 * reviews_dispabled field renamed to scoring_disabled. (Daniel Hans)
 * Proposal review form does not show scoring option if it is disabled. (Lennard)
 * Disable pagination in accepted{Orgs,Projects} lists (Sverre Rabbelier)
 * Remove old list code from helper.lists (Sverre Rabbelier)
 * Fix Roles to notify upon new request for module versions of the Mentor role. (Lennard)
 * Fix typos in Role model help text and clarified the help for phone number. (Lennard)
 * New boolean field (reviews_disabled) added to GSoCOrganization model. (Daniel Hans)
 * Merged with Lennard. (Daniel Hans)
 * Developers may access /public views for all proposals. (Daniel Hans)
 * Students may access /public view for their own proposals. (Daniel Hans)
 * Access chcking for proposal's /public view added. (Daniel Hans)
 * Access cheking function for proposal's public view added. (Daniel Hans)
 * Fix Particiaption agreement not appearing for Mentors and Students. (Lennard de Rijk)
 * New field (is_publicly_visible) added to StudentProposal model. (Daniel Hans)
 * Fix notification list using load instead of loads to load the JSON string. (Lennard)
 * Fix whitespace in GSoCOrganization view. (Lennard de Rijk)
 * Fix the Student Proposals list page for Orgs. (Lennard de Rijk)
 * Remove unused index for slot assignment. (Lennard de Rijk)
 * Clean up the code to set a proposal to a certain rank. (Lennard de Rijk)
 * Edited showDuplicates View to work with the new models. (Madhusudan.C.S)
 * Added as_proposal_duplicates template tag for displaying duplicates. (Madhusudan.C.S)
 * Added Logic for the ProposalDuplicatesStatus model. (Lennard de Rijk)
 * Added Logic for ProposalDuplicates model. (Madhusudan.C.S)
 * Added/Edited models for the new duplicates finding system. (Madhusudan.C.S)
 * Chang index for Organization to GSoCOrganization to match new design. (Madhusudan.C.S)
 * Fix call to AccessViolation constructor getting the wrong keyarg in Access. (Lennard)
 * Changed call to simplejson.read() to simplejson.load(). (Lennard de Rijk)
 * Add example text to link_id to clarify its purpose. (Lennard de Rijk)
 * Add tags as a column to the GSoCOrganization public list. (Lennard de Rijk)
 * Ideas page and home page links now state Click Here. (Lennard de Rijk)
 * Fix the list_requests page to only show uncompleted requests. (Lennard)
 * Fix URL Pattern for process_request for roles which only have invites. (Lennard)
 * Fixed organization home page to properly render if no project list is set. (Lennard)
 * Fix home page document field to properly work for Organizations. (Lennard)
 * Edit mail templates for OrgAppSurveys to state which org it is for. (Lennard)
 * Fix roles showing up under the wrong list in user_self. (Lennard)
 * Remove forgotten string used for debug. (Mario Ferraro)
 * /share view removed; its role taken up by /public. (Daniel Hans)
 * Access checking added for /comment view. (Daniel Hans)
 * /comment view matched with an URL pattern. (Daniel Hans)
 * /comment view is able to handle public comments POST request. (Daniel Hans)
 * Context related to proposal scores is updated by updateScoresContext. (Daniel Hans)
 * Context related to proposal reviews is updated by updateReviewsContext. (Daniel Hans)
 * Proper template set for /comment view. (Daniel Hans)
 * Initial version of updateCommentContext function. (Daniel Hans)
 * form param moved from function arguments to its body. Also, typo fix. (Daniel Hans)
 * Template binded with /comment view. (Daniel Hans)
 * Very initial version of functions which will handle /comment view. (Daniel Hans)
 * Initial version of /comment template for student proposals added. (Daniel Hans)
 * Convert cell value to String before operations for CSV exporting. (Mario Ferraro)
 * edit_params replaced with take_params for survey and org_app_survey. (Daniel Hans)
 * save_message key changed to successful_take_message for surveys. (Daniel Hans)
 * Items on list of proposals for a student have redirect to /private view. (Daniel Hans)
 * User is notified after submitting org application survey. (Daniel Hans)
 * Switch from JQuery Growfield plugin to TextAreaExpander plugin. (Mario Ferraro)
 * Display a "hand" cursor when hovering if row action is present. (Mario Ferraro)
 * Set correct row index to update cells. (Mario Ferraro)
 * Comma separator fix. (Daniel Hans)
 * Add explicit GPLv2 and LGPLv2 option to the licenses (Sverre Rabbelier)
 * Fix html encoding in surveys (Sverre Rabbelier)
 * Switch slot allocation JS logic to the new lists. (Mario Ferraro)
 * Test if row parameter is an empty object before iterating through it. (Mario Ferraro)
 * Use the proper org_logic in modules.gsoc.views.models.program (Sverre Rabbelier)
 * Add link_id as hidden row (Sverre Rabbelier)
 * Disable slot assignment row actions (Sverre Rabbelier)
 * Add index required for slot assignment (Sverre Rabbelier)
 * Compatibility with lists with pagination disabled. (Mario Ferraro)
 * Trigger an event when list is loaded. (Mario Ferraro)
 * Turn off pagination for assignSlots (Sverre Rabbelier)
 * Convert assignSlots to the new list system (Sverre Rabbelier)
 * Added license question to the OrgApplication. (Lennard de Rijk)
 * Fallback to empty array if no row is selected in lists. (Mario Ferraro)
 * Use multiselect in notification.list (Sverre Rabbelier)
 * Allow overriding configuration options (Sverre Rabbelier)
 * Fixed Org App Review Overview page to properly redirect to the Review page. (Lennard)
 * Fixed redirect on the OrgAppSurvey listSelf page to now work. (Lennard de Rijk)
 * do not open a new window by default when clicking on an item in a list. (Lennard)
 * Create CSV respecting the actual order of jQGrid colModel. (Mario Ferraro)
 * Fix View.select to use the proper params and view (Sverre Rabbelier)
 * Redirect inactive students to public page on student.listProjects (Sverre Rabbelier)
 * Get current row data from row number instead from selected row. (Mario Ferraro)
 * Check if there is a button event for per-entity ops before binding. (Mario Ferraro)
 * Format of /private page header fixed. (Daniel Hans)
 * private.html template added. (Daniel Hans)
 * Comment form is not sent in context in /share view for student proposal. (Daniel Hans)
 * /public view renamed to /private for student proposals. (Daniel Hans)
 * Convert organization.home to the new list system (Sverre Rabbelier)
 * Convert showEditRecordList to the new list system (Sverre Rabbelier)
 * Remove obsolete method from program (Sverre Rabbelier)
 * Remove broken function call in ghop and replace with todo (Sverre Rabbelier)
 * Convert program.acceptedOrgs to the new list system (Sverre Rabbelier)
 * Tags are cleaned by cleanTagsList. (Daniel Hans)
 * Org Application Form now shows link to printable Org Admin Agreement. (Lennard)
 * Make proper use of the show_in_roles_overview setting in Role Views. (Lennard)
 * Added empty cron.yaml file to indicate we are not running any Cron Jobs. (Lennard)
 * Autocompletion works for multiple tags in a single input line. (Daniel Hans)
 * Make the autocomplete script accept additional options. (Mario Ferraro)
 * Fallback to POST to current url if not specified by the backend. (Mario Ferraro)
 * Removed usage of a local variable before assignment. (Daniel Hans)
 * 'share' view for student proposal to displays only its content. (Daniel Hans)
 * Org admins may post comments and scores to student proposals. (Daniel Hans)
 * Tags autocompletion works on organization applicant page. (Daniel Hans)
 * Fix Review OrgaPP entry for Programs to redirect to the correct page. (Lennard)
 * Tags may be added on organization applicant page. (Daniel Hans)
 * The buttons on the notifcations page are now moved to the new list. (Lennard de Rijk)
 * Now properly merging params in Organization View. (Lennard de Rijk)
 * Tags may be added on create organization page. (Daniel Hans)
 * scope_path added as a hidden input on organization create page. (Daniel Hans)
 * Tags are removed, when an organization is deleted. (Daniel Hans)
 * Tags, which are not predefined, are auto deleted if there are not used. (Daniel Hans)
 * Changes made on Tags input field are handled by organization view. (Daniel Hans)
 * Tags input field on organization edit page. (Daniel Hans)
 * pickSuggestedTags function binded with org_tags/pick url. (Daniel Hans)
 * A list of suggested tags may be sent to a browser in a JSON format. (Daniel Hans)
 * Update tag list when an organization is updated. (Daniel Hans)
 * Don't trigger row actions on clicks on checkboxes in multisel tables. (Mario Ferraro)
 * Redid part of the Accepted Orgs page to at least perform the right query. (Lennard)
 * Enable global button in org_app_survey.reviewOverview (Sverre Rabbelier)
 * Enable global buttons in the new list system (Sverre Rabbelier)
 * Convert grading_survey_group.viewRecords to the new list system (Sverre Rabbelier)
 * GHOP Org App Survey Take View now uses checkIsSurveyTakeable check. (Lennard de Rijk)
 * Fix OrgAdmin view to properly display admin agreement when already accepted. (Lennard)
 * Fix missing space in OrgAppSurvey Completed message. (Lennard de Rijk)
 * Fix notification page showing Notifications of all users. (Lennard de Rijk)
 * Temporarily fixed checkIsSurveyTakable to work with the program prefixes. (Lennard)
 * Role requests for new groups are now working properly again. (Lennard de Rijk)
 * Added org_app_logic argument to checkOrgAppRecordIfPresent. (Lennard de Rijk)
 * Finished bulk processing of OrgApplicationRecords from the Overview page. (Lennard)
 * Make buttons disabled by default if lower bound is >0. (Mario Ferraro)
 * Rename CSS to today date to reflect recent changes. (Mario Ferraro)
 * Apply a different color to disabled buttons. (Mario Ferraro)
 * Send list index along with POST data. (Mario Ferraro)
 * Send button operation id of the protocol instead of DOM id. (Mario Ferraro)
 * Use /usr/bin/env python2.5 to support local installs of python (Sverre Rabbelier)
 * Remove unnecessary brs in template. (Mario Ferraro)
 * Simple workaround to fix "triple-tooltip" bug. (Mario Ferraro)
 * Add a simple tag to output a proper JSON string from a Py dict. (Mario Ferraro)
 * Send id of the button who triggered the action along with POST data. (Mario Ferraro)
 * Make POST function work with real button bounds. (Mario Ferraro)
 * Fix adding predefined tags when a new program is created. (Daniel Hans)
 * onCreate and onUpdate functions may be passed additional attributes. (Daniel Hans)
 * Student proposals may be reviewed even when the program is frozen. (Daniel Hans)
 * Corrected the role names used for the Organization sidebar. (Lennard de Rijk)
 * Fix epic copy/paste fail in org_admin (Sverre Rabbelier)
 * Now properly passing along role_name in Mentor/OrgAdmin logic. (Lennard de Rijk)
 * Add XSRF token automatically in POST operations for lists buttons. (Mario Ferraro)
 * Switch autocomplete and tooltip code to external JS files. (Mario Ferraro)
 * Make autocomplete and tooltip JS packages loadable from base template. (Mario Ferraro)
 * Externalize tooltip code to a JS package. (Mario Ferraro)
 * Externalize autocomplete code to a JS package. (Mario Ferraro)
 * Change null values to empty string when exporting CSV from lists. (Mario Ferraro)
 * Fixed StudentProject Manage page to query for the proper surveys. (Lennard de Rijk)
 * Removed OrgApplication models from SeedDB. (Lennard de Rijk)
 * Redone checkCanReviewGroupApp to work with Organization Applications. (Lennard)
 * Removed the old Group Application system. (Lennard de Rijk)
 * Implemented first version of the Org Application overview page for Hosts. (Lennard)
 * GSoC Program View now uses document_prefix for Survey menu items. (Lennard de Rijk)
 * Convert student_project.manage to the new list system (Sverre Rabbelier)
 * Improve helper.lists.urlize (Sverre Rabbelier)
 * Remove duplicate survey fields (Sverre Rabbelier)
 * Remove leftovers from the old list system (Sverre Rabbelier)
 * Fix whitespace damadge in notification.html (Sverre Rabbelier)
 * Remove leftovers from the old list system (Sverre Rabbelier)
 * Use the new list helper tags where appropriate (Sverre Rabbelier)
 * Add templatetags.list_helpers module (Sverre Rabbelier)
 * Restore custom list description to user_self.roles (Sverre Rabbelier)
 * Sort notifications by -created_on (Sverre Rabbelier)
 * Make it easy to only show notifications that are (Not) Read (Sverre Rabbelier)
 * Render 'unread' field as (Not) Read in the notifications list (Sverre Rabbelier)
 * Redirect to the public page for notifications (Sverre Rabbelier)
 * Pass the 'order' attribute to getListData in base.list (Sverre Rabbelier)
 * Add support for per-field properties in the new list system (Sverre Rabbelier)
 * Cleaned up base.list in the Base View. (Lennard de Rijk)
 * Finish implementing the new list for the listSelf page in OrgAppSurvey View. (Lennard)
 * Move toDict to dict Logic so that expando_base can make use of it too. (Lennard)
 * Add and enable access check for the Organziation Applicant View. (Lennard de Rijk)
 * Base url check in lists not to conflict with current query string. (Mario Ferraro)
 * Enabled the sending of mail when OrgAppRecord is accepted/rejected. (Lennard de Rijk)
 * Fix call to completeApplication in the OrgApp helper to match new signature. (Lennard)
 * getApplicantRedirect now uses the new URL scheme. (Lennard de Rijk)
 * Removed now unused mailing template. (Lennard de Rijk)
 * Redid the notifications and added mail for accepted/rejected applications. (Lennard)
 * Added mailing templates for OrgAppSurveys. (Lennard de Rijk)
 * Fixed access check in OrgAppSurvey view that was missing. (Lennard de Rijk)
 * Added OrgAppRecord Logic instances that are modules specfic. (Lennard de Rijk)
 * Organziation applicant view now initializes more form values. (Lennard de Rijk)
 * On creation of an Org by an applicant, Admin invites are now sent out. (Lennard)
 * Removed sentMail method from OrgAppRecord logic. (Lennard de Rijk)
 * OrgAdmin Logic now uses right Organization Logic in onCreate. (Lennard de Rijk)
 * Remove sending of invites when a new Organization is created. (Lennard de Rijk)
 * editContext in OrgAdmin View now works with the new OrgApplications. (Lennard)
 * Removed applicant view from the Group View. (Lennard de Rijk)
 * Removed now unused access check for the old Group Applications. (Lennard de Rijk)
 * Create Applicant view for the new OrgAppRecords. (Lennard de Rijk)
 * Fixed too long lines in Notification view. (Lennard de Rijk)
 * Fixed imports in Organization logic. (Lennard de Rijk)
 * Fixed docstring for onCreate in the Organization logic. (Lennard de Rijk)
 * Removed GroupApp argument from validate_new_group in the cleaning module. (Lennard)
 * RankerRoot entities are now only created for GSoCOrganizations. (Lennard de Rijk)
 * Disable refresh button in lists. (Mario Ferraro)
 * Increase timeout for async list fetchings. (Mario Ferraro)
 * Change null values to strings when exporting CSV from lists. (Mario Ferraro)
 * Adds a testing framework for GHOP module in Melange. (Madhusudan.C.S)
 * Convert org_app-survey to the new list system (Sverre Rabbelier)
 * out_of_band.Error responses are handled in the middleware (Sverre Rabbelier)
 * Rename list_self method to listSelf (Sverre Rabbelier)
 * Removed GHOP Search view because it will be redone using the new lists. (Lennard)
 * Added review page for OrgAppSurveyRecords. (Lennard de Rijk)
 * Add TODO's for unconverted lists (Sverre Rabbelier)
 * Remove leftovers of the old list system (Sverre Rabbelier)
 * Convert all list_action redirects to use public_row_extra (Sverre Rabbelier)
 * Convert project_survey to the new list system (Sverre Rabbelier)
 * Convert notifications to the new list system (Sverre Rabbelier)
 * Convert grading_record to new list system (Sverre Rabbelier)
 * Convert user_self to use the new list system (Sverre Rabbelier)
 * Convert student_project.manageOverview to the new list system (Sverre Rabbelier)
 * Convert student_proposal.listSelf to the new list system (Sverre Rabbelier)
 * Convert student_project.withdraw to the new list system (Sverre Rabbelier)
 * Convert project_survey.selectProjects to the new list system (Sverre Rabbelier)
 * Convert showEditRecordList to the new list system (Sverre Rabbelier)
 * Convert survey.viewResults to the new list system (Sverre Rabbelier)
 * Convert organization.listPublic to the new list system (Sverre Rabbelier)
 * Convert group.listRoles to the new list system (Sverre Rabbelier)
 * Convert group.listRequest to the new list system (Sverre Rabbelier)
 * Convert views.base.select to the new list system (Sverre Rabbelier)
 * Convert organization.listProposals to the new list system (Sverre Rabbelier)
 * Convert student_proposal.listOrgs to the new list system (Sverre Rabbelier)
 * Convert organization.applyMentor to the new list system (Sverre Rabbelier)
 * Convert request.listSelf to the new list system (Sverre Rabbelier)
 * Convert surveys to the new list system (Sverre Rabbelier)
 * Convert ghop student_proposal to the new list system (Sverre Rabbelier)
 * Convert ghop tasks to the new list system (Sverre Rabbelier)
 * Convert ghop programs to the new list system (Sverre Rabbelier)
 * Convert ghop organizations to the new list system (Sverre Rabbelier)
 * Convert student_project to the new list system (Sverre Rabbelier)
 * Convert group applications to the new list system (Sverre Rabbelier)
 * Convert grading_project_survey to the new list system (Sverre Rabbelier)
 * Convert club_member to the new list system (Sverre Rabbelier)
 * Convert club to the new list system (Sverre Rabbelier)
 * Convert club_admin to the new list system (Sverre Rabbelier)
 * Convert site to the new list system (Sverre Rabbelier)
 * Convert requests to the new list system (Sverre Rabbelier)
 * Convert program to the new list system (Sverre Rabbelier)
 * Convert priority groups to the new list system (Sverre Rabbelier)
 * Convert presence to the new list system (Sverre Rabbelier)
 * Convert organization to the new list system (Sverre Rabbelier)
 * Convert job to the new list system (Sverre Rabbelier)
 * Convert org_admin to the new list system (Sverre Rabbelier)
 * Convert groups to the new list system (Sverre Rabbelier)
 * Convert grading survey group list to the new system (Sverre Rabbelier)
 * Convert user list to new system (Sverre Rabbelier)
 * Convert student list to new system (Sverre Rabbelier)
 * Convert mentor list to new system (Sverre Rabbelier)
 * Convert host list to new system (Sverre Rabbelier)
 * Convert document list to new system (Sverre Rabbelier)
 * Convert datetime fields to strs in toDict (Sverre Rabbelier)
 * Pass on 'context' argument in base.list (Sverre Rabbelier)
 * Convert base.list to use the new list system (Sverre Rabbelier)
 * Change the default edit redirect to the new list system (Sverre Rabbelier)
 * Add views.helper.lists.urlize (Sverre Rabbelier)
 * Add getListData and getListGenerator to helper.lists (Sverre Rabbelier)
 * ease debugging of json responses by setting &plain=1 (Sverre Rabbelier)
 * Added json(Error)Response to helper.responses (Sverre Rabbelier)
 * Switch all lists to the new code (Mario Ferraro)
 * Enable jq_grid, jlinq, and melangeList js files (Mario Ferraro)
 * Add jlinq to the build script (Mario Ferraro)
 * Add the jlinq directory to app.yaml.template (Mario Ferraro)
 * Add the new melange javascript list code (Mario Ferraro)
 * Update the JQuery css file (Mario Ferraro)
 * Add the jqgrid ui images (Mario Ferraro)
 * Add the jqgrid css files (Mario Ferraro)
 * Add the jlinq library (Mario Ferraro)
 * Add the jquery 'jqgrid' plugin (Mario Ferraro)

= Changelog for 0-6-20100201 =

 * Update text for the agreement field to also say "Printable Page" (Lennard de Rijk)
 * Remove edits that do not belong in r7cda75. (Lennard de Rijk)
 * Added missing license statement to two templates. (Lennard de Rijk)
 * Started with implementation of the bulk processing task for OrgApps. (Lennard de Rijk)
 * Displays list of accepted organizations when a program is frozen. (Daniel Hans)
 * Add TODO's to convert student_project.withdraw to use POST (Sverre Rabbelier)
 * Fix error that occurs in combination with the xsrf layer. (Lennard de Rijk)
 * Set default charset to UTF-8. (Lennard de Rijk)

= Changelog for 0-6-20100130 =

 * Generate proper gsoc_program survey links (Sverre Rabbelier)
 * Site home page link now shows for every user by default. (Lennard de Rijk)
 * Style fix due to comments on ra68b457f37. (Lennard de Rijk)
 * Make the build script run closure script when running. (Mario Ferraro)
 * Add Closure running script. (Mario Ferraro)
 * Add Closure compiler to repository. (Mario Ferraro)
 * Remove shrinksafe script from repository. (Mario Ferraro)
 * Remove Shrinksafe binaries from repository. (Mario Ferraro)
 * Remove Shrinksafe calling in build script. (Mario Ferraro)
 * Ensure that status is present in dictionary when used in Task Logic. (Lennard de Rijk)
 * Uncommented lines to hide Group menus. (Lennard de Rijk)
 * Edited several menu items to stay visible when your role is inactive. (Lennard de Rijk)
 * Group's menus now collapse by default when the Group is inactive. (Lennard de Rijk)
 * POST Requests made by AppEngine's Task/CronJob do not need a token. (Lennard de Rijk)
 * Clarified the use of the index for GSoCMentors. (Lennard de Rijk)
 * Fix import in GSoC Program Menu to import its own logic. (Lennard de Rijk)
 * Fix missing import in GHOP Program View. (Marcelo de Sena Lacerda)
 * Fix attempt to load wrong Access module in OrgAppSurveys. (Lennard de Rijk)
 * Fix student_proposal.review when there are no reviews (Sverre Rabbelier)
 * Add required index (Sverre Rabbelier)

= Changelog for 0-6-20100117 =

 * Do not show li class=... in the sidebar when there is no heading (Sverre Rabbelier)
 * don't send out emails in non-local debug mode (Sverre Rabbelier)
 * Catch OverQuotaErrors in mail_dispatcher.sendEmail (Sverre Rabbelier)
 * Generate proper key field pattern for id based entities (Sverre Rabbelier)
 * Add logic.isIdBased() (Sverre Rabbelier)
 * Security fixes (adds XSRF protection) (Doug Coker)
 * Added missing logic property to OrgAppSurvey Logic module. (Lennard de Rijk)
 * Removed the Club Applications. (Lennard de Rijk)
 * Enabled the new Organization Application Surveys. (Lennard de Rijk)
 * Disabled old Organization Application View. (Lennard de Rijk)
 * Added entry to create/edit OrgAppSurvey in the Program menu. (Lennard de Rijk)
 * Include OrgAppSurvey entries for GHOP and GSoC programs. (Lennard de Rijk)
 * Added OrgAppSurvey View to the GSoC and GHOP module. (Lennard de Rijk)
 * Added OrgApplicationSurvey Logic to the GHOP and GSoC module. (Lennard de Rijk)
 * Added base view for OrgAppSurveys. (Lennard de Rijk)
 * Added access checks related to the new OrgApplications. (Lennard de Rijk)
 * Added OrgAppSurvey redirects. (Lennard de Rijk)
 * Added templates for OrgApplicationSurveys. (Lennard de Rijk)
 * Added has_post boolean to SurveyTakeForm. (Lennard de Rijk)
 * Added logic methods for OrgApplications. (Lennard de Rijk)
 * Added new OrgApplication models. (Lennard de Rijk)
 * Remove not needed get_by_scope class method from OrgTag model. (Pawel Solyga)
 * Only show Developer menu to developers (Sverre Rabbelier)
 * Google JSApi included only once in base template now. (Mario Ferraro)
 * Merged with Pawel. (Daniel Hans)
 * Admin chooses a mentor to a proposal from a drop-down list. (Daniel Hans)
 * Add get_by_scope class method to OrgTag model. (Pawel Solyga)
 * Remove unused imports and fix style issues. (Pawel Solyga)
 * Remove unused imports from soc.tasks.updates modules. (Pawel Solyga)
 * Remove unused imports in mentor and org_admin soc.views.models modules. (Pawel Solyga)
 * Rmove unused import in soc.tasks.responses module. (Pawel Solyga)
 * Fix style issues in soc.models.survey module. (Pawel Solyga)
 * Merged with Sverre. (Daniel Hans)
 * Remove unused imports from soc.middleware. (Pawel Solyga)
 * Fix imports in soc.logic.models.mentor module. (Pawel Solyga)
 * Review proposal page: added summary to, subscores instead of total score. (Daniel Hans)
 * Remove unused imports and fix style issues in soc.views.helper.surveys. (Pawel Solyga)
 * Fix too long lines in soc.views.models.document module. (Pawel Solyga)
 * Style fixes in soc.views.models.role module. (Pawel Solyga)
 * Style fixes in soc.views.models.notification module. (Pawel Solyga)
 * Style fixes in soc.views.models.organization module. (Pawel Solyga)
 * Fix too long lines in soc.views.models.student_project module. (Pawel Solyga)
 * Remove unused imports and fix some style issues in survey modules. (Pawel Solyga)
 * add logic.base.getFromKeyNameOrID (Sverre Rabbelier)
 * Fix wrong imports in tasks.grading_survey_group (Sverre Rabbelier)
 * Create and use the Developer menu (Sverre Rabbelier)
 * Add getDevmenu to sitemap.sidebar (Sverre Rabbelier)
 * Factor out getItemsFromDefaults (Sverre Rabbelier)
 * squash with prior (Sverre Rabbelier)
 * Collapse the 'Developer' menu by default (Sverre Rabbelier)
 * Add priority_group and job to the sidebar (Sverre Rabbelier)
 * Allow grouping under one grouper (Sverre Rabbelier)
 * Program settings now properly validates the reference fields again. (Lennard de Rijk)
 * Fixed SurveyRecord property not being passed along to the redirect. (Lennard de Rijk)
 * Added a method that returns the redirect for submitting a Survey. (Lennard de Rijk)
 * Descriptions of student proposals scores removed. (Daniel Hans)
 * Merged with Lennard. (Daniel Hans)
 * Admin options for proposals separated from 'Score and Review' section. (Daniel Hans)
 * Added survey argument to SurveyTakeForm. (Lennard de Rijk)
 * word regexp pattern changed to \w. (Daniel Hans)
 * Tags entered with capital letters are normalized to lower case. (Daniel Hans)
 * Added cleaning functions for gsoc module. (Daniel Hans)
 * Data validation for tag values added. (Daniel Hans)
 * Predefined tags may be both added or removed. (Daniel Hans)
 * 'Upload organization tags' -> 'Predefined organization tags'. (Daniel Hans)
 * Save organization tags defined in program edit view to the datastore. (Daniel Hans)
 * taggable-mixin directory removed from the repository. (Daniel Hans)
 * Program edit view contains a widget to upload predefined org tags. (Daniel Hans)
 * Tag property added to GSoCOrganization model. (Daniel Hans)
 * New get_or_create function added to Tag class. (Daniel Hans)
 * get_or_create function moved to TaskTag class. (Daniel Hans)
 * str2set cleaning function can have a custom separator. (Daniel Hans)
 * Fixed several imports regarding scope view and scope logic. (Lennard de Rijk)
 * Fixed wrong URL mapping in GradingSuveyGroup. (Lennard de Rijk)
 * Excise jslint. (Dan Bentley)
 * applyMentor redirect uses new mentor_url_name param. (Daniel Hans)
 * Merged with Lennie. (Daniel Hans)
 * mentor_role_name changed to 'gsoc/mentor' to match the modulus design. (Daniel Hans)
 * Fixed import in StudentProject Logic. (Lennard de Rijk)
 * Fixed import for StudentProjects to refer to GSoCOrganization. (Lennard de Rijk)
 * Fixed missing timeline helper import in GSoC module access method. (Lennard de Rijk)
 * Fixed StudentProposal imports for Logic and Views. (Lennard de Rijk)
 * Fixed imports for validate_student_proposal in the cleaner. (Lennard de Rijk)
 * Fixed bug in core Access where the wrong Program Logic was used. (Lennard de Rijk)
 * Fixed bug in Program View getExtraMenus where wrong Logic was used. (Lennard de Rijk)
 * Remove unused imports from soc.views.models.request module. (Pawel Solyga)

= Changelog for 0-6-20091214 =

 * Fixed docstrings for Tasks Repsonses. (Lennard de Rijk)
 * Some missing gsoc prefixes added to redirect calls for GSoC Surveys. (Daniel Hans)
 * GSoC specific survey record models moved to gsoc module. (Daniel Hans)
 * Survey model moved back to the core module. (Daniel Hans)
 * New survey model files actually added to repository. (Daniel Hans)
 * Survey models moved to gsoc module. (Daniel Hans)
 * Move (Grading)Project(Survey)Logic to GSoC module (Sverre Rabbelier)
 * GradingSurveyGroup model moved to gsoc module (Daniel Hans)
 * Review model moved to gsoc module (Daniel Hans)
 * getRankerFor in gsoc student_proposal logic imports ranker_root logic. (Daniel Hans)
 * RankerRoot model moved to gsoc module (Daniel Hans)
 * ProposalDuplicates model moved to gsoc module (Daniel Hans)
 * ReviewFollower model moved to gsoc module (Daniel Hans)
 * Follower model moved to gsoc module (Daniel Hans)
 * StudentProposal model moved to gsoc module (Daniel Hans)
 * StudentProject module moved to gsoc module. (Daniel Hans)
 * Fix for "invalid Maps API key" when showing both map and blog feeds. (Mario Ferraro)
 * Move grading survey group logic to gsoc module (Sverre Rabbelier)
 * Move review logic to gsoc module (Sverre Rabbelier)
 * Move ranker root logic to gsoc module (Sverre Rabbelier)
 * Move proposal duplicates logic to gsoc module (Sverre Rabbelier)
 * Move grading record logic to gsoc module (Sverre Rabbelier)
 * Move review follower logic to gsoc module (Sverre Rabbelier)
 * Move the follower logic to the gsoc module (Sverre Rabbelier)
 * Move student proposal logic to gsoc module (Sverre Rabbelier)
 * Move student project logic to gsoc module (Sverre Rabbelier)

= Changelog for 0-6-20091207 =

 * Style fix due to comments on rf8ecabdc70. (Lennard de Rijk)
 * Missing slashes added in program redirects. (Daniel Hans)
 * getExtraMenuItems for organization moved to gsoc organization view. (Daniel Hans)
 * Some missing 'gsoc/' prefixes added to GSoC redirects. (Daniel Hans)
 * Entries common for gsoc and ghop students collected in program view. (Daniel Hans)
 * getStudentEntries function moved to gsoc program view. (Daniel Hans)
 * getExtraMenus function in program view refactored. (Daniel Hans)
 * Two missing imports added to student view in gsoc module. (Daniel Hans)
 * Legacy request for list_projects removed from student view. (Daniel Hans)
 * URL pattern for student projects moved to student view in gsoc module. (Daniel Hans)
 * listProjects moved to GSoC Student view. (Daniel Hans)
 * Index to order Organizations by name removed from index.yaml (Daniel Hans)
 * GSoCOrganization index moved and described in index.yaml (Daniel Hans)
 * Merged with Lennard. (Daniel Hans)
 * Capital letters in 'List all Student Projects' link. (Daniel Hans)
 * Message displayed with list of accepted projects moved to GSOCProgram. (Daniel Hans)
 * acceptedProjects function moved to GSoCProgram view. (Daniel Hans)
 * Missing ugettext import added to GSoCProgram view. (Daniel Hans)
 * Typo fixed in DEF_PARTICIPATING_ORGS_MSG_FMT message. (Daniel Hans)
 * GSoC specific messages moved to GSoCProgram view. (Daniel Hans)
 * List of accepted organization works for gsoc module. (Daniel Hans)
 * Fixed typo in StudentProposal View getDefaultReviewContext. (Lennard de Rijk)

= Changelog for 0-6-20091205p4 =

 * Empty content for getTimeDependentEntries in program view. (Daniel Hans)
 * Fixed missing GSoCMentor logic import for StudentProjects. (Lennard de Rijk)
 * Removed Student Proposal as a legacy redirect. (Lennard de Rijk)
 * Updated import in Organization to the new GSoC module. (Lennard de Rijk)
 * Fixed incorrect mapping of URL to methods in the new GSoC module. (Lennard de Rijk)

= Changelog for 0-6-20091205p3 =

 * Copy getTimelineEntries to GSoCProgram view use proper logics. (Daniel Hans)
 * Fixed list project page to no longer require login. (Lennard de Rijk)

= Changelog for 0-6-20091205p2 =

 * GSoC Program Logic now uses the GSoCTimeline logic as argument. (Lennard de Rijk)
 * Corrected scope property for timeline in module conversion updater. (Lennard de Rijk)
 * Removed sidebar entries related to ProjectSurveys. (Lennard de Rijk)

= Changelog for 0-6-20091205p1 =

 * Add missing imports and use ugettext instead of the lazy variant. (Lennard de Rijk)
 * Removed the app/gsoc folder. (Lennard de Rijk)
 * Program Logic now doesn't use any Timeline as default. (Lennard de Rijk)
 * Timeline view now uses base Timeline. (Lennard de Rijk)
 * Moved GSoC timeline entries to the correct model. (Lennard de Rijk)
 * Removed sidebar entries for timeline. (Lennard de Rijk)

= Changelog for 0-6-20091205 =

 * Move GSoC specific access checks to GSoCAccess (Sverre Rabbelier)
 * Removed unused import from Core access module. (Lennard de Rijk)
 * StudentProposal now imports Logic from the GSoC module. (Lennard de Rijk)
 * Removed Reviewer property from Review model. (Lennard de Rijk)
 * Moved three access checks related to StudentProjects. (Lennard de Rijk)
 * Added Program Logic argument to checkIsHostForProgramInScope. (Lennard de Rijk)
 * Moved two Survey related access checks to the GSoCChecker. (Lennard de Rijk)
 * Set the default prefix for ProjectSurveys to gsoc_program. (Lennard de Rijk)
 * The new Views in the GSoC module now use the GSoCChecker. (Lennard de Rijk)
 * Added Program and Org specific menu entries to the GSoC module. (Lennard de Rijk)
 * Removed unneeded menu entries from the SoC Core. (Lennard de Rijk)
 * Enable the GSoC module (Sverre Rabbelier)
 * Use new surveys in program.py (Sverre Rabbelier)
 * Delete old survey views (Sverre Rabbelier)
 * Disable old survey views (Sverre Rabbelier)
 * Turn old student project and proposals into redirects (Sverre Rabbelier)
 * Enable new GSoC views (Sverre Rabbelier)
 * Add new GSoC views (Sverre Rabbelier)
 * Replace legacy views with redirects (Sverre Rabbelier)
 * Merge with Lennard (Sverre Rabbelier)
 * Add logging.debug(post_dict) to task decorators (Sverre Rabbelier)
 * Let the GSoC Views use the new GSoCChecker. (Lennard de Rijk)
 * Added GSoCChecker module. (Lennard de Rijk)
 * Fixed wrongly addressed Logic being used in the GSoCProgram View. (Lennard de Rijk)

= Changelog for 0-5-20091205 =

 * Update Google App Engine from 1.2.7 to 1.2.8 in thirdparty folder. (Sverre Rabbelier)
 * The StudentProject and StudentProposal update should put Key back. (Lennard de Rijk)
 * Allow cron jobs and tasks to work in maintenance mode (Sverre Rabbelier)
 * Hooked up the module_conversion updates to the start_update module. (Lennard de Rijk)
 * Minor typo fixes and whitespace fixes in cleaning module. (Daniel Hans)
 * Input form values are properly cleared when school_type is changed. (Daniel Hans)
 * Fixed issue for cleaning student fields on server side. (Daniel Hans)
 * Minor typo errors fixed in help texts for Student role. (Daniel Hans)
 * runGradingSurveyGroupUpdate update includes setting new survey. (Daniel Hans)
 * Module conversion update for survey models. (Daniel Hans)
 * Only active students may edit their student projects. (Daniel Hans)
 * iterative_task uses pickle module instead of simplejson. (Daniel Hans)
 * Fixed bug in process_exception function in soc.middleware module. (Daniel Hans)
 * Fixed bug in base editGet where suffix must be a String. (Lennard de Rijk)
 * Fixed typo in access module introduced in rf70ce. (Lennard de Rijk)
 * Merged checkCanCreateFromRequest and checkIsMyGroupAcceptedRequest. (Lennard de Rijk)
 * Removed unsused Model properties from Document, Survey and User. (Lennard de Rijk)
 * Code fixes in GHOP view modules based on pylint output. (Daniel Hans)
 * Code fixes in GHOP models based on pylint output. (Daniel Hans)
 * Code fixes in GHOP logic modules based on pylint output. (Daniel Hans)
 * When a new role is created, fields are populated from previous roles. (Daniel Hans)
 * Default accepted text will not be shown if one is set by the Program. (Lennard de Rijk)
 * Switched T-shirt questions order. (Lennard de Rijk)
 * Adds buttons to notifications list. (Madhusudan.C.S)
 * Edited version tag to match right format. (Lennard de Rijk)

= Changelog for 0-5-20091121 =

 * Url pattern fix for tasks handler in app.yaml.template. (Daniel Hans)
 * Forgotten simplejson import added. (Daniel Hans)
 * The Document conversion now creates documents with new prefixes. (Lennard de Rijk)
 * Added gsoc_program and gsoc_org prefixes to the Document Model. (Lennard de Rijk)
 * Added missing Document Prefix to the GSoC Program module. (Lennard de Rijk)
 * Fixed missing document_prefix for the GHOP Program module. (Lennard de Rijk)
 * Added gsoc_org and gsoc_program to the Document Rights system. (Lennard de Rijk)
 * Fixed typo in GHOP core registerRights documentation. (Lennard de Rijk)
 * Use the proper prefix in 'Create new Document' entry for programs. (Lennard de Rijk)
 * Added general description of the jslint.sh script. (Mario Ferraro)
 * Added general description of the shrinksafe.sh script. (Mario Ferraro)
 * Added general description of the jsdoctoolkit.sh script. (Mario Ferraro)
 * Bug on GHOP task public view fixed. (Daniel Hans)
 * Show register link only when a user has AwaitingRegistration task. (Daniel Hans)
 * Mentors list cleaning optimization. (Daniel Hans)
 * A person without User profile cannot pass checkStatusForTask checker. (Daniel Hans)
 * Whitespace fixes in GHOP program view. (Daniel Hans)
 * Status is not filtered when checking if a user can see his tasks. (Daniel Hans)
 * GHOP Timeline fixes. (Pawel Solyga)
 * GMaps related JS changed to use new google namespace. (Mario Ferraro)
 * Changes in tags are saved to the data store. (Daniel Hans)
 * Tasks may be deleted by pressing 'Delete' button on the edit view. (Daniel Hans)
 * Minor fix in tags module. (Daniel Hans)
 * tags.py module, which contains helper class for tags, is added. (Daniel Hans)
 * Users who claim or work on tasks may list them without a student role. (Daniel Hans)
 * Minor linguistic changes to NOTICE file for the taggable module. (Daniel Hans)
 * NOTICE file added to the taggable module. (Daniel Hans)
 * Move some functions from TaskTag to Task model. (Daniel Hans)
 * Docstring fix for delete_tag function. (Daniel Hans)
 * 'scope' field moved from TaskTag to the parent class. (Daniel Hans)
 * TaskArbritraryTag now has auto_delete set to True by default. (Daniel Hans)
 * Adds a new property to taggable which automatically deletes an empty tag. (Daniel Hans)
 * Fixed an error with the task_history not being loaded. (Lennard de Rijk)
 * Fixed 'Register as a student' link problem for GHOP program. (Daniel Hans)
 * Lists of student tasks view does not use pagination. (Daniel Hans)
 * Accidental module change in settings.py fixed. (Daniel Hans)
 * List view of all tasks for a GHOP student. (Daniel Hans)
 * getListContentForData function added to lists helper. (Daniel Hans)
 * HtmlSanitizer becomes Python 2.6 compatible. (Daniel Hans)
 * Convert gen_app_yaml.py to optparse (Sverre Rabbelier)

= Changelog for 0-5-20091102 =

 * Minor (mostly stylish and whitespace) fixes in GHOP access.py module. (Daniel Hans)
 * Multiple choice nonrequired questions now accept empty answers. (Daniel Hans)
 * checkIsHostForProgram fixes: logic argument has default value. (Daniel Hans)
 * checkIsHostForProgram function takes a new 'logic' argument. (Daniel Hans)
 * If checkCanOrgAdminOrMentorEdit does not find a task, redirect to 404. (Daniel Hans)
 * Script to run JSLint over JS files to check JS code quality. (Mario Ferraro)
 * JSON2 utilities now loaded by default. (Mario Ferraro)
 * Module Conversion also changes the RankerRoots. (Lennard de Rijk)
 * Now showing the message contained in Requests on the correct pages. (Lennard de Rijk)
 * Process invite page now shows the right Role name in the page name. (Lennard de Rijk)
 * Request lists now show display name as well as the link id. (Lennard de Rijk)
 * The work_submission model's update now reflected in views and logic. (Madhusudan.C.S)
 * Whitespace fix in settings.py and added missing authors. (Lennard de Rijk)
 * Changed the access checks in the GSoC module to match the new checks. (Lennard de Rijk)
 * Removed the now obsolete Request helper module. (Lennard de Rijk)
 * Edited the necessary access checks for all the Role views. (Lennard de Rijk)
 * Facilitate the use of the ID-based Requests. (Lennard de Rijk)
 * Redone the access checks to work with the new Request model. (Lennard de Rijk)
 * Removed now unused method from Role Logic. (Lennard de Rijk)
 * Redone the notifications to work with the new Request model. (Lennard de Rijk)
 * Reworked the redirects to work with the new Request model. (Lennard de Rijk)
 * Redone the request View to work with the new model. (Lennard de Rijk)
 * Redone the request templates to work with the new ID-based request. (Lennard de Rijk)
 * Made Request Logic ID-based and added some helper methods. (Lennard de Rijk)
 * Redone the Request object to contain a message property. (Lennard de Rijk)
 * Add a redirectLegacyRequest response (Sverre Rabbelier)
 * fix typo in reponses.py (Sverre Rabbelier)
 * GSoC Views (Sverre Rabbelier)
 * Script to run JSDocToolkit over our JS files. (Mario Ferraro)
 * JSDocToolkit 2.3.0 added to create documentation for JS files. (Mario Ferraro)
 * Integration of general Melange JS utilities in base template. (Mario Ferraro)
 * General JavaScript utilities for melange. (Mario Ferraro)
 * Once a task has been approved it can no longer be unapproved. (Madhusudan.C.S)
 * Fixes issue 697. (Daniel Hans)
 * Use skipFields method in the expando base logic. (Lennard de Rijk)
 * Minor typographical errors fixed. (Daniel Hans)
 * Whitespaces fixed in task view. (Daniel Hans)
 * When a task is edited, 'modified_by' field is not cleared any more. (Daniel Hans)
 * Changed checkCanMakeRequestToGroup to use Logic instance. (Lennard de Rijk)
 * Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder. (Sverre Rabbelier)
 * Disabled GHOP module. (Lennard de Rijk)
 * Added logic paramters to two access checks. (Lennard de Rijk)
 * Set the Mentors list to the user that is suggesting a Task. (Lennard de Rijk)
 * Fixed access check and seed for Task Suggest page. (Madhusudan.C.S)
 * Removed query wether or not the current user was ever an org admin. (Lennard de Rijk)
 * Fixed the TimelineConversionUpdate to also update the GSoCProgram. (Lennard de Rijk)
 * Use scope_path for updating Documents. (Lennard de Rijk)
 * Renamed runGradingProjectSurveyRecordsUpdate to match style. (Lennard de Rijk)
 * Fixed error in the runDocumentUpdate. (Lennard de Rijk)
 * Added GradingSurveyGroup update to the Module Conversion. (Lennard de Rijk)
 * Fixed bug in StudentProposal update. (Lennard de Rijk)
 * Fixed module conversion imports. (Lennard de Rijk)
 * Fix typographical error and changes in status messages for Tasks. (Matthew Wilkes)
 * Separated the publish and approve button on the Task list page. (Madhusudan.C.S)
 * Add function for CSV export of survey records for a given survey. (Pawel Solyga)
 * Add functions for CSV export of organizations and roles. (Pawel Solyga)
 * Add StudentProposal conversion update (Sverre Rabbelier)

= Changelog for 0-5-20091004 =

 * Add Timeline conversion update (Sverre Rabbelier)
 * Add update for Documents (Sverre Rabbelier)
 * Added update for SurveyRecords (Sverre Rabbelier)
 * Added update for Surveys, ProjectSurveys and ProjectGradingSurveys. (Lennard de Rijk)
 * Added StudentProject update to the Module Conversion updates. (Lennard de Rijk)
 * Added Review module conversion update. (Lennard de Rijk)
 * Removed obsolete value to unpack in the updateGHOPTask Task. (Lennard de Rijk)
 * Also pass along the args when running an update. (Lennard de Rijk)
 * GHOP Comments do not need to be created by a User. (Lennard de Rijk)
 * Fix the deadline counter to start after Task claim is accepted. (Madhusudan.C.S)
 * Only set new properties outside the "properties" loop. (Lennard de Rijk)
 * Add the Student to GSoCStudent conversion. (Lennard de Rijk)
 * Only store all the entities once in the ModuleConversion. (Lennard de Rijk)
 * Add OrgAdmin and Mentor to GSoCOrgadmin and GSoCMentor updates. (Lennard de Rijk)
 * Added the Organization to GSoCOrganzation update. (Lennard de Rijk)
 * Use the iterative task iterator for the ProgramConversion update. (Lennard de Rijk)
 * Changed the working of the iterative_task decorator. (Lennard de Rijk)
 * Removed order property in the getBatchOfData. (Lennard de Rijk)
 * Removed the debug logging line from the Task decorator. (Lennard de Rijk)
 * Made getBatchOfData use start_key instead of next_key. (Lennard de Rijk)
 * Fixed use of wrong dictionary key in Task Decorators. (Lennard de Rijk)
 * Moved the Tasks decorators to their own module. (Lennard de Rijk)
 * Make batch size a param to getBatchOfData (Sverre Rabbelier)

= Changelog for 0-5-20090928 =

 * Merging test back in (Sverre Rabbelier)
 * Fixed whitespace in base model. (Lennard de Rijk)
 * Move soc.logic.tasks to soc.tasks.responses (Sverre Rabbelier)
 * Add task and iterative_task decorator (Daniel Hans)
 * Fixed Task public view to always call the update method. (Lennard de Rijk)
 * Add task and iterative_task decorator (Daniel Hans)
 * Fixed GHOP Task Logic's updateEntityProperties. (Lennard de Rijk)
 * Fixes the problem of GHOP Task editing after it is created. (Madhusudan.C.S)
 * Style fix in soc.views.models.request module. (Pawel Solyga)
 * Add missing blank line in soc.modules.gsoc.logic.models.student module. (Pawel Solyga)
 * Add missing blank line in soc.models.survey_record module. (Pawel Solyga)
 * Fix whitespace in pylint disable-msg comment. (Pawel Solyga)
 * Added first version of the 1st step in the module conversion process. (Lennard de Rijk)
 * Style fixes in seed_db module. (Pawel Solyga)
 * Style fix in soc.views.helper.redirects module. (Pawel Solyga)
 * Fix indentions in student_project view module. (Pawel Solyga)
 * Corrected an import in the student_school_type update module. (Lennard de Rijk)
 * Prevent modification of key fields (Sverre Rabbelier)
 * Add a script to generate a kml file with all active GSoC participants (Daniel Hans)

= Changelog for 0-5-20090922 =

 * Renamed timeline entry in GHOP Timeline. (Lennard de Rijk)
 * Fixed a typo in getRightsChecker docstring (Sverre Rabbelier)
 * Throw an exception when registering an already registered right (Sverre Rabbelier)
 * Convert cleaning module to use the new checker in core (Sverre Rabbelier)
 * Use ',' instead of ':' in function call (Sverre Rabbelier)
 * Remove ghop related liens from soc_core callback (Sverre Rabbelier)
 * Fixed unknown variable in GHOP Access checker. (Lennard de Rijk)
 * Enable document system for GHOP (Madhusudan.C.S)
 * Use the new rights code in core (Sverre Rabbelier)
 * Add document rights registration to core (Sverre Rabbelier)
 * Move around Core methods into more relevant sections (Sverre Rabbelier)
 * Use getOrCreateTaskSubscriptionForTask in the TaskSubscription View. (Lennard de Rijk)
 * Added getOrCreateTaskSubscriptionForTask to TaskSubscription Logic. (Lennard de Rijk)
 * Added listing of all Accepted GHOPOrganizations to the Program View. (Lennard de Rijk)
 * Add ret_list keyword argument to tags_strings method. (Madhusudan.C.S)
 * Added index to sort GHOPOrganizations per program by their name. (Madhusudan.C.S)
 * Added a templatetag for table field to show date in ordinal fashion. (Madhusudan.C.S)
 * Added missing argument to org_app View access check. (Lennard de Rijk)
 * Added GHOP views helper to INSTALLED_APPS in django settings.py. (Madhusudan.C.S)
 * Added apply_mentor view to GHOPOrganization view. (Lennard de Rijk)
 * Added 2 missing views to the GHOPOrganization View. (Lennard de Rijk)
 * Fixed error in mentor field cleaning. (Lennard de Rijk)
 * Removed undefined order argument in GHOP Task View. (Lennard de Rijk)
 * Bron paper bag fix, should have been part of ref809d10aa. (Lennard de Rijk)
 * Fixed error occuring when tags list was empty in GHOPProgram edit. (Lennard de Rijk)
 * Map JS renamed because of latest changes. (Mario Ferraro)
 * Shrinksafe complains during compression of map JS fixed. (Mario Ferraro)
 * Shrinksafe script fixed to workaround Linux vs BSD stat packages. (Mario Ferraro)
 * Added program_logic parameter to checkCanEditTimeline access check. (Madhusudan.C.S)
 * Removed slots and apps_tasks_limit from extra_dynaexclude in params. (Madhusudan.C.S)
 * Added all indexes required for GHOP specific queries. (Madhusudan.C.S)
 * Added all GHOP specific css properties. (Madhusudan.C.S)
 * Fixed the Student update to properly find its own URL. (Lennard de Rijk)
 * Enabled the Student School type updater. (Lennard de Rijk)
 * Added updater to update the existing Student models. (Madhusudan.C.S)
 * Moved the Student cleaner to the create form. (Lennard de Rijk)
 * Changed the TaskRunner to start and run update tasks. (Lennard de Rijk)
 * Changed the cleaner to deal with the new Student properties. (Madhusudan.C.S)
 * Added school_type and grade property to Student model. (Madhusudan.C.S)
 * Moved the updater to its own module. (Lennard de Rijk)
 * Added Student create/edit/apply template. (Madhusudan.C.S)
 * Enabled the GHOPStudent view in the GHOP module. (Lennard de Rijk)
 * Added GHOPStudent view and access checks. (Madhusudan.C.S)

= Changelog for 0-5-20090914 =

 * Using the new checkIsMyActiveRole check where necessary. (Lennard de Rijk)
 * Added checkIsMyActiveRole check to the access module. (Lennard de Rijk)
 * Make coverage conditional on run.py flag (Sverre Rabbelier)
 * Manually call start and end in test_sidebar (Sverre Rabbelier)
 * Use request.start and end (Sverre Rabbelier)
 * Add a start and end method to MockRequest (Sverre Rabbelier)

= Changelog for 0-5-20090913 =

 * Changed the conversion starter system to an update starter system. (Lennard de Rijk)
 * Use the new optional argument to endRequest in the middleware (Sverre Rabbelier)
 * Add optional argument to endRequest (Sverre Rabbelier)
 * Document value store methods (Sverre Rabbelier)
 * Remove memcache setup from interactive.py script (Sverre Rabbelier)
 * Add docstring to middleware hooks (Sverre Rabbelier)
 * Fix copy/paste fail in maintenance middleware docstring (Sverre Rabbelier)
 * Enable the new middleware and empty the view decorator (Sverre Rabbelier)
 * Add ValueStoreMiddleware (Sverre Rabbelier)
 * Add MaintenanceMiddleware (Sverre Rabbelier)
 * Add ExceptionHandlerMiddleware (Sverre Rabbelier)
 * Add Middleware directory (Sverre Rabbelier)
 * Fix broken maintenance mode (Sverre Rabbelier)
 * Fix 500 when saving /site/edit without email (Sverre Rabbelier)
 * Remove __melange_queries logging (Sverre Rabbelier)
 * Moved enabling GHOP to settings.py. (Lennard de Rijk)
 * Added the GHOP modules to the callback. (Lennard de Rijk)
 * Use available Rights Checker when rights are already defined. (Madhusudan.C.S)
 * Several style and import fixes regarding the GHOP module. (Madhusudan.C.S)
 * Added jquery in-place-edit. (Madhusudan.C.S)
 * Added GHOP Program View. (Madhusudan.C.S)
 * Added GHOP Timeline View. (Madhusudan.C.S)
 * Added GHOP Task Subscription View. (Madhusudan.C.S)
 * Added GHOP Organization View. (Madhusudan.C.S)
 * Added GHOP Org Admin View. (Madhusudan.C.S)
 * Added GHOP Mentor View. (Madhusudan.C.S)
 * Added GHOP Task View. (Madhusudan.C.S)
 * Renamed method in GHOP Cleaning to match style guide. (Lennard de Rijk)
 * Hook up the conversion tasks (Sverre Rabbelier)
 * Add a view to start conversion tasks (Sverre Rabbelier)
 * Add templates for conversion task starter (Sverre Rabbelier)
 * Fix import sort order (Sverre Rabbelier)
 * Fix miscaching of homepage (Sverre Rabbelier)
 * Use system.getHostname() everywhere (Sverre Rabbelier)
 * Add a getHostname to system (Sverre Rabbelier)
 * Enable local memcache api in interactive console (Sverre Rabbelier)
 * Scripts to run Shrinksafe during build. (Mario Ferraro)
 * Added Shrinksafe code to shrink JS files before deploy. (Mario Ferraro)

= Changelog for 0-5-20090906 =

 * Remove some left overs from recent Google App Engine 1.2.5 update. (Pawel Solyga)
 * Update Google App Engine from 1.2.3 to 1.2.5 in thirdparty folder. (Pawel Solyga)
 * Fixed Ivory Coast rename that was introduced in r74f0972f52. (Lennard de Rijk)
 * Fixed GHOP Cleaning clean_mentors_list method. (Lennard de Rijk)
 * Added cleaning method to validate a list of mentor's link_ids. (Madhusudan.C.S)
 * Added cleaning method to convert a list of csv strings into a set. (Madhusudan.C.S)
 * Added additional methods for TaskTag model. (Madhusudan.C.S)
 * Updated to r11 of app_profiler (Sverre Rabbelier)
 * Prefetch referenced fields in project listing (Sverre Rabbelier)
 * Hook up prefetching in the view (helper) (Sverre Rabbelier)
 * Add support for prefetching fields (Sverre Rabbelier)
 * only store queries in debug mode (Sverre Rabbelier)
 * fix typo in memcache.get in base logic (Sverre Rabbelier)
 * Store queries in memcache (Sverre Rabbelier)
 * Do not store core in Checker (Sverre Rabbelier)
 * Add self.in_request to Core and verify correct state (Sverre Rabbelier)
 * Convert profiler/start page to html (Sverre Rabbelier)
 * Use profiler.py to prevent import failures (Sverre Rabbelier)
 * Set expiration date of static dirs to 1d (Sverre Rabbelier)
 * GHOPWorkSubmission model is made id_based and inherits from base. (Madhusudan.C.S)
 * Added missing blank line to GHOP redirects helper. (Lennard de Rijk)
 * Added __init__ file to the GHOP views module. (Madhusudan.C.S)
 * Added list_info method for use in the GHOP module. (Madhusudan.C.S)
 * Updated the docstrings for GHOP access methods. (Madhusudan.C.S)
 * Added access checks for GHOP Module. (Madhusudan.C.S)
 * Added redirects module for GHOP. (Madhusudan.C.S)
 * Added templatetag and filter libraries for GHOP. (Madhusudan.C.S)
 * Set profiler/ to admin only (Sverre Rabbelier)
 * Use per-request store to store access rights (Sverre Rabbelier)
 * Use the per-request store to store the context (Sverre Rabbelier)
 * Hook up the new per-request value storage (Sverre Rabbelier)
 * Add a new per-request value store to Core (Sverre Rabbelier)
 * Profiling patch (Sverre Rabbelier)
 * STATE_TRANSITIONS dictionary values are changed to strings. (Madhusudan.C.S)
 * Added templatetags for use in the GHOP module. (Madhusudan.C.S)
 * Bulk added templates for GHOPOrganization views. (Madhusudan.C.S)
 * Bulk add templates regarding GHOPProgram Views. (Madhusudan.C.S)
 * Bulk add templates regarding Task Views. (Madhusudan.C.S)
 * Added Task for sending out emails to subscribed users about a Comment. (Madhusudan.C.S)
 * Added method to send out mail about a Task update. (Madhusudan.C.S)
 * Added template for mails regarding Task updates. (Madhusudan.C.S)
 * Added several methods to the Task Logic module. (Madhusudan.C.S)
 * Removed scope and scope_path properties from GHOPComment. (Madhusudan.C.S)
 * Added reference to GHOPProgram entity for Work Submissions. (Madhusudan.C.S)
 * Added GHOP Form cleaning module. (Madhusudan.C.S)
 * Added GHOPTaskSubscription Logic module. (Madhusudan.C.S)
 * Added GHOP Student Logic. (Madhusudan.C.S)
 * Added GAE tasks that are related to updating GHOP Tasks. (Madhusudan.C.S)
 * Added GHOP Logic helper package. (Madhusudan.C.S)
 * Added ghop-update queue for dealing with GHOP Task updates. (Madhusudan.C.S)
 * Added GHOP task package for holding GAE Task related modules. (Madhusudan.C.S)
 * Removed workflow property from Program model. (Lennard de Rijk)
 * Moved createTimelineForType to Program Logic. (Madhusudan.C.S)
 * Added timeline_logic keyword argument to Program logic. (Lennard de Rijk)
 * Make the timeline View work directly on the GSoC timeline. (Lennard de Rijk)
 * Make Sponsor the scope_logic for the GSoC timeline model. (Lennard de Rijk)
 * Take the safe way when trying to delete a Sponsor. (Lennard de Rijk)
 * GHOPComment Logic is made to inherit from base Logic. (Madhusudan.C.S)
 * Added role_name params to OA and Mentor Logic. (Madhusudan.C.S)
 * Added model to keep track subscriptions for GHOPTasks. (Madhusudan.C.S)
 * JSLint comment moved because of new uncompressed JSLint complains. (Mario Ferraro)
 * JSLint script file renamed because of better file name style. (Mario Ferraro)
 * JSLint updated to uncompressed version. (Mario Ferraro)
 * Renamed all JS files affected by former commit. (Mario Ferraro)
 * Made all JS code JSLint compliant. (Mario Ferraro)
 * JSLint added to verify Javascript code quality against guidelines. (Mario Ferraro)
 * Added SurveyRecordForm for viewing a SurveyRecord. (James Levy)
 * Make sure the PlainTextWidget converts linebreaks to proper HTML. (Lennard de Rijk)

= Changelog for 0-5-20090825 =

 * Only create GradingRecords for succeful/failed projects with Surveys. (Lennard de Rijk)
 * Set default taking access for GradingProjectSurvey to org. (Lennard de Rijk)
 * Added org taking access to Surveys. (Lennard de Rijk)
 * Removed reference to GHOPTask and GHOPProgram. (Madhusudan.C.S)
 * Added GHOPStudent model which inherits from core Student model. (Madhusudan.C.S)
 * Changed GHOPComment model to inherit from base model. (Madhusudan.C.S)
 * Changed all status to start with Uppercase letters, made 3 properties required. (Madhusudan.C.S)
 * Reverting last 4 patches containing GHOP related views. (Madhusudan.C.S)
 * Added extra menu items per GHOPOrganization. (Madhusudan.C.S)
 * Added Organization View for GHOP. (Madhusudan.C.S)
 * Added timeline view for GHOP. (Madhusudan.C.S)
 * Extended program configuration create/edit views to support GHOP. (Madhusudan C.S)
 * Change dotted path to the views in URL patterns to a params parameter. (Madhusudan.C.S)
 * program_logic is passed as a parameter to three checkers. (Madhusudan.C.S)
 * Whitespace fix in Base view. (Daniel Hans)
 * Argument to_json added to json function in Base view. (Daniel Hans)
 * Whitespace fix in Program view. (Daniel Hans)
 * Added redirect for use to manage statistics. (Daniel Hans)

= Changelog for 0-5-20090814p1 =

 * Fixed call to get QueryForFields due to changes in r0548101922. (Lennard de Rijk)

= Changelog for 0-5-20090814 =

 * checkIsAfterEvent takes logic as argument. (Madhusudan.C.S)
 * Redone the acceptedStudentsExport functionality. (Lennard de Rijk)
 * Added export for Org Admins and Mentors, but only one per User. (Lennard de Rijk)
 * Added methods that give the shipping information for a role entity. (Lennard de Rijk)
 * Changed to_dict to call all callable values. (Lennard de Rijk)
 * Fixed Survey Take page which was erroring on undefined variables. (Lennard de Rijk)
 * Removed unused import from GradingProjectSurvey view. (Lennard de Rijk)
 * Cleaned up Survey Logic. (Lennard de Rijk)
 * Added base Model for Expando models. (Lennard de Rijk)
 * Added intial GSoC logic modules. (Lennard de Rijk)
 * Added basic GSoC module models. (Lennard de Rijk)
 * Added inital GSoC module package structure. (Lennard de Rijk)
 * Set ASCII-only cleaner for first and last name. (Lennard de Rijk)
 * Changed the parameter from ancestor to ancestors. (Madhusudan.C.S)
 * updateOrCreateFromFields is made to call updateOrCreateFromKeyName. (Madhusudan C.S.)
 * Added ancestors property to getQueryForFields. (Madhusudan C.S.)
 * Completed the proper filter for the GradingProjectSurvey results. (Lennard de Rijk)
 * Project Survey results view now doesn't list all for plain users. (Lennard de Rijk)
 * Set the proper filters for the ProjectSurvey results view. (Lennard de Rijk)
 * Fix copy/paste fail in Survey results view regarding allowed_to_read. (Lennard de Rijk)
 * getResultsViewRecordFields does not need fields argument anymore. (Lennard de Rijk)
 * Open up the Survey Results view for users. (Lennard de Rijk)
 * Upgrade jQuery UI to version 1.7. (Mario Ferraro)
 * Updated several page titles to contain more information. (Lennard de Rijk)
 * Added hook for the edit view. (Lennard de Rijk)
 * Redirect to the manage page for projects. (Lennard de Rijk)
 * Made the specific SurveyTakeForm used in a View part of params. (Lennard de Rijk)
 * Removed the grade_choices keyword argument from GradeSurveyTakeForm. (Lennard de Rijk)
 * Enable the project management page to be visited for projects. (Lennard de Rijk)

= Changelog for 0-5-20090809 =

 * Added project title and student name to the ProjectSurvey take page. (Lennard de Rijk)
 * Added capability to update a single GradingRecord on the edit page. (Lennard de Rijk)
 * Upgrade to jQuery library to 1.3.2 version. (Mario Ferraro)
 * List of countries is actually alphabetically sorted. (Daniel Hans)
 * Argument store added to updateEntityProperties. (Daniel Hans)
 * Assign each country its continent. (Daniel Hans)
 * Added and enabled new access check for viewing ProjectSurvey records. (Lennard de Rijk)
 * Added and enabled access check for viewing SurveyRecords. (Lennard de Rijk)
 * Enabled Org Admins to take Surveys on behalf of their Mentors. (Lennard de Rijk)
 * The Survey Results view now only list Records of interest. (Lennard de Rijk)
 * Redone the list_info function for the Project's manage page. (Lennard de Rijk)
 * Added redirect to the StudentProject manage page. (Lennard de Rijk)
 * Whitespace fix in User model. (Lennard de Rijk)
 * ViewResults for Surveys is now showing all SurveyRecords. (Lennard de Rijk)
 * Added redirect for viewing SurveyRecords and enabled links. (Lennard de Rijk)
 * Removed TODO from ProjectSurvey and GradingProjectSurvey views. (Lennard de Rijk)
 * Added templates for listing SurveyRecords. (James Levy)
 * The Survey public view now uses the proper page name. (Lennard de Rijk)
 * Added view for showing Survey Records. (Lennard de Rijk)
 * Added template for viewing Survey Records. (James Levy)
 * Use proper id for survey_description div. (Lennard de Rijk)
 * Added link for students to resign their profile to the Program menu. (Lennard de Rijk)
 * Fixed access check for Student Manage/Resign page. (Lennard de Rijk)
 * Fixed typo in access module comment. (Lennard de Rijk)
 * Added minimum age property to Program model. (Madhusudan C.S.)
 * Added some helpful text to the Student Project Withdraw view. (Lennard de Rijk)
 * Fixed Org home view map to show iff projects have been announced. (Lennard de Rijk)

= Changelog for 0-5-20090802 =

 * addressed comments by Lennard (Sverre Rabbelier)
 * add checkIsHostForStudentProject checker (Sverre Rabbelier)
 * Add parent parameter to accommodate entity groups. (Madhusudan.C.S)
 * accept constructor parameters in Notification logic. (Madhusudan.C.S)
 * Fix for copy/paste fail (Sverre Rabbelier)
 * Add link to withdraw student project page (Sverre Rabbelier)
 * Allow hosts to withdraw student projects (Sverre Rabbelier)
 * Add three new redirects (Sverre Rabbelier)
 * Style fixes in the ghop task model module. (Madhusudan.C.S)
 * Added optional filters property to deepFetch. (Pawel Solyga)
 * Organization home page map dimensions now fit the world. (Mario Ferraro)
 * Role name for mentors now correctly shown in map's infoWindows. (Mario Ferraro)
 * Enable the map of the connections between mentors and students. (Lennard de Rijk)
 * Edited the role form to clarify the intention of the checkbox+marker. (Lennard de Rijk)
 * Renamed main CSS and map JS file due to recent changes. (Lennard de Rijk)
 * Moved the student to mentor map on the org home page below the list. (Mario Ferraro)
 * Redone the student to mentor map JS to reflect recent changes. (Mario Ferraro)
 * Redone the gathering of data for the student to mentor map. (Lennard de Rijk)
 * Style fixes in StudentProject View. (Lennard de Rijk)
 * Factored out the "No Record Available" message. (Lennard de Rijk)
 * Pre-storing the information for setStudentProjectSurveyInfo. (Lennard de Rijk)
 * Added project information to the Project manage page. (Lennard de Rijk)
 * Renamed hasAtLeastOneRecord to hasRecord. (Lennard de Rijk)
 * Added list of Surveys to the Project's manage page. (Lennard de Rijk)
 * Added getProjectSurveyInfoForProject to list_info helper. (Lennard de Rijk)
 * Added new table templates for showing Suryves on the manage page. (Lennard de Rijk)
 * Added columns to the manage page showing the amount of evaluations. (Lennard de Rijk)
 * Added hasAtLeastOneRecord method to Survey Logic. (Lennard de Rijk)
 * Two style fixes. (Lennard de Rijk)

= Changelog for 0-5-20090727 =

 * Every radio button is now properly shown on a new line. (Lennard de Rijk)
 * Adds to Melange a tags framework based on taggable-mixin. (Madhusudan C.S)
 * Send out a Notification upon creation of a new Request entity. (Lennard de Rijk)
 * Use proper in-line import in Request helper. (Lennard de Rijk)
 * Added sendNewRequestNotification to the Notifications helper. (Lennard de Rijk)
 * Added template for a notification upon arrival of a new Request. (Lennard de Rijk)
 * Tables listing Requests now show the name of the Group. (Lennard de Rijk)
 * Added missing role_name to org_admin Logic. (Lennard de Rijk)
 * Added getRoleLogicsToNotifyUponNewRequest for use with notifications. (Lennard de Rijk)
 * Use proper in-line imports in the Notifications helper. (Lennard de Rijk)
 * fix for issue 653 by adding wrap=hard attr to textareas for surveys (James Levy)
 * seed_db now creates fixture student project entities (James Levy)
 * Use role_name where needed for creating/handling requests. (Lennard de Rijk)
 * Use role_name to register the Role with the Group View. (Lennard de Rijk)
 * Use role_name as key to store the different Role Views. (Lennard de Rijk)
 * Style fixes in Group View. (Lennard de Rijk)
 * Added registerRole to Role Logic where all roles are registered. (Lennard de Rijk)
 * update Sidebar tests to use getCore (Sverre Rabbelier)
 * register a core for the test modules to use (Sverre Rabbelier)
 * Fixed line length. (Mario Ferraro)
 * Another batch of style fixes for Surveys. (Lennard de Rijk)
 * More style fixes due to code reviews for Surveys. (Lennard de Rijk)
 * Several style fixes and code cleaning for surveys. (Lennard de Rijk)
 * Fixed wrong js being referenced by the public Survey template. (James Levy)
 * Added validation to email fields where needed. (Lennard de Rijk)
 * Slow down mail tasks some more to ensure they actually complete. (Lennard de Rijk)

= Changelog for 0-5-20090711 =

 * Fixed typo in ProjectSurvey reminder mail. (Lennard de Rijk)
 * Fixed the redirect for Survey reminder emails. (Lennard de Rijk)
 * Fixed typo in GradingProjectSurvey reminder email. (Lennard de Rijk)
 * Add queue.yaml to build scripts. (Pawel Solyga)
 * Changed URL pattern for starting sending out survey reminders. (Lennard de Rijk)
 * Added the Surveys Tasks to the registered URL patterns. (Lennard de Rijk)
 * Added a view to start sending out a reminder. (Lennard de Rijk)
 * Added Surveys Tasks module to send reminders. (Lennard de Rijk)
 * Added empty Tasks package and queue.yaml. (Lennard de Rijk)
 * Edited help text to be more clear when a Survey has been submitted. (Lennard de Rijk)
 * Add setOrganizationInSurveyRecords function to stats.py script. (Pawel Solyga)
 * Add Organization reference property to ProjectSurveyRecord. (Pawel Solyga)
 * Fix indention and add missing dot in docstring in survey models. (Pawel Solyga)
 * GradingSurveyGroup now uses DynaForm for its forms. (Lennard de Rijk)
 * Indention fixes and adding "reference_class=" in ReferenceProperty. (Pawel Solyga)
 * Start using buildout to bring in external dependencies. (Augie Fackler)
 * Added GradingSurveyGroup to the sitemap and sidebar. (Lennard de Rijk)
 * Completed the Create and Edit view for GradingSurveyGroup. (Daniel Diniz)
 * Fixed GradingRecord and GradingSurveyRecord Logic. (Lennard de Rijk)
 * Added denySidebar to several access checks. (Lennard de Rijk)
 * Added Surveys to sidebar menu. (Lennard de Rijk)
 * Changed title entry in GradingSurveyGroup's public template to name. (Lennard de Rijk)
 * Added skeleton view and templates for GradingSurveyGroup. (Lennard de Rijk)
 * Added name property to GradingSurveyGroup. (Lennard de Rijk)
 * Added missing blank line to GradingSurveyGroup logic. (Lennard de Rijk)
 * Added logic for GradingRecord and GradingSurveyGroup. (Lennard de Rijk)
 * Removed results list from Survey edit. (Daniel Diniz)
 * Extended tooltip timeout to 10 seconds for all fields. (Mario Ferraro)
 * Minor stylefix to StudentProject model. (Lennard de Rijk)
 * Handle a dynamic amount of GradeRecords in StudentProject model. (Lennard de Rijk)
 * Renamed several files due to recent changes. (Lennard de Rijk)
 * Style fixing in GradeRecord model (Lennard de Rijk)
 * Several Survey UI fixes. (Daniel Diniz)
 * Fixed base template URL to tagged version of the deployed code. (Madhusudan C.S.)
 * Fixed imports for Survey logic. (Lennard de Rijk)
 * Added skeleton models for GradingSurveyGroup and Records. (Lennard de Rijk)

= Changelog for 0-5-20090706 =

 * Ensure that the Grade field data stays in clean_data. (Lennard de Rijk)
 * Add missing import to Project Survey view. (Daniel Diniz)
 * Renamed several files due to recent changes. (Lennard de Rijk)
 * Now properly escaping JS and converting new lines into br for Tooltips. (Mario Ferraro)
 * Added ability to add custom tooltips and UI improvements. (Daniel Diniz)
 * Public Survey template now resembles the take template more closely. (Lennard de Rijk)
 * Added the possiblitity to add a description to the top of the Survey. (Lennard de Rijk)
 * Use CSS instead of JS for Survey layout. (James Levy)
 * Remove the custom propmpt inside textareas and input fields. (Daniel Diniz)
 * Fix HtmlSanitizer to return cleaned string in proper encoding. (Pawel Solyga)
 * Added clear:right property to submit button in Survey take form. (James Levy)
 * Fix button layout on Safari 4.0 for Survey take page. (Mario Ferraro)
 * Fix comment indention in survey-take javascript file. (Pawel Solyga)
 * Renamed survey-take-090627.js to survey-take-090705.js. (Lennard de Rijk)
 * Increased bottom margin on comments for better grouping. (James Levy)
 * Changed the filter for getting a SurveyRecord for a ProjectSurvey (Lennard de Rijk)

= Changelog for 0-5-20090705p1 =

 * Ensure that accessViolations for Survey menu items get captured. (Lennard de Rijk)

= Changelog for 0-5-20090705 =

 * Added Menu items for all three kinds of Surveys to the program menu. (James Levy)
 * POST data always overwrites survey_record data. (Daniel Diniz)
 * Fixes bug when option name contains double quotes. (Mario Ferraro)
 * Several style fixes due to code reviews. (Lennard de Rijk)
 * Ensure that long questions and comments are stored as db.Text. (Daniel Diniz)
 * Style fix in access module. (Lennard de Rijk)
 * Returned ProjectSurvey create to checkIsUser. (Lennard de Rijk)
 * Added access checks for taking a Project(Grading)Survey. (Lennard de Rijk)
 * Brown paper bag fix for using non-existing logic. (Lennard de Rijk)
 * Fixed basic Survey access check. (Lennard de Rijk)
 * Fixed broken selection questions from refactoring SurveyForm. (Daniel Diniz)
 * Fixed showing the correct list of projects. (Lennard de Rijk)
 * Refactored filter construction. (Lennard de Rijk)
 * Make sure that radio button questions validate correctly. (Lennard de Rijk)
 * Added Daniel Diniz and Zachary Voase to the AUTHORS file. (Lennard de Rijk)
 * Added Daniel Diniz to authors for Grading Project Survey View. (Lennard de Rijk)
 * Add a grade field to the Grading Project Survey form. (Daniel Diniz)
 * Survey editing/taking Javascript and CSS fixes. (James Levy)
 * Remove public role type from SURVEY_TAKING_ACCESS in Survey model. (Pawel Solyga)
 * try to fix the surveys-have-no-scope issue (Sverre Rabbelier)
 * addressed comments to previous version (Sverre Rabbelier)
 * return found entity for activity checks (Sverre Rabbelier)
 * survey access: stylefix and remove public role type (Sverre Rabbelier)
 * Style fixes in Survey helper. (Lennard de Rijk)
 * Added getSurveyTakeForm to the Survey view. (Lennard de Rijk)
 * Only initialize a SurveyTakeForm in take. (Lennard de Rijk)
 * Split SurveyForm into SurveyTakeForm and SurveyEditForm. (Daniel Diniz)
 * Do not call takeGet when SurveyForm ValidationError occurs. (Lennard de Rijk)
 * Several stylefixes due to received reviews. (Lennard de Rijk)
 * Style fixes in Access module. (Lennard de Rijk)
 * Style fixes to the GradingProjectSurvey View module. (Lennard de Rijk)
 * Sub_merge params for GradingProjectSurvey View. (Lennard de Rijk)
 * Added rudimentary grade field to GradingProjectSurvey take View. (James Levy)
 * Ensure that the params from subclasses get merged. (Lennard de Rijk)
 * Corrected the links to Grading Project Surveys in Program menu. (Lennard de Rijk)
 * Added missing import to ProjectSurvey View. (Lennard de Rijk)
 * Fix pick_multi only returning one answer as maximum. (Daniel Diniz)
 * Removed getSurveyResponseFromPost from Surveys helper. (Lennard de Rijk)
 * Renamed survey-edit-090627.js due to recent changes. (Lennard de Rijk)
 * Form errors when taking a Survey now have the correct context. (Lennard de Rijk)
 * Fixed Survey Form error giving 505. (Lennard de Rijk)
 * Surveys can now have required questions. (Daniel Diniz)
 * Added Survey From Field validation. (Daniel Diniz)
 * Style fixes and a forgotten parameter in Survey(Record) logic. (Daniel Diniz)
 * Removed unnecessary variable in ProjectSurvey take method. (Lennard de Rijk)
 * Overwrite _getSurveyRecordFor in ProjectSurvey view. (Lennard de Rijk)
 * Added _getSurveyRecordFor method to Survey View. (Lennard de Rijk)
 * Added default Survey list templates. (Lennard de Rijk)
 * Enable the ProjectSurvey and GradingProjectSurvey views in the core. (Daniel Diniz)
 * Implemented taking ProjectSurveys. (Lennard de Rijk)
 * Edit SurveyRecord model to not make use of different Survey. (Lennard de Rijk)
 * Made the CSV exporter not rely on the BackReferenceProperty. (Lennard de Rijk)
 * Added getTakeProjectSurveyRedirect. (Lennard de Rijk)
 * Added the possibility to change the action Survey take page. (Lennard de Rijk)
 * Small style fix in Surveys helper. (Lennard de Rijk)
 * Set required is True for StudentProject reference. (Lennard de Rijk)
 * Removed obsolete if tag form take template. (Lennard de Rijk)
 * Added hook methods to takeGet and takePost. (Lennard de Rijk)
 * Fixed typo in title of Survey Take page. (Lennard de Rijk)
 * Add a base implementation of takePost. (Lennard de Rijk)
 * Added getSurveyResponseFromPost method to Surveys Helper. (Lennard de Rijk)
 * Added updateOrCreateFromFields method to SurveyRecordLogic. (Lennard de Rijk)
 * Added base class logic for Expando based models. (Lennard de Rijk)
 * Removed two obsolete/outdated methods in Survey Logic. (Lennard de Rijk)
 * Removed obsolote method call in Program View. (Lennard de Rijk)
 * Clean up and other fixes for Survey modules. (Daniel Diniz)
 * Implemented the takeGet view for Surveys. (Lennard de Rijk)
 * Fixed multiple typos in Survey tooltips strings. (Lennard de Rijk)
 * Added skeleton for the take view and its template. (Lennard de Rijk)
 * Move getMenusForScope to the end of the View class. (Lennard de Rijk)
 * Changed the Survey public view to give a preview of the Survey. (Lennard de Rijk)
 * Removed activate grade URL pattern from Survey View. (Lennard de Rijk)
 * Brown paper bag "without tea" morning typo fix in Survey View. (Lennard de Rijk)
 * Style fix in Survey views helper. (Lennard de Rijk)
 * Returned access checks in Survey View to the right state. (Lennard de Rijk)
 * Fixed too long line in Surveys helper. (Lennard de Rijk)
 * Solved some merging problems and use the getRecordLogic where needed. (Lennard de Rijk)
 * Reverted some changes in SurveyLogic. (Lennard de Rijk)
 * Use an existing logic for showing Survey Results. (Lennard de Rijk)
 * Merge params from inheriting Survey views. (Lennard de Rijk)
 * Add more flexibility to the Survey helper. (Lennard de Rijk)
 * Added getRecordLogic method to SurveyLogic. (Lennard de Rijk)
 * Removed setting of the scope in the ProjectSurvey init. (Lennard de Rijk)
 * Added getSurveyForContent method to SurveyLogic. (Lennard de Rijk)
 * Calling the correct super in Project and Grading Survey Logic. (Lennard de Rijk)
 * fixed critical errors related to survey subclassing (James Levy)
 * Add paver script that will replace our current build.sh. (Zachary Voase)
 * Add checkHasSurveyAccess access check (Sverre Rabbelier)
 * Removed survey_kind from Survey model. (Lennard de Rijk)
 * Set the correct base_model and scope_logic for extended Survey logic. (Lennard de Rijk)
 * Added two missing imports to the Project and Grading Surveys views. (Lennard de Rijk)
 * Added SurveyContentSchema to improve readability for the survey helper. (Daniel Diniz)

= Changelog for 0-5-20090629 =

 * Added skeleton view for ProjectSurvey and GradingProjectSurvey. (Lennard de Rijk)
 * Prepared Survey access controls to deal with multiple logics. (Lennard de Rijk)
 * Extracted the ProjectSurvey and ProjectGradingSurvey records. (Lennard de Rijk)
 * Removed unused import from Survey model. (Lennard de Rijk)
 * Separated two survey types out of the main survey model. (Lennard de Rijk)
 * Seperated Logic for ProjectSurvey and GradingProject surveys. (Lennard de Rijk)
 * Start on adding ProjectSurvey and GradingProjectSurvey. (Daniel Diniz)
 * Added .settings to hgignore. (Lennard de Rijk)
 * Renamed opening to survey_start and deadline to survey_end. (Lennard de Rijk)
 * Put ResultsLogic in its own Logic module named survey_record. (Lennard de Rijk)
 * Removed non-existing import in Survey Logic. (Lennard de Rijk)
 * Added Survey menu items to the Program menu. (Daniel Diniz)
 * Added Surveys to the sitemap. (Daniel Diniz)
 * Added View for Surveys. (James Levy)
 * Added redirect for use in Surveys. (Daniel Diniz)
 * Added Access checks for Surveys. (Daniel Diniz)
 * Added Survey Views Helper for rendering several widgets. (James Levy)
 * Added logic for Survey and SurveyRecord. (James Levy)
 * Added SurveyRecordGroup for the use in evaluation surveys. (James Levy)
 * Added SurveyRecordModel. (James Levy)
 * Added Survey and SurveyContent model. (James Levy)
 * Fixed docstring in Document Logic. (Lennard de Rijk)
 * Renamed css due to previous changes in previous commit. (Lennard de Rijk)
 * Edited stylesheet for use in Surveys. (Daniel Diniz)
 * Renamed JavaScript files in templates to match the correct files. (Lennard de Rijk)
 * Adding JS files for use in Surveys. (Daniel Diniz)
 * Added templates considering Surveys. (Daniel Diniz)
 * Renamed jquery.growfield.js to jquery-growfield.js. (Daniel Diniz)
 * Patch that adds the JS and CSS files for surveys. (Daniel Diniz)
 * Patch that touches 'upstream' templates, for use in surveys. (Daniel Diniz)
 * Fixes an issue where the organization home page. (Lennard de Rijk)

= Changelog for 0-5-20090621 =

 * jQuery Spin plugin updated to version 1.1.1 (Mario Ferraro)
 * Use build-in django 1.0.x on deployed version of Melange. (Pawel Solyga)
 * Update GAE to 1.2.3 in thirdparty folder. (Pawel Solyga)

= Changelog for 0-5-20090604 =

 * Display caught errors on the page itself (Sverre Rabbelier)
 * Make the maintenance page a hardcoded response (Sverre Rabbelier)
 * Merge with Pawel's tip. (Lennard de Rijk)
 * Small indentation fix. (Lennard de Rijk)
 * Fixed an issue where some access checks would fail. (Lennard de Rijk)
 * Now showing link to edit the home page document on the home page. (Lennard de Rijk)
 * Partial fix for displaying mentors and students. (Pawel Solyga)
 * Comment out GMaps support in Organization home page template. (Pawel Solyga)
 * Add missing if statement in organization list row template. (Pawel Solyga)
 * Added link to edit the Document on the Document's public page. (Lennard de Rijk)
 * Clarified docstring for document read/write access check. (Lennard de Rijk)
 * Added a link to the website the welcome email. (Lennard de Rijk)
 * Introduced 'module_package' key in params dict (Madhusudan.C.S)
 * Temporary turn off GMaps support until it's fixed. (Pawel Solyga)
 * Rename soc-090421.css and update base.html template. (Pawel Solyga)
 * Small changes in #extra_left, #extra_right tags in css file. (Pawel Solyga)
 * Add taggable-mixin and gviz to build script. (Pawel Solyga)
 * Extend taggable-mixin to support different Tag models. (Pawel Solyga)
 * Make taggable-mixin tests working by updating GAE path. (Pawel Solyga)
 * Merge with Pawel's head. (Pawel Solyga)
 * Add google-visualization-python project to Melange repository. (Pawel Solyga)
 * Removed unecessary use of %. (Lennard de Rijk)
 * Changed expected graduation date to be a dynamic dropdown. (Lennard de Rijk)
 * Added GHOP specific Mentor and Org Admin Models. (Lennard de Rijk)
 * Add missing __init__.py file in taggable-mixin module. (Pawel Solyga)
 * Add taggable-mixin to Melange repository. (Pawel Solyga)
 * Add some missing docstrings to Seeder classes in seed_db.py (Pawel Solyga)
 * Style fixes and pylint: disable-msg comments in different modules. (Pawel Solyga)
 * Add pylint: disable-msg= where needed in Melange modules. (Pawel Solyga)
 * Rename bathSize variable to batch_size in soc.logic.models.base module. (Pawel Solyga)
 * Style fixes and wrong function call fix. (Pawel Solyga)
 * Remove unused variable from soc.view.models.cron module. (Pawel Solyga)
 * Some more pylint fixes in different Melange modules. (Pawel Solyga)
 * Style and pylint fixes in Melange modules. (Pawel Solyga)
 * Style and variable names fixes in soc.modules.core module. (Pawel Solyga)
 * Remove unused imports in Melange modules. (Pawel Solyga)
 * Remove unused imports from main.py. (Pawel Solyga)
 * Some small fixes to unique_user_id_adder module. (Pawel Solyga)
 * Fixed typo in org_prize_assignment model. (Lennard de Rijk)
 * remove accidental head (Sverre Rabbelier)
 * Use key_name instead of link_id (Sverre Rabbelier)
 * Fixed the notification list to show a properly formatted date. (Lennard de Rijk)
 * Link id and key name fixes for Organization And OrgApplication. (Pawel Solyga)
 * Add Organization Application seeding. (Dan Bentley)
 * Make user_id property in User model not required. (Pawel Solyga)
 * Merged with Sverre (Sverre Rabbelier)
 * Fixed model name and comment typo's in task model. (Lennard de Rijk)
 * Added several models related to the GHOP workflow. (Madhusudan C.S.)
 * Do not die on NeedIndexErrors (Sverre Rabbelier)
 * Add helper functions, model update and jobs for unique user ids. (Pawel Solyga)
 * Add missing django.template import to shell.py. (Pawel Solyga)
 * Revert "Add a supplemantal block to the edit form" (Sverre Rabbelier)
 * Revert "Add an EditForm id to the edit form" (Sverre Rabbelier)
 * Add a supplemantal block to the edit form (James Levy)
 * Add an EditForm id to the edit form (James Levy)
 * Remove executable bit from datatimepicker (Sverre Rabbelier)
 * Added GHOP Task model. (Madhusudan C.S.)
 * Added __init__.py to ghop folder. (Lennard de Rijk)
 * Merge with Sverre's recent module architecture commit. (Pawel Solyga)
 * Add web based python shell to Melange. (Pawel Solyga)
 * First step in the module design (Sverre Rabbelier)
 * Comment style fix in soc.views.models.organization module. (Pawel Solyga)
 * Add comment regarding Student Project sorting on Organization home page. (Pawel Solyga)
 * Add sorting of student projects on organization home page. (Pawel Solyga)
 * Now clicking cancel button returns user to previous page. (Pawel Solyga)
 * Add comment to clean_html_content function and update __authors__. (Pawel Solyga)
 * Invoke pylint from build script. (Pawel Solyga)
 * Replace usage of feedparser for sanitizing html with new HtmlSanitizer. (Pawel Solyga)
 * Add htmlsanitizer folder to build script. (Pawel Solyga)
 * Add missing __init__.py file to htmlsanitizer folder. (Pawel Solyga)
 * Add HtmlSanitizer python module to Melange repository. (Pawel Solyga)
 * Add BeautifulSoup Python HTML/XML parser to Melange repository. (Pawel Solyga)
 * Add acceptedStudentsCSVExport function to stats.py script. (Pawel Solyga)
 * Remove accidentaly committed file. (Pawel Solyga)
 * Merge with Sverre's accidental head. (Pawel Solyga)
 * Do not rely on notifiction module being imported (Sverre Rabbelier)
 * Style fixes in test_functional.py. (Pawel Solyga)
 * Add some example function tests that use gaeftest (Matthew Wilkes)
 * Include required antl3 library and check if datastore is available (Matthew Wilkes)
 * Revert not finished 1000 limitation fix commit (ef7222d484). (Pawel Solyga)
 * added foo (Sverre Rabbelier)
 * Add vcs-load-dirs project to thirdparty directory. (Pawel Solyga)
 * Add .DS_Store Mac OS X specific files to .hgignore. (Pawel Solyga)
 * Update Google App Engine to 1.2.2 in thirdparty folder. (Pawel Solyga)
 * Fix ordering of names in AUTHORS file. (Pawel Solyga)
 * Add .gitignore to .hgignore (Sverre Rabbelier)
 * Add .git to the .hgignore file (Sverre Rabbelier)
 * Remove __init__.py from project root as well (Sverre Rabbelier)
 * [PATCH] Remove __init__.py from app, as app is not a module (Sverre Rabbelier)
 * Renamed duplicate slots because of recent changes. (Lennard de Rijk)
 * Fixes Duplicate calculation hang if no assigned slots where available. (Mario Ferraro)
 * Fixed multiple Purr boxes would show when using calendar widget. (Mario Ferraro)
 * Add Marcelo to AUTHORS file and fix typo (Sverre Rabbelier)
 * Add coverage support to the test suite (Marcelo de Sena Lacerda)
 * Added coverage output files to .hgignore (Sverre Rabbelier)
 * Fixed typo in docstring as to comments on r3012 (svn repo). (Lennard de Rijk)
 * Replace BeautyTips tooltips with purr info box. (Mario Ferraro)
 * Use python2.5 in our unit tests (Sverre Rabbelier)
 * Ignore .project and .pydevproject files (Sverre Rabbelier)
 * Add full list of accepted students (Sverre Rabbelier)
 * Ignore backup files (~) (Sverre Rabbelier)
 * Ignore zip files and build directory (Sverre Rabbelier)
 * Merged revert (Sverre Rabbelier)
 * Backed out changeset 571f2de51138 (Sverre Rabbelier)
 * Make dev_appserver error out when python version >2.5 is used (Sverre Rabbelier)
 * Added file 'foo.txt' (Sverre Rabbelier)
 * Fixed StudentProposal apply view that broke during split of Create/Edit view. (Lennard de Rijk)
 * Fix Issue 389 (Clicking list entry will not open new tab/window). (Daniel Hans)
 * Fix too long line in soc.view.models.organization module. (Pawel Solyga)
 * Remove E1103 and E1101 errors from ignore list in pylintrc file. (Pawel Solyga)
 * Style fixes in app.soc.views.models.student_project module. (Pawel Solyga)
 * Show all Co-Mentors on the Student Project public page. (Lennard de Rijk)
 * Changed Additional Mentors to Co-Mentors in the manage view. (Lennard de Rijk)
 * Added functionality to set additional mentors for a Student Project. (Lennard de Rijk)
 * Fixed missing value in context. (Lennard de Rijk)
 * Fix broken tests by renaming default app id from "test-app-run". (Pawel Solyga)
 * Add .hgignore to repository and ignore all .pyc files and app.yaml file. (Pawel Solyga)
 * Add getStudentsProjects to context in stats.py script. (Pawel Solyga)
 * Update to AppEngine 1.2.1. (Pawel Solyga)
 * Renamed .css file due to recent changes. (Lennard de Rijk)
 * Added map of accepted student proposals to mentors. (Lennard de Rijk)
 * Fix missing dot in stats.py docstring. (Pawel Solyga)
 * Fixing the build now that emails have been tested. (Sverre Rabbelier)
 * Intentionally breaking the build (Sverre Rabbelier)
 * Fixing the build now that emails have been tested. (Augie Fackler)
 * Intentionally breaking the build. (Augie Fackler)
 * Added reviveJobs and deidleJobs to stats.py (Sverre Rabbelier)
 * Email address is actually private, not public, make this obvios (Sverre Rabbelier)
 * Set the last_modified_on date to last change (Sverre Rabbelier)
 * Set batch size to 10 (Sverre Rabbelier)
 * Added index needed to convert proposals (Sverre Rabbelier)
 * Some minor style fixes. (Lennard de Rijk)
 * Accepted and rejected list to redirect to the review page. (Lennard de Rijk)
 * Allowing review page in read-only mode after the deadline has passed. (Lennard de Rijk)
 * Fixed typo in access module naming. (Lennard de Rijk)
 * Use offset_linkid instead of offset to scan >1000 entities. (Daniel Bentley)

= Changelog for 0-5-20090420 =

 * Some minor style fixes. (Lennard de Rijk)
 * Added listing of accepted and rejected proposals. (Madhusudan C.S)
 * Added org_home_gmap function to the map JS. (Madhusudan C.S, Merio Ferraro)
 * Added mentor-marker.png to content/images. (Madhusudan C.S)
 * Renamed map JS to facilitate upcoming changes. (Lennard de Rijk)
 * Added the gathering of data required to display a map. (Madhusudan C.S)
 * Added ccTld property to role to retrieve the ccTld for a role entity. (Madhusudan C.S)
 * Added dictionary mapping to CCTLD in countries model. (Madhusudan C.S)
 * Don't run in a transaction if not needed (Sverre Rabbelier)
 * Tweak the 'load balancing' algorithm (Sverre Rabbelier)
 * Added deleteEntities methods to stats.py (Sverre Rabbelier)
 * Fixed typo in cron.job module's timeOutJob docstring. (Lennard de Rijk)
 * Use status codes in job.py (Sverre Rabbelier)
 * getDefaultMailSender now handles logged in but not registered. (Lennard de Rijk)
 * Allow anyone to see student projects (Sverre Rabbelier)
 * Make no valid sender could be found a fatal error (Lennard de Rijk)
 * Students can not list their own projects before the announced. (Lennard de Rijk)
 * Student Proposal Mailer is now sending out real emails. (Lennard de Rijk)
 * Fixed a comment typo and possible bug in mail_dispatcher. (Lennard de Rijk)
 * Added email templates for accepted and rejected students. (Lennard de Rijk)
 * Major brown paper bag fix (Sverre Rabbelier)
 * Add a startSpam method to stats (Sverre Rabbelier)
 * Add job to the index (Sverre Rabbelier)
 * Add a random chance to ignore a job to reduce contention (Sverre Rabbelier)
 * Do not fetch all jobs with each poke (Sverre Rabbelier)
 * Add entityIterator to base Logic (Sverre Rabbelier)
 * Store how many times a job has timed out and abort if needed (Sverre Rabbelier)
 * Wrong usage of twoline_table_row caused weird layout in project (Sverre Rabbelier)
 * Add cron.yaml to the build script (Sverre Rabbelier)
 * Instead of text_data use key_data property to check for uniqueness. (Lennard de Rijk)
 * Style fix in Job model. (Lennard de Rijk)
 * Hook up the Student Proposal Mailer in the cron/jobs module. (Lennard de Rijk)
 * Added Student Proposal Mailer module (Lennard de Rijk)
 * Various improvements to convertProposals (Sverre Rabbelier)
 * Add a silent option to updateOrCreateFromFields (Sverre Rabbelier)
 * Fixed wrong import for list proposals view. (Lennard de Rijk)
 * Fixed typo and added myself to authors in the cron/job module. (Lennard de Rijk)
 * Add a script to convert proposals. (Sverre Rabbelier)
 * Added FatalJobError to the cron/job module. (Lennard de Rijk)
 * Fixed typo in documentation of the Job Model. (Lennard de Rijk)
 * Changed the response message in the cron poke view. (Lennard de Rijk)
 * Remove debug url too (Sverre Rabbelier)
 * Remove testing method and update docstring for cron system (Sverre Rabbelier)
 * Removed unneeded imports and variables (Sverre Rabbelier)
 * Add cron, the core of the job system (Sverre Rabbelier)
 * Add priority groups and jobs to the sitemap (Sverre Rabbelier)
 * Add jobs (model, logic, and view) (Sverre Rabbelier)
 * Add priority groups (model, logic, and view) (Sverre Rabbelier)
 * Listing of accepted projects is now timeline dependent. (Lennard de Rijk)
 * White space fix in list_info module. (Lennard de Rijk)
 * Fix user_self calling editGet with a wrong parameter (Sverre Rabbelier)
 * Split edit and create into different methods (Sverre Rabbelier)
 * Add support for ID based entities (Sverre Rabbelier)
 * Use proposal key instead of raw proposal (Sverre Rabbelier)
 * Show in green the proposals that would be accepted (Sverre Rabbelier)
 * Add Student entities and StudentProposal entities to seed_db module. (Pawel Solyga)
 * Rename that should have been part of r2953. (Lennard de Rijk)
 * Renamed stepsize to step_size in Student Proposal Logic. (Lennard de Rijk)
 * Moved the code to retrieve all Proposal to the Logic module. (Lennard de Rijk)
 * Style fixes in soc.views.helper.lists module. (Pawel Solyga)
 * Style fixes in soc.views.models.organization module. (Pawel Solyga)
 * Fix too long line in soc.views.models.program module. (Pawel Solyga)
 * Comment out unused variables in soc.views.models.base module. (Pawel Solyga)
 * Fix too long line in templatetags.forms_helpers module. (Pawel Solyga)
 * Proposal CSV export for students. (Pawel Solyga)
 * Readability fix in base logic (Sverre Rabbelier)
 * Remove redundant if check (Sverre Rabbelier)
 * Comment out unused variables in soc.logic.allocations module. (Pawel Solyga)
 * Fix too long line in soc.cache.logic module. (Pawel Solyga)
 * Add missing responses import and in soc.views.models.student module. (Pawel Solyga)
 * Fix too long line and in soc.views.models.student_proposal module. (Pawel Solyga)
 * Step 2 of moving to new seeding model. (Daniel Bentley)
 * Added additional_mentors property to StudentProject. (Lennard de Rijk)
 * Whitespace fix in sponsor model. (Lennard de Rijk)
 * Place the getSingleton call in view decorator in the try (Sverre Rabbelier)
 * Fix a bug in duplicate detection (Sverre Rabbelier)
 * Undid superfluas replacement of .name() with .name_or_id() (Sverre Rabbelier)
 * Fixes access check for manage view. (Lennard de Rijk)
 * Do not rely on dicts.merge to change target (Sverre Rabbelier)
 * Use key().id_or_name() instead of key().name() (Sverre Rabbelier)
 * Fix a bug in seed_db (Sverre Rabbelier)
 * Added a warning message that reviews are not editable. (Lennard de Rijk)
 * Added overview of private reviews. (Lennard de Rijk)
 * Update to the latest GAE release (Pawel Solyga)
 * Do not rely on a backup_admin being set (Sverre Rabbelier)
 * Send out notifications and emails to admin and backup admin (Sverre Rabbelier)
 * Allow the backup_admin to fill in the org application (Sverre Rabbelier)
 * Use offset_linkid instead of offset to scan >1000 entities. (Daniel Bentley)
 * Respond to comments on r2769. (Daniel Bentley)
 * Last step of refactoring before adding support for > 1000 entities. (Daniel Bentley)
 * Add (better) help_text to publish_location and school_name (Sverre Rabbelier)
 * Brown paper bag fix (Sverre Rabbelier)
 * Added Joel Sherrill to the AUTHORS file (Sverre Rabbelier)
 * Lower ASCII fix (Sverre Rabbelier)
 * Remove getKeySuffix and it's usage (Sverre Rabbelier)
 * Use key().id_or_name() instead of key().name() (Sverre Rabbelier)
 * Use key.id_or_name in templates rather than key.name (Sverre Rabbelier)
 * Indentation fixes. (Lennard de Rijk)
 * Added two menu items to the program menu. (Lennard de Rijk)
 * Removed obsolete white line. (Lennard de Rijk)
 * Added listing of Student Projects for Students themselves. (Lennard de Rijk)
 * Added three new redirect methods. (Lennard de Rijk)
 * Brown paper bag fix for Student Project Manage and Edit access check. (Lennard de Rijk)
 * Style fix in function names in stats.py (Sverre Rabbelier)
 * When ranking, put them at or above the given rank (Sverre Rabbelier)
 * Remove slots_allocation from program view (Sverre Rabbelier)
 * Make it possible to save any value with saveValues (Sverre Rabbelier)
 * Allow loading a previously saved slot allocation (Sverre Rabbelier)
 * Added Manage Student Projects item to the organization menu. (Lennard de Rijk)
 * Fixed typo in checkStudentProjectHasStatus docstring. (Lennard de Rijk)
 * Removed TODO that has been completed in r2876. (Lennard de Rijk)
 * Fix bug exposed in previous commit (Sverre Rabbelier)
 * Add a test case to demonstrate a bug in the allocator (Sverre Rabbelier)

= Changelog for 0-5-20090410 =

 * Add a new allocation algorithm and use it (Sverre Rabbelier)
 * Change iterative to algorithm in slot allocator (Sverre Rabbelier)
 * Store min and max slots in the program model (Sverre Rabbelier)
 * If nothing is assigned, return no assignments (Sverre Rabbelier)
 * Add a submit method and button to slots view (Sverre Rabbelier)
 * Make "Private Comment" default on Student Proposal review page. (Pawel Solyga)
 * Add auto-completion for mentor field (Kai Blin)
 * Make mentor pickable (Kai Blin)
 * Make it possible to specify the key_order for pick (Kai Blin)
 * Add a temporary hack to allow filtering on org.key().name() (Kai Blin)
 * Drop the 'adjustement' part of slots allocation (Sverre Rabbelier)
 * Use slots allocated instead of adjustment in slots view (Sverre Rabbelier)
 * Use the new self._getAcceptedOrgsList in slots view (Sverre Rabbelier)
 * Factor out _getAcceptedOrgsList from acceptedOrgs (Sverre Rabbelier)
 * Public page for StudentProjects now displays public info. (Lennard de Rijk)
 * Added public info as TinyMCE to the edit pages. (Lennard de Rijk)
 * Added public_info property to StudentProject model. (Lennard de Rijk)
 * Student Project public page now shows feed entries. (Madhusudan C.S)
 * Added feed_url to StudentProject. (Lennard de Rijk)
 * Added list of projects to the organization home page. (Madhusudan C.S)
 * Changed StudentProposal list to show the amount of pending mentors (Lennard de Rijk)
 * Brown paper bag fix (Sverre Rabbelier)

= Changelog for 0-5-20090407 =

 * Cleanups in in soc.views.models.student_project module. (Pawel Solyga)
 * Add pylint: disable-msg=W0706 to soc.views.helper.access module. (Pawel Solyga)
 * Major update to the views concerning StudentProjects. (Lennard de Rijk)
 * Added new redirect method to be used for StudentProjects. (Lennard de Rijk)
 * Added two new templates for use in StudentProject views. (Lennard de Rijk)
 * Added 2 new access checks to deal with StudentProjects. (Lennard de Rijk)
 * Student Project listing now includes mentor column. (Lennard de Rijk)
 * Change the dropdown menu to state Comment Visible to Student. (Lennard de Rijk)
 * Only show mentor name in the detailed list. (Lennard de Rijk)
 * Properly handle exports when there are multiple lists (Sverre Rabbelier)
 * Make slots view available to hosts (Sverre Rabbelier)
 * Use the new nr_applications and nr_mentors (Sverre Rabbelier)
 * Add the amount of proposals and mentors to slots view (Sverre Rabbelier)
 * Added Matthew Wilkes to the AUTHORS file (Sverre Rabbelier)
 * Added key_order to student proposal to enable csv export (Sverre Rabbelier)
 * Fixed wrong usage of twoline_field in proposal view (Sverre Rabbelier)
 * Fixed bug introduced by fixing a pylint error (Sverre Rabbelier)
 * Added name column to all role lists. (Lennard de Rijk)
 * Added Mentor name column to StudentProposals list. (Lennard de Rijk)
 * Fix too long line in soc.views.models.student_proposal module. (Pawel Solyga)
 * Added simple listing for Student Proposals you are a mentor for. (Lennard de Rijk)
 * Changed label and help_text for public review button. (Lennard de Rijk)
 * Replace current favicon with the cleaned up one (smudges). (ajatsu)
 * Allow students to see and comment on withdrawn and ineligible proposals. (Pawel Solyga)
 * Indention fix in soc.views.models.organization module. (Pawel Solyga)
 * When Student withdras a proposal a comment is added. (Pawel Solyga)
 * Make "Mark as Ineligible" reversable. (Pawel Solyga)
 * Add a script to subscribe someone to all updates (Sverre Rabbelier)
 * Add the entities to the context too (Sverre Rabbelier)
 * Fix posting public comments as private. (Pawel Solyga)
 * Brown paper bag fix, sort by last name in AUTHORS (Sverre Rabbelier)
 * Added Dmitri to the AUTHORS file (Sverre Rabbelier)
 * Use different colors for public/private comment widget (Dmitri Gaskin)
 * Fixed a missing variable declaration (Sverre Rabbelier)
 * Disable E1002 pylint error in soc.views.helper.dynaform module. (Pawel Solyga)
 * Fixed a 'stylefix' in DynaField that wasn't a style issue (Sverre Rabbelier)
 * Fix bug in soc.views.models.base after recent cleanup. (Pawel Solyga)
 * Also show 'List my student proposals' after signup closes (Sverre Rabbelier)
 * Minor tweaks to orgStats (Sverre Rabbelier)
 * Fix calling of super class __init__ method in out_of_band Error class. (Pawel Solyga)
 * Cleanups in soc.views.helper. (Pawel Solyga)
 * Style fixes and removal of unused imports in soc.views.models. (Pawel Solyga)
 * Cleanups in soc.views.out_of_band module Error class. (Pawel Solyga)
 * Cleanups soc.models modules. (Pawel Solyga)
 * Style fixes and removal of unused imports in soc.logic modules. (Pawel Solyga)
 * Style fixes and removal of unused imports in soc.logic.models modules. (Pawel Solyga)
 * Disable some messages in pylintrc of do_pylint.sh. (Pawel Solyga)
 * Cleanups in soc.cache.base and in soc.views.sitemap. (Pawel Solyga)
 * Remove unused imports in soc.views.sitemap modules. (Pawel Solyga)
 * Style fixes and removal of unused imports in soc.logic.helper modules. (Pawel Solyga)
 * Add missing docstring url.py. (Pawel Solyga)
 * Add missing docstrings to main.py and settings.py. (Pawel Solyga)
 * Add license file and docstring to __init__.py files. (Pawel Solyga)
 * Returning a JSON response on successfully storing duplicates. (Lennard de Rijk)
 * Fixed a typo in stats.py (Sverre Rabbelier)
 * Refactor getProps to use dateFetch (Sverre Rabbelier)
 * Style fixes (Sverre Rabbelier)
 * Add and use a getEntities method (Sverre Rabbelier)
 * Make it possible to retrieve all properties in toDict (Sverre Rabbelier)
 * Add dateFetch (Sverre Rabbelier)
 * Make stats.py executable (Sverre Rabbelier)
 * Print how many entities have been retrieved (Sverre Rabbelier)
 * Enable storing of the duplicate calculation results. (Lennard de Rijk)
 * Added ProposalDuplicates model and logic. (Lennard de Rijk)
 * Replace "Founded by" with "Registered by" in soc.models.group module. (Pawel Solyga)
 * Add some additional functions for stats to stats.py script. (Pawel Solyga)
 * Make the mentor and admin submission nicer. (Tim Ansell, Pawel Solyga)
 * "Where did you hear about this program" is now always editable. (Lennard de Rijk)
 * Some fixes to lists helper to reduce mutation. (David Bentley)
 * A new model to easily seed many entities. (David Bentley)
 * Added a stats module to scripts (Sverre Rabbelier)
 * Factor out the setup() method in interactive (Sverre Rabbelier)
 * Fixed a typo in seed_db.html (Sverre Rabbelier)
 * Now using GET request for getting the data. (Lennard de Rijk)
 * Missing template change from r2750. (Lennard de Rijk)
 * Renamed duplicate-slots.js to prepare for changes. (Lennard de Rijk)
 * Make invalid Student Proposals accessible. (Pawel Solyga)
 * Added example text to birth_date. (Lennard de Rijk)
 * Fix docstring in interactive.py script. (Pawel Solyga)

= Changelog for 0-5-20090331 =

 * Added nr_applications and nr_mentors (Sverre Rabbelier)
 * Use ugettext and shorter variable names for inellegible list (Sverre Rabbelier)
 * Add listing of ineligible Student Proposals (Pawel Solyga)
 * Fixed the duplicate slots view. (Merio Ferraro, Lennard de Rijk)
 * Renamed duplicate-slots.js to prepare for changes. (Lennard de Rijk)
 * Added missing return to manage access check. (Lennard de Rijk)
 * Enforce the 500 character limit for abstracts. (Lennard de Rijk)
 * Fixed typo in docstring for logic/models/base.py (Lennard de Rijk)
 * Added cleaner to clean content of a specific size. (Lennard de Rijk)
 * Add confirmation to "Mark as Ineligible" on Student Proposal (Tim Ansell)
 * Add mentor for one gsoc org and an admin for a gsoc org (Tim Ansell)
 * Set fields to 100% width again (Tim Ansell)
 * Remove two trailing comma's (Sverre Rabbelier)
 * Add a script to start an interactive shell with remote api (Sverre Rabbelier)
 * Enabled remote_api for admins only (Sverre Rabbelier)
 * Fix  Issue 381  and  Issue 207  (Date selector Widget) (Daniel Hans)
 * Fixed some typo in app/soc/views/models/base.py (Chen Lunpeng)
 * Changed edit access checks for role views. (Lennard de Rijk)
 * Fixed access check in club_member view. (Lennard de Rijk)
 * Added missing access checks to various roles. (Lennard de Rijk)
 * Added document_name alias for use on award certificates. (Lennard de Rijk)
 * Disabled CSV export for roles. (Lennard de Rijk)
 * Name alias now does not use the name_on_documents. (Lennard de Rijk)
 * Add missing utf decode in html cleaner in soc.logic.cleaning module. (Pawel Solyga)
 * Use minified tiny_mce.js which saves 100kB (Pawel Solyga)
 * Student Proposal Review template now has the right header_title. (Lennard de Rijk)
 * Added title and student name to Student Proposal Review title. (Lennard de Rijk)
 * Separate submit button on Student Proposal review page. (Lennard de Rijk)

= Changelog for 0-5-20090325 =

 * Public review now also triggers the status change to pending. (Lennard de Rijk)
 * Show additional info link on Student Proposal pages. (Lennard de Rijk)
 * Added cleaning to student proposal content and its reviews. (Lennard de Rijk)
 * Removed leftover URL in duplicate-slots.js (Lennard de Rijk)
 * Added JS to the duplicate proposals page. (Lennard de Rijk)
 * Fixed error occurring when mentor or student posts a comment. (Lennard de Rijk)
 * Fix csv export of properties that are not string (like datetime.time) (Pawel Solyga)

= Changelog for 0-5-20090324 =

 * Add csv export support for Roles (Pawel Solyga)
 * Now showing student name in list proposal views. (Lennard de Rijk)
 * Fixed a typo in proposal listing (Sverre Rabbelier)
 * Enable resizing in the TinyMCE widget (Sverre Rabbelier)
 * Add "Edit my Student Profile" link to program menu. (Lennard de Rijk)
 * Added check to prevent students from submitting too many proposals. (Lennard de Rijk)
 * Fixed a typo in Organization model. (Lennard de Rijk)

= Changelog for 0-5-20090322 =

 * Redirect to show if there is no home document (Sverre Rabbelier)
 * Make public return True iff public page should be shown (Sverre Rabbelier)
 * Automagically convert '+' to '00' in phone numbers (Sverre Rabbelier)
 * Added a 'Can we contact you' property (Sverre Rabbelier)
 * Make sure the user has restricted rights to create a new document (Sverre Rabbelier)
 * Add example text on t-shirt sizes (Sverre Rabbelier)
 * Ensure that the link_id entered is the user's in edit_self (Sverre Rabbelier)
 * Optionally return link_id in clean_user_is_current (Sverre Rabbelier)
 * Use getFromKeyFields instead of getForFields where possible (Sverre Rabbelier)
 * Student proposal list shows date, regular list shows the org name. (Lennard de Rijk)
 * Removes the Mentor from 'willing to mentor' lists when resigning. (Lennard de Rijk)
 * Factor out input and file utils into io.py. (David Anderson)
 * Added fields requested in Issue 392 to Student Model. (Lennard de Rijk)
 * Push agreements to group 99 for Role forms. (Lennard de Rijk)
 * Use the new as_email tag for user profile (Sverre Rabbelier)
 * Added an as_email template tag (Sverre Rabbelier)
 * Fixed typo in variable name. (Lennard de Rijk)
 * Fix broken list_msg, do not to display list_msg if it is None. (Pawel Solyga)

= Changelog for 0-5-20090321 =

 * Add school name and school country properties to Student Role (Pawel Solyga)
 * Mentors cant resign when mentoring a project/proposal. (Lennard de Rijk)
 * Only show 'Register as student' link student has a user profile (Sverre Rabbelier)
 * Explain better what a link_id should look like (Sverre Rabbelier)
 * Typo and thinko fix in accepted_orgs_msg (Sverre Rabbelier)
 * Show the accepted_orgs_msg for the accepted orgs page (Sverre Rabbelier)
 * Allow for a message to be displayed above the list view (Sverre Rabbelier)
 * Add an non-required accepted_orgs_msg property to program profile (Sverre Rabbelier)
 * Requests now link to a user's profile (Sverre Rabbelier)
 * Added an as_user template tag (Sverre Rabbelier)
 * Clean phone numbers to be numeric only (Sverre Rabbelier)
 * Added a numeric_only cleaner (Sverre Rabbelier)
 * Added example text to the phone number fields (Sverre Rabbelier)
 * Removed formatting from TinyMCE that use the style tag (Sverre Rabbelier)
 * Show all orgs in accepted org list view (Sverre Rabbelier)
 * Made getPickData more generic by supporting ordening (Sverre Rabbelier)
 * Added a new index for accepted orgs listing (Sverre Rabbelier)
 * Fixed docstring for canResign method. (Lennard de Rijk)
 * Moved canResign check to role logic so subclasses can override. (Lennard de Rijk)
 * Minor style fix. (Lennard de Rijk)
 * Add date postfix to slot-allocator.js file. (Pawel Solyga)
 * Don't call updateFromJSON function if no data in slot allocation. (Mario Ferraro)
 * Fixed copy/paste fail in docstring. (Lennard de Rijk)
 * Only show valid roles on user roles page. (Lennard de Rijk)
 * Added "How did you hear about this program?" to Student Profile. (Lennard de Rijk)
 * Fixed double sending of notifications on creating a new invite. (Lennard de Rijk)
 * Fixed redirect after creating/rejecting a request/invite. (Lennard de Rijk)