_..this is so that we can speak/understand the same language..._

  * **Site Administrator:** (now known as 'Developer' in Melange).  The all powerful one who initially set up a Melange site.
  * **Sponsor:** _Example - Google_.  "It is not expected that very many Sponsor organizations will be created for a running Melange site, often only one."
  * **Host:** _Example - LH_.  Hosts sign up as regular users and are later promoted/blessed/anointed to being hosts either by the site administrator or by another host.
  * **Program:** _Examples - GsoC-2008 or GHOP-2008_.  A program is an individual instance. We’re NOT calling a generic 'GSoC' or 'GHOP' a program, but are qualifying by which one, i.e. which year.

  * **Quiz:** (was 'Questionnaire') _Example - the mid term mentor survey_.  A set of questions created by an author.  A quiz has a target audience, e.g. mentors, students.  Creating a new quiz automatically creates a new questions-page and answers-summary page.  The quiz mechanism will be used in multiple places, e.g. it's also used for terms of service.  See QuestionnairePages.

  * **Club:** _Example - Apache, GSoCers from Poland, Documentators_. A Club is a generic type of Group that gathers Members into a community. This is a group that is going to be used in social networking related Melange features. Club can gather Members and later apply to become an Organization for a particular Program.

# The difference between a User and a Person:

**Explanation** (from MelangeIrcLogs): User is unique for each Google Account.  Person is not.  There is a Person (with things like shipping address, public email address, etc.) for each Role that a User can have on the site.  User is some very harmless "nickname" and "linkname" (used in URLs) info attached to a User (Google Account).  User is site-wide.   Person is per-Program (per-year) and per-Role.   So, User is supposed to be minimal and not contain time-sensitive data.


# Google Account, id and User

  * A Google Account is referred to, at least in code, as an "id".  This change was made to avoid confusion between the App Engine users.User and our User Model.