| # 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. |
| |
| """Some constants used in Monorail issue tracker pages.""" |
| from __future__ import print_function |
| from __future__ import division |
| from __future__ import absolute_import |
| |
| import re |
| |
| from mrproto 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 = [ |
| 'AllLabels', 'Attachments', 'Stars', 'Opened', 'Closed', 'Modified', |
| 'BlockedOn', 'Blocking', 'Blocked', 'MergedInto', |
| 'Reporter', 'Cc', 'Project', 'Component', |
| 'OwnerModified', 'StatusModified', 'ComponentModified', |
| 'OwnerLastVisit'] |
| |
| # 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', 'alllabels', 'gate'] |
| |
| # Suffix of a column name for an approval's approvers. |
| APPROVER_COL_SUFFIX = '-approver' |
| APPROVAL_SETTER_COL_SUFFIX = '-setter' |
| APPROVAL_SET_ON_COL_SUFFIX = '-on' |
| |
| # Reserved column name suffixes that field names cannot end with. |
| RESERVED_COL_NAME_SUFFIXES = [ |
| APPROVER_COL_SUFFIX, |
| APPROVAL_SETTER_COL_SUFFIX, |
| APPROVAL_SET_ON_COL_SUFFIX |
| ] |
| |
| # The columns are useless in the grid view, so don't offer them. |
| # These are also not used in groupby in the issue list. |
| NOT_USED_IN_GRID_AXES = [ |
| 'Summary', 'ID', 'Opened', 'Closed', 'Modified', 'Cc', |
| 'OwnerModified', 'StatusModified', 'ComponentModified', |
| 'OwnerLastVisit', 'AllLabels'] |
| |
| # 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._]+') |
| |
| # Pattern used to validate component leaf names, the parts of |
| # a component path between the ">" symbols. |
| COMPONENT_LEAF_PATTERN = '[a-zA-Z]([-_]?[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'^%s$' % (COMPONENT_LEAF_PATTERN)) |
| |
| # Pattern for matching a full component name, not just a single leaf. |
| # Allows any number of repeating valid leaf names separated by ">" characters. |
| COMPONENT_PATH_PATTERN = r'%s(\>%s)*' % ( |
| COMPONENT_LEAF_PATTERN, COMPONENT_LEAF_PATTERN) |
| |
| # Regular expression used to validate new field names. |
| FIELD_NAME_RE = re.compile(r'^[a-zA-Z]([-_]?[a-zA-Z0-9])*$') |
| |
| # Regular expression used to validate new phase_names. |
| PHASE_NAME_RE = re.compile(r'^[a-z]([-_]?[a-z0-9])*$', re.IGNORECASE) |
| |
| # 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 * 1024 |
| ISSUE_ATTACHMENTS_QUOTA_SOFT = ISSUE_ATTACHMENTS_QUOTA_HARD - 1 * 1024 * 1024 |
| |
| # 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 = 1000 |