#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= 
==Changes to the existing models== 
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.
 * After this, the references can be modified, for example 
{{{
reference_class=soc.modules.gsoc.models.student.GCIStudent
}}}
 is changed to 
{{{
reference_class=soc.modules.gsoc.models.profile.GCIProfile 
}}}
 * We will then write a script to update each of these references.

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