feature: adds DB model and global settings inheritance

This commit is contained in:
ievgenii vdovenko 2025-06-20 16:19:30 +02:00
parent 7c72d6d74b
commit b42333562d
3 changed files with 108 additions and 10 deletions

View file

@ -77,7 +77,6 @@ from zope.cachedescriptors.property import Lazy as LazyProperty
from webhelpers2.text import remove_formatting
from rhodecode import ConfigGet
from rhodecode.lib.str_utils import safe_bytes
from rhodecode.translation import _
from rhodecode.lib.vcs import get_vcs_instance, VCSError
@ -108,6 +107,8 @@ from rhodecode.lib.exceptions import ArtifactMetadataDuplicate, ArtifactMetadata
from rhodecode.lib.pyramid_utils import get_current_request
from rhodecode.model.meta import Base, Session
DEFAULT_JSON_OBJ_SIZE = 16384
URL_SEP = "/"
log = logging.getLogger(__name__)
@ -364,7 +365,7 @@ class BaseModel(object):
return cls.query().all()
@classmethod
def delete(cls, id_):
def delete(cls, id_): # noqa: F811
obj = cls.query().get(id_)
Session().delete(obj)
@ -418,7 +419,7 @@ class RhodeCodeSetting(Base, BaseModel):
@validates("_app_settings_value")
def validate_settings_value(self, key, val):
assert type(val) == str
assert type(val) is str
return val
@hybrid_property
@ -535,7 +536,7 @@ class RepoRhodeCodeSetting(Base, BaseModel):
@validates("_app_settings_value")
def validate_settings_value(self, key, val):
assert type(val) == str
assert type(val) is str
return val
@hybrid_property
@ -4442,13 +4443,15 @@ class _PullRequestBase(BaseModel):
_last_merge_target_rev = Column("last_merge_other_rev", String(40), nullable=True)
_last_merge_status = Column("merge_status", Integer(), nullable=True)
last_merge_metadata = Column(
"last_merge_metadata", MutationObj.as_mutable(JsonType(dialect_map=dict(mysql=UnicodeText(16384))))
"last_merge_metadata",
MutationObj.as_mutable(JsonType(dialect_map=dict(mysql=UnicodeText(DEFAULT_JSON_OBJ_SIZE)))),
)
merge_rev = Column("merge_rev", String(40), nullable=True)
reviewer_data = Column(
"reviewer_data_json", MutationObj.as_mutable(JsonType(dialect_map=dict(mysql=UnicodeText(16384))))
"reviewer_data_json",
MutationObj.as_mutable(JsonType(dialect_map=dict(mysql=UnicodeText(DEFAULT_JSON_OBJ_SIZE)))),
)
@property
@ -4632,6 +4635,13 @@ class PullRequest(Base, _PullRequestBase):
LATEST_VER = "latest"
pull_request_id = Column("pull_request_id", Integer(), nullable=False, primary_key=True)
settings = Column(
"settings_json",
MutationObj.as_mutable(
JsonType(dialect_map=dict(mysql=UnicodeText(DEFAULT_JSON_OBJ_SIZE))),
),
default=dict,
)
def __repr__(self):
if self.pull_request_id:
@ -4797,6 +4807,26 @@ class PullRequest(Base, _PullRequestBase):
return self.versions_count
@event.listens_for(PullRequest, "before_insert")
def _init_pr_default_settings(mapper, connection, pull_request):
if not pull_request.settings:
pull_request.settings = {
"close_branch_before_merging": _inherit_global_settings(pull_request),
}
def _inherit_global_settings(pull_request):
from rhodecode.model.settings import VcsSettingsModel # handle circular dependency issue
repo_type = pull_request.target_repo.repo_type
settings_model = VcsSettingsModel(repo=pull_request.target_repo)
settings = settings_model.get_general_settings()
key = "rhodecode_{}_close_branch_before_merging"
if repo_type in ["hg", "git"]:
return settings.get(key.format(repo_type), False)
return False
class PullRequestVersion(Base, _PullRequestBase):
__tablename__ = "pull_request_versions"
__table_args__ = (base_table_args,)
@ -4859,7 +4889,9 @@ class PullRequestReviewers(Base, BaseModel):
pull_requests_reviewers_id = Column("pull_requests_reviewers_id", Integer(), nullable=False, primary_key=True)
pull_request_id = Column("pull_request_id", Integer(), ForeignKey("pull_requests.pull_request_id"), nullable=False)
user_id = Column("user_id", Integer(), ForeignKey("users.user_id"), nullable=True)
_reasons = Column("reason", MutationList.as_mutable(JsonType("list", dialect_map=dict(mysql=UnicodeText(16384)))))
_reasons = Column(
"reason", MutationList.as_mutable(JsonType("list", dialect_map=dict(mysql=UnicodeText(DEFAULT_JSON_OBJ_SIZE))))
)
mandatory = Column("mandatory", Boolean(), nullable=False, default=False)
role = Column("role", Unicode(255), nullable=True, default=ROLE_REVIEWER)
@ -4867,7 +4899,7 @@ class PullRequestReviewers(Base, BaseModel):
user = relationship("User")
pull_request = relationship("PullRequest", back_populates="reviewers")
rule_data = Column("rule_data_json", JsonType(dialect_map=dict(mysql=UnicodeText(16384))))
rule_data = Column("rule_data_json", JsonType(dialect_map=dict(mysql=UnicodeText(DEFAULT_JSON_OBJ_SIZE))))
def rule_user_group_data(self):
"""
@ -5232,7 +5264,9 @@ class Integration(Base, BaseModel):
name = Column("name", String(255), nullable=False)
child_repos_only = Column("child_repos_only", Boolean(), nullable=False, default=False)
settings = Column("settings_json", MutationObj.as_mutable(JsonType(dialect_map=dict(mysql=UnicodeText(16384)))))
settings = Column(
"settings_json", MutationObj.as_mutable(JsonType(dialect_map=dict(mysql=UnicodeText(DEFAULT_JSON_OBJ_SIZE))))
)
repo_id = Column("repo_id", Integer(), ForeignKey("repositories.repo_id"), nullable=True, unique=None, default=None)
repo = relationship("Repository", lazy="joined", back_populates="integrations")