

# Post-GSoC Plan - Delayed/Postponed 2011

## Weekly Targets

**Week of Jan 9th - Jan 15th**

  * User Pages workflow
  * User Pages Image Upload
  * Clarify about issue of pulling task info with Madhu and work on it

## Issues to be handled

Order of Integration (and priority of issues to be resolved):
  * User Pages
  * Maps
  * Calendars


### User Pages
| **Short Name** | **Description** | **Schelduled** | **Priority** | **Primary Contributors** |
|:---------------|:----------------|:---------------|:-------------|:-------------------------|
|User Page Image Upload|Enable uploading of Images for User Pages|16 January      |High          | Savitha                  |
|User Pages: Pull Task Info|Instead of showing student project info on User Page, get the users Task information also, to make it usable for GHOP/GCI as well | 16 January     |High          | Savitha                  |
|Write tests for User Pages |Testing all code related to User Pages| ----           |High          |Savitha                   |

### Maps

| **Short Name** | **Description** | **Schelduled** | **Priority** | **Primary Contributors** |
|:---------------|:----------------|:---------------|:-------------|:-------------------------|
|Map-View JS data handling|Find out how javascript will handle huge amount of users and events and show them on the map.|23 January      |Medium        |Savitha                   |
| Rectify Empty Address Line in Event Pop-out | Format the pop-out windows html to avoid empty lines for missing address fields | 23 January     | Medium       | Savitha                  |
|Map Generation based on Address field value|When filling in the address fields of a form, the Google map should be generated if either or all of the address fields are populated in any order.|23 January      |Medium        |Savitha                   |

### Calendars

| **Short Name** | **Description** | **Schelduled** | **Priority** | **Primary Contributors** |
|:---------------|:----------------|:---------------|:-------------|:-------------------------|
| Enable Auto-reload of DynaForms | The Calendars list in forms should be reloaded each time a form loads as the list keeps changing based on Calendar activation | TBD            | Medium       | Savitha                  |
|Calendars are being sent from Melange ID |                 | TBD            | Low          | Savitha                  |
|Calendars API Moved Temp. Error|Error situation on API side| TBD            |Low           | Savitha                  |
|Cron Job to check Event changes|Pull event from Google Calendars and run through them to check for changes from Google Calendar side and update Melange datastore.|TBD             | Medium       | Savitha                  |



### General

| Add Appropriate Indentation for Community menu | Indent the menu items for the social features correctly/uniformly | 23 January | Medium | Savitha |
|:-----------------------------------------------|:------------------------------------------------------------------|:-----------|:-------|:--------|
|Testing other parts of project                  |Testing                                                            |TBD         |Medium  |Savitha  |


---


## Issues to be handled

| **Short Name** | **Description** | **Schelduled** | **Priority** | **Primary Contributors** |
|:---------------|:----------------|:---------------|:-------------|:-------------------------|
| Enable Auto-reload of DynaForms | The Calendars list in forms should be reloaded each time a form loads as the list keeps changing based on Calendar activation | 30 September   | Medium       | Savitha                  |
| Add Appropriate Indentation for Community menu | Indent the menu items for the social features correctly/uniformly | 20 September   | Medium       | Savitha                  |
| Rectify Empty Address Line in Event Pop-out | Format the pop-out windows html to avoid empty lines for missing address fields | 10 October     | Medium       | Savitha                  |
|Map Generation based on Address field value|When filling in the address fields of a form, the Google map should be generated if either or all of the address fields are populated in any order.|15 October      |Medium        |Savitha                   |
| Calendars are being sent from Melange ID |                 | TBD            | Low          | Savitha                  |
|Calendars API Moved Temp. Error|Error situation on API side| TBD            |Low           | Savitha                  |
|Cron Job to check Event changes|Pull event from Google Calendars and run through them to check for changes from Google Calendar side and update Melange datastore.|20 October      | Medium       | Savitha                  |
|User Page Image Upload|Enable uploading of Images for User Pages|20 September    |High          | Savitha                  |
|User Pages: Pull Task Info|Instead of showing student project info on User Page, get the users Task information also, to make it usable for GHOP/GCI as well | 30th September |High          | Savitha                  |
|Write tests for User Pages |Testing all code related to User Pages| 10 October     |High          |Savitha                   |
|Testing other parts of project|Testing          |TBD             |Medium        |Savitha                   |
|Map-View JS data handling|Find out how javascript will handle huge amount of users and events and show them on the map.|TBD             |Medium        |Savitha                   |

# Introduction

> This document will be used to documents the progress and details of the Social Features (GSoC 2010) project for Melange.


# Project Design and Implementation

