# 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 (on Google Code) (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 (on Google Code). (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 (on Google Code) 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 (on Google Code). (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 (on Google Code) 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](PATCH.md) 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 (on Google Code) (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 (on Google Code) (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 (on Google Code). (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 (on Google Code). (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 (on Google Code). (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 (on Google Code). (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 (on Google Code)  and  Issue 207 (on Google Code)  (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 (on Google Code) 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)