blob: dc698534364fb5cdb0089ee360ca3b8998daa909 [file] [log] [blame]
#summary Wiki Page for the Google Code-In with new Architecture Project.
#labels Phase-Design
<wiki:toc max_depth="3" />
=Introduction=
This document contains information regarding the progress and details of the Google Code-In with New Architecture project (GSOC 2011).
----
=Design and Implementation=
==Converting roles and updating references==
Minor changes have to be made to the GCI models such that fields that refer to student/org_admin/mentor should now refer to profile as we are getting rid of Mentor/OrgAdmin entities and Students are defined by their StudentInfo coupled to the profile.
===Implementation===
* A GCIProfile model will be written which extends soc.models.role.profile and the GCI specific fields are added to this model and the GCIStudentInfo model which is coupled to the student's profile.
* If someone is both OrgAdmin and Mentor for the same organization, then we will not need to update the GCIProfile with mentor information (mentor_for field).We assume that an org admin is also a mentor.
* The GCIProfile model contains the GCI specific notification settings.
* Currently, GCI has a different notification system where a user X can subscribe to the notification to a particular task by clicking a star on the task and can un-subscribe the task by clicking on the same star again, org_admin,mentor and the student claiming are automatically subscribed.
* In addition to this, we will now have Profile based notification settings where a user will be given an option to whether subscribe for the notifications automatically or not, for example a student at the time of profile creation can check/uncheck automatically subscribe to tasks I claim.The same can be applied for mentor and org_admin.
* The GCIStudentInfo model contains additional fields specific to GCI
* number_of_tasks_completed -> contains number of tasks completed by the student
* consent_form -> A signed Parental consent form
* student_id_form -> Student ID to verify a student
* grade -> The grade in which the student is
* We then write a script to convert the roles itself.Basically for each student,mentor or org_admin entity we create a GCIProfile.And then we update all these references in the models containing them.we will use the deferred library which lets us retrieve entites in batches and update their references easily.
==Move list generator to the core==
As the list generator is required even for the GCI module, we move the list generatorfrom gsoc module to the core.
===Implementation===
* Move gsoc.views.helper.lists to soc.views.lists and fix the corresponding imports
== Request-Data Object ==
A RequestData object that will be created for each request in the GCI module will be written.This extends the soc.views.helper.request_data.RequestData and GCI specific data is added to it.
===Implementation===
* The GCI RequestData object contains the following fields
* site: The Site entity
* user: The user entity (if logged in)
* program: The GCI program entity that the request is pointing to
* program_timeline: The GCITimeline entity
* timeline: A TimelineHelper entity
* is_host: is the current user a host of the program
* is_mentor: is the current user a mentor in the program
* is_student: is the current user a student in the program
* is_org_admin: is the current user an org admin in the program
* org_map: map of retrieved organizations
* org_admin_for: the organizations the current user is an admin for
* mentor_for: the organizations the current user is a mentor for
* student_info: the StudentInfo for the current user and program
* The RequestData object contains methods like,
* getOrganization: To get the specified organization
* orgAdminFor: Tells if the user is Admin for the specified Organization
* mentorFor: Tells if the user is Mentor for the specified Organization
* appliedTo: Tells if the user has applied to a specified organization
* isPossibleMentorForTask : Checks if the user is possible mentor for the task in the data
* hasCompletedTask : Checks if the user has completed atleast one Task
* currentTaskState: Returns the user's current task state
* populate: To populate the fields in the RequestData object
==Access checker specific to GCI==
An access checker class that contains helper functions for checking access in the GCI module.
===Implementation===
* Add the required objects to Mutator class to mutate the data object as requested, for example
{{{
from soc.modules.gci.models.task import
class Mutator(object):
# unset the data object first
def unSetAll(self):
self.data.task = unset
#kwargs which define a Task
def taskFromKwargs(self):
id = int(self.data.kwargs['id'])
self.data.task = GCITask.get_by_id(id, parent=self.data.profile)
}}}
* After finishing with the mutator class, we can have access checker methods like,
* isTaskInURLValid -> Checks if task in URL exists
* canStudentClaimTask -> Checks if the student can claim a Task.
==URL Patterns==
The GCI related URL Patterns should be created, they will be discussed in the implementation.
===Implementation===
* The patterns will be returned in any of the following ways
* namedLinkIdPattern -> Returns a link ID pattern consisting of named parts
* namedIdBasedPattern -> Returns a url pattern consisting of named parts whose last element is a numeric id
* namedKeyBasedPattern -> Returns a url pattern consisting of named parts whose last element is a string representation of a Key instance
==Redirects==
A helper view for constructing GCI related redirects which can be used in other views for redirecting.
===Implementation===
* A RedirectHelper class will be written for constructing required redirects.
* Here we set args/kwargs for a url_pattern.`<TYPE>` redirect, where TYPE can be organisation, profile,document etc
* For example,
{{{
self.kwargs['survey'] = survey
}}}
* Other methods that help redirects will be.
* urlOf -> Returns the resolved url for a name
* url -> Returns url of current state
* to -> Redirects to resolved url for name
* specific methods to set the _url/_url_name for particular redirects
* For example,
{{{
def homepage(self):
self.program()
self._url_name = 'gci_homepage'
return self
}}}
==Site Menus==
For now, the views for the site menus can be similar to that of the GSoC site menus with certain minor changes.
==Required Views==
The following are the basic views required, This section will be updated as the views are written.
* Public Task view
* Task subscription
* Work submission
* Program settings view
* Profile
* Admin
* Org application
* Org Profile
* Org Homepage
* Dashboard
* Document
* Assign Mentor
* Student Ranking
==Implementation==
* All the views will be basically have the following
* djangoURLPatterns -> To return required url pattern for the view
* checkAccess -> To check if a user has access to this view
* templatePath -> Returns the path to the template to be rendered
* context -> Returns the current context of the view
* A view will have other required methods specific to that view.
----
= Meetings and Agendas =
== Tuesday, May 17:10:00 in UTC ==
=== Meeting Notes ===
Location : Skype <br />
Time : Tuesday, May 17:10:00 in UTC <br />
Conducted by: Lennard de Rijk, Madhusudan C.S <br />
Notes taken by : Selwyn Jacob <br />
* General Discussion on the approach to start the project.
* Change the GCI models such that the fields that refer to student/org admin/mentor should now refer to Profile as we are getting rid of Mentor/OrgAdmin entities and Students are defined by their StudentInfo coupled to the profile.And use mapreduce or Task API to go over all entities in GCI that need to have their reference updated.
* Move the List generating module from gsoc.views.helper to soc.views and change corresponding imports as even GCI needs this.
* Create GCI specific RequestHandler and RequestData object created for each request in GCI before starting with writing the views.
* Start with the dashboard functionality.