## Main Feature 1: Tabbed User Pages

### Overview
User Page feature will be used by each user to share information about
themselves with the rest of the GSoC community. The UI of this feature is designed with tabs,
hence users will remain on a single page while navigating between multiple tabs. The details of this feature's design and implementation are as follows.

The tabs of the user page will be as follows:
  * Profile
  * Project
  * My Stuff (to be renamed later)

### Workflow

Workflow for Users:
The workflow for using this feature is largely similar for all user roles in the soc framework, with some differences for the program and organization admins.

Workflow for Student, Mentor, Organization Admin User roles


  1. User receives acceptance notification email that they have been accepted to participate in the program. A short message is appended to this email, mentioning that users can now update their respective user pages on Melange as well as view other users’ pages.
  1. There are two possibilities from here:
    1. If users click the link, they are redirected to the profile tab of their user page, where they see their partially filled profile based on current user information provided at sign up (i.e. name, current/past user roles).
    1. If they do not click on the email link, whenever they next log into Melange, they will see ‘User Page’ on their sidebar under the ‘User’ tab. Clicking on this will take them to the profile tab of their user page.
  1. They may further update the data on their profile tab, or the other two (Project, MyStuff) tabs by clicking on the ‘Edit User Page’ button to be redirected to a form where they can edit/add data for all the three tabs.
  1. The **Profile tab** will display a subset of the properties from the user\_page data model. Profile related information such as contact, personal profile details, education and job information will be shown here.
  1. In the **Project tab**, students can fill in details of the project they are working on, while mentors can provide details about the project they are mentoring for. Past and Current project data for both mentors and students will be pulled from the database. Users can add on to it using a text field.Organization Admins can use this page to provide information about all their student projects. Program Admins can use this page to provide general information about the GSoC/GHOP program itself.
  1. In the **My Stuff tab**, users can click on “Add Blog Feed”, to insert their blog url to display updates from their personal blogs using Melange’s RSS widget. For organization and program admins, there is provision to display two blog feeds. This is to display their own personal blog feed as well their organization/program blog feeds.
  1. Once changes are saved, users may return anytime during the course of the program to change and save the information on their user pages.

---

**Suggestion Incorporated** Comment (Madhu): I think there should be only one edit page where they can edit all the three tabs.

---


---

**Suggestion Incorporated** Comment (Madhu): Nope, that makes the interface too complicated and messy. Or if you would like, don't make it generic, but give Admins options for 2 RSS widgets. Thats the max, not more than that for sure.

---


### Data Models

**UserPage**

This user\_page.py will be the master model for this feature which will enclose the three tabs that make up this feature. The other data models created are for multiple-valued properties such as education, jobs, current/past projects, updates and comments.

The Data Models
  * user\_page.py
  * project\_details.py (pulled from database)

Properties of user\_page.py
  * user - **ReferenceProperty**         (required)
  * email – **StringProperty**
  * website - **LinkProperty**
  * biography - **TextProperty**
  * profile\_picture – **BlobProperty**
  * last\_modified - **DateTimeProperty** (required)
  * project\_details – **ListProperty**   (required)
  * feed\_url - **LinkProperty**
  * user\_page\_status - **StringProperty**(required)
  * tags - **ListProperty**              (required)


---

**Suggestion Incorporated** Comment (madhu): I think you must really use tag framework in Melange here and use the tag property.

---




The User page feature should be in one of the following states implied by the user\_page\_status property of the model.
  * Visible - This state occurs after the user is accepted into the program. Only the minimal information about the user already entered during registration period is shown on the user page. In this state, the user may edit or add to his user page at any time during the program.
  * Invisible - This state of the user page can be activated by the user if the user wishes to prevent other users from viewing their profile.
  * Invalid - The user account has been terminated.


---

**Suggestion Incorporated** Comment (Madhu): Status is good, but I don't think Uninitialized, Initialized and Updated is a good idea. Instead we can just have three states like, visible, invisible and invalid.

---





---

**Suggestion Incorporated** Comment (Madhu): Oh! I am extremely sorry for not making this clear earlier, when you started writing it out, but anyways better late than never. You need not create so many Python files and data models. From what I can see all the files and data models you have specified above can be merged into one single file with one single data model. So many reference properties is not good. Also, even if we keep all the data you have specified in a single data model we can write views in such a way that it shows only what data needs to be shown to a specific user and tabbing etc etc can all be controlled by views and templates. So we might not want so many data models. We will have to redesign this together.

---


### Views, Templates & Logic
**Views**

**_soc.modules.social.views.models.user\_page.py_** : Since the user\_page feature serves more or less the same purpose for all the different user roles in Melange, a single view will be created.

