#summary One-sentence summary of this page.
#labels 2013DeveloperDoc

= Introduction =

Document describing how information is stored and managed on Melange. It describes the relationships between the data entities and how those entities are transformed into UI elements.

= Details =

== Data model architecture ==

=== Jargon ===

  * Model - Structural and relational definition of the data.
  * Entity - An instance of the data model which is stored.

=== User Information ===

  * User model stores the user's public name, the Google account with which the user signed up for Melange and the user's link id.
  * Profile information is stored in the Profile (GSoCProfile and GCIProfile) models which are in turn inherited from Role model. The user entity of the user to whom profile belongs to serves as the parent of the profile entity. GSoCStudentInfo and GCIStudentInfo models store student specific information such as school name, project and proposal counts in GSoC, completed tasks count in GCI and so on. Corresponding profile models are the parents of the StudentInfo models. Both the Profile models and StudentInfo models contain user supplied information as well as derived properties.


=== Program Information ===

  * The program models(GSoCProgram and GCIProgram) store the settings such as total number of slots available, age restrictions for participants, program's current visibility that are related to the entire program.
  * The timeline (GCITimeline and GSoCTimeline) models store the program's timeline. However the timeline corresponding to the surveys such as organization application and mentor and student midterm and final evaluations are stored as part of the corresponding surveys outside these timeline models. There exists a 1:1 relationship between the program model and the timeline model. Program model references the timeline model through "timeline" reference property and timeline model references program model through "scope" reference property.
  * The program messages (GSoCProgramMessage and GCIProgramMessage) models store the message bodies of the emails that are sent by hosts to different various participants. Message models are descendents of program models.

=== Organization Information ===

  * The organization (GSoCOrganization and GCIOrganization) models store both the information pertaining to the organization that are publicly visible such as organization name, contact details etc. and organization specific settings such as their GSoC proposal scoring scale, accepted and rejected student messages in GSoC. These models also store some derived information such as the number of mentors assigned to proposals, slots allocated and so on.

=== Proposals and Projects ===

  * The StudentProposal model stores the content of the proposal submitted by the student, mentors who wish to mentor the proposal, the mentors assigned to the proposal, etc.
  * The GSoCComment model stores the proposal review comments.
  * The GSoCScore model stores the score assigned by each member of the organization to a proposal.


Relationship between entities: