tests: fixed some flaky tests

This commit is contained in:
RhodeCode Admin 2025-01-10 10:42:53 +01:00
parent 159899a475
commit e9ad755887
4 changed files with 393 additions and 500 deletions

View file

@ -27,48 +27,48 @@ from rhodecode.lib.pyramid_utils import get_current_request
from rhodecode.lib import rc_cache
from rhodecode.lib.hash_utils import sha1_safe
from rhodecode.lib.html_filters import sanitize_html
from rhodecode.lib.utils2 import (
Optional, AttributeDict, safe_str, remove_prefix, str2bool)
from rhodecode.lib.utils2 import Optional, AttributeDict, safe_str, remove_prefix, str2bool
from rhodecode.lib.vcs.backends import base
from rhodecode.lib.statsd_client import StatsdClient
from rhodecode.model import BaseModel
from rhodecode.model.db import (
RepoRhodeCodeUi, RepoRhodeCodeSetting, RhodeCodeUi, RhodeCodeSetting)
from rhodecode.model.db import RepoRhodeCodeUi, RepoRhodeCodeSetting, RhodeCodeUi, RhodeCodeSetting
from rhodecode.model.meta import Session
log = logging.getLogger(__name__)
UiSetting = namedtuple(
'UiSetting', ['section', 'key', 'value', 'active'])
UiSetting = namedtuple("UiSetting", ["section", "key", "value", "active"])
SOCIAL_PLUGINS_LIST = ['github', 'bitbucket', 'twitter', 'google']
SOCIAL_PLUGINS_LIST = ["github", "bitbucket", "twitter", "google"]
class SettingNotFound(Exception):
def __init__(self, setting_id):
msg = f'Setting `{setting_id}` is not found'
msg = f"Setting `{setting_id}` is not found"
super().__init__(msg)
class SettingsModel(BaseModel):
BUILTIN_HOOKS = (
RhodeCodeUi.HOOK_REPO_SIZE, RhodeCodeUi.HOOK_PUSH,
RhodeCodeUi.HOOK_PRE_PUSH, RhodeCodeUi.HOOK_PRETX_PUSH,
RhodeCodeUi.HOOK_PULL, RhodeCodeUi.HOOK_PRE_PULL,
RhodeCodeUi.HOOK_PUSH_KEY,)
HOOKS_SECTION = 'hooks'
RhodeCodeUi.HOOK_REPO_SIZE,
RhodeCodeUi.HOOK_PUSH,
RhodeCodeUi.HOOK_PRE_PUSH,
RhodeCodeUi.HOOK_PRETX_PUSH,
RhodeCodeUi.HOOK_PULL,
RhodeCodeUi.HOOK_PRE_PULL,
RhodeCodeUi.HOOK_PUSH_KEY,
)
HOOKS_SECTION = "hooks"
def __init__(self, sa=None, repo=None):
self.repo = repo
self.UiDbModel = RepoRhodeCodeUi if repo else RhodeCodeUi
self.SettingsDbModel = (
RepoRhodeCodeSetting if repo else RhodeCodeSetting)
self.SettingsDbModel = RepoRhodeCodeSetting if repo else RhodeCodeSetting
super().__init__(sa)
def get_keyname(self, key_name, prefix='rhodecode_'):
return f'{prefix}{key_name}'
def get_keyname(self, key_name, prefix="rhodecode_"):
return f"{prefix}{key_name}"
def get_ui_by_key(self, key):
q = self.UiDbModel.query()
@ -101,8 +101,7 @@ class SettingsModel(BaseModel):
# TODO: mikhail: add caching
result = [
UiSetting(
section=safe_str(r.ui_section), key=safe_str(r.ui_key),
value=safe_str(r.ui_value), active=r.ui_active
section=safe_str(r.ui_section), key=safe_str(r.ui_key), value=safe_str(r.ui_value), active=r.ui_active
)
for r in q.all()
]
@ -124,7 +123,7 @@ class SettingsModel(BaseModel):
new_ui.ui_value = val
new_ui.ui_active = active
repository_id = ''
repository_id = ""
if self.repo:
repo = self._get_repo(self.repo)
repository_id = repo.repo_id
@ -133,9 +132,9 @@ class SettingsModel(BaseModel):
if not key:
# keys are unique so they need appended info
if self.repo:
key = sha1_safe(f'{section}{val}{repository_id}')
key = sha1_safe(f"{section}{val}{repository_id}")
else:
key = sha1_safe(f'{section}{val}')
key = sha1_safe(f"{section}{val}")
new_ui.ui_key = key
@ -143,9 +142,7 @@ class SettingsModel(BaseModel):
return new_ui
def create_or_update_hook(self, key, value):
ui = (
self.get_ui_by_section_and_key(self.HOOKS_SECTION, key) or
self.UiDbModel())
ui = self.get_ui_by_section_and_key(self.HOOKS_SECTION, key) or self.UiDbModel()
ui.ui_section = self.HOOKS_SECTION
ui.ui_active = True
ui.ui_key = key
@ -171,7 +168,8 @@ class SettingsModel(BaseModel):
return q.scalar()
def create_or_update_setting(
self, name, val: Optional | str = Optional(''), type_: Optional | str = Optional('unicode')):
self, name, val: Optional | str = Optional(""), type_: Optional | str = Optional("unicode")
):
"""
Creates or updates RhodeCode setting. If updates are triggered, it will
only update parameters that are explicitly set Optional instance will
@ -190,9 +188,7 @@ class SettingsModel(BaseModel):
val = Optional.extract(val)
type_ = Optional.extract(type_)
args = (
(repo.repo_id, name, val, type_)
if repo else (name, val, type_))
args = (repo.repo_id, name, val, type_) if repo else (name, val, type_)
res = self.SettingsDbModel(*args)
else:
@ -213,14 +209,15 @@ class SettingsModel(BaseModel):
def get_cache_region(self):
repo = self._get_repo(self.repo) if self.repo else None
cache_key = f"repo.v1.{repo.repo_id}" if repo else "repo.v1.ALL"
cache_namespace_uid = f'cache_settings.{cache_key}'
region = rc_cache.get_or_create_region('cache_general', cache_namespace_uid)
cache_namespace_uid = f"cache_settings.{cache_key}"
region = rc_cache.get_or_create_region("cache_general", cache_namespace_uid)
return region, cache_namespace_uid
def invalidate_settings_cache(self, hard=False):
region, namespace_key = self.get_cache_region()
log.debug('Invalidation cache [%s] region %s for cache_key: %s',
'invalidate_settings_cache', region, namespace_key)
log.debug(
"Invalidation cache [%s] region %s for cache_key: %s", "invalidate_settings_cache", region, namespace_key
)
# we use hard cleanup if invalidation is sent
rc_cache.clear_cache_namespace(region, namespace_key, method=rc_cache.CLEAR_DELETE)
@ -232,13 +229,11 @@ class SettingsModel(BaseModel):
def _get_all_settings(name, key):
q = self._get_settings_query()
if not q:
raise Exception('Could not get application settings !')
raise Exception("Could not get application settings !")
settings = {
self.get_keyname(res.app_settings_name): res.app_settings_value
for res in q
}
settings = {self.get_keyname(res.app_settings_name): res.app_settings_value for res in q}
return settings
return _get_all_settings
def get_all_settings(self, cache=False, from_request=True):
@ -250,7 +245,8 @@ class SettingsModel(BaseModel):
if from_request and not repo:
request = get_current_request()
if request and hasattr(request, 'call_context') and hasattr(request.call_context, 'rc_config'):
if request and hasattr(request, "call_context") and hasattr(request.call_context, "rc_config"):
log.debug("Using cached request settings [%s]", request.call_context.rc_config)
rc_config = request.call_context.rc_config
if rc_config:
return rc_config
@ -259,27 +255,24 @@ class SettingsModel(BaseModel):
_get_all_settings = self.get_cache_call_method(cache=cache)
start = time.time()
result = _get_all_settings('rhodecode_settings', cache_key)
result = _get_all_settings("rhodecode_settings", cache_key)
compute_time = time.time() - start
log.debug('cached method:%s took %.4fs', _get_all_settings.__name__, compute_time)
log.debug("cached method:%s took %.4fs", _get_all_settings.__name__, compute_time)
statsd = StatsdClient.statsd
if statsd:
elapsed_time_ms = round(1000.0 * compute_time) # use ms only
statsd.timing("rhodecode_settings_timing.histogram", elapsed_time_ms,
use_decimals=False)
statsd.timing("rhodecode_settings_timing.histogram", elapsed_time_ms, use_decimals=False)
log.debug('Fetching app settings for key: %s took: %.4fs: cache: %s', cache_key, compute_time, cache)
log.debug("Fetching app settings for key: %s took: %.4fs: cache: %s", cache_key, compute_time, cache)
return result
def get_auth_settings(self):
q = self._get_settings_query()
q = q.filter(
self.SettingsDbModel.app_settings_name.startswith('auth_'))
q = q.filter(self.SettingsDbModel.app_settings_name.startswith("auth_"))
rows = q.all()
auth_settings = {
row.app_settings_name: row.app_settings_value for row in rows}
auth_settings = {row.app_settings_name: row.app_settings_value for row in rows}
return auth_settings
def get_auth_plugins(self):
@ -288,23 +281,21 @@ class SettingsModel(BaseModel):
def get_default_repo_settings(self, strip_prefix=False):
q = self._get_settings_query()
q = q.filter(
self.SettingsDbModel.app_settings_name.startswith('default_'))
q = q.filter(self.SettingsDbModel.app_settings_name.startswith("default_"))
rows = q.all()
result = {}
for row in rows:
key = row.app_settings_name
if strip_prefix:
key = remove_prefix(key, prefix='default_')
key = remove_prefix(key, prefix="default_")
result.update({key: row.app_settings_value})
return result
def get_repo(self):
repo = self._get_repo(self.repo)
if not repo:
raise Exception(
f'Repository `{self.repo}` cannot be found inside the database')
raise Exception(f"Repository `{self.repo}` cannot be found inside the database")
return repo
def _filter_by_repo(self, model, query):
@ -325,7 +316,7 @@ class SettingsModel(BaseModel):
def list_enabled_social_plugins(self, settings):
enabled = []
for plug in SOCIAL_PLUGINS_LIST:
if str2bool(settings.get(f'rhodecode_auth_{plug}_enabled')):
if str2bool(settings.get(f"rhodecode_auth_{plug}_enabled")):
enabled.append(plug)
return enabled
@ -334,14 +325,15 @@ def assert_repo_settings(func):
@functools.wraps(func)
def _wrapper(self, *args, **kwargs):
if not self.repo_settings:
raise Exception('Repository is not specified')
raise Exception("Repository is not specified")
return func(self, *args, **kwargs)
return _wrapper
class IssueTrackerSettingsModel(object):
INHERIT_SETTINGS = 'inherit_issue_tracker_settings'
SETTINGS_PREFIX = 'issuetracker_'
INHERIT_SETTINGS = "inherit_issue_tracker_settings"
SETTINGS_PREFIX = "issuetracker_"
def __init__(self, sa=None, repo=None):
self.global_settings = SettingsModel(sa=sa)
@ -357,48 +349,49 @@ class IssueTrackerSettingsModel(object):
@inherit_global_settings.setter
def inherit_global_settings(self, value):
if self.repo_settings:
settings = self.repo_settings.create_or_update_setting(
self.INHERIT_SETTINGS, value, type_='bool')
settings = self.repo_settings.create_or_update_setting(self.INHERIT_SETTINGS, value, type_="bool")
Session().add(settings)
def _get_keyname(self, key, uid, prefix='rhodecode_'):
return f'{prefix}{self.SETTINGS_PREFIX}{key}_{uid}'
def _get_keyname(self, key, uid, prefix="rhodecode_"):
return f"{prefix}{self.SETTINGS_PREFIX}{key}_{uid}"
def _make_dict_for_settings(self, qs):
prefix_match = self._get_keyname('pat', '',)
prefix_match = self._get_keyname(
"pat",
"",
)
issuetracker_entries = {}
# create keys
for k, v in qs.items():
if k.startswith(prefix_match):
uid = k[len(prefix_match):]
uid = k[len(prefix_match) :]
issuetracker_entries[uid] = None
def url_cleaner(input_str):
input_str = input_str.replace('"', '').replace("'", '')
input_str = input_str.replace('"', "").replace("'", "")
input_str = sanitize_html(input_str, strip=True)
return input_str
# populate
for uid in issuetracker_entries:
url_data = qs.get(self._get_keyname('url', uid))
url_data = qs.get(self._get_keyname("url", uid))
pat = qs.get(self._get_keyname('pat', uid))
pat = qs.get(self._get_keyname("pat", uid))
try:
pat_compiled = re.compile(r'%s' % pat)
pat_compiled = re.compile(r"%s" % pat)
except re.error:
pat_compiled = None
issuetracker_entries[uid] = AttributeDict({
'pat': pat,
'pat_compiled': pat_compiled,
'url': url_cleaner(
qs.get(self._get_keyname('url', uid)) or ''),
'pref': sanitize_html(
qs.get(self._get_keyname('pref', uid)) or ''),
'desc': qs.get(
self._get_keyname('desc', uid)),
})
issuetracker_entries[uid] = AttributeDict(
{
"pat": pat,
"pat_compiled": pat_compiled,
"url": url_cleaner(qs.get(self._get_keyname("url", uid)) or ""),
"pref": sanitize_html(qs.get(self._get_keyname("pref", uid)) or ""),
"desc": qs.get(self._get_keyname("desc", uid)),
}
)
return issuetracker_entries
@ -415,7 +408,7 @@ class IssueTrackerSettingsModel(object):
Returns list of issue tracker settings per repository
"""
if not self.repo_settings:
raise Exception('Repository is not specified')
raise Exception("Repository is not specified")
all_settings = self.repo_settings.get_all_settings(cache=cache)
settings = self._make_dict_for_settings(all_settings)
return settings
@ -436,76 +429,67 @@ class IssueTrackerSettingsModel(object):
entries = all_patterns.get(uid, [])
for del_key in entries:
setting_name = self._get_keyname(del_key, uid, prefix='')
setting_name = self._get_keyname(del_key, uid, prefix="")
entry = settings_model.get_setting_by_name(setting_name)
if entry:
Session().delete(entry)
Session().commit()
def create_or_update_setting(
self, name, val=Optional(''), type_=Optional('unicode')):
def create_or_update_setting(self, name, val=Optional(""), type_=Optional("unicode")):
if self.repo_settings:
setting = self.repo_settings.create_or_update_setting(
name, val, type_)
setting = self.repo_settings.create_or_update_setting(name, val, type_)
else:
setting = self.global_settings.create_or_update_setting(
name, val, type_)
setting = self.global_settings.create_or_update_setting(name, val, type_)
return setting
class VcsSettingsModel(object):
INHERIT_SETTINGS = 'inherit_vcs_settings'
INHERIT_SETTINGS = "inherit_vcs_settings"
GENERAL_SETTINGS = (
'use_outdated_comments',
'pr_merge_enabled',
'auto_merge_enabled',
'hg_use_rebase_for_merging',
'hg_close_branch_before_merging',
'git_use_rebase_for_merging',
'git_close_branch_before_merging',
'diff_cache',
"use_outdated_comments",
"pr_merge_enabled",
"auto_merge_enabled",
"hg_use_rebase_for_merging",
"hg_close_branch_before_merging",
"git_use_rebase_for_merging",
"git_close_branch_before_merging",
"diff_cache",
)
HOOKS_SETTINGS = (
('hooks', 'changegroup.repo_size'),
('hooks', 'changegroup.push_logger'),
('hooks', 'outgoing.pull_logger'),
("hooks", "changegroup.repo_size"),
("hooks", "changegroup.push_logger"),
("hooks", "outgoing.pull_logger"),
)
HG_SETTINGS = (
('extensions', 'largefiles'),
('phases', 'publish'),
('extensions', 'evolve'),
('extensions', 'topic'),
('experimental', 'evolution'),
('experimental', 'evolution.exchange'),
)
GIT_SETTINGS = (
('vcs_git_lfs', 'enabled'),
("extensions", "largefiles"),
("phases", "publish"),
("extensions", "evolve"),
("extensions", "topic"),
("experimental", "evolution"),
("experimental", "evolution.exchange"),
)
GIT_SETTINGS = (("vcs_git_lfs", "enabled"),)
GLOBAL_HG_SETTINGS = (
('extensions', 'largefiles'),
('phases', 'publish'),
('extensions', 'evolve'),
('extensions', 'topic'),
('experimental', 'evolution'),
('experimental', 'evolution.exchange'),
("extensions", "largefiles"),
("phases", "publish"),
("extensions", "evolve"),
("extensions", "topic"),
("experimental", "evolution"),
("experimental", "evolution.exchange"),
)
GLOBAL_GIT_SETTINGS = (
('vcs_git_lfs', 'enabled'),
)
GLOBAL_GIT_SETTINGS = (("vcs_git_lfs", "enabled"),)
SVN_BRANCH_SECTION = 'vcs_svn_branch'
SVN_TAG_SECTION = 'vcs_svn_tag'
PATH_SETTING = ('paths', '/')
SVN_BRANCH_SECTION = "vcs_svn_branch"
SVN_TAG_SECTION = "vcs_svn_tag"
PATH_SETTING = ("paths", "/")
def __init__(self, sa=None, repo=None):
self.global_settings = SettingsModel(sa=sa)
self.repo_settings = SettingsModel(sa=sa, repo=repo) if repo else None
self._ui_settings = (
self.HG_SETTINGS + self.GIT_SETTINGS + self.HOOKS_SETTINGS)
self._ui_settings = self.HG_SETTINGS + self.GIT_SETTINGS + self.HOOKS_SETTINGS
self._svn_sections = (self.SVN_BRANCH_SECTION, self.SVN_TAG_SECTION)
@property
@ -517,11 +501,10 @@ class VcsSettingsModel(object):
@inherit_global_settings.setter
@assert_repo_settings
def inherit_global_settings(self, value):
self.repo_settings.create_or_update_setting(
self.INHERIT_SETTINGS, value, type_='bool')
self.repo_settings.create_or_update_setting(self.INHERIT_SETTINGS, value, type_="bool")
def get_keyname(self, key_name, prefix='rhodecode_'):
return f'{prefix}{key_name}'
def get_keyname(self, key_name, prefix="rhodecode_"):
return f"{prefix}{key_name}"
def get_global_svn_branch_patterns(self):
return self.global_settings.get_ui_by_section(self.SVN_BRANCH_SECTION)
@ -551,24 +534,23 @@ class VcsSettingsModel(object):
return global_settings
@assert_repo_settings
def create_or_update_repo_settings(
self, data, inherit_global_settings=False):
def create_or_update_repo_settings(self, data, inherit_global_settings=False):
from rhodecode.model.scm import ScmModel
self.inherit_global_settings = inherit_global_settings
repo = self.repo_settings.get_repo()
if not inherit_global_settings:
if repo.repo_type == 'svn':
if repo.repo_type == "svn":
self.create_repo_svn_settings(data)
else:
self.create_or_update_repo_hook_settings(data)
self.create_or_update_repo_pr_settings(data)
if repo.repo_type == 'hg':
if repo.repo_type == "hg":
self.create_or_update_repo_hg_settings(data)
if repo.repo_type == 'git':
if repo.repo_type == "git":
self.create_or_update_repo_git_settings(data)
ScmModel().mark_for_invalidation(repo.repo_name, delete=True)
@ -578,17 +560,13 @@ class VcsSettingsModel(object):
for section, key in self.HOOKS_SETTINGS:
data_key = self._get_form_ui_key(section, key)
if data_key not in data:
raise ValueError(
f'The given data does not contain {data_key} key')
raise ValueError(f"The given data does not contain {data_key} key")
active = data.get(data_key)
repo_setting = self.repo_settings.get_ui_by_section_and_key(
section, key)
repo_setting = self.repo_settings.get_ui_by_section_and_key(section, key)
if not repo_setting:
global_setting = self.global_settings.\
get_ui_by_section_and_key(section, key)
self.repo_settings.create_ui_section_value(
section, global_setting.ui_value, key=key, active=active)
global_setting = self.global_settings.get_ui_by_section_and_key(section, key)
self.repo_settings.create_ui_section_value(section, global_setting.ui_value, key=key, active=active)
else:
repo_setting.ui_active = active
Session().add(repo_setting)
@ -597,22 +575,18 @@ class VcsSettingsModel(object):
for section, key in self.HOOKS_SETTINGS:
data_key = self._get_form_ui_key(section, key)
if data_key not in data:
raise ValueError(
f'The given data does not contain {data_key} key')
raise ValueError(f"The given data does not contain {data_key} key")
active = data.get(data_key)
repo_setting = self.global_settings.get_ui_by_section_and_key(
section, key)
repo_setting = self.global_settings.get_ui_by_section_and_key(section, key)
repo_setting.ui_active = active
Session().add(repo_setting)
@assert_repo_settings
def create_or_update_repo_pr_settings(self, data):
return self._create_or_update_general_settings(
self.repo_settings, data)
return self._create_or_update_general_settings(self.repo_settings, data)
def create_or_update_global_pr_settings(self, data):
return self._create_or_update_general_settings(
self.global_settings, data)
return self._create_or_update_general_settings(self.global_settings, data)
@assert_repo_settings
def create_repo_svn_settings(self, data):
@ -622,82 +596,54 @@ class VcsSettingsModel(object):
if is_enabled:
# if evolve is active set evolution=all
self._create_or_update_ui(
settings, *('experimental', 'evolution'), value='all',
active=True)
self._create_or_update_ui(
settings, *('experimental', 'evolution.exchange'), value='yes',
active=True)
self._create_or_update_ui(settings, *("experimental", "evolution"), value="all", active=True)
self._create_or_update_ui(settings, *("experimental", "evolution.exchange"), value="yes", active=True)
# if evolve is active set topics server support
self._create_or_update_ui(
settings, *('extensions', 'topic'), value='',
active=True)
self._create_or_update_ui(settings, *("extensions", "topic"), value="", active=True)
else:
self._create_or_update_ui(
settings, *('experimental', 'evolution'), value='',
active=False)
self._create_or_update_ui(
settings, *('experimental', 'evolution.exchange'), value='no',
active=False)
self._create_or_update_ui(
settings, *('extensions', 'topic'), value='',
active=False)
self._create_or_update_ui(settings, *("experimental", "evolution"), value="", active=False)
self._create_or_update_ui(settings, *("experimental", "evolution.exchange"), value="no", active=False)
self._create_or_update_ui(settings, *("extensions", "topic"), value="", active=False)
@assert_repo_settings
def create_or_update_repo_hg_settings(self, data):
largefiles, phases, evolve = \
self.HG_SETTINGS[:3]
largefiles_key, phases_key, evolve_key = \
self._get_settings_keys(self.HG_SETTINGS[:3], data)
largefiles, phases, evolve = self.HG_SETTINGS[:3]
largefiles_key, phases_key, evolve_key = self._get_settings_keys(self.HG_SETTINGS[:3], data)
self._create_or_update_ui(
self.repo_settings, *largefiles, value='',
active=data[largefiles_key])
self._create_or_update_ui(
self.repo_settings, *evolve, value='',
active=data[evolve_key])
self._create_or_update_ui(self.repo_settings, *largefiles, value="", active=data[largefiles_key])
self._create_or_update_ui(self.repo_settings, *evolve, value="", active=data[evolve_key])
self._set_evolution(self.repo_settings, is_enabled=data[evolve_key])
self._create_or_update_ui(
self.repo_settings, *phases, value=safe_str(data[phases_key]))
self._create_or_update_ui(self.repo_settings, *phases, value=safe_str(data[phases_key]))
def create_or_update_global_hg_settings(self, data):
opts_len = 3
largefiles, phases, evolve \
= self.GLOBAL_HG_SETTINGS[:opts_len]
largefiles_key, phases_key, evolve_key \
= self._get_settings_keys(self.GLOBAL_HG_SETTINGS[:opts_len], data)
largefiles, phases, evolve = self.GLOBAL_HG_SETTINGS[:opts_len]
largefiles_key, phases_key, evolve_key = self._get_settings_keys(self.GLOBAL_HG_SETTINGS[:opts_len], data)
self._create_or_update_ui(
self.global_settings, *largefiles, value='',
active=data[largefiles_key])
self._create_or_update_ui(
self.global_settings, *phases, value=safe_str(data[phases_key]))
self._create_or_update_ui(
self.global_settings, *evolve, value='',
active=data[evolve_key])
self._create_or_update_ui(self.global_settings, *largefiles, value="", active=data[largefiles_key])
self._create_or_update_ui(self.global_settings, *phases, value=safe_str(data[phases_key]))
self._create_or_update_ui(self.global_settings, *evolve, value="", active=data[evolve_key])
self._set_evolution(self.global_settings, is_enabled=data[evolve_key])
def create_or_update_repo_git_settings(self, data):
# NOTE(marcink): # comma makes unpack work properly
lfs_enabled, \
= self.GIT_SETTINGS
(lfs_enabled,) = self.GIT_SETTINGS
lfs_enabled_key, \
= self._get_settings_keys(self.GIT_SETTINGS, data)
(lfs_enabled_key,) = self._get_settings_keys(self.GIT_SETTINGS, data)
self._create_or_update_ui(
self.repo_settings, *lfs_enabled, value=data[lfs_enabled_key],
active=data[lfs_enabled_key])
self.repo_settings, *lfs_enabled, value=data[lfs_enabled_key], active=data[lfs_enabled_key]
)
def create_or_update_global_git_settings(self, data):
lfs_enabled = self.GLOBAL_GIT_SETTINGS[0]
lfs_enabled_key = self._get_settings_keys(self.GLOBAL_GIT_SETTINGS, data)[0]
self._create_or_update_ui(
self.global_settings, *lfs_enabled, value=data[lfs_enabled_key],
active=data[lfs_enabled_key])
self.global_settings, *lfs_enabled, value=data[lfs_enabled_key], active=data[lfs_enabled_key]
)
def create_or_update_global_svn_settings(self, data):
# branch/tags patterns
@ -722,16 +668,12 @@ class VcsSettingsModel(object):
repo_uis = self.repo_settings.get_ui(section, key)
filtered_repo_uis = self._filter_ui_settings(repo_uis)
filtered_repo_uis_keys = [
(s.section, s.key) for s in filtered_repo_uis]
filtered_repo_uis_keys = [(s.section, s.key) for s in filtered_repo_uis]
def _is_global_ui_filtered(ui):
return (
(ui.section, ui.key) in filtered_repo_uis_keys
or ui.section in self._svn_sections)
return (ui.section, ui.key) in filtered_repo_uis_keys or ui.section in self._svn_sections
filtered_global_uis = [
ui for ui in global_uis if not _is_global_ui_filtered(ui)]
filtered_global_uis = [ui for ui in global_uis if not _is_global_ui_filtered(ui)]
return filtered_global_uis + filtered_repo_uis
@ -778,21 +720,16 @@ class VcsSettingsModel(object):
return self.get_repo_general_settings()
def _filter_ui_settings(self, settings):
filtered_settings = [
s for s in settings if self._should_keep_setting(s)]
filtered_settings = [s for s in settings if self._should_keep_setting(s)]
return filtered_settings
def _should_keep_setting(self, setting):
keep = (
(setting.section, setting.key) in self._ui_settings or
setting.section in self._svn_sections)
keep = (setting.section, setting.key) in self._ui_settings or setting.section in self._svn_sections
return keep
def _filter_general_settings(self, settings):
keys = [self.get_keyname(key) for key in self.GENERAL_SETTINGS]
return {
k: settings[k]
for k in settings if k in keys}
return {k: settings[k] for k in settings if k in keys}
def _collect_all_settings(self, global_=False):
settings = self.global_settings if global_ else self.repo_settings
@ -803,9 +740,9 @@ class VcsSettingsModel(object):
result_key = self._get_form_ui_key(section, key)
if ui:
if section in ('hooks', 'extensions'):
if section in ("hooks", "extensions"):
result[result_key] = ui.ui_active
elif result_key in ['vcs_git_lfs_enabled']:
elif result_key in ["vcs_git_lfs_enabled"]:
result[result_key] = ui.ui_active
else:
result[result_key] = ui.ui_value
@ -819,16 +756,13 @@ class VcsSettingsModel(object):
return result
def _get_form_ui_key(self, section, key):
return '{section}_{key}'.format(
section=section, key=key.replace('.', '_'))
return "{section}_{key}".format(section=section, key=key.replace(".", "_"))
def _create_or_update_ui(
self, settings, section, key, value=None, active=None):
def _create_or_update_ui(self, settings, section, key, value=None, active=None):
ui = settings.get_ui_by_section_and_key(section, key)
if not ui:
active = True if active is None else active
settings.create_ui_section_value(
section, value, key=key, active=active)
settings.create_ui_section_value(section, value, key=key, active=active)
else:
if active is not None:
ui.ui_active = active
@ -837,10 +771,7 @@ class VcsSettingsModel(object):
Session().add(ui)
def _create_svn_settings(self, settings, data):
svn_settings = {
'new_svn_branch': self.SVN_BRANCH_SECTION,
'new_svn_tag': self.SVN_TAG_SECTION
}
svn_settings = {"new_svn_branch": self.SVN_BRANCH_SECTION, "new_svn_tag": self.SVN_TAG_SECTION}
for key in svn_settings:
if data.get(key):
settings.create_ui_section_value(svn_settings[key], data[key])
@ -849,16 +780,13 @@ class VcsSettingsModel(object):
for name in self.GENERAL_SETTINGS:
data_key = self.get_keyname(name)
if data_key not in data:
raise ValueError(
f'The given data does not contain {data_key} key')
setting = settings.create_or_update_setting(
name, data[data_key], 'bool')
raise ValueError(f"The given data does not contain {data_key} key")
setting = settings.create_or_update_setting(name, data[data_key], "bool")
Session().add(setting)
def _get_settings_keys(self, settings, data):
data_keys = [self._get_form_ui_key(*s) for s in settings]
for data_key in data_keys:
if data_key not in data:
raise ValueError(
f'The given data does not contain {data_key} key')
raise ValueError(f"The given data does not contain {data_key} key")
return data_keys