**Templates**

  * **_soc.templates.modules.social.user\_page.view\_user\_page.html_** : Since the user pages will be tabbed, the entire page will not reload when users switch between tabs. With the help of JavaScript, this can be achieved with a single template with different html div and id tags defining the data to be displayed in different tabs :).

  * **_soc.templates.modules.social.user\_page.edit\_user\_page.html_** : A different template with the html form will be created for the 'Edit User Page' function which will be used to update the user\_page.py data model.

**Logic**

**_soc.modules.social.logic.models.user\_page.py_** : To handle the edit/update of the user data a logic is created which will be used to update the user\_page.py data model.

## Main Feature 2: Maps + Calendars for GSoC

### Overview
This feature consists of two main components. The **Calendars** and **My Community** components. These two components will appear in the sidebar in the User section.

The My Community tab will provide a portal for users to explore all the participants of the program by different categories such as location, organization, project tags etc. Users can can get to know their fellow participants by visiting their user page.

The My Community section also allows user to explore community events by location, organization and tags. Non-admin users can also request to add a new event to the calendar by sending "Add Event" requests to their respective admins with the event details.
The My Community tab provides two views for the above-mentioned activities, a simply list view and a global map view(default).

The Calendars component is used to view only the events such as GSoC meetups, irc meetings, conferences and other related events which might be of interest to the community members. Each user can view the public program calendar and the private organization calendar which is owned by the organization admin and is viewable only by users associated with that organization.


### Workflow

**My Community**

