blob: 0bf13782a5b6a2ee6e78a70362567292c7e39492 [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 API."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from endpoints import ResourceContainer
from protorpc import messages
from protorpc import message_types
from mrproto import usergroup_pb2
########################## Helper Message ##########################
class ErrorMessage(messages.Message):
"""Request error."""
code = messages.IntegerField(
1, required=True, variant=messages.Variant.INT32)
reason = messages.StringField(2, required=True)
message = messages.StringField(3, required=True)
class Status(messages.Message):
"""Issue status."""
status = messages.StringField(1, required=True)
meansOpen = messages.BooleanField(2, required=True)
description = messages.StringField(3)
class Label(messages.Message):
"""Issue label."""
label = messages.StringField(1, required=True)
description = messages.StringField(2)
class Prompt(messages.Message):
"""Default issue template values."""
name = messages.StringField(1, required=True)
title = messages.StringField(2)
description = messages.StringField(3)
titleMustBeEdited = messages.BooleanField(4)
status = messages.StringField(5)
labels = messages.StringField(6, repeated=True)
membersOnly = messages.BooleanField(7)
defaultToMember = messages.BooleanField(8)
componentRequired = messages.BooleanField(9)
class Role(messages.Enum):
"""User role."""
owner = 1
member = 2
contributor = 3
class IssueState(messages.Enum):
"""Issue state."""
closed = 0
open = 1
class CannedQuery(messages.Enum):
"""Canned query to search issues."""
all = 0
new = 1
open = 2
owned = 3
reported = 4
starred = 5
to_verify = 6
class AtomPerson(messages.Message):
"""Atomic person."""
name = messages.StringField(1, required=True)
htmlLink = messages.StringField(2)
kind = messages.StringField(3)
last_visit_days_ago = messages.IntegerField(4)
email_bouncing = messages.BooleanField(5)
vacation_message = messages.StringField(6)
class Attachment(messages.Message):
"""Issue attachment."""
attachmentId = messages.IntegerField(
1, variant=messages.Variant.INT64, required=True)
fileName = messages.StringField(2, required=True)
fileSize = messages.IntegerField(
3, required=True, variant=messages.Variant.INT32)
mimetype = messages.StringField(4, required=True)
isDeleted = messages.BooleanField(5)
class IssueRef(messages.Message):
"Issue reference."
issueId = messages.IntegerField(
1, required=True, variant=messages.Variant.INT32)
projectId = messages.StringField(2)
kind = messages.StringField(3)
class FieldValueOperator(messages.Enum):
"""Operator of field values."""
add = 1
remove = 2
clear = 3
class FieldValue(messages.Message):
"""Custom field values."""
fieldName = messages.StringField(1, required=True)
fieldValue = messages.StringField(2)
derived = messages.BooleanField(3, default=False)
operator = messages.EnumField(FieldValueOperator, 4, default='add')
phaseName = messages.StringField(5)
approvalName = messages.StringField(6)
class Update(messages.Message):
"""Issue update."""
summary = messages.StringField(1)
status = messages.StringField(2)
owner = messages.StringField(3)
labels = messages.StringField(4, repeated=True)
cc = messages.StringField(5, repeated=True)
blockedOn = messages.StringField(6, repeated=True)
blocking = messages.StringField(7, repeated=True)
mergedInto = messages.StringField(8)
kind = messages.StringField(9)
components = messages.StringField(10, repeated=True)
moveToProject = messages.StringField(11)
fieldValues = messages.MessageField(FieldValue, 12, repeated=True)
is_description = messages.BooleanField(13)
class ApprovalUpdate(messages.Message):
"""Approval update."""
approvers = messages.StringField(1, repeated=True)
status = messages.StringField(2)
kind = messages.StringField(3)
fieldValues = messages.MessageField(FieldValue, 4, repeated=True)
class ProjectIssueConfig(messages.Message):
"""Issue configuration of project."""
kind = messages.StringField(1)
restrictToKnown = messages.BooleanField(2)
defaultColumns = messages.StringField(3, repeated=True)
defaultSorting = messages.StringField(4, repeated=True)
statuses = messages.MessageField(Status, 5, repeated=True)
labels = messages.MessageField(Label, 6, repeated=True)
prompts = messages.MessageField(Prompt, 7, repeated=True)
defaultPromptForMembers = messages.IntegerField(
8, variant=messages.Variant.INT32)
defaultPromptForNonMembers = messages.IntegerField(
9, variant=messages.Variant.INT32)
usersCanSetLabels = messages.BooleanField(10)
class Phase(messages.Message):
"""Issue phase details."""
phaseName = messages.StringField(1)
rank = messages.IntegerField(2)
class IssueCommentWrapper(messages.Message):
"""Issue comment details."""
attachments = messages.MessageField(Attachment, 1, repeated=True)
author = messages.MessageField(AtomPerson, 2)
canDelete = messages.BooleanField(3)
content = messages.StringField(4)
deletedBy = messages.MessageField(AtomPerson, 5)
id = messages.IntegerField(6, variant=messages.Variant.INT32)
published = message_types.DateTimeField(7)
updates = messages.MessageField(Update, 8)
kind = messages.StringField(9)
is_description = messages.BooleanField(10)
class ApprovalCommentWrapper(messages.Message):
"""Approval comment details."""
attachments = messages.MessageField(Attachment, 1, repeated=True)
author = messages.MessageField(AtomPerson, 2)
canDelete = messages.BooleanField(3)
content = messages.StringField(4)
deletedBy = messages.MessageField(AtomPerson, 5)
id = messages.IntegerField(6, variant=messages.Variant.INT32)
published = message_types.DateTimeField(7)
approvalUpdates = messages.MessageField(ApprovalUpdate, 8)
kind = messages.StringField(9)
is_description = messages.BooleanField(10)
class ApprovalStatus(messages.Enum):
"""Allowed Approval Statuses."""
needsReview = 1
nA = 2
reviewRequested = 3
reviewStarted = 4
needInfo = 5
approved = 6
notApproved = 7
notSet = 8
class Approval(messages.Message):
"""Approval Value details"""
approvalName = messages.StringField(1)
approvers = messages.MessageField(AtomPerson, 2, repeated=True)
status = messages.EnumField(ApprovalStatus, 3)
setter = messages.MessageField(AtomPerson, 4)
setOn = message_types.DateTimeField(5)
phaseName = messages.StringField(6)
class IssueWrapper(messages.Message):
"""Issue details."""
author = messages.MessageField(AtomPerson, 1)
blockedOn = messages.MessageField(IssueRef, 2, repeated=True)
blocking = messages.MessageField(IssueRef, 3, repeated=True)
canComment = messages.BooleanField(4)
canEdit = messages.BooleanField(5)
cc = messages.MessageField(AtomPerson, 6, repeated=True)
closed = message_types.DateTimeField(7)
description = messages.StringField(8)
id = messages.IntegerField(9, variant=messages.Variant.INT32)
kind = messages.StringField(10)
labels = messages.StringField(11, repeated=True)
owner = messages.MessageField(AtomPerson, 12)
published = message_types.DateTimeField(13)
starred = messages.BooleanField(14)
stars = messages.IntegerField(15, variant=messages.Variant.INT32)
state = messages.EnumField(IssueState, 16)
status = messages.StringField(17, required=True)
summary = messages.StringField(18, required=True)
title = messages.StringField(19)
updated = message_types.DateTimeField(20)
components = messages.StringField(21, repeated=True)
projectId = messages.StringField(22, required=True)
mergedInto = messages.MessageField(IssueRef, 23)
fieldValues = messages.MessageField(FieldValue, 24, repeated=True)
owner_modified = message_types.DateTimeField(25)
status_modified = message_types.DateTimeField(26)
component_modified = message_types.DateTimeField(27)
approvalValues = messages.MessageField(Approval, 28, repeated=True)
phases = messages.MessageField(Phase, 29, repeated=True)
migrated_id = messages.StringField(30)
class ProjectWrapper(messages.Message):
"""Project details."""
kind = messages.StringField(1)
name = messages.StringField(2)
externalId = messages.StringField(3, required=True)
htmlLink = messages.StringField(4, required=True)
summary = messages.StringField(5)
description = messages.StringField(6)
versionControlSystem = messages.StringField(7)
repositoryUrls = messages.StringField(8, repeated=True)
issuesConfig = messages.MessageField(ProjectIssueConfig, 9)
role = messages.EnumField(Role, 10)
members = messages.MessageField(AtomPerson, 11, repeated=True)
class UserGroupSettingsWrapper(messages.Message):
"""User group settings."""
groupName = messages.StringField(1, required=True)
who_can_view_members = messages.EnumField(
usergroup_pb2.MemberVisibility, 2,
default=usergroup_pb2.MemberVisibility.MEMBERS)
ext_group_type = messages.EnumField(usergroup_pb2.GroupType, 3)
last_sync_time = messages.IntegerField(
4, default=0, variant=messages.Variant.INT32)
class GroupCitizens(messages.Message):
"""Group members and owners."""
groupOwners = messages.StringField(1, repeated=True)
groupMembers = messages.StringField(2, repeated=True)
########################## Comments Message ##########################
# pylint: disable=pointless-string-statement
"""Request to delete/undelete an issue's comments."""
ISSUES_COMMENTS_DELETE_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
projectId=messages.StringField(1, required=True),
issueId=messages.IntegerField(
2, required=True, variant=messages.Variant.INT32),
commentId=messages.IntegerField(
3, required=True, variant=messages.Variant.INT32)
)
class IssuesCommentsDeleteResponse(messages.Message):
"""Response message of request to delete/undelete an issue's comments."""
error = messages.MessageField(ErrorMessage, 1)
"""Request to insert an issue's comments."""
ISSUES_COMMENTS_INSERT_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
IssueCommentWrapper,
projectId=messages.StringField(1, required=True),
issueId=messages.IntegerField(
2, required=True, variant=messages.Variant.INT32),
sendEmail=messages.BooleanField(3)
)
class IssuesCommentsInsertResponse(messages.Message):
"""Response message of request to insert an issue's comments."""
error = messages.MessageField(ErrorMessage, 1)
id = messages.IntegerField(2, variant=messages.Variant.INT32)
kind = messages.StringField(3)
author = messages.MessageField(AtomPerson, 4)
content = messages.StringField(5)
published = message_types.DateTimeField(6)
updates = messages.MessageField(Update, 7)
canDelete = messages.BooleanField(8)
"""Request to list an issue's comments."""
ISSUES_COMMENTS_LIST_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
projectId=messages.StringField(1, required=True),
issueId=messages.IntegerField(
2, required=True, variant=messages.Variant.INT32),
maxResults=messages.IntegerField(
3, default=100, variant=messages.Variant.INT32),
startIndex=messages.IntegerField(
4, default=0, variant=messages.Variant.INT32)
)
class IssuesCommentsListResponse(messages.Message):
"""Response message of request to list an issue's comments."""
error = messages.MessageField(ErrorMessage, 1)
items = messages.MessageField(IssueCommentWrapper, 2, repeated=True)
totalResults = messages.IntegerField(3, variant=messages.Variant.INT32)
kind = messages.StringField(4)
########################## ApprovalComments Message ################
"""Request to insert an issue approval's comments."""
APPROVALS_COMMENTS_INSERT_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
ApprovalCommentWrapper,
projectId=messages.StringField(1, required=True),
issueId=messages.IntegerField(
2, required=True, variant=messages.Variant.INT32),
approvalName=messages.StringField(3, required=True),
sendEmail=messages.BooleanField(4)
)
class ApprovalsCommentsInsertResponse(messages.Message):
"""Response message of request to insert an isuse's comments."""
error = messages.MessageField(ErrorMessage, 1)
id = messages.IntegerField(2, variant=messages.Variant.INT32)
kind = messages.StringField(3)
author = messages.MessageField(AtomPerson, 4)
content = messages.StringField(5)
published = message_types.DateTimeField(6)
approvalUpdates = messages.MessageField(ApprovalUpdate, 7)
canDelete = messages.BooleanField(8)
approvalName = messages.StringField(9)
"""Requests to list an approval's comments."""
APPROVALS_COMMENTS_LIST_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
projectId=messages.StringField(1, required=True),
issueId=messages.IntegerField(
2, required=True, variant=messages.Variant.INT32),
approvalName=messages.StringField(3, required=True),
maxResults=messages.IntegerField(
4, default=100, variant=messages.Variant.INT32),
startIndex=messages.IntegerField(
5, default=0, variant=messages.Variant.INT32)
)
class ApprovalsCommentsListResponse(messages.Message):
"""Response message of request to list an approval's comments."""
error = messages.MessageField(ErrorMessage, 1)
items = messages.MessageField(ApprovalCommentWrapper, 2, repeated=True)
totalResults = messages.IntegerField(3, variant=messages.Variant.INT32)
kind = messages.StringField(4)
########################## Users Message ##########################
"""Request to get a user."""
USERS_GET_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
userId=messages.StringField(1, required=True),
ownerProjectsOnly=messages.BooleanField(2, default=False)
)
class UsersGetResponse(messages.Message):
"""Response message of request to get a user."""
error = messages.MessageField(ErrorMessage, 1)
id = messages.StringField(2)
kind = messages.StringField(3)
projects = messages.MessageField(ProjectWrapper, 4, repeated=True)
########################## Issues Message ##########################
"""Request to get an issue."""
ISSUES_GET_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
projectId=messages.StringField(1, required=True),
issueId=messages.IntegerField(
2, required=True, variant=messages.Variant.INT32)
)
"""Request to insert an issue."""
ISSUES_INSERT_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
IssueWrapper,
projectId=messages.StringField(1, required=True),
sendEmail=messages.BooleanField(2, default=True)
)
class IssuesGetInsertResponse(messages.Message):
"""Response message of request to get/insert an issue."""
error = messages.MessageField(ErrorMessage, 1)
kind = messages.StringField(2)
id = messages.IntegerField(3, variant=messages.Variant.INT32)
title = messages.StringField(4)
summary = messages.StringField(5)
stars = messages.IntegerField(6, variant=messages.Variant.INT32)
starred = messages.BooleanField(7)
status = messages.StringField(8)
state = messages.EnumField(IssueState, 9)
labels = messages.StringField(10, repeated=True)
author = messages.MessageField(AtomPerson, 11)
owner = messages.MessageField(AtomPerson, 12)
cc = messages.MessageField(AtomPerson, 13, repeated=True)
updated = message_types.DateTimeField(14)
published = message_types.DateTimeField(15)
closed = message_types.DateTimeField(16)
blockedOn = messages.MessageField(IssueRef, 17, repeated=True)
blocking = messages.MessageField(IssueRef, 18, repeated=True)
projectId = messages.StringField(19)
canComment = messages.BooleanField(20)
canEdit = messages.BooleanField(21)
components = messages.StringField(22, repeated=True)
mergedInto = messages.MessageField(IssueRef, 23)
fieldValues = messages.MessageField(FieldValue, 24, repeated=True)
owner_modified = message_types.DateTimeField(25)
status_modified = message_types.DateTimeField(26)
component_modified = message_types.DateTimeField(27)
approvalValues = messages.MessageField(Approval, 28, repeated=True)
phases = messages.MessageField(Phase, 29, repeated=True)
migrated_id = messages.StringField(30)
"""Request to list issues."""
ISSUES_LIST_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
projectId=messages.StringField(1, required=True),
additionalProject=messages.StringField(2, repeated=True),
can=messages.EnumField(CannedQuery, 3, default='all'),
label=messages.StringField(4),
maxResults=messages.IntegerField(
5, default=100, variant=messages.Variant.INT32),
owner=messages.StringField(6),
publishedMax=messages.IntegerField(7, variant=messages.Variant.INT64),
publishedMin=messages.IntegerField(8, variant=messages.Variant.INT64),
q=messages.StringField(9),
sort=messages.StringField(10),
startIndex=messages.IntegerField(
11, default=0, variant=messages.Variant.INT32),
status=messages.StringField(12),
updatedMax=messages.IntegerField(13, variant=messages.Variant.INT64),
updatedMin=messages.IntegerField(14, variant=messages.Variant.INT64)
)
class IssuesListResponse(messages.Message):
"""Response message of request to list issues."""
error = messages.MessageField(ErrorMessage, 1)
items = messages.MessageField(IssueWrapper, 2, repeated=True)
totalResults = messages.IntegerField(3, variant=messages.Variant.INT32)
kind = messages.StringField(4)
"""Request to list group settings."""
GROUPS_SETTINGS_LIST_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
importedGroupsOnly=messages.BooleanField(1, default=False)
)
class GroupsSettingsListResponse(messages.Message):
"""Response message of request to list group settings."""
error = messages.MessageField(ErrorMessage, 1)
groupSettings = messages.MessageField(
UserGroupSettingsWrapper, 2, repeated=True)
"""Request to create a group."""
GROUPS_CREATE_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
groupName = messages.StringField(1, required=True),
who_can_view_members = messages.EnumField(
usergroup_pb2.MemberVisibility, 2,
default=usergroup_pb2.MemberVisibility.MEMBERS, required=True),
ext_group_type = messages.EnumField(usergroup_pb2.GroupType, 3)
)
class GroupsCreateResponse(messages.Message):
"""Response message of request to create a group."""
error = messages.MessageField(ErrorMessage, 1)
groupID = messages.IntegerField(
2, variant=messages.Variant.INT32)
"""Request to get a group."""
GROUPS_GET_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
groupName = messages.StringField(1, required=True)
)
class GroupsGetResponse(messages.Message):
"""Response message of request to create a group."""
error = messages.MessageField(ErrorMessage, 1)
groupID = messages.IntegerField(
2, variant=messages.Variant.INT32)
groupSettings = messages.MessageField(
UserGroupSettingsWrapper, 3)
groupOwners = messages.StringField(4, repeated=True)
groupMembers = messages.StringField(5, repeated=True)
"""Request to update a group."""
GROUPS_UPDATE_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
GroupCitizens,
groupName = messages.StringField(1, required=True),
who_can_view_members = messages.EnumField(
usergroup_pb2.MemberVisibility, 2),
ext_group_type = messages.EnumField(usergroup_pb2.GroupType, 3),
last_sync_time = messages.IntegerField(
4, default=0, variant=messages.Variant.INT32),
friend_projects = messages.StringField(5, repeated=True),
)
class GroupsUpdateResponse(messages.Message):
"""Response message of request to update a group."""
error = messages.MessageField(ErrorMessage, 1)
########################## Component Message ##########################
class Component(messages.Message):
"""Component PB."""
componentId = messages.IntegerField(
1, required=True, variant=messages.Variant.INT32)
projectName = messages.StringField(2, required=True)
componentPath = messages.StringField(3, required=True)
description = messages.StringField(4)
admin = messages.StringField(5, repeated=True)
cc = messages.StringField(6, repeated=True)
deprecated = messages.BooleanField(7, default=False)
created = message_types.DateTimeField(8)
creator = messages.StringField(9)
modified = message_types.DateTimeField(10)
modifier = messages.StringField(11)
"""Request to get components of a project."""
COMPONENTS_LIST_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
projectId=messages.StringField(1, required=True),
)
class ComponentsListResponse(messages.Message):
"""Response to list components."""
components = messages.MessageField(
Component, 1, repeated=True)
class ComponentCreateRequestBody(messages.Message):
"""Request body to create a component."""
parentPath = messages.StringField(1)
description = messages.StringField(2)
admin = messages.StringField(3, repeated=True)
cc = messages.StringField(4, repeated=True)
deprecated = messages.BooleanField(5, default=False)
"""Request to create component of a project."""
COMPONENTS_CREATE_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
ComponentCreateRequestBody,
projectId=messages.StringField(1, required=True),
componentName=messages.StringField(2, required=True),
)
"""Request to delete a component."""
COMPONENTS_DELETE_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
message_types.VoidMessage,
projectId=messages.StringField(1, required=True),
componentPath=messages.StringField(2, required=True),
)
class ComponentUpdateFieldID(messages.Enum):
"""Possible fields that can be updated in a component."""
LEAF_NAME = 1
DESCRIPTION = 2
ADMIN = 3
CC = 4
DEPRECATED = 5
class ComponentUpdate(messages.Message):
"""Component update."""
# 'field' allows a field to be cleared
field = messages.EnumField(ComponentUpdateFieldID, 1, required=True)
leafName = messages.StringField(2)
description = messages.StringField(3)
admin = messages.StringField(4, repeated=True)
cc = messages.StringField(5, repeated=True)
deprecated = messages.BooleanField(6)
class ComponentUpdateRequestBody(messages.Message):
"""Request body to update a component."""
updates = messages.MessageField(ComponentUpdate, 1, repeated=True)
"""Request to update a component."""
COMPONENTS_UPDATE_REQUEST_RESOURCE_CONTAINER = ResourceContainer(
ComponentUpdateRequestBody,
projectId=messages.StringField(1, required=True),
componentPath=messages.StringField(2, required=True),
)