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