Workflow for all Users:

  * When users click on 'My Community' in the sidebar, under the 'User' tab, they will be redirected to the _MapView_ which is the default view. Here, they will see a world map which they can manipulate to show either **users or events**.
  * In the _MapView_
    1. Once users or events are selected, the map can be further manipulated to show the data based on location, organization and tags(i.e. C#, PHP, Django etc).
      1. If users are selected: The map will point to all user locations based on the filters selected. A mouse-over on a particular user, will show a link to user profile, which can be clicked to be directed to the user page.
      1. If events are selected: The workflow is same as users, except that events are shown on the map. The users can mouse-over and click on a particular event to view the details as a pop-up widget.
  * In the _ListView_
    1. Once users or events are selected, the same filters as above can be applied, except the data will be shown in a text-based list format. Clicking on any row in the list, will lead to the corresponding user page or the pop-up event widget respectively.

**Calendars**

Workflow for Users:

  * All calendars will be hosted under a single Google account owned by the program\_admin. When the accepted organizations are announced, a new calendar can be created for each new organization. If organizations have participated in the program previously and they already have a calendar with the account, then that same calendar can be used.
The Google ids of org\_admins can be added to their respective org calendars giving them
rights to publish on their calendar.
Org\_admins can be notified about their org\_calendar on acceptance. A short message and link can be added in their acceptance notification emails leading them to their org calendar page. (**Note** : Program\_admins will have to provide the google account under which the program and org calendars are to be hosted.)
  * Click on 'Calendars' under the User tab in the sidebar. They view a single calendar containing events in the Program calendar as well as the events in their organization calendar. (Organization admins are owners of their respective org calendars.)
  * From this point onwards, users may choose any of the following:
    * **For Admins** Add a new event by clicking on the 'Add Event' button, which will take them to a form where they can fill in the event details and it will be shown on the org calendar.
    * **For Admins** They can choose to approve or decline requests sent by other users to publish events in their calendar by clicking on the 'Requests' button. They will be redirected to a page showing a list of event requests. After inspecting the event details, they can approve or decline the events.
    * **For Non-Admins** User can choose to request to add a new event by clicking on the  'Request Add Event' button. They will be redirected to a similar form as the admins 'Add Event' function. They can submit it and this event will be shown on the respective org or program calendar after it is approved by the respective admin.
    * View user's org events only.
    * View Program events only.
  * Additionally, users can also subscribe to feeds to be notified about events with certain tags.

### Data Models

Currently, the additional data model required here is for the event objects.

_soc.modules.social.models.event.py_

Properties of for event.py
  * created\_by - **ReferenceProperty**  (required)
  * created\_on - **DateTimeProperty**   (required)
  * modified\_by - **ReferenceProperty**
  * modified\_on - **DateTimeProperty**
  * event\_name - **StringProperty**     (required)
  * description – **StringProperty**
  * location – **GeoPtProperty**        (required)
  * is\_org\_event – **BooleanProperty**  (required)
  * organization - **ReferenceProperty**(required if is\_org\_event=True)
  * program - **ReferenceProperty**     (required)
  * status - **StringProperty**         (required)
  * time - **DateTimeProperty**         (required)
  * tags - **ListProperty**             (required)


---

**Suggestion Incorporated** Comment (madhu):
  1. Same as above. You may want to use tag framework for tags.
  1. Also you may want created by and created on along with modified by and modified on properties.
  1. Also you may want to use http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#GeoPtProperty GeoPtProperty here instead of Lat Lng location float properties. The reason why it was used in previous model was because this property was not in Appengine then. But now we have!
  1. You also want reference to program.

---


An event can only be published in one calendar(i.e. program calendar or org calendar). If is\_org\_event is true, then it will be published in the current user's org calendar, if is\_org\_event is set to false, then the event will be published in the program calendar.
These two status properties differentiate the program admin and the org admins.


---

Comment (madhu): Just to warn you, a user may be involved with two or more Organizations. For example, Sverre is mentoring two students this time :P One for Melange and another for Git

---


Based on the calendar(org or program) in which the event is meant to be published, the status property is set to either of the three values.

  * **requested** : If the current user is not the owner of the calendar where the event is to be published, then this state is set by default. When it is approved by the owner, this is set to is\_approved.
  * **approved** : If the current user is the owner of the calendar where the event is to be published, then this state is set by default. Else if the event is approved by the owner, this state is set for the event.
  * **declined** : If the calendar owner chooses to decline an event request this state is set.


---

**Suggestion Incorporated** Comment (madhu): For clarity reasons I think it is better to name these values **requested**, **approved** and **declined** since they are not really Boolean fields but a 3-state property.

---

### Calendars in Detail

**UseCases for Different User Roles**

Program Admin

![http://www.comp.nus.edu.sg/~savitha/gsoc/cal_init.png](http://www.comp.nus.edu.sg/~savitha/gsoc/cal_init.png)

"Initialize Calendars" use case simply refers to the automated creation of a new calendar for each accepted Organization and the assigning of access rights for all the org\_admins and students at the start of the program.

**Org Admin**

![http://www.comp.nus.edu.sg/~savitha/gsoc/org_admin.png](http://www.comp.nus.edu.sg/~savitha/gsoc/org_admin.png)

**Student or Mentor**

![http://www.comp.nus.edu.sg/~savitha/gsoc/student-mentor.png](http://www.comp.nus.edu.sg/~savitha/gsoc/student-mentor.png)


**Calendar Types**:
  * **Program Calendar**: This is a completely public calendar which is visible to all users participating in the program including mentors, students, org\_admins and program\_admins.
  * **Organization Calendar**: Every accepted organization has its own private calendar which is visible only to users working for that particular organization such as mentors, students and org\_admin of that organization.

**Calendar Account**:
  * All the organization calendars and the single program calendar will be hosted in a **single** Google account owned by the program\_admin. (this can be the program\_admins own account or analternative account such as gsummerofcode@gmail.com where the current program  [calendar](http://www.google.com/calendar/hosted/google.com/embed?src=gsummerofcode@gmail.com&ctz=America/Los_Angeles) is being hosted.)
  * Every org\_admin will be given owner access to their org calendar. Google's Calendar API provides access control lists for each calendar. Hence, each org\_admin can be given owner  access(user can make changes to events) while org students are given read access(this user can see all event details). (Ref: http://code.google.com/apis/calendar/data/1.0/developers_guide_python.html#SharingACalendar)

**Access Rights for User Roles**
When users access their Calendars, the respective calendars and rights will be triggered based on the account in which they are logged in. For example, if bob@gmail.com is an org\_admin, and is logged in. He will automatically have "owner" access to his org calendar and "read" access to the program calendar.

**Program\_Admin**:
  * Has "owner" access for all org calendars and program calendar

**Org\_Admin**:
  * Has "read" access to program calendar.
  * Has "owner" access to their org\_calendar.

**Mentors**:
  * Has "read" access to their org calendar and program calendar.

**Student**:
  * Has "read" acess to their org calendar and program calendar.

Users who do not have access to a particular calendar but want to add an event can send requests to the owner who can approve it. This is an internal feature to be implemented within Melange and not visible to Google Calendar API. The calendar will view the event as being added by the owner. (This is depicted in the Calendars User case [below](http://code.google.com/p/soc/wiki/SocialFeaturesMelangeGSoC2010?ts=1274515831&updated=SocialFeaturesMelangeGSoC2010#Maps_+_Calendar_Feature))

### APIs & Libraries
  * Google Calendars API
  * Google Maps API
  * CalVi's UI library
  * GeoModel (filtering locations, tentative)
> (more coming up...)


---

Comment (madhu): Want to see them soon. Esp. jQuery plugins for tabbed pages since you are starting with User pages in two days.

---


## Use-Case Diagrams

### User Page Feature

![http://www.comp.nus.edu.sg/~savitha/gsoc/user_page_usecase4.png](http://www.comp.nus.edu.sg/~savitha/gsoc/user_page_usecase4.png)

### Maps + Calendar Feature

**Maps**

![http://www.comp.nus.edu.sg/~savitha/gsoc/maps_usecase1.png](http://www.comp.nus.edu.sg/~savitha/gsoc/maps_usecase1.png)


**Calendars**

![http://www.comp.nus.edu.sg/~savitha/gsoc/calendars_usecase2.png](http://www.comp.nus.edu.sg/~savitha/gsoc/calendars_usecase2.png)

## Latest Workflow (as of Week 7)

### User Pages

  1. User Pages features are only accessible for those who have been assigned a role.
  1. The workflow changes slightly based on the different roles Users will have.
  1. User Page entities are Program scoped.

**Student Role** :
  1. Users can Register as a Student
  1. Upon successful registration, they will see a red highlighted "Create User Page" link on the sidebar.
  1. They can click on this to activate the User Pages feature and fill in the User Page forms.
  1. Once they create their User Page entity, it will be listed in the "List User Pages" link and all other users will be able to view their page if they have set their User Pages as "Visible".
  1. Each User may edit their User Page visibility and other information appearing on their User Page at anytime by selecting "Edit User Page".

**Mentor** :
  1. Users can apply to become a mentor for an accepted organization.
  1. The respective org\_admin then accepts the user as a mentor.
  1. The user is then notified of his acceptance as a mentor and made to fill out the mentor registration form.
  1. Upon successful registration as mentor, the red highlighted "Create User Page" link will appear.
  1. The steps from this point on are same as the Student Role.

**Org Admin and Program Admin**:
  1. Upon accepting invitation to be org/program admin, they will be fill in the form to register.
  1. Upon successful registration, they will see the red highlighted "Create User Page" link appear on the sidebar.
  1. The steps from this point on are same as the Student Role.

### Calendars

**Calendar Feature Activation**

  1. Once the timeline passes the "Accepted Organization Announced" deadline, the program\_admin will see a red highlighted "Activate Calendars for Orgs" link on their sidebar.
  1. Cliking on this will trigger the creation of one calendar for all accepted organizations.
  1. Simultaneously, notifications will be sent to all org\_admins about the new feature.
  1. Org\_Admins can choose to accept their calendar, upon which time, their user email will be added with 'owner' rights to their organization's Google calendar.

**Calendars Feature**

  1. Once the Calendar feature is officially "activated" by the program\_admin, all users will see "Events", "List Events" and "Add Event" links on their sidebar.
  1. "Events" link will show them the calendars. They may select to view different calendars using a drop down box.
  1. "List Events" will give a list view of events with the respective event tags.
  1. "Add Event" will take them to a form, where users choose the calendar they want to add their event to and the fill in the other event details.

**Event Creation by Owners**:

  1. If the user posting the event has 'owner' rights(org\_admin or program\_admin) to the calendar they are posting to, the event entity will be created on Melange as well as on the actual Google Calendar immidiately.

**Event Creation by Non-Owners**:

  1. If the user posting the even does not have 'owner' access to the calendar, the even entity will still be created on Melange with status "Unconfirmed" and will not posted to the Google Calendar. Instead, a notification with the event details will be sent to the 'owner' of the Calendar.
  1. Upon recieving the notification, the owner may choose to accept the event, whereby the event will be posted to the Google Calendar, and the status of the correpoding event entity set to "Confirmed".


# Code Work Flow & Documentation

## User Pages

**Main Files**:

**Code**:
  * User Page View - soc/modules/social/views/models/user\_page.py
  * User Page Model - soc/modules/social/models/user\_page.py
  * User Page Logic - soc/modules/social/logic/models/user\_page.py

**Other Files**
  * edit.html  - soc/templates/modules/social/edit.html
  * view\_page.html - soc/templates/modules/social/view\_page.html
  * userpage.css - soc/content/modules/social/css/userpage.css

**User Page View**:
  * **init** function:
    1. Access params are set for 'create','edit' and 'list' access for User Pages.
    1. new\_params[.md](.md) is used to set: **(i)** module and url names, **(ii)** templates for create, edit, view\_page and list, **(iii)** create,edit and exclude dynaproperties, **(iv)** set public fields to be shown in User Page lists.
    1. Setting url patterns for 'create','edit','list' and 'viewpage'.
  * **viewpage** function:
    1. sets the template to be used for View Page
    1. calls Logic method to get context, containing User Page entity details.
  * **_editPost_** function:
    1. used to set User Page properties before User Page entity is created
    1. properties such as **(i)** User reference, **(ii)** link\_id, **(iii)** last\_modified, **(iv)** role\_entity of user, **(v)** calls Logic functions to get Student Projects associated with the role of the User, **(vi)** sets tags associated with user, **(vii)** image property(yet to be fixed) **(viii)** call Logic functions to get additional Work and Education entities added from the POST dictionary.
  * **_editGet_** function:
    1. sets 'link\_id' and 'tags' as a string before going to edit page.
  * **_edit_** function:
    1. if request method is 'GET', call logic function to get all Work and Education entities associated with User Page to load to edit form.
    1. if request method is 'POST', call logic function to create the additional Work and Education entities added to edit form.
  * **getExtraMenus** function:
    1. creates Extra menu item called 'User (Community)'
    1. if user if not logged in, shows a 'Sign In' link
    1. if user if logged in, call redirect functions to get links for 'create', 'edit', 'view', and 'list' user pages based on respective access checks.
  * **list** function:
    1. Filter and list user pages whose status is set to 'Visible'.

**User Page Logic**
  * **getRoleEntity** function: gets the role entity associated with current user.
  * **getProjects** function: get student projects associated with current user.
    1. student projects in which current user is participating as student.
    1. student projects in which current user is particiapting as mentor.
    1. if current user is org\_admin, all student projects associated with the org.
  * **getEducation** function:
    1. gets all additional education-related field values from POST dict and updateOrCreates the Education entities.
  * **getWork** function:
    1. gets all additional work-related field values from POST dict and updateOrCreates the Job entities.
  * **getUserPageContext** function:
    1. gets the User Page entity, and the addtional education and job entities associated with the user.

**User Page Model**
  * Contains all the properties of the user page data model.

**edit.html**
  * **Javascript** functions:
    1. **afterLoad()** function: This function is called upon the loading of the page. It gets the additional education and job entities in the context and calls **getWork()** and **getEducation()** functions to create the additional fields in the form for these entities.
    1. **getWork()** function: for each work entity in the context dictionary, this creates the additional form fields and fills it in with the already existing work entities, if any.
    1. **getEducation()** function: for each education entity in the context dictionary, creates the additional education form feilds and fills it with respective values.
    1. **$('#moreEducation').click** function: Creates a new set of empty education form fields for user to fill.
    1. **$('#moreWork').click** function: Creates a new set of empty Work form fields for the user to fill.


# Timeline
> The tentative project timeline will be added here.

### Week 1(22 May - 28 May)

**To Do**:
  1. Code the models, views/templates and logic for User Pages as per design above.
  1. Modify existing code to accommodate new feature (sending out user page link in acceptance notifications etc.)
  1. Test code on localhost instance of Melange
  1. Find out how to pull data from past year databases (how to test this? can we import the database files from somewhere?)


---

Comment (madhu): Simple, create your own dummy data. If Felix has something to seed by then, we can probably use it. But in the first week I doubt it. But yeah you can create your own data.

---


**Deliverables**:
  1. Partial User Page feature:
    * On receiving acceptance notification, users can click on the link to their User Page or access it from the User tab in Melange.
    * User's will see default values on their User Page.
    * Users can view only their **own** user page. (search and view others' user pages not added yet).
    * Users can edit their user page data using forms.



### Week 2(29 May - 4 June)

**To Do**:
  1. Complete left-overs from Week 1
  1. Develop an All Users ListView for viewing all users (who are not private) where clicking on a user takes them to the User pages
  1. Work on providing filtering in the list view based on user-tags, location and org
  1. Testing and Debugging previous weeks' work.

**Deliverables**:
  1. Almost-There User Page feature:
    * Users can use ListView to sift through the rest of the users and click on them to view their user pages.
    * Users can apply dynamic filtering to view users by location, org and tags using ListView.


---

Comment (madhu): This is already there. Can you please tell us what you want to do other than this? http://socghop.appspot.com/gsoc/program/list_projects/google/gsoc2010

---


### Week 3(5 June - 11 June)

**To Do**:
  1. Complete left-overs from Week 2
  1. Testing of feature plus writing tests(to be confirmed).
  1. code event.py data model.
  1. Design UI for calendar to be displayed (CSS/ CalVis).

**Deliverables**:
  1. Fully-Functional User Page feature:
    * User can view/edit their own user pages.
    * Users can have a list view of all users participating in the program and view them by location, org and tags.
    * Users can view user pages of other users by clicking on their names in the ListView.



### Week 4(12 June - 18 June)

**To Do**:
  1. Modify View, Logic for Program\_admin to authenticate an account where the program calendar and org calendar will be hosted. Create new org calendars once accepted orgs are announced.
  1. Modify Views and Logic for users and admins, to view the program and their org calendars Clicking on calendars in their User tab.
  1. Create templates for viewing the calendars based on user roles.
  1. Use calendar api to import calendars and display them in Melange.
**Deliverables**:
  1. Very-Partial Calendars feature:
    * On org acceptance, new calendars are created for each org.
    * All users can access their 'Calendars' link in their User tab.
    * They get to view their respective org and program calendars.



### Week 5(19 June - 25 June)

**To Do**:
  1. Code or modify existing user Views, create forms and templates for event creation/requests based on user roles.
  1. Create templates and modify Views for org\_admins and program\_admins to approve or decline event requests.
  1. Add event.py Logic to add new event in the actual Google calendar using API once its status is set to is\_approved.
  1. When adding event, use Maps Api to show a mini-map which users can use(optional) to point to the location of the event. Store this as Lat,Long attributes of event.py data model.

**Deliverables**:
  1. Partial Calendar feature:
    * Users can view Calendars
    * Admins can add events to their respective calendars and approve/decline requests.
    * Non-admins can send requests to add event.



### Week 6(26 June - 2 July)

**To Do**:
  1. Write a feed function using Django's feed generator(to be confirmed) allowing users to subscribe to rss feeds on events with certain tags.
  1. Test previous weeks' code.
  1. Fix Bugs, complete lagging work from previous week.
  1. Write tests?

**Deliverables**:
  1. Almost-there Calendar feature:
    * All deliverables from Week 4 and 5.
    * Users can subscribe to feeds for events with certain tags.



### Week 7(3 July - 9 July)

**To Do**:
  1. Develop ListView for events (similar to users ListView)
  1. Allow dynamic filtering by tags, location.
  1. Users can click on events they are interested in to see a pop-out widget with the event details.

**Deliverables**:
  1. Almost-there Calendar feature:
    * All deliverables from weeks 4,5 and 6.
    * Calendars ListView
    * Event filtering by categories.
    * View event using pop-up widget.


### Week 8(10 July - 16 July)

**To Do**:
  1. Any left-over todo's from previous weeks.
  1. Testing, Testing and Testing.
  1. Bug fixing.
  1. Documentation
  1. Get ready for mid-term evaluations.

**Deliverables**:
  1. User Page feature
    * View/edit User Page
    * View User Pages of all other users in the program.
    * Use ListView to filter users by location, org and tags.
  1. Calendars Features
    * View Program and User's org calendar.
    * Add or Request to add Events.
    * ListView of all program and org events and all other events marked as public.
    * View a particular event's details.

### Week 9(17 July - 23 July)

**To Do**:
  1. Any left-over todo's from previous weeks.
  1. Get started on Maps, read up on APIs
  1. Design UI
  1. Decide on possible jqueries that will be required
  1. Wind up User Pages & Calendar features and testing.

**Deliverables**:
  1. Maps feature
    * View all users and events in one shot no filtering yet

### Week 10(24 July - 30 July)

**To Do**:
  1. JS for filtering data based on tags, locations
  1. Wind up previous weeks' work

**Deliverables**:
  1. Maps feature
    * filtering should be visible

### Week 11(31 July - 6 August)

**To Do**:
  1. Complete Maps feature
  1. Documentation
  1. Get ready for final-term evaluations.

**Deliverables**:
  1. User Page feature
    * View/edit User Page
    * View User Pages of all other users in the program.
    * Use ListView to filter users by location, org and tags.
  1. Calendars Features
    * View Program and User's org calendar.
    * Add or Request to add Events.
    * ListView of all program and org events and all other events marked as public.
    * View a particular event's details.
  1. Maps Features
    * View all users or all events
    * apply filtering based on various criteria


# Meetings and Agendas

## Friday April 30, 2010 13:30:00 in UTC
### Meeting Logs
> Meeting start: http://www.thousandparsec.net/~irc/logm/%23melange.2010-04-30.log.html#t2010-04-30T13:30:05

> Meeting End: http://www.thousandparsec.net/~irc/logm/%23melange.2010-04-30.log.html#t2010-04-30T14:19:13


### Meeting Notes

> Location: #melange on freenode

> Time: 13:30:00 Friday April 30, 2010 in UTC

> Chaired by: Madhusudan C.S

> Notes taken by: Savitha R


  * A general overview of the project design was discussed.
    * Users should be able to view fellow GSoC students/mentors/admin by (i) geographic location (perhaps like a global map) (ii) by organization attached to (iii) by type of work/projects they are doing (iv) a complete list of all users in the program.
    * Users should be able to find other users using the above categories and then further have the option of finding out more information by clicking to view their personal GSoC user pages.
    * Privacy & Visibility issues: Users might need to have the option to keep their location and personal information private. In their personal user pages they may or may not choose to share their personal profile. However, they can share information about their projects such as progress, issues and other information related to the project.  Further discussion on the specific details is required.
    * In addition to finding fellow users by location, users can also choose to view events/calendars by selecting to view the happenings in certain locations only. In this case, the location will dictate the calendar to be displayed.

  * Tips on getting familiar with the code and documentation.
    * Select or get assigned to a simple patch/issue. Fix and submit the patch.
    * Homework assignments during community bonding period to get familiar with Melange code base.

### Next Meeting

Location: #melange on freenode

Time: 13:30:00 Wednesday May 5, 2010 in UTC

Attendees: C.S.Madhusudan, Savitha

Agenda:
  * Detailed Project requirements
  * Design and Implementation details of project
  * Discuss and assigning of patch/bug-fixing home works to be taken up.



## Wednesday May 5, 2010 13:30:00 in UTC
### Meeting Logs
> Meeting start: http://www.thousandparsec.net/~irc/logm/%23melange.2010-05-05.log.html#t2010-05-05T13:30:33

> Meeting End: http://www.thousandparsec.net/~irc/logm/%23melange.2010-05-05.log.html#t2010-05-05T15:19:58


### Meeting Notes

> Location: #melange on freenode

> Time: 13:30:00 Wednesday May 5, 2010 in UTC

> Chaired by: Madhusudan C.S

> Notes taken by: Savitha R


  * General discussion on version control.
    * Cloning project. - Done
    * Learn and understand mercurial version control system as well as commands etc. How to make changes, submit patches, push changes etc.
    * Fix and submit a patch a.s.a.p. for the issue no. 890 bug
  * APIs to be used – Google Calendar API, Maps API, CalVi UI library, GeoModel for filtering in maps, Google AJAX APIs, default GMAPs UI.
  * Project features in detail -  Maps
    * Global map indicating GSoC students/mentors/etc. and events occurring at specific locations.
    * Filtering data displayed on global map using different categories such as
> > > (i)show all GSoC students from specific location
> > > (ii)show all students from specific organization
> > > (iii) show all events organized by program
> > > (iv) show all events for a specific organization
> > > (v) show all events between given date range
> > > (vi) show all students based on the work they are doing (e.g all students working with C/C++ project tags)
> > > issue:  have to check app engine quota restrictions
    * Maps can be used to display student items or event items with any combination of the above filters.
    * UI – An AJAX-based UI which shows the map and a section for users to type in their filtering options, as they type input, map display gets updated dynamically. When users mouse over and click indicated points on the map, there will be a pop-out widget providing more information. If a user scrolls over and clicks on a GSoC meet up event at Singapore then a small widget will pop out showing the details such as time, venue and info about the event.
  * Project features in detail – Calendars
    * Other than maps view, there will be calendar-only display, to just view events.
    * Program calendar and their own organization calendar will be shown in this view.
    * If organization admins choose to make their org calendar “public”, this can also be viewed in the calendar display.
    * Events can be added by calendar owners only, such as org admins and program admins. Other wishing to share events, can submit a simple form with event details, which calendar owners can approve and publish on their calendar.
    * Display-only UI as users will not be allowed to edit calendar events without authorization.
    * Pop-out widget like In the maps, with event information and optional Google map view and optional YouTube video embed related to the event.
  * Project Features in detail – User pages
    * User pages will contain (i)personal profile (ii) picture (iii)project updates (iv) rss widget (iv) (if time permits) twitter widget also!
    * UI to be like face book profile pages, with tabs. (i) Profile tab for users to share personal, educational and professional information. (ii) Project tab for users to share info about their project progress, updates  and issue. (iii) Other stuff tab where users can add other social widgets such as rss widget for their blog feed.
    * Simple forms to be used to get users to fill in profile information etc. Under “Project” tab users can post using a text field which takes in “html”.
  * Discussion on resolving issue 890 (on Google Code) and submitting patch this weekend. Posting weekly updates to dev blog and submit patches by Friday night (compulsory!).
  * Todo List for Savitha
    * Keep updating wiki with project design, workflows and formalized implementation details over the week.
    * Post on Dev Blog this weeks’ update.
    * Fix issue 890 (on Google Code) and submit patch.
