• Get Review Board
  • What's New
  • Products
  • Review Board Code review, image review, and document review
  • Documentation
  • Release Notes
  • Power Pack Enterprise integrations, reports, and enhanced document review
  • Try for 60 Days
  • Purchase
  • RBCommons Review Board as a Service, hosted by us
  • Pricing
  • RBTools Command line tools and Python API for Review Board
  • Documentation
  • Release Notes
  • Review Bot Automated code review, connecting tools you already use
  • Documentation
  • Release Notes
  • RB Gateway Manage Git and Mercurial repositories in your network
  • Documentation
  • Release Notes
  • Learn and Explore
  • What is Code Review?
  • Documentation
  • Frequently Asked Questions
  • Support Options
  • Third-Party Integrations
  • Demo
  • Review Board RBTools Power Pack Review Bot Djblets RB Gateway
    1. Review Board 8.x
    2. Version 8.x
    3. Version 7.x
    4. Version 6.x
    5. Version 5.0
    6. Version 4.0
    7. Version 3.0
    8. Version 2.5
    9. Version 2.0
    10. Version 1.7
    11. Version 1.6
    12. Version 1.5
    13. Version 1.0
    14. Extending Review Board
    15. Customizing Review Request Conditions
  • Home
  • Users Guide
  • Getting Started
  • Introduction
  • What is Code Review?
  • Review Board Workflows
  • Account Settings
  • Dashboard
  • Working with Review Requests
  • Overview
  • Creating Review Requests
  • Editing Fields
  • Uploading Diffs
  • Uploading File Attachments
  • Publishing Review Requests
  • Closing Review Requests
  • Reviewing
  • Reviews and Comments
  • The Review Banner
  • Managing and Publishing Drafts
  • Issue Tracking
  • Reviewing Code (Diffs)
  • Reviewing File Attachments
  • Reviewing Images
  • Reviewing Markdown Files
  • Reviewing Text Files
  • Creating and Editing Reviews
  • Approving Changes (Ship It!)
  • Replying to Comments
  • Automated Code Reviews
  • Searching
  • Quick Search
  • Full-Text Search
  • Using Markdown
  • Administration Guide
  • Installation
  • Installing Review Board
  • Linux System Compatibility
  • Installing with Docker
  • Manually Installing on Linux
  • Installing on macOS
  • Installing on Windows
  • Installing Development Releases
  • Creating a Review Board Site
  • Choosing a Review Board Plan
  • Upgrading
  • Upgrading Review Board
  • Upgrading Review Board Sites
  • Optimization
  • Optimizing and Scaling Review Board
  • Administration UI
  • Overview of the Administration UI
  • Administrator Dashboard
  • Database Management
  • Configuration
  • Site Settings
  • General Settings
  • Authentication Settings
  • Avatar Services Settings
  • E-Mail Settings
  • Review Workflow Settings
  • Diff Viewer Settings
  • Logging Settings
  • SSH Settings
  • File Storage Settings
  • User Privacy Settings
  • Search Settings
  • Document Review Settings
  • Access Control
  • Working with E-Mail
  • Default Reviewers
  • Permission Groups
  • Repositories
  • Azure DevOps Server / Team Foundation Server Repositories
  • Bazaar Repositories
  • CVS Repositories
  • Git Repositories
  • HCL ClearCase and IBM ClearCase
  • Mercurial Repositories
  • Perforce Repositories
  • Review Board Gateway Repositories
  • Subversion Repositories
  • Assembla Repositories
  • AWS CodeCommit Repositories
  • Azure DevOps Services Repositories
  • Beanstalk Repositories
  • Bitbucket Repositories
  • Bitbucket Data Center Repositories
  • Codebase HQ Repositories
  • Fedora Hosted Repositories
  • Forgejo Repositories
  • Gerrit Repositories
  • GitHub Repositories
  • GitHub Enterprise Repositories
  • GitLab Repositories
  • Gitorious Repositories
  • Keysight SOS Repositories
  • SourceForge Repositories
  • Unfuddle STACK Repositories
  • Review Groups
  • Managing SSL/TLS Certificates and CA Bundles
  • User Roles
  • Users
  • WebHooks
  • Extensions
  • Integrations
  • Asana Integration
  • CircleCI Integration
  • Discord Integration
  • GitLab CI/CD Integration
  • I Done This Integration
  • Jenkins CI Integration
  • Matrix Integration
  • Mattermost Integration
  • Microsoft Teams Integration
  • Slack Integration
  • Travis CI Integration
  • Trello Integration
  • Site Maintenance
  • The rb-site Tool
  • Advanced Management Commands
  • Monitoring Review Board
  • Health Checks
  • Web API Guide
  • Resource Tree
  • Resources
  • Root List Resource
  • Default Reviewer List Resource
  • Default Reviewer Resource
  • Extension List Resource
  • Extension Resource
  • Hosting Service Account List Resource
  • Hosting Service Account Resource
  • Remote Repository List Resource
  • Hosting Service List Resource
  • Hosting Service Resource
  • OAuth2 Applications List Resource
  • OAuth2 Applications Resource
  • OAuth2 Tokens List Resource
  • OAuth2 Tokens Resource
  • Repository List Resource
  • Repository Resource
  • Diff File Attachment List Resource
  • Repository Branches Resource
  • Repository Commits Resource
  • Repository Group List Resource
  • Repository Info Resource
  • Repository User List Resource
  • Review Group List Resource
  • Review Group Resource
  • Review Group User List Resource
  • Review Request List Resource
  • Review Request Resource
  • Change List Resource
  • Diff Context Resource
  • Diff List Resource
  • File Attachment List Resource
  • Review List Resource
  • Review Request Draft Resource
  • Review Request Last Update Resource
  • Screenshot List Resource
  • Status Update List Resource
  • Root Diff Comment List Resource
  • Root File Attachment Comment List Resource
  • Root General Comment List Resource
  • Root Review List Resource
  • Search Resource
  • Server Info Resource
  • Session Resource
  • User List Resource
  • User Resource
  • API Token List Resource
  • Archived Review Request List Resource
  • Muted Review Request List Resource
  • User File Attachment List Resource
  • Watched List Resource
  • Validation List Resource
  • Validate Diff List Resource
  • Validate Diff Commit List Resource
  • WebHook List Resource
  • WebHook Resource
  • Server Info Resource
  • Default Reviewer List Resource
  • Default Reviewer Resource
  • Default Reviewer Resource
  • Diff Context Resource
  • Diff List Resource
  • Diff Resource
  • Diff Commit List Resource
  • Diff Commit Resource
  • File Diff List Resource
  • File Diff Resource
  • Diff Resource
  • Diff Commit List Resource
  • Diff Commit Resource
  • File Diff List Resource
  • File Diff Resource
  • File Diff Comment List Resource
  • Original File Resource
  • Patched File Resource
  • Diff Commit List Resource
  • Diff Commit Resource
  • Diff Commit Resource
  • Diff File Attachment List Resource
  • Diff File Attachment Resource
  • Diff File Attachment Resource
  • Original File Resource
  • Patched File Resource
  • Extension List Resource
  • Extension Resource
  • Extension Resource
  • Hosting Service List Resource
  • Hosting Service Resource
  • Hosting Service Resource
  • Hosting Service Account List Resource
  • Hosting Service Account Resource
  • Remote Repository List Resource
  • Remote Repository Resource
  • Hosting Service Account Resource
  • Remote Repository List Resource
  • Remote Repository Resource
  • Remote Repository List Resource
  • Remote Repository Resource
  • Remote Repository Resource
  • OAuth2 Applications List Resource
  • OAuth2 Applications Resource
  • OAuth2 Applications Resource
  • OAuth2 Tokens List Resource
  • OAuth2 Tokens Resource
  • OAuth2 Tokens Resource
  • Repository List Resource
  • Repository Resource
  • Diff File Attachment List Resource
  • Diff File Attachment Resource
  • Repository Branches Resource
  • Repository Commits Resource
  • Repository Group List Resource
  • Repository Group Resource
  • Repository Info Resource
  • Repository User List Resource
  • Repository User Resource
  • Repository Resource
  • Diff File Attachment List Resource
  • Diff File Attachment Resource
  • Repository Branches Resource
  • Repository Commits Resource
  • Repository Group List Resource
  • Repository Group Resource
  • Repository Info Resource
  • Repository User List Resource
  • Repository User Resource
  • Repository Branches Resource
  • Repository Commits Resource
  • Repository Group List Resource
  • Repository Group Resource
  • Repository Group Resource
  • Repository Info Resource
  • Repository User List Resource
  • Repository User Resource
  • Repository User Resource
  • Review Group List Resource
  • Review Group Resource
  • Review Group User List Resource
  • Review Group User Resource
  • Review Group Resource
  • Review Group User List Resource
  • Review Group User Resource
  • Review Group User List Resource
  • Review Group User Resource
  • Review Group User Resource
  • Change List Resource
  • Change Resource
  • Change Resource
  • File Attachment List Resource
  • File Attachment Resource
  • File Attachment Comment List Resource
  • File Attachment Resource
  • File Attachment Comment List Resource
  • File Attachment Comment List Resource
  • File Diff List Resource
  • File Diff Resource
  • File Diff Comment List Resource
  • Original File Resource
  • Patched File Resource
  • File Diff Resource
  • File Diff Comment List Resource
  • Original File Resource
  • Patched File Resource
  • File Diff Comment List Resource
  • Review Request List Resource
  • Review Request Resource
  • Change List Resource
  • Change Resource
  • Diff Context Resource
  • Diff List Resource
  • Diff Resource
  • File Attachment List Resource
  • File Attachment Resource
  • Review List Resource
  • Review Resource
  • Review Draft Resource
  • Review Request Draft Resource
  • Draft Diff List Resource
  • Draft File Attachment List Resource
  • Draft Screenshot List Resource
  • Review Request Last Update Resource
  • Screenshot List Resource
  • Screenshot Resource
  • Status Update List Resource
  • Status Update Resource
  • Review Request Resource
  • Change List Resource
  • Change Resource
  • Diff Context Resource
  • Diff List Resource
  • Diff Resource
  • Diff Commit List Resource
  • File Diff List Resource
  • File Attachment List Resource
  • File Attachment Resource
  • File Attachment Comment List Resource
  • Review List Resource
  • Review Resource
  • Review Diff Comment List Resource
  • Review File Attachment Comment List Resource
  • Review General Comment List Resource
  • Review Reply List Resource
  • Review Screenshot Comment List Resource
  • Review Draft Resource
  • Review Request Draft Resource
  • Draft Diff List Resource
  • Draft Diff Resource
  • Draft File Attachment List Resource
  • Draft File Attachment Resource
  • Draft Screenshot List Resource
  • Draft Screenshot Resource
  • Review Request Last Update Resource
  • Screenshot List Resource
  • Screenshot Resource
  • Screenshot Comment List Resource
  • Status Update List Resource
  • Status Update Resource
  • Review Request Last Update Resource
  • Screenshot List Resource
  • Screenshot Resource
  • Screenshot Comment List Resource
  • Screenshot Resource
  • Screenshot Comment List Resource
  • Screenshot Comment List Resource
  • Draft Diff List Resource
  • Draft Diff Resource
  • Draft Diff Commit List Resource
  • Draft Diff Commit Resource
  • Draft File Diff List Resource
  • Draft File Diff Resource
  • Draft Diff Resource
  • Draft Diff Commit List Resource
  • Draft Diff Commit Resource
  • Draft File Diff List Resource
  • Draft File Diff Resource
  • Draft Original File Resource
  • Draft Patched File Resource
  • Draft Diff Commit List Resource
  • Draft Diff Commit Resource
  • Draft Diff Commit Resource
  • Draft File Diff List Resource
  • Draft File Diff Resource
  • Draft Original File Resource
  • Draft Patched File Resource
  • Draft File Diff Resource
  • Draft Original File Resource
  • Draft Patched File Resource
  • Draft File Attachment List Resource
  • Draft File Attachment Resource
  • Draft File Attachment Resource
  • Draft Original File Resource
  • Draft Patched File Resource
  • Draft Screenshot List Resource
  • Draft Screenshot Resource
  • Draft Screenshot Resource
  • Review Request Draft Resource
  • Draft Diff List Resource
  • Draft Diff Resource
  • Draft Diff Commit List Resource
  • Draft File Diff List Resource
  • Draft File Attachment List Resource
  • Draft File Attachment Resource
  • Draft Screenshot List Resource
  • Draft Screenshot Resource
  • Root Review List Resource
  • Root Diff Comment List Resource
  • Root File Attachment Comment List Resource
  • Root General Comment List Resource
  • Review List Resource
  • Review Resource
  • Review Diff Comment List Resource
  • Review Diff Comment Resource
  • Review File Attachment Comment List Resource
  • Review File Attachment Comment Resource
  • Review General Comment List Resource
  • Review General Comment Resource
  • Review Reply List Resource
  • Review Reply Resource
  • Review Reply Draft Resource
  • Review Screenshot Comment List Resource
  • Review Screenshot Comment Resource
  • Review Draft Resource
  • Review Resource
  • Review Diff Comment List Resource
  • Review Diff Comment Resource
  • Review File Attachment Comment List Resource
  • Review File Attachment Comment Resource
  • Review General Comment List Resource
  • Review General Comment Resource
  • Review Reply List Resource
  • Review Reply Resource
  • Review Reply Diff Comment List Resource
  • Review Reply File Attachment Comment List Resource
  • Review Reply General Comment List Resource
  • Review Reply Screenshot Comment List Resource
  • Review Reply Draft Resource
  • Review Screenshot Comment List Resource
  • Review Screenshot Comment Resource
  • Review Draft Resource
  • Review Diff Comment List Resource
  • Review Diff Comment Resource
  • Review Diff Comment Resource
  • Review File Attachment Comment List Resource
  • Review File Attachment Comment Resource
  • Review File Attachment Comment Resource
  • Review General Comment List Resource
  • Review General Comment Resource
  • Review General Comment Resource
  • Review Screenshot Comment List Resource
  • Review Screenshot Comment Resource
  • Review Screenshot Comment Resource
  • Review Reply Draft Resource
  • Review Reply List Resource
  • Review Reply Resource
  • Review Reply Diff Comment List Resource
  • Review Reply Diff Comment Resource
  • Review Reply File Attachment Comment List Resource
  • Review Reply File Attachment Comment Resource
  • Review Reply General Comment List Resource
  • Review Reply General Comment Resource
  • Review Reply Screenshot Comment List Resource
  • Review Reply Screenshot Comment Resource
  • Review Reply Draft Resource
  • Review Reply Resource
  • Review Reply Diff Comment List Resource
  • Review Reply Diff Comment Resource
  • Review Reply File Attachment Comment List Resource
  • Review Reply File Attachment Comment Resource
  • Review Reply General Comment List Resource
  • Review Reply General Comment Resource
  • Review Reply Screenshot Comment List Resource
  • Review Reply Screenshot Comment Resource
  • Review Reply Diff Comment List Resource
  • Review Reply Diff Comment Resource
  • Review Reply Diff Comment Resource
  • Review Reply File Attachment Comment List Resource
  • Review Reply File Attachment Comment Resource
  • Review Reply File Attachment Comment Resource
  • Review Reply General Comment List Resource
  • Review Reply General Comment Resource
  • Review Reply General Comment Resource
  • Review Reply Screenshot Comment List Resource
  • Review Reply Screenshot Comment Resource
  • Review Reply Screenshot Comment Resource
  • Search Resource
  • Status Update List Resource
  • Status Update Resource
  • Status Update Resource
  • API Token List Resource
  • API Token Resource
  • API Token Resource
  • Archived Review Request List Resource
  • Archived Review Request Resource
  • Archived Review Request Resource
  • Muted Review Request List Resource
  • Muted Review Request Resource
  • Muted Review Request Resource
  • Session Resource
  • User List Resource
  • User Resource
  • API Token List Resource
  • API Token Resource
  • Archived Review Request List Resource
  • Archived Review Request Resource
  • Muted Review Request List Resource
  • Muted Review Request Resource
  • User File Attachment List Resource
  • User File Attachment Resource
  • Watched List Resource
  • Watched Review Group List Resource
  • Watched Review Request List Resource
  • User Resource
  • API Token List Resource
  • API Token Resource
  • Archived Review Request List Resource
  • Archived Review Request Resource
  • Muted Review Request List Resource
  • Muted Review Request Resource
  • User File Attachment List Resource
  • User File Attachment Resource
  • Watched List Resource
  • Watched Review Group List Resource
  • Watched Review Group Resource
  • Watched Review Request List Resource
  • Watched Review Request Resource
  • User File Attachment List Resource
  • User File Attachment Resource
  • User File Attachment Resource
  • Watched Review Group List Resource
  • Watched Review Group Resource
  • Watched Review Group Resource
  • Watched Review Request List Resource
  • Watched Review Request Resource
  • Watched Review Request Resource
  • Watched List Resource
  • Watched Review Group List Resource
  • Watched Review Group Resource
  • Watched Review Request List Resource
  • Watched Review Request Resource
  • Validation List Resource
  • Validate Diff List Resource
  • Validate Diff Commit List Resource
  • Validate Diff List Resource
  • Validate Diff Commit List Resource
  • WebHook List Resource
  • WebHook Resource
  • WebHook Resource
  • Errors
  • 100 - Does Not Exist
  • 101 - Permission Denied
  • 102 - Invalid Attribute
  • 103 - Not Logged In
  • 104 - Login Failed
  • 105 - Invalid Form Data
  • 106 - Missing Attribute
  • 107 - Enable Extension Failed
  • 108 - Disable Extension Failed
  • 109 - Extension Already Installed
  • 110 - Install Extension Failed
  • 111 - Duplicate Item
  • 112 - OAuth2 Missing Scope Error
  • 113 - OAuth2 Access Denied Error
  • 114 - Rate Limit Exceeded
  • 203 - Invalid Change Number
  • 204 - Change Number In Use
  • 205 - Missing Repository
  • 206 - Invalid Repository
  • 207 - Repository File Not Found
  • 208 - Invalid User
  • 209 - Repository Action Not Supported
  • 210 - Repository Information Error
  • 212 - Empty Changeset
  • 213 - Server Configuration Error
  • 214 - Bad Host Key
  • 215 - Unverified Host Key
  • 216 - Unverified Host Certificate
  • 217 - Missing User Key
  • 218 - Repository Authentication Error
  • 219 - Diff Empty
  • 220 - Diff Too Big
  • 221 - File Retrieval Error
  • 222 - Hosting Service Authentication Error
  • 223 - Group Already Exists
  • 224 - Diff Parse Error
  • 225 - Publish Error
  • 226 - User Query Error
  • 227 - Commit ID Already Exists
  • 228 - Token Generation Failed
  • 230 - Could not close review request
  • 231 - Could not reopen review request
  • 232 - Ship-It Revocation Error
  • REST API 2.0
  • Overview
  • Authenticating
  • API Token Policies
  • OAuth2 Authentication
  • Rich Text Fields and Types
  • Storing/Accessing Extra Data
  • Resources
  • Root List Resource
  • Default Reviewer List Resource
  • Default Reviewer Resource
  • Extension List Resource
  • Extension Resource
  • Hosting Service Account List Resource
  • Hosting Service Account Resource
  • Hosting Service List Resource
  • Hosting Service Resource
  • OAuth2 Applications List Resource
  • OAuth2 Applications Resource
  • OAuth2 Tokens List Resource
  • OAuth2 Tokens Resource
  • Repository List Resource
  • Repository Resource
  • Review Group List Resource
  • Review Group Resource
  • Review Request List Resource
  • Review Request Resource
  • Root Diff Comment List Resource
  • Root File Attachment Comment List Resource
  • Root General Comment List Resource
  • Root Review List Resource
  • Search Resource
  • Server Info Resource
  • Session Resource
  • User List Resource
  • User Resource
  • Validation List Resource
  • Validate Diff List Resource
  • Validate Diff Commit List Resource
  • WebHook List Resource
  • WebHook Resource
  • Server Info Resource
  • Default Reviewer List Resource
  • Default Reviewer Resource
  • Default Reviewer Resource
  • Diff Context Resource
  • Diff List Resource
  • Diff Resource
  • Diff Commit List Resource
  • File Diff List Resource
  • Diff Resource
  • Diff Commit List Resource
  • Diff Commit Resource
  • File Diff List Resource
  • File Diff Resource
  • Diff Commit List Resource
  • Diff Commit Resource
  • Diff Commit Resource
  • Diff File Attachment List Resource
  • Diff File Attachment Resource
  • Diff File Attachment Resource
  • Original File Resource
  • Patched File Resource
  • Extension List Resource
  • Extension Resource
  • Extension Resource
  • Hosting Service List Resource
  • Hosting Service Resource
  • Hosting Service Resource
  • Hosting Service Account List Resource
  • Hosting Service Account Resource
  • Remote Repository List Resource
  • Hosting Service Account Resource
  • Remote Repository List Resource
  • Remote Repository Resource
  • Remote Repository List Resource
  • Remote Repository Resource
  • Remote Repository Resource
  • OAuth2 Applications List Resource
  • OAuth2 Applications Resource
  • OAuth2 Applications Resource
  • OAuth2 Tokens List Resource
  • OAuth2 Tokens Resource
  • OAuth2 Tokens Resource
  • Repository List Resource
  • Repository Resource
  • Diff File Attachment List Resource
  • Repository Branches Resource
  • Repository Commits Resource
  • Repository Group List Resource
  • Repository Info Resource
  • Repository User List Resource
  • Repository Resource
  • Diff File Attachment List Resource
  • Diff File Attachment Resource
  • Repository Branches Resource
  • Repository Commits Resource
  • Repository Group List Resource
  • Repository Group Resource
  • Repository Info Resource
  • Repository User List Resource
  • Repository User Resource
  • Repository Branches Resource
  • Repository Commits Resource
  • Repository Group List Resource
  • Repository Group Resource
  • Repository Group Resource
  • Repository Info Resource
  • Repository User List Resource
  • Repository User Resource
  • Repository User Resource
  • Review Group List Resource
  • Review Group Resource
  • Review Group User List Resource
  • Review Group Resource
  • Review Group User List Resource
  • Review Group User Resource
  • Review Group User List Resource
  • Review Group User Resource
  • Review Group User Resource
  • Change List Resource
  • Change Resource
  • Change Resource
  • File Attachment List Resource
  • File Attachment Resource
  • File Attachment Comment List Resource
  • File Attachment Resource
  • File Attachment Comment List Resource
  • File Attachment Comment List Resource
  • File Diff List Resource
  • File Diff Resource
  • File Diff Comment List Resource
  • Original File Resource
  • Patched File Resource
  • File Diff Resource
  • File Diff Comment List Resource
  • Original File Resource
  • Patched File Resource
  • File Diff Comment List Resource
  • Review Request List Resource
  • Review Request Resource
  • Change List Resource
  • Diff Context Resource
  • Diff List Resource
  • File Attachment List Resource
  • Review List Resource
  • Review Request Draft Resource
  • Review Request Last Update Resource
  • Screenshot List Resource
  • Status Update List Resource
  • Review Request Resource
  • Change List Resource
  • Change Resource
  • Diff Context Resource
  • Diff List Resource
  • Diff Resource
  • File Attachment List Resource
  • File Attachment Resource
  • Review List Resource
  • Review Resource
  • Review Draft Resource
  • Review Request Draft Resource
  • Draft Diff List Resource
  • Draft File Attachment List Resource
  • Draft Screenshot List Resource
  • Review Request Last Update Resource
  • Screenshot List Resource
  • Screenshot Resource
  • Status Update List Resource
  • Status Update Resource
  • Review Request Last Update Resource
  • Screenshot List Resource
  • Screenshot Resource
  • Screenshot Comment List Resource
  • Screenshot Resource
  • Screenshot Comment List Resource
  • Screenshot Comment List Resource
  • Draft Diff List Resource
  • Draft Diff Resource
  • Draft Diff Commit List Resource
  • Draft File Diff List Resource
  • Draft Diff Resource
  • Draft Diff Commit List Resource
  • Draft Diff Commit Resource
  • Draft File Diff List Resource
  • Draft File Diff Resource
  • Draft Diff Commit List Resource
  • Draft Diff Commit Resource
  • Draft Diff Commit Resource
  • Draft File Diff List Resource
  • Draft File Diff Resource
  • Draft Original File Resource
  • Draft Patched File Resource
  • Draft File Diff Resource
  • Draft Original File Resource
  • Draft Patched File Resource
  • Draft File Attachment List Resource
  • Draft File Attachment Resource
  • Draft File Attachment Resource
  • Draft Original File Resource
  • Draft Patched File Resource
  • Draft Screenshot List Resource
  • Draft Screenshot Resource
  • Draft Screenshot Resource
  • Review Request Draft Resource
  • Draft Diff List Resource
  • Draft Diff Resource
  • Draft File Attachment List Resource
  • Draft File Attachment Resource
  • Draft Screenshot List Resource
  • Draft Screenshot Resource
  • Root Review List Resource
  • Root Diff Comment List Resource
  • Root File Attachment Comment List Resource
  • Root General Comment List Resource
  • Review List Resource
  • Review Resource
  • Review Diff Comment List Resource
  • Review File Attachment Comment List Resource
  • Review General Comment List Resource
  • Review Reply List Resource
  • Review Screenshot Comment List Resource
  • Review Draft Resource
  • Review Resource
  • Review Diff Comment List Resource
  • Review Diff Comment Resource
  • Review File Attachment Comment List Resource
  • Review File Attachment Comment Resource
  • Review General Comment List Resource
  • Review General Comment Resource
  • Review Reply List Resource
  • Review Reply Resource
  • Review Reply Draft Resource
  • Review Screenshot Comment List Resource
  • Review Screenshot Comment Resource
  • Review Draft Resource
  • Review Diff Comment List Resource
  • Review Diff Comment Resource
  • Review Diff Comment Resource
  • Review File Attachment Comment List Resource
  • Review File Attachment Comment Resource
  • Review File Attachment Comment Resource
  • Review General Comment List Resource
  • Review General Comment Resource
  • Review General Comment Resource
  • Review Screenshot Comment List Resource
  • Review Screenshot Comment Resource
  • Review Screenshot Comment Resource
  • Review Reply Draft Resource
  • Review Reply List Resource
  • Review Reply Resource
  • Review Reply Diff Comment List Resource
  • Review Reply File Attachment Comment List Resource
  • Review Reply General Comment List Resource
  • Review Reply Screenshot Comment List Resource
  • Review Reply Draft Resource
  • Review Reply Resource
  • Review Reply Diff Comment List Resource
  • Review Reply Diff Comment Resource
  • Review Reply File Attachment Comment List Resource
  • Review Reply File Attachment Comment Resource
  • Review Reply General Comment List Resource
  • Review Reply General Comment Resource
  • Review Reply Screenshot Comment List Resource
  • Review Reply Screenshot Comment Resource
  • Review Reply Diff Comment List Resource
  • Review Reply Diff Comment Resource
  • Review Reply Diff Comment Resource
  • Review Reply File Attachment Comment List Resource
  • Review Reply File Attachment Comment Resource
  • Review Reply File Attachment Comment Resource
  • Review Reply General Comment List Resource
  • Review Reply General Comment Resource
  • Review Reply General Comment Resource
  • Review Reply Screenshot Comment List Resource
  • Review Reply Screenshot Comment Resource
  • Review Reply Screenshot Comment Resource
  • Search Resource
  • Status Update List Resource
  • Status Update Resource
  • Status Update Resource
  • API Token List Resource
  • API Token Resource
  • API Token Resource
  • Archived Review Request List Resource
  • Archived Review Request Resource
  • Archived Review Request Resource
  • Muted Review Request List Resource
  • Muted Review Request Resource
  • Muted Review Request Resource
  • Session Resource
  • User List Resource
  • User Resource
  • API Token List Resource
  • Archived Review Request List Resource
  • Muted Review Request List Resource
  • User File Attachment List Resource
  • Watched List Resource
  • User Resource
  • API Token List Resource
  • API Token Resource
  • Archived Review Request List Resource
  • Archived Review Request Resource
  • Muted Review Request List Resource
  • Muted Review Request Resource
  • User File Attachment List Resource
  • User File Attachment Resource
  • Watched List Resource
  • Watched Review Group List Resource
  • Watched Review Request List Resource
  • User File Attachment List Resource
  • User File Attachment Resource
  • User File Attachment Resource
  • Watched Review Group List Resource
  • Watched Review Group Resource
  • Watched Review Group Resource
  • Watched Review Request List Resource
  • Watched Review Request Resource
  • Watched Review Request Resource
  • Watched List Resource
  • Watched Review Group List Resource
  • Watched Review Group Resource
  • Watched Review Request List Resource
  • Watched Review Request Resource
  • Validation List Resource
  • Validate Diff List Resource
  • Validate Diff Commit List Resource
  • Validate Diff List Resource
  • Validate Diff Commit List Resource
  • WebHook List Resource
  • WebHook Resource
  • WebHook Resource
  • Errors
  • 100 - Does Not Exist
  • 101 - Permission Denied
  • 102 - Invalid Attribute
  • 103 - Not Logged In
  • 104 - Login Failed
  • 105 - Invalid Form Data
  • 106 - Missing Attribute
  • 107 - Enable Extension Failed
  • 108 - Disable Extension Failed
  • 109 - Extension Already Installed
  • 110 - Install Extension Failed
  • 111 - Duplicate Item
  • 112 - OAuth2 Missing Scope Error
  • 113 - OAuth2 Access Denied Error
  • 114 - Rate Limit Exceeded
  • 203 - Invalid Change Number
  • 204 - Change Number In Use
  • 205 - Missing Repository
  • 206 - Invalid Repository
  • 207 - Repository File Not Found
  • 208 - Invalid User
  • 209 - Repository Action Not Supported
  • 210 - Repository Information Error
  • 212 - Empty Changeset
  • 213 - Server Configuration Error
  • 214 - Bad Host Key
  • 215 - Unverified Host Key
  • 216 - Unverified Host Certificate
  • 217 - Missing User Key
  • 218 - Repository Authentication Error
  • 219 - Diff Empty
  • 220 - Diff Too Big
  • 221 - File Retrieval Error
  • 222 - Hosting Service Authentication Error
  • 223 - Group Already Exists
  • 224 - Diff Parse Error
  • 225 - Publish Error
  • 226 - User Query Error
  • 227 - Commit ID Already Exists
  • 228 - Token Generation Failed
  • 230 - Could not close review request
  • 231 - Could not reopen review request
  • 232 - Ship-It Revocation Error
  • Glossary
  • Extending Review Board
  • Extension Files and Package Layout
  • Creating an Extension Class
  • Adding a Configuration Form
  • Providing Database Models
  • Providing Static Media Files
  • Writing JavaScript Extensions
  • Writing Extension Unit Tests
  • Packaging and Distributing Extensions
  • Pre-defined URL Names
  • Extension Hooks
  • AccountPageFormsHook
  • AccountPagesHook
  • ActionHook
  • AdminWidgetHook
  • APIExtraDataAccessHook
  • AuthBackendHook
  • AvatarServiceHook
  • CommentDetailDisplayHook
  • DashboardColumnsHook
  • DashboardSidebarItemsHook
  • DataGridColumnsHook
  • EmailHook
  • ReviewRequestPublishedEmailHook
  • ReviewRequestClosedEmailHook
  • ReviewPublishedEmailHook
  • ReviewReplyPublishedEmailHook
  • FileAttachmentThumbnailHook
  • FileDiffACLHook
  • HideActionHook
  • HostingServiceHook
  • IntegrationHook
  • NavigationBarHook
  • ReviewRequestApprovalHook
  • ReviewRequestConditionChoicesHook
  • ReviewRequestFieldsHook
  • ReviewRequestFieldSetsHook
  • ReviewUIHook
  • SCMToolHook
  • SignalHook
  • TemplateHook
  • URLHook
  • UserDetailsProviderHook
  • UserInfoboxHook
  • UserPageSidebarItemsHook
  • WebAPICapabilitiesHook
  • Writing Review Board Extensions
  • Making a Review Board Extension
  • The rbext Tool
  • Extension Hooks
  • AccountPageFormsHook
  • AccountPagesHook
  • ActionHook
  • AdminWidgetHook
  • APIExtraDataAccessHook
  • AuthBackendHook
  • AvatarServiceHook
  • CommentDetailDisplayHook
  • DashboardColumnsHook
  • DashboardSidebarItemsHook
  • DataGridColumnsHook
  • EmailHook
  • ReviewRequestPublishedEmailHook
  • ReviewRequestClosedEmailHook
  • ReviewPublishedEmailHook
  • ReviewReplyPublishedEmailHook
  • FileAttachmentThumbnailHook
  • FileDiffACLHook
  • HideActionHook
  • HostingServiceHook
  • IntegrationHook
  • NavigationBarHook
  • ReviewRequestApprovalHook
  • ReviewRequestConditionChoicesHook
  • ReviewRequestFieldsHook
  • ReviewRequestFieldSetsHook
  • ReviewUIHook
  • SCMToolHook
  • SignalHook
  • TemplateHook
  • URLHook
  • UserDetailsProviderHook
  • UserInfoboxHook
  • UserPageSidebarItemsHook
  • WebAPICapabilitiesHook
  • JavaScript Extension Hooks
  • CommentDialogHook
  • FileAttachmentThumbnailContainerHook
  • ReviewDialogCommentHook
  • ReviewDialogHook
  • Customizing the UI with Actions
  • Customizing the Dashboard Columns
  • Customizing Review Request Conditions
  • Adding Page Banners
  • Adding Review Request Fields
  • Adding UIs for New File Types (Review UIs)
  • Writing Authentication Backends
  • Writing Legacy Authentication Backends
  • Extending the Web API
  • Module and Class References
  • reviewboard
  • reviewboard.deprecation
  • reviewboard.rb_platform
  • reviewboard.signals
  • reviewboard.urls
  • reviewboard.accounts.backends
  • reviewboard.accounts.backends.ad
  • reviewboard.accounts.backends.base
  • reviewboard.accounts.backends.http_digest
  • reviewboard.accounts.backends.ldap
  • reviewboard.accounts.backends.nis
  • reviewboard.accounts.backends.registry
  • reviewboard.accounts.backends.standard
  • reviewboard.accounts.backends.x509
  • reviewboard.accounts.decorators
  • reviewboard.accounts.errors
  • reviewboard.accounts.forms.auth
  • reviewboard.accounts.forms.pages
  • reviewboard.accounts.forms.registration
  • reviewboard.accounts.managers
  • reviewboard.accounts.middleware
  • reviewboard.accounts.mixins
  • reviewboard.accounts.models
  • reviewboard.accounts.pages
  • reviewboard.accounts.privacy
  • reviewboard.accounts.templatetags.accounts
  • reviewboard.accounts.testing
  • reviewboard.accounts.testing.queries
  • reviewboard.accounts.trophies
  • reviewboard.accounts.user_details
  • reviewboard.actions
  • reviewboard.actions.base
  • reviewboard.actions.errors
  • reviewboard.actions.registry
  • reviewboard.actions.renderers
  • reviewboard.admin
  • reviewboard.admin.actions
  • reviewboard.admin.admin_sites
  • reviewboard.admin.cache_stats
  • reviewboard.admin.checks
  • reviewboard.admin.decorators
  • reviewboard.admin.form_widgets
  • reviewboard.admin.middleware
  • reviewboard.admin.model_admin
  • reviewboard.admin.security_checks
  • reviewboard.admin.server
  • reviewboard.admin.siteconfig
  • reviewboard.admin.support
  • reviewboard.admin.validation
  • reviewboard.admin.widgets
  • reviewboard.attachments.errors
  • reviewboard.attachments.forms
  • reviewboard.attachments.managers
  • reviewboard.attachments.mimetypes
  • reviewboard.attachments.models
  • reviewboard.avatars.registry
  • reviewboard.avatars.services
  • reviewboard.avatars.settings
  • reviewboard.avatars.templatetags.avatars
  • reviewboard.avatars.testcase
  • reviewboard.changedescs.models
  • reviewboard.datagrids.columns
  • reviewboard.datagrids.grids
  • reviewboard.datagrids.sidebar
  • reviewboard.diffviewer.chunk_generator
  • reviewboard.diffviewer.differ
  • reviewboard.diffviewer.diffutils
  • reviewboard.diffviewer.errors
  • reviewboard.diffviewer.forms
  • reviewboard.diffviewer.managers
  • reviewboard.diffviewer.models
  • reviewboard.diffviewer.models.diffcommit
  • reviewboard.diffviewer.models.diffset
  • reviewboard.diffviewer.models.diffset_history
  • reviewboard.diffviewer.models.filediff
  • reviewboard.diffviewer.models.legacy_file_diff_data
  • reviewboard.diffviewer.models.raw_file_diff_data
  • reviewboard.diffviewer.myersdiff
  • reviewboard.diffviewer.opcode_generator
  • reviewboard.diffviewer.parser
  • reviewboard.diffviewer.processors
  • reviewboard.diffviewer.renderers
  • reviewboard.diffviewer.smdiff
  • reviewboard.certs
  • reviewboard.certs.cert
  • reviewboard.certs.errors
  • reviewboard.certs.utils
  • reviewboard.extensions.base
  • reviewboard.extensions.hooks
  • reviewboard.extensions.packaging
  • reviewboard.extensions.packaging.backend
  • reviewboard.extensions.packaging.setuptools_backend
  • reviewboard.extensions.packaging.static_media
  • reviewboard.extensions.testing
  • reviewboard.extensions.testing.testcases
  • reviewboard.hostingsvcs.base
  • reviewboard.hostingsvcs.base.bug_tracker
  • reviewboard.hostingsvcs.base.client
  • reviewboard.hostingsvcs.base.forms
  • reviewboard.hostingsvcs.base.hosting_service
  • reviewboard.hostingsvcs.base.http
  • reviewboard.hostingsvcs.base.paginator
  • reviewboard.hostingsvcs.base.registry
  • reviewboard.hostingsvcs.base.repository
  • reviewboard.hostingsvcs.errors
  • reviewboard.hostingsvcs.forms
  • reviewboard.hostingsvcs.hook_utils
  • reviewboard.hostingsvcs.models
  • reviewboard.hostingsvcs.repository
  • reviewboard.hostingsvcs.service
  • reviewboard.hostingsvcs.testing
  • reviewboard.hostingsvcs.testing.testcases
  • reviewboard.hostingsvcs.utils.paginator
  • reviewboard.integrations
  • reviewboard.integrations.base
  • reviewboard.integrations.forms
  • reviewboard.integrations.models
  • reviewboard.integrations.urls
  • reviewboard.integrations.views
  • reviewboard.licensing
  • reviewboard.licensing.actions
  • reviewboard.licensing.errors
  • reviewboard.licensing.features
  • reviewboard.licensing.license
  • reviewboard.licensing.license_checks
  • reviewboard.licensing.provider
  • reviewboard.licensing.registry
  • reviewboard.licensing.views
  • reviewboard.notifications
  • reviewboard.notifications.email
  • reviewboard.notifications.email.backend
  • reviewboard.notifications.email.decorators
  • reviewboard.notifications.email.hooks
  • reviewboard.notifications.email.message
  • reviewboard.notifications.email.utils
  • reviewboard.notifications.email.views
  • reviewboard.notifications.forms
  • reviewboard.notifications.managers
  • reviewboard.notifications.models
  • reviewboard.notifications.webhooks
  • reviewboard.reviews.actions
  • reviewboard.reviews.builtin_fields
  • reviewboard.reviews.chunk_generators
  • reviewboard.reviews.conditions
  • reviewboard.reviews.context
  • reviewboard.reviews.default_actions
  • reviewboard.reviews.detail
  • reviewboard.reviews.errors
  • reviewboard.reviews.features
  • reviewboard.reviews.fields
  • reviewboard.reviews.forms
  • reviewboard.reviews.managers
  • reviewboard.reviews.markdown_utils
  • reviewboard.reviews.models
  • reviewboard.reviews.signals
  • reviewboard.reviews.templatetags.reviewtags
  • reviewboard.reviews.testing
  • reviewboard.reviews.testing.queries
  • reviewboard.reviews.testing.queries.review_groups
  • reviewboard.reviews.testing.queries.review_requests
  • reviewboard.reviews.testing.queries.reviews
  • reviewboard.reviews.ui.base
  • reviewboard.reviews.ui.image
  • reviewboard.reviews.ui.markdownui
  • reviewboard.reviews.ui.text
  • reviewboard.reviews.views.attachments
  • reviewboard.reviews.views.bug_trackers
  • reviewboard.reviews.views.diff_fragments
  • reviewboard.reviews.views.diffviewer
  • reviewboard.reviews.views.download_diff
  • reviewboard.reviews.views.email
  • reviewboard.reviews.views.mixins
  • reviewboard.reviews.views.new_review_request
  • reviewboard.reviews.views.review_request_detail
  • reviewboard.reviews.views.review_request_infobox
  • reviewboard.reviews.views.review_request_updates
  • reviewboard.reviews.views.root
  • reviewboard.scmtools.certs
  • reviewboard.scmtools.conditions
  • reviewboard.scmtools.core
  • reviewboard.scmtools.crypto_utils
  • reviewboard.scmtools.errors
  • reviewboard.scmtools.forms
  • reviewboard.scmtools.managers
  • reviewboard.scmtools.models
  • reviewboard.scmtools.signals
  • reviewboard.scmtools.testing
  • reviewboard.scmtools.testing.queries
  • reviewboard.scmtools.tests.testcases
  • reviewboard.search.fields
  • reviewboard.search.forms
  • reviewboard.search.indexes
  • reviewboard.search.search_backends.base
  • reviewboard.search.search_backends.elasticsearch
  • reviewboard.search.search_backends.registry
  • reviewboard.search.search_backends.whoosh
  • reviewboard.search.signal_processor
  • reviewboard.search.testing
  • reviewboard.site.conditions
  • reviewboard.site.context_processors
  • reviewboard.site.decorators
  • reviewboard.site.middleware
  • reviewboard.site.mixins
  • reviewboard.site.models
  • reviewboard.site.signals
  • reviewboard.site.templatetags.localsite
  • reviewboard.site.testing
  • reviewboard.site.testing.queries
  • reviewboard.site.urlresolvers
  • reviewboard.site.validation
  • reviewboard.ssh.client
  • reviewboard.ssh.errors
  • reviewboard.ssh.policy
  • reviewboard.ssh.storage
  • reviewboard.ssh.utils
  • reviewboard.testing.hosting_services
  • reviewboard.testing.queries
  • reviewboard.testing.queries.base
  • reviewboard.testing.queries.http
  • reviewboard.testing.scmtool
  • reviewboard.testing.testcase
  • reviewboard.themes
  • reviewboard.themes.context_processors
  • reviewboard.themes.ui
  • reviewboard.themes.ui.base
  • reviewboard.themes.ui.default
  • reviewboard.themes.ui.registry
  • reviewboard.webapi.auth_backends
  • reviewboard.webapi.base
  • reviewboard.webapi.decorators
  • reviewboard.webapi.errors
  • reviewboard.webapi.mixins
  • reviewboard.webapi.models
  • reviewboard.webapi.server_info
  • reviewboard.webapi.testing
  • reviewboard.webapi.testing.queries
  • reviewboard.webapi.tests.base
  • Frequently Asked Questions
  • General Index
  • Python Module Index
  • Release Notes
  • Customizing Review Request Conditions¶

    Conditions allow administrators to define rules for when most integrations are used. For example, a Slack integration can be set up to only post when a review request targets a specific repository, or when the owner is a member of a certain group.

    Review Board provides a set of built-in choices to select from when configuring conditions. For example, a review request’s repository, review groups, branches, user roles, and more.

    Extensions can add their own available choices. This can be used along with custom review request fields, custom extension-stored or API-stored data in ReviewRequest.extra_data, or with logic you define in your extension.

    There are three key things to know about building conditions:

    1. Condition choices are created by subclassing one of the base classes from djblets.conditions.choices and mixing in reviewboard.reviews.conditions. ReviewRequestConditionChoiceMixin.

    2. Condition choices declare operators (such as Is, Contains, Is one of, or Starts with) by setting the operators attribute.

    3. Condition choices are then registered by passing their classes (not instances) to ReviewRequestConditionChoicesHook.

    Choosing a Base Class¶

    Djblets_, Review Board’s companion library for writing extensions, provides several ready-made base classes you can choose from. Each has a built-in set of standard operators.

    These are:

    • djblets.conditions.choices.BaseConditionBooleanChoice

      Used for boolean (true/false) values. This provides:

      • Is (with a True / False selector)

    • djblets.conditions.choices.BaseConditionIntegerChoice

      Used for integer values. This provides:

      • Is / Is not

      • Greater than / Less than

    • djblets.conditions.choices.BaseConditionStringChoice

      Used for text/string values. This provides the operators:

      • Is / Is not

      • Contains / Does not contain

      • Starts with / Ends with

      • Matches regex / Does not match regex

    • djblets.conditions.choices.BaseConditionModelChoice

      Used to select an optional single database object from a list. This provides:

      • Is unset

      • Is / Is not

    • djblets.conditions.choices.BaseConditionRequiredModelChoice

      Used to select a required single database object from a list. This provides:

      • Is / Is not

    • djblets.conditions.choices.BaseConditionModelMultipleChoice

      Used to select one or more database options from a list.

      • Any / None

      • Is one of / Is not one of

    • djblets.conditions.choices.BaseConditionChoice

      A base class for defining entirely-new condition choices.

      Subclasses are required to set operators and default_value_field.

    Creating a Choice¶

    To create a condition choice:

    1. Subclass one of the base classes above and mix in reviewboard.reviews.conditions.ReviewRequestConditionChoiceMixin.

    2. Define the required attributes:

      • choice_id

        A unique string identifier for the choice.

        You should use a vendor or extension prefix to avoid conflicts with Review Board’s built-in choices or other extensions.

        Allowed characters: A-Z, a-z, 0-9, -, and _.

      • name

        The human-readable name shown in the condition selector. This should be short and descriptive.

    3. Define the required method:

      • get_match_value()

        Returns the value that will be matched against, using the user’s selected operator.

        This would return any data your extension stores or computes that would determine if the condition choice applies.

        This will receive the review request as its first argument, and must take **kwargs as the last argument.

        We’ll talk about this more in a minute.

    Here’s an example condition choice that matches a milestone stored by your extension.

    from djblets.conditions.choices import BaseConditionStringChoice
    from reviewboard.reviews.conditions import ReviewRequestConditionChoiceMixin
    from reviewboard.reviews.models import ReviewRequest
    
    
    class MilestoneChoice(ReviewRequestConditionChoiceMixin,
                          BaseConditionStringChoice):
        choice_id = 'myvendor_my-milestone'
        name = 'Milestone'
    
        def get_match_value(
            self,
            review_request: ReviewRequest,
            **kwargs,
        ) -> str:
            return review_request.extra_data.get('myvendor_milestone', '')
    

    Model Choices¶

    BaseConditionModelChoice, BaseConditionRequiredModelChoice, and BaseConditionModelMultipleChoice all work off of the database, using Django database models.

    These take a queryset attribute that populates the entries to show and match against.

    You’ll usually only use this if your extension is providing its own database models that have a relation back to the ReviewRequest model.

    For example:

    from django.db.models import QuerySet
    from djblets.conditions.choices import BaseConditionModelMultipleChoice
    from reviewboard.reviews.conditions import ReviewRequestConditionChoiceMixin
    from reviewboard.reviews.models import ReviewRequest
    
    from myextension.models import Project
    
    
    class ProjectsChoice(ReviewRequestConditionChoiceMixin,
                         BaseConditionModelMultipleChoice):
        choice_id = 'myvendor_projects'
        name = 'Projects'
        queryset = Project.objects.all()
    
        def get_match_value(
            self,
            review_request: ReviewRequest,
            **kwargs,
        ) -> QuerySet[Project]:
            # Return all entries associated with this review request.
            return review_request.myvendor_projects.all()
    

    Caching Match Values¶

    Computing a match value may be expensive. For example, you might query the database, or you might look something up in an external system. In these cases, you’ll want to cache the computed match value.

    Caching avoids performing these lookups or computations multiple times in the event where the user has configured your condition choice multiple times in the same set of rules.

    get_match_value() takes a value_state_cache keyword argument, which is a dictionary shared across all conditions the user has chosen. Any state you compute can (and should!) be stored there.

    We’ll update our example from above to build in some caching:

    from collections.abc import Sequence
    
    from djblets.conditions.choices import BaseConditionModelMultipleChoice
    from djblets.conditions.values import ValueStateCache
    from reviewboard.reviews.conditions import ReviewRequestConditionChoiceMixin
    from reviewboard.reviews.models import ReviewRequest
    
    from myextension.models import Project
    
    
    class ProjectsChoice(ReviewRequestConditionChoiceMixin,
                         BaseConditionModelMultipleChoice):
        choice_id = 'myvendor_projects'
        name = 'Projects'
        queryset = Project.objects.all()
    
        def get_match_value(
            self,
            review_request: ReviewRequest,
            value_state_cache: ValueStateCache,
            **kwargs,
        ) -> Sequence[Project]:
            try:
                projects = value_state_cache['myvendor_projects']
            except KeyError:
                projects = list(review_request.myvendor_projects.all())
                value_state_cache['myvendor_projects'] = projects
    
            return projects
    

    Matching Against a List of Values¶

    Some choices represent a list of values (such as the files changed in a diff). You may want to give users the ability to match against any item in the list, instead of trying to match the entire list itself.

    In the diff files example, you may want the user to be able to choose Changed file path -> Starts with -> “docs/”, and if any of the files start with docs/, it would be a match.

    To do this, simply mix ConditionChoiceMatchListItemsMixin into your class.

    For example:

    from collections.abc import Sequence
    
    from djblets.conditions.choices import (BaseConditionStringChoice,
                                            ConditionChoiceMatchListItemsMixin)
    from djblets.conditions.values import ValueStateCache
    from reviewboard.reviews.conditions import ReviewRequestConditionChoiceMixin
    from reviewboard.reviews.models import ReviewRequest
    
    
    class ChangedFileChoice(ConditionChoiceMatchListItemsMixin,
                            ReviewRequestConditionChoiceMixin,
                            BaseConditionStringChoice):
        choice_id = 'myvendor_changed-file'
        name = 'Changed file path'
    
        def get_match_value(
            self,
            review_request: ReviewRequest,
            value_state_cache: ValueStateCache,
            **kwargs,
        ) -> Sequence[str]:
            try:
                files = value_state_cache['myvendor_changed_files']
            except KeyError:
                diffset = review_request.get_latest_diffset()
                files: list[str] = []
    
                if diffset is not None:
                    files = list(diffset.files.values_list('dest_file',
                                                           flat=True))
    
                value_state_cache['myvendor_changed_files'] = files
    
            return files
    

    This is best used with ContainsOperator and DoesNotContainOperator.

    If you want to require that every item in the list matches, instead of just any item, you can set require_match_all_items to True on the class:

    ...
    
    class ChangedFileChoice(ConditionChoiceMatchListItemsMixin,
                            ReviewRequestConditionChoiceMixin,
                            BaseConditionStringChoice):
        require_match_all_items = True
    
        ...
    

    Customizing Operators¶

    Every condition choice needs operators.

    Operators define how a match value is compared against a user’s provided value.

    As we saw above, there are base classes for condition choices that provide a default list of operators. You can use these as-is, or you can customize the list.

    For example, if we wanted to use BaseConditionStringChoice but limit our operators to Is one of and Is not one of, we could do:

    from djblets.conditions.choices import BaseConditionStringChoice
    from djblets.conditions.operators import (ConditionOperators,
                                              IsNotOneOfOperator,
                                              IsOneOfOperator)
    from reviewboard.reviews.conditions import ReviewRequestConditionChoiceMixin
    
    
    class MilestoneChoice(ReviewRequestConditionChoiceMixin,
                          BaseConditionStringChoice):
        ...
    
        operators = ConditionOperators([
            IsOneOfOperator,
            IsNotOneOfOperator,
        ])
    

    Built-in operators¶

    There are many built-in operators you can use. Most have a twin operator that matches the opposite values, so we’ll group them that way:

    • Check whether there’s a match value:

      • AnyOperator (Has a value)

      • UnsetOperator (Is unset)

    • Check whether a value equals the match value:

      • IsOperator (Is)

      • IsNotOperator (Is not)

    • Check whether a match value is found in a set of user-provided values:

      • IsOneOfOperator (Is one of)

      • IsNotOneOfOperator (Is not one of)

    • Check whether the user-provided value is found in a set of match values:

      • ContainsOperator (Contains)

      • DoesNotContainOperator (Does not contain)

    • Check whether the match value contains any of the user-provided values:

      • ContainsAnyOperator (Any of)

      • DoesNotContainAnyOperator (Not any of)

    • Checks whether the match value starts with a user-provided prefix:

      • StartsWithOperator (Starts with)

    • Checks whether the match value ends with a user-provided suffix:

      • EndsWithOperator (Ends with)

    • Checks whether the match value is greater than a user-provided value:

      • GreaterThanOperator (Greater than)

    • Checks whether the match value is less than a user-provided value:

      • LessThanOperator (Less than)

    • Checks whether the user-provided Python Regex (Regular Expression) pattern matches the match value:

      • MatchesRegexOperator (Matches regex)

      • DoesNotMatchRegexOperator (Does not match regex)

    Renaming an Operator¶

    Sometimes the default label for an operator isn’t quite right for your condition choice. You may want to give it a different name.

    You can easily do this with with_overrides():

    from djblets.conditions.operators import AnyOperator, UnsetOperator
    
    ...
    
    operators = ConditionOperators([
        AnyOperator.with_overrides(name='Has any projects'),
        UnsetOperator.with_overrides(name='Has no projects'),
    ])
    

    Writing a Custom Operator¶

    The built-in operators may not be right for your condition choice. You may want to create your own operator.

    To write a custom operator:

    1. Subclass djblets.conditions.operators.BaseConditionOperator.

    2. Define the required attributes:

      • operator_id

        A unique string identifier for the operator.

        You should use a vendor or extension prefix to avoid conflicts with Review Board’s built-in operators or other extensions.

        Allowed characters: A-Z, a-z, 0-9, -, and _.

      • name

        The human-readable name shown in the operator selector. This should be short and descriptive.

      • value_field

        The field type the user will use to provide a value.

        This can be explicitly set to None if the operator doesn’t take a value. If it’s omitted from the class, the choice’s default value field will be used.

    3. Define the required method:

      • matches()

        Returns whether the operator matches the choice-provided match value against the user-provided condition value (if one is available).

    For example:

    from djblets.conditions.choices import BaseConditionStringChoice
    from djblets.conditions.operators import (BaseConditionOperator,
                                              ConditionOperators)
    from reviewboard.reviews.conditions import ReviewRequestConditionChoiceMixin
    from reviewboard.reviews.models import ReviewRequest
    
    
    # This operator doesn't take a provided value. It just matches
    # against the string "urgent".
    class IsUrgentOperator(BaseConditionOperator):
        operator_id = 'myvendor_is-urgent'
        name = 'Is urgent'
        value_field = None  # No user-provided value is needed.
    
        def matches(
            self,
            match_value: str,
            **kwargs,
        ) -> bool:
            return match_value == 'urgent'
    
    
    # This operator takes a text field meant to include a priority level
    # that would append to "priority". For example, a user-provided value
    # of "1" would match "priority1".
    #
    # This doesn't set `value_field`, so it uses the default for the
    # choice.
    class IsPriorityLevelOperator(BaseConditionOperator):
        operator_id = 'myvendor_priority-level'
        name = 'Priority level'
    
        def matches(
            self,
            match_value: str,
            condition_value: str,
            **kwargs,
        ) -> bool:
            return match_value == f'priority{condition_value}'
    
    
    class PriorityChoice(ReviewRequestConditionChoiceMixin,
                         BaseConditionStringChoice):
        choice_id = 'myvendor_my-priority'
        name = 'Priority'
    
        operators = ConditionOperators([
            IsUrgentOperator,
            IsPriorityLevelOperator,
        ])
    
        def get_match_value(
            self,
            review_request: ReviewRequest,
            **kwargs,
        ) -> str:
            return review_request.extra_data.get('myvendor_priority', '')
    

    Customizing the Value Field¶

    We talked about an operator’s value field. Operators may set a custom field, disable a field, or fall back on the choice’s value field.

    If you’re subclassing one of the built-in condition choice classes, like BaseConditionIntegerChoice, a suitable default value field will be supplied for you.

    If you want to customize the field used, you can override default_value_field.

    In most cases, you’ll want to use one of the pre-built field types:

    • ConditionValueBooleanField

      A drop-down with “True” and “False” entries.

    • ConditionValueCharField

      Single-line text input.

    • ConditionValueIntegerField

      A field that validates as an integer.

    • ConditionValueRegexField

      A text input that validates and compiles as a Python Regex (Regular Expression), used for pattern matching.

    • ConditionValueModelField

      A field for selecting a specific database model entry.

    • ConditionValueMultipleModelField

      A field for selecting zero or more database model entries.

    • ConditionValueMultipleChoiceField

      A multiple choice of values (as we’ll see next).

    We’ll look at a couple of these.

    Restricting to a Fixed Set of Values¶

    A good reason to set your own field is to limit the options available to the user. You can use ConditionValueMultipleChoiceField to provide a fixed list of options to choose from.

    Each option in the list is a Python tuple in the form of (value, label). It also takes a generic type (the [str] after the name in the code sample below), which specifies the type of value found in the list.

    This is best used with IsOneOfOperator and IsNotOneOfOperator.

    For example:

    from djblets.conditions.choices import BaseConditionStringChoice
    from djblets.conditions.operators import (ConditionOperators,
                                              IsNotOneOfOperator,
                                              IsOneOfOperator)
    from djblets.conditions.values import ConditionValueMultipleChoiceField
    from reviewboard.reviews.conditions import ReviewRequestConditionChoiceMixin
    
    
    class CategoryChoice(ReviewRequestConditionChoiceMixin,
                         BaseConditionStringChoice):
        choice_id = 'myvendor_category'
        name = 'Category'
    
        operators = ConditionOperators([
            IsOneOfOperator,
            IsNotOneOfOperator,
        ])
    
        default_value_field = ConditionValueMultipleChoiceField[str](choices=[
            ('architecture', 'Architecture'),
            ('bug', 'Bug'),
            ('docs', 'Documentation'),
            ('feature', 'Feature'),
            ('security', 'Security'),
            ('whimsy', 'Whimsy'),
        ])
    
        ...
    

    Using a Django Form Field¶

    Another reason to override the field type is to use a specific (or a custom) Django form field. You’ll wrap this with ConditionValueFormField.

    You can use this to customize the attributes going into the form or the validation behavior. Any Django form field can be provided.

    For example:

    from django import forms
    from djblets.conditions.choices import BaseConditionIntegerChoice
    from djblets.conditions.values import ConditionValueFormField
    from reviewboard.reviews.conditions import ReviewRequestConditionChoiceMixin
    from reviewboard.reviews.models import ReviewRequest
    
    
    class ScoreChoice(ReviewRequestConditionChoiceMixin,
                      BaseConditionIntegerChoice):
        choice_id = 'myvendor_score'
        name = 'Review Score'
    
        default_value_field = ConditionValueFormField(forms.IntegerField(
            min_value=0,
            max_value=100,
        ))
    
        def get_match_value(
            self,
            review_request: ReviewRequest,
            **kwargs,
        ) -> int:
            return review_request.extra_data.get('myvendor_score', 0)
    

    Registering Choices¶

    In order for your condition choice to appear as an option for users, you’ll need to register it. This is done by passing one or more condition choice classes (not instances) to a ReviewRequestConditionChoicesHook:

    from reviewboard.extensions.base import Extension
    from reviewboard.extensions.hooks import ReviewRequestConditionChoicesHook
    
    
    class MyExtension(Extension):
        def initialize(self) -> None:
            ReviewRequestConditionChoicesHook(self, [
                MyCategoryChoice,
                MyTaskIDChoice,
            ])
    

    Your choices will immediately appear in the condition selector when administrators configure any integration.

    Keep up with the latest Review Board releases, security updates, and helpful information.

    About
    News
    Demo
    RBCommons Hosting
    Integrations
    Happy Users
    Support Options
    Documentation
    FAQ
    User Manual
    RBTools
    Administration Guide
    Power Pack
    Release Notes
    Downloads
    Review Board
    RBTools
    Djblets
    Power Pack
    Package Store
    PGP Signatures
    Contributing
    Bug Tracker
    Submit Patches
    Development Setup
    Wiki
    Follow Us
    Mailing Lists
    Reddit
    Twitter
    Mastodon
    Facebook
    YouTube
    Copyright © 2006-2026 Beanbag, Inc. All rights reserved.
    Terms of Service — Privacy Policy — AI Ethics Policy — Branding

    On this page

    • [Top]
    • Choosing a Base Class
    • Creating a Choice
      • Model Choices
      • Caching Match Values
      • Matching Against a List of Values
    • Customizing Operators
      • Built-in operators
      • Renaming an Operator
      • Writing a Custom Operator
    • Customizing the Value Field
      • Restricting to a Fixed Set of Values
      • Using a Django Form Field
    • Registering Choices