blob: de1aa6ee7a96916b47415a9995d7b836a81c2a9b [file] [log] [blame]
# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Protocol buffers for Monorail users."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from protorpc import messages
class IssueUpdateNav(messages.Enum):
"""Pref for where a project member goes after an issue update."""
UP_TO_LIST = 0 # Back to issue list or grid view.
STAY_SAME_ISSUE = 1 # Show the same issue with the update.
NEXT_IN_LIST = 2 # Triage mode: go to next issue, if any.
class User(messages.Message):
"""In-memory busines object for representing users."""
user_id = messages.IntegerField(1) # TODO(jrobbins): make it required.
# Is this user a site administer?
is_site_admin = messages.BooleanField(4, required=True, default=False)
# User notification preferences. These preferences describe when
# a user is sent a email notification after an issue has changed.
# The user is notified if either of the following is true:
# 1. notify_issue_change is True and the user is named in the
# issue's Owner or CC field.
# 2. notify_starred_issue_change is True and the user has starred
# the issue.
notify_issue_change = messages.BooleanField(5, default=True)
notify_starred_issue_change = messages.BooleanField(6, default=True)
# Opt-in to email subject lines like "proj:123: issue summary".
email_compact_subject = messages.BooleanField(14, default=False)
# Opt-out of "View Issue" button in Gmail inbox.
email_view_widget = messages.BooleanField(15, default=True)
# Opt-in to ping emails from issues that the user starred.
notify_starred_ping = messages.BooleanField(16, default=False)
# This user has been banned, and this string describes why. All access
# to Monorail pages should be disabled.
banned = messages.StringField(7, default='')
# Fields 8-13 are no longer used: they were User action counts and limits.
after_issue_update = messages.EnumField(
IssueUpdateNav, 29, default=IssueUpdateNav.STAY_SAME_ISSUE)
# Should we obfuscate the user's email address and require solving a captcha
# to reveal it entirely? The default value corresponds to requiring users to
# opt into publishing their identities, but our code ensures that the
# opposite takes place for Gmail accounts.
obscure_email = messages.BooleanField(26, default=True)
# The email address chosen by the user to reveal on the site.
email = messages.StringField(27)
# Sticky state for show/hide widget on people details page.
keep_people_perms_open = messages.BooleanField(33, default=False)
deleted = messages.BooleanField(39, default=False)
deleted_timestamp = messages.IntegerField(40, default=0)
preview_on_hover = messages.BooleanField(42, default=True)
last_visit_timestamp = messages.IntegerField(45, default=0)
email_bounce_timestamp = messages.IntegerField(46, default=0)
vacation_message = messages.StringField(47)
linked_parent_id = messages.IntegerField(48)
linked_child_ids = messages.IntegerField(49, repeated=True)
class UserPrefValue(messages.Message):
"""Holds a single non-default user pref."""
name = messages.StringField(1, required=True)
value = messages.StringField(2)
class UserPrefs(messages.Message):
"""In-memory business object for representing user preferences."""
user_id = messages.IntegerField(1, required=True)
prefs = messages.MessageField(UserPrefValue, 2, repeated=True)
def MakeUser(user_id, email=None, obscure_email=False):
"""Create and return a new user record in RAM."""
user = User(user_id=user_id, obscure_email=bool(obscure_email))
if email:
user.email = email
return user