Index: appengine/monorail/tracker/tracker_constants.py |
diff --git a/appengine/monorail/tracker/tracker_constants.py b/appengine/monorail/tracker/tracker_constants.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2cfa58389863db1ee7c23931327830eb4a56caad |
--- /dev/null |
+++ b/appengine/monorail/tracker/tracker_constants.py |
@@ -0,0 +1,222 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is govered by a BSD-style |
+# license that can be found in the LICENSE file or at |
+# https://developers.google.com/open-source/licenses/bsd |
+ |
+"""Some constants used in Monorail issue tracker pages.""" |
+ |
+import re |
+ |
+from proto import user_pb2 |
+ |
+ |
+# Default columns shown on issue list page, and other built-in cols. |
+DEFAULT_COL_SPEC = 'ID Type Status Priority Milestone Owner Summary' |
+OTHER_BUILT_IN_COLS = ['Attachments', 'Stars', 'Opened', 'Closed', 'Modified', |
+ 'BlockedOn', 'Blocking', 'Blocked', 'MergedInto', |
+ 'Reporter', 'Cc', 'Project', 'Component'] |
+ |
+# These are label prefixes that would conflict with built-in column names. |
+# E.g., no issue should have a *label* id-1234 or status-foo because any |
+# search for "id:1234" or "status:foo" would not look at labels. |
+RESERVED_PREFIXES = [ |
+ 'id', 'project', 'reporter', 'summary', 'status', 'owner', 'cc', |
+ 'attachments', 'attachment', 'component', 'opened', 'closed', |
+ 'modified', 'is', 'has', 'blockedon', 'blocking', 'blocked', 'mergedinto', |
+ 'stars', 'starredby', 'description', 'comment', 'commentby', 'label', |
+ 'hotlist', 'rank', 'explicit_status', 'derived_status', 'explicit_owner', |
+ 'derived_owner', 'explicit_cc', 'derived_cc', 'explicit_label', |
+ 'derived_label', 'last_comment_by', 'exact_component', |
+ 'explicit_component', 'derived_component'] |
+ |
+# These columns are sorted as user names. |
+USERNAME_COLS = ['owner', 'reporter', 'cc'] |
+ |
+# The columns are useless in the grid view, so don't offer them. |
+NOT_USED_IN_GRID_AXES = ['Summary', 'ID', 'Opened', 'Closed', 'Modified'] |
+ |
+# Issues per page in the issue list |
+DEFAULT_RESULTS_PER_PAGE = 100 |
+ |
+# Search field input indicating that the user wants to |
+# jump to the specified issue. |
+JUMP_RE = re.compile(r'^\d+$') |
+ |
+# Regular expression defining a single search term. |
+# Used when parsing the contents of the issue search field. |
+TERM_RE = re.compile(r'[-a-zA-Z0-9._]+') |
+ |
+# Regular expression used to validate new component leaf names. |
+# This should never match any string with a ">" in it. |
+COMPONENT_NAME_RE = re.compile(r'^[a-zA-Z]([-_]?[a-zA-Z0-9])+$') |
+ |
+# Regular expression used to validate new field names. |
+FIELD_NAME_RE = re.compile(r'^[a-zA-Z]([-_]?[a-zA-Z0-9])*$') |
+ |
+# The next few items are specifications of the defaults for project |
+# issue configurations. These are used for projects that do not have |
+# their own config. |
+DEFAULT_CANNED_QUERIES = [ |
+ # Query ID, Name, Base query ID (not used for built-in queries), conditions |
+ (1, 'All issues', 0, ''), |
+ (2, 'Open issues', 0, 'is:open'), |
+ (3, 'Open and owned by me', 0, 'is:open owner:me'), |
+ (4, 'Open and reported by me', 0, 'is:open reporter:me'), |
+ (5, 'Open and starred by me', 0, 'is:open is:starred'), |
+ (6, 'New issues', 0, 'status:new'), |
+ (7, 'Issues to verify', 0, 'status=fixed,done'), |
+ (8, 'Open with comment by me', 0, 'is:open commentby:me'), |
+ ] |
+ |
+DEFAULT_CANNED_QUERY_CONDS = { |
+ query_id: cond |
+ for (query_id, _name, _base, cond) in DEFAULT_CANNED_QUERIES} |
+ |
+ALL_ISSUES_CAN = 1 |
+OPEN_ISSUES_CAN = 2 |
+ |
+# Define well-known issue statuses. Each status has 3 parts: a name, a |
+# description, and True if the status means that an issue should be |
+# considered to be open or False if it should be considered closed. |
+DEFAULT_WELL_KNOWN_STATUSES = [ |
+ # Name, docstring, means_open, deprecated |
+ ('New', 'Issue has not had initial review yet', True, False), |
+ ('Accepted', 'Problem reproduced / Need acknowledged', True, False), |
+ ('Started', 'Work on this issue has begun', True, False), |
+ ('Fixed', 'Developer made source code changes, QA should verify', False, |
+ False), |
+ ('Verified', 'QA has verified that the fix worked', False, False), |
+ ('Invalid', 'This was not a valid issue report', False, False), |
+ ('Duplicate', 'This report duplicates an existing issue', False, False), |
+ ('WontFix', 'We decided to not take action on this issue', False, False), |
+ ('Done', 'The requested non-coding task was completed', False, False), |
+ ] |
+ |
+DEFAULT_WELL_KNOWN_LABELS = [ |
+ # Name, docstring, deprecated |
+ ('Type-Defect', 'Report of a software defect', False), |
+ ('Type-Enhancement', 'Request for enhancement', False), |
+ ('Type-Task', 'Work item that doesn\'t change the code or docs', False), |
+ ('Type-Other', 'Some other kind of issue', False), |
+ ('Priority-Critical', 'Must resolve in the specified milestone', False), |
+ ('Priority-High', 'Strongly want to resolve in the specified milestone', |
+ False), |
+ ('Priority-Medium', 'Normal priority', False), |
+ ('Priority-Low', 'Might slip to later milestone', False), |
+ ('OpSys-All', 'Affects all operating systems', False), |
+ ('OpSys-Windows', 'Affects Windows users', False), |
+ ('OpSys-Linux', 'Affects Linux users', False), |
+ ('OpSys-OSX', 'Affects Mac OS X users', False), |
+ ('Milestone-Release1.0', 'All essential functionality working', False), |
+ ('Security', 'Security risk to users', False), |
+ ('Performance', 'Performance issue', False), |
+ ('Usability', 'Affects program usability', False), |
+ ('Maintainability', 'Hinders future changes', False), |
+ ] |
+ |
+# Exclusive label prefixes are ones that can only be used once per issue. |
+# For example, an issue would normally have only one Priority-* label, whereas |
+# an issue might have many OpSys-* labels. |
+DEFAULT_EXCL_LABEL_PREFIXES = ['Type', 'Priority', 'Milestone'] |
+ |
+DEFAULT_USER_DEFECT_REPORT_TEMPLATE = { |
+ 'name': 'Defect report from user', |
+ 'summary': 'Enter one-line summary', |
+ 'summary_must_be_edited': True, |
+ 'content': ( |
+ 'What steps will reproduce the problem?\n' |
+ '1. \n' |
+ '2. \n' |
+ '3. \n' |
+ '\n' |
+ 'What is the expected output?\n' |
+ '\n' |
+ '\n' |
+ 'What do you see instead?\n' |
+ '\n' |
+ '\n' |
+ 'What version of the product are you using? ' |
+ 'On what operating system?\n' |
+ '\n' |
+ '\n' |
+ 'Please provide any additional information below.\n'), |
+ 'status': 'New', |
+ 'labels': ['Type-Defect', 'Priority-Medium'], |
+ } |
+ |
+DEFAULT_DEVELOPER_DEFECT_REPORT_TEMPLATE = { |
+ 'name': 'Defect report from developer', |
+ 'summary': 'Enter one-line summary', |
+ 'summary_must_be_edited': True, |
+ 'content': ( |
+ 'What steps will reproduce the problem?\n' |
+ '1. \n' |
+ '2. \n' |
+ '3. \n' |
+ '\n' |
+ 'What is the expected output?\n' |
+ '\n' |
+ '\n' |
+ 'What do you see instead?\n' |
+ '\n' |
+ '\n' |
+ 'Please use labels and text to provide additional information.\n'), |
+ 'status': 'Accepted', |
+ 'labels': ['Type-Defect', 'Priority-Medium'], |
+ 'members_only': True, |
+ } |
+ |
+ |
+DEFAULT_TEMPLATES = [ |
+ DEFAULT_DEVELOPER_DEFECT_REPORT_TEMPLATE, |
+ DEFAULT_USER_DEFECT_REPORT_TEMPLATE, |
+ ] |
+ |
+DEFAULT_STATUSES_OFFER_MERGE = ['Duplicate'] |
+ |
+ |
+# This is used by JS on the issue admin page to indicate that the user deleted |
+# this template, so it should not be considered when updating the project's |
+# issue config. |
+DELETED_TEMPLATE_NAME = '<DELETED>' |
+ |
+ |
+# This is the default maximum total bytes of files attached |
+# to all the issues in a project. |
+ISSUE_ATTACHMENTS_QUOTA_HARD = 50 * 1024 * 1024L |
+ISSUE_ATTACHMENTS_QUOTA_SOFT = ISSUE_ATTACHMENTS_QUOTA_HARD - 1 * 1024 * 1024L |
+ |
+# Default value for nav action after updating an issue. |
+DEFAULT_AFTER_ISSUE_UPDATE = user_pb2.IssueUpdateNav.STAY_SAME_ISSUE |
+ |
+# Maximum comment length to mitigate spammy comments |
+MAX_COMMENT_CHARS = 50 * 1024 |
+MAX_SUMMARY_CHARS = 500 |
+ |
+SHORT_SUMMARY_LENGTH = 45 |
+ |
+# Number of recent commands to offer the user on the quick edit form. |
+MAX_RECENT_COMMANDS = 5 |
+ |
+# These recent commands are shown if the user has no history of their own. |
+DEFAULT_RECENT_COMMANDS = [ |
+ ('owner=me status=Accepted', "I'll handle this one."), |
+ ('owner=me Priority=High status=Accepted', "I'll look into it soon."), |
+ ('status=Fixed', 'The change for this is done now.'), |
+ ('Type=Enhancement', 'This is an enhancement, not a defect.'), |
+ ('status=Invalid', 'Please report this in a more appropriate place.'), |
+ ] |
+ |
+# Consider an issue to be a "noisy" issue if it has more than these: |
+NOISY_ISSUE_COMMENT_COUNT = 100 |
+NOISY_ISSUE_STARRER_COUNT = 100 |
+ |
+# After a project owner edits the filter rules, we recompute the |
+# derived field values in work items that each handle a chunk of |
+# of this many items. |
+RECOMPUTE_DERIVED_FIELDS_BLOCK_SIZE = 1000 |
+ |
+# This is the number of issues listed in the ReindexQueue table that will |
+# be processed each minute. |
+MAX_ISSUES_TO_REINDEX_PER_MINUTE = 500 |
+ |