# User Preferences Discussion

Discussion of this topic stems from [Issue 619](http://code.google.com/p/soc/issues/detail?id=619).

What are preferences that users would like to see set in Melange? What does implementing these preferences look like? Please feel free to improve this page.

# Possible Preferences

**If we had preferences right now:**

  * Use a text box rather than TinyMCE as my editor
  * Do not show balloon help
  * Do not show feeds
  * Default to 100 items per page for tables
  * Show (named static document) in place of tree sidebar
  * Use (named style sheet) for look-and-feel

  * Frequency of notifications (Issue 561 (on Google Code)), e.g. abridged list.
    1. no notification
    1. one abridged notification until I log in: a single liner email with the URL to the detailed list of notification
    1. grouped notifications every 24 hours: similar to digest mode of mailing list - a concatenation of individual notifications (see below)
    1. individual e-mail notification of all events - each notification would be a plain text message with all the new information, e.g. the proposal to which a comment refers, as well as the text of the comment itself. I don't want to have to click myself through a web browser into melange to get the information that could be delivered to my inbox.
  * (if Admin) E-mails for all admin events like 'would like to be a mentor'
  * (if mentor) E-mails for all student updates and comments to proposals
  * (if mentor) E-mails for all mentor updates and comments to proposals
  * (if student) E-mails for all mentor comments

**scope of preference**

We may want finer grained notification preferences, particularly in large organizations, for example just to get notifications on students whose proposals I have tagged.  Issue 560 (on Google Code) makes the point that a single simple global preference is not sufficient.

a preference is a user-decision that is repeatedly applicable to the same scope/situation as it arises again and again. Not all student proposals are equal and so they can not be considered to be the same scope. A mentor that subscribes to updates on a particular student proposal does not imply a preference for the same subscription pattern on all other students proposals. Hence Issue 560 (on Google Code) which IMO is not a global preference, and has nothing to do with the size of an organization. It may or may not be useful to have default subscription preferences. It is more important to me to determine on a case by case basis for each proposal how I want to be subscribed. The improvement described in Issue 560 (on Google Code) is the case by case basis that IMO makes sense for every mentor in an organization with more than two proposals.


**Possible preferences in future:**
  * 