default-reviewers: changes for source/target branch distinction and new rule name.

- since reasons is bigger now we'll hide those and toggle on view.
This commit is contained in:
Marcin Kuzminski 2017-12-05 00:09:44 +01:00
parent eb371210f5
commit 4eb2164498
5 changed files with 86 additions and 18 deletions

View file

@ -51,7 +51,7 @@ PYRAMID_SETTINGS = {}
EXTENSIONS = {}
__version__ = ('.'.join((str(each) for each in VERSION[:3])))
__dbversion__ = 82 # defines current db version for migrations
__dbversion__ = 83 # defines current db version for migrations
__platform__ = platform.system()
__license__ = 'AGPLv3, and Commercial License'
__author__ = 'RhodeCode GmbH'

View file

@ -0,0 +1,41 @@
import logging
from sqlalchemy import *
from rhodecode.model import meta
from rhodecode.lib.dbmigrate.versions import _reset_base, notify
log = logging.getLogger(__name__)
def upgrade(migrate_engine):
"""
Upgrade operations go here.
Don't create your own engine; bind migrate_engine to your metadata
"""
_reset_base(migrate_engine)
from rhodecode.lib.dbmigrate.schema import db_4_11_0_0 as db
review_rule_table = db.RepoReviewRule.__table__
target_branch_pattern = Column(
"target_branch_pattern",
UnicodeText().with_variant(UnicodeText(255), 'mysql'), default=u'*')
target_branch_pattern.create(table=review_rule_table)
review_rule_name = Column('review_rule_name', String(255))
review_rule_name.create(table=review_rule_table)
# issue fixups
fixups(db, meta.Session)
def downgrade(migrate_engine):
meta = MetaData()
meta.bind = migrate_engine
def fixups(models, _SESSION):
pass

View file

@ -4127,7 +4127,9 @@ class RepoReviewRule(Base, BaseModel):
"repo_id", Integer(), ForeignKey('repositories.repo_id'))
repo = relationship('Repository', backref='review_rules')
review_rule_name = Column('review_rule_name', String(255))
_branch_pattern = Column("branch_pattern", UnicodeText().with_variant(UnicodeText(255), 'mysql'), default=u'*') # glob
_target_branch_pattern = Column("target_branch_pattern", UnicodeText().with_variant(UnicodeText(255), 'mysql'), default=u'*') # glob
_file_pattern = Column("file_pattern", UnicodeText().with_variant(UnicodeText(255), 'mysql'), default=u'*') # glob
use_authors_for_review = Column("use_authors_for_review", Boolean(), nullable=False, default=False)
@ -4138,18 +4140,27 @@ class RepoReviewRule(Base, BaseModel):
rule_users = relationship('RepoReviewRuleUser')
rule_user_groups = relationship('RepoReviewRuleUserGroup')
@hybrid_property
def branch_pattern(self):
return self._branch_pattern or '*'
def _validate_glob(self, value):
re.compile('^' + glob2re(value) + '$')
@branch_pattern.setter
def branch_pattern(self, value):
@hybrid_property
def source_branch_pattern(self):
return self._branch_pattern or '*'
@source_branch_pattern.setter
def source_branch_pattern(self, value):
self._validate_glob(value)
self._branch_pattern = value or '*'
@hybrid_property
def target_branch_pattern(self):
return self._target_branch_pattern or '*'
@target_branch_pattern.setter
def target_branch_pattern(self, value):
self._validate_glob(value)
self._target_branch_pattern = value or '*'
@hybrid_property
def file_pattern(self):
return self._file_pattern or '*'
@ -4159,7 +4170,7 @@ class RepoReviewRule(Base, BaseModel):
self._validate_glob(value)
self._file_pattern = value or '*'
def matches(self, branch, files_changed):
def matches(self, source_branch, target_branch, files_changed):
"""
Check if this review rule matches a branch/files in a pull request
@ -4167,13 +4178,21 @@ class RepoReviewRule(Base, BaseModel):
:param files_changed: list of file paths changed in the pull request
"""
branch = branch or ''
source_branch = source_branch or ''
target_branch = target_branch or ''
files_changed = files_changed or []
branch_matches = True
if branch:
branch_regex = re.compile('^' + glob2re(self.branch_pattern) + '$')
branch_matches = bool(branch_regex.search(branch))
if source_branch or target_branch:
source_branch_regex = re.compile(
'^' + glob2re(self.source_branch_pattern) + '$')
target_branch_regex = re.compile(
'^' + glob2re(self.target_branch_pattern) + '$')
branch_matches = (
bool(source_branch_regex.search(source_branch)) and
bool(target_branch_regex.search(target_branch))
)
files_matches = True
if self.file_pattern != '*':

View file

@ -1335,9 +1335,14 @@ table.integrations {
width: 100%;
overflow: auto;
}
.reviewer_reason {
padding-left: 20px;
.reviewer_reason_container {
padding-left: 20px;
}
.reviewer_reason {
}
.reviewer_status {
display: inline-block;
vertical-align: top;

View file

@ -340,7 +340,7 @@
## REVIEWERS
<div class="reviewers-title block-right">
<div class="pr-details-title">
${_('Pull request reviewers')}
${_('Pull request reviewers')} / <a href="#toggleReasons" onclick="$('.reviewer_reason').toggle(); return false">${_('show reasons')}</a>
%if c.allowed_to_update:
<span id="open_edit_reviewers" class="block-right action_button last-item">${_('Edit')}</span>
%endif
@ -351,7 +351,7 @@
<input type="hidden" name="__start__" value="review_members:sequence">
<ul id="review_members" class="group_members">
%for member,reasons,mandatory,status in c.pull_request_reviewers:
<li id="reviewer_${member.user_id}" class="reviewer_entry">
<li id="reviewer_${member.user_id}">
<div class="reviewers_member">
<div class="reviewer_status tooltip" title="${h.tooltip(h.commit_status_lbl(status[0][1].status if status else 'not_reviewed'))}">
<div class="${'flag_status %s' % (status[0][1].status if status else 'not_reviewed')} pull-left reviewer_member_status"></div>
@ -361,11 +361,14 @@
</div>
<input type="hidden" name="__start__" value="reviewer:mapping">
<input type="hidden" name="__start__" value="reasons:sequence">
% if reasons:
<div class="reviewer_reason_container">
%for reason in reasons:
<div class="reviewer_reason">- ${reason}</div>
<div class="reviewer_reason" style="display: none">- ${reason}</div>
<input type="hidden" name="reason" value="${reason}">
%endfor
</div>
% endif
<input type="hidden" name="__end__" value="reasons:sequence">
<input id="reviewer_${member.user_id}_input" type="hidden" value="${member.user_id}" name="user_id" />
<input type="hidden" name="mandatory" value="${mandatory}"/>