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