forms.py
668 lines
| 25.3 KiB
| text/x-python
|
PythonLexer
r5088 | # Copyright (C) 2010-2023 RhodeCode GmbH | |||
r1 | # | |||
# This program is free software: you can redistribute it and/or modify | ||||
# it under the terms of the GNU Affero General Public License, version 3 | ||||
# (only), as published by the Free Software Foundation. | ||||
# | ||||
# This program is distributed in the hope that it will be useful, | ||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
# GNU General Public License for more details. | ||||
# | ||||
# You should have received a copy of the GNU Affero General Public License | ||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
# | ||||
# This program is dual-licensed. If you wish to learn more about the | ||||
# RhodeCode Enterprise Edition, including its added features, Support services, | ||||
# and proprietary license terms, please see https://rhodecode.com/licenses/ | ||||
""" | ||||
this is forms validation classes | ||||
http://formencode.org/module-formencode.validators.html | ||||
for list off all availible validators | ||||
we can create our own validators | ||||
The table below outlines the options which can be used in a schema in addition to the validators themselves | ||||
pre_validators [] These validators will be applied before the schema | ||||
chained_validators [] These validators will be applied after the schema | ||||
allow_extra_fields False If True, then it is not an error when keys that aren't associated with a validator are present | ||||
filter_extra_fields False If True, then keys that aren't associated with a validator are removed | ||||
if_key_missing NoDefault If this is given, then any keys that aren't available but are expected will be replaced with this value (and then validated). This does not override a present .if_missing attribute on validators. NoDefault is a special FormEncode class to mean that no default values has been specified and therefore missing keys shouldn't take a default value. | ||||
ignore_key_missing False If True, then missing keys will be missing in the result, if the validator doesn't have .if_missing on it already | ||||
<name> = formencode.validators.<name of validator> | ||||
<name> must equal form name | ||||
list=[1,2,3,4,5] | ||||
for SELECT use formencode.All(OneOf(list), Int()) | ||||
""" | ||||
r518 | import deform | |||
r519 | import logging | |||
import formencode | ||||
r518 | from pkg_resources import resource_filename | |||
r519 | from formencode import All, Pipe | |||
r1918 | from pyramid.threadlocal import get_current_request | |||
r519 | ||||
from rhodecode import BACKENDS | ||||
from rhodecode.lib import helpers | ||||
from rhodecode.model import validators as v | ||||
log = logging.getLogger(__name__) | ||||
r518 | ||||
deform_templates = resource_filename('deform', 'templates') | ||||
rhodecode_templates = resource_filename('rhodecode', 'templates/forms') | ||||
search_path = (rhodecode_templates, deform_templates) | ||||
r519 | ||||
class RhodecodeFormZPTRendererFactory(deform.ZPTRendererFactory): | ||||
""" Subclass of ZPTRendererFactory to add rhodecode context variables """ | ||||
def __call__(self, template_name, **kw): | ||||
kw['h'] = helpers | ||||
r1918 | kw['request'] = get_current_request() | |||
r519 | return self.load(template_name)(**kw) | |||
r518 | ||||
r519 | form_renderer = RhodecodeFormZPTRendererFactory(search_path) | |||
deform.Form.set_default_renderer(form_renderer) | ||||
r1 | ||||
r2351 | def LoginForm(localizer): | |||
_ = localizer | ||||
r1 | class _LoginForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
username = v.UnicodeString( | ||||
strip=True, | ||||
min=1, | ||||
not_empty=True, | ||||
messages={ | ||||
r5096 | 'empty': _('Please enter a login'), | |||
'tooShort': _('Enter a value %(min)i characters long or more') | ||||
r1 | } | |||
) | ||||
password = v.UnicodeString( | ||||
strip=False, | ||||
min=3, | ||||
r2192 | max=72, | |||
r1 | not_empty=True, | |||
messages={ | ||||
r5096 | 'empty': _('Please enter a password'), | |||
'tooShort': _('Enter %(min)i characters or more')} | ||||
r1 | ) | |||
remember = v.StringBoolean(if_missing=False) | ||||
r2351 | chained_validators = [v.ValidAuth(localizer)] | |||
r1 | return _LoginForm | |||
r5360 | def TOTPForm(localizer, user, allow_recovery_code_use=False): | |||
_ = localizer | ||||
class _TOTPForm(formencode.Schema): | ||||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
totp = v.Regex(r'^(?:\d{6}|[A-Z0-9]{32})$') | ||||
r5367 | secret_totp = v.String() | |||
r5360 | ||||
def to_python(self, value, state=None): | ||||
validation_checks = [user.is_totp_valid] | ||||
if allow_recovery_code_use: | ||||
validation_checks.append(user.is_2fa_recovery_code_valid) | ||||
form_data = super().to_python(value, state) | ||||
received_code = form_data['totp'] | ||||
r5367 | secret = form_data.get('secret_totp') | |||
if not any(map(lambda func: func(received_code, secret), validation_checks)): | ||||
r5360 | error_msg = _('Code is invalid. Try again!') | |||
raise formencode.Invalid(error_msg, v, state, error_dict={'totp': error_msg}) | ||||
r5367 | return form_data | |||
r5360 | ||||
return _TOTPForm | ||||
r5522 | def WhitelistedVcsClientsForm(localizer): | |||
_ = localizer | ||||
class _WhitelistedVcsClientsForm(formencode.Schema): | ||||
regexp = r'^(?:\s*[<>=~^!]*\s*\d{1,2}\.\d{1,2}(?:\.\d{1,2})?\s*|\*)\s*(?:,\s*[<>=~^!]*\s*\d{1,2}\.\d{1,2}(?:\.\d{1,2})?\s*|\s*\*\s*)*$' | ||||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
git = v.Regex(regexp) | ||||
hg = v.Regex(regexp) | ||||
svn = v.Regex(regexp) | ||||
return _WhitelistedVcsClientsForm | ||||
r2351 | def UserForm(localizer, edit=False, available_languages=None, old_data=None): | |||
old_data = old_data or {} | ||||
available_languages = available_languages or [] | ||||
_ = localizer | ||||
r1 | class _UserForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
username = All(v.UnicodeString(strip=True, min=1, not_empty=True), | ||||
r2351 | v.ValidUsername(localizer, edit, old_data)) | |||
r1 | if edit: | |||
new_password = All( | ||||
r2351 | v.ValidPassword(localizer), | |||
r2192 | v.UnicodeString(strip=False, min=6, max=72, not_empty=False) | |||
r1 | ) | |||
password_confirmation = All( | ||||
r2351 | v.ValidPassword(localizer), | |||
r2192 | v.UnicodeString(strip=False, min=6, max=72, not_empty=False), | |||
r1 | ) | |||
admin = v.StringBoolean(if_missing=False) | ||||
else: | ||||
password = All( | ||||
r2351 | v.ValidPassword(localizer), | |||
r2192 | v.UnicodeString(strip=False, min=6, max=72, not_empty=True) | |||
r1 | ) | |||
password_confirmation = All( | ||||
r2351 | v.ValidPassword(localizer), | |||
r2192 | v.UnicodeString(strip=False, min=6, max=72, not_empty=False) | |||
r1 | ) | |||
password_change = v.StringBoolean(if_missing=False) | ||||
create_repo_group = v.StringBoolean(if_missing=False) | ||||
active = v.StringBoolean(if_missing=False) | ||||
firstname = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
lastname = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
r2391 | email = All(v.UniqSystemEmail(localizer, old_data), v.Email(not_empty=True)) | |||
r4056 | description = v.UnicodeString(strip=True, min=1, max=250, not_empty=False, | |||
if_missing='') | ||||
r1 | extern_name = v.UnicodeString(strip=True) | |||
extern_type = v.UnicodeString(strip=True) | ||||
language = v.OneOf(available_languages, hideList=False, | ||||
testValueList=True, if_missing=None) | ||||
r2351 | chained_validators = [v.ValidPasswordsMatch(localizer)] | |||
r1 | return _UserForm | |||
r2351 | def UserGroupForm(localizer, edit=False, old_data=None, allow_disabled=False): | |||
r224 | old_data = old_data or {} | |||
r2351 | _ = localizer | |||
r224 | ||||
r1 | class _UserGroupForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
users_group_name = All( | ||||
v.UnicodeString(strip=True, min=1, not_empty=True), | ||||
r2351 | v.ValidUserGroup(localizer, edit, old_data) | |||
r1 | ) | |||
user_group_description = v.UnicodeString(strip=True, min=1, | ||||
not_empty=False) | ||||
users_group_active = v.StringBoolean(if_missing=False) | ||||
if edit: | ||||
r224 | # this is user group owner | |||
user = All( | ||||
v.UnicodeString(not_empty=True), | ||||
r2351 | v.ValidRepoUser(localizer, allow_disabled)) | |||
r1 | return _UserGroupForm | |||
r2351 | def RepoGroupForm(localizer, edit=False, old_data=None, available_groups=None, | |||
can_create_in_root=False, allow_disabled=False): | ||||
_ = localizer | ||||
r224 | old_data = old_data or {} | |||
available_groups = available_groups or [] | ||||
r1 | class _RepoGroupForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
group_name = All(v.UnicodeString(strip=True, min=1, not_empty=True), | ||||
r2351 | v.SlugifyName(localizer),) | |||
r1 | group_description = v.UnicodeString(strip=True, min=1, | |||
not_empty=False) | ||||
group_copy_permissions = v.StringBoolean(if_missing=False) | ||||
group_parent_id = v.OneOf(available_groups, hideList=False, | ||||
testValueList=True, not_empty=True) | ||||
enable_locking = v.StringBoolean(if_missing=False) | ||||
r224 | chained_validators = [ | |||
r2351 | v.ValidRepoGroup(localizer, edit, old_data, can_create_in_root)] | |||
r1 | ||||
if edit: | ||||
r224 | # this is repo group owner | |||
user = All( | ||||
v.UnicodeString(not_empty=True), | ||||
r2351 | v.ValidRepoUser(localizer, allow_disabled)) | |||
r1 | return _RepoGroupForm | |||
r2351 | def RegisterForm(localizer, edit=False, old_data=None): | |||
_ = localizer | ||||
old_data = old_data or {} | ||||
r1 | class _RegisterForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
username = All( | ||||
r2351 | v.ValidUsername(localizer, edit, old_data), | |||
r1 | v.UnicodeString(strip=True, min=1, not_empty=True) | |||
) | ||||
password = All( | ||||
r2351 | v.ValidPassword(localizer), | |||
r2192 | v.UnicodeString(strip=False, min=6, max=72, not_empty=True) | |||
r1 | ) | |||
password_confirmation = All( | ||||
r2351 | v.ValidPassword(localizer), | |||
r2192 | v.UnicodeString(strip=False, min=6, max=72, not_empty=True) | |||
r1 | ) | |||
active = v.StringBoolean(if_missing=False) | ||||
firstname = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
lastname = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
r2391 | email = All(v.UniqSystemEmail(localizer, old_data), v.Email(not_empty=True)) | |||
r1 | ||||
r2351 | chained_validators = [v.ValidPasswordsMatch(localizer)] | |||
r1 | return _RegisterForm | |||
r2351 | def PasswordResetForm(localizer): | |||
_ = localizer | ||||
r1 | class _PasswordResetForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
r2351 | email = All(v.ValidSystemEmail(localizer), v.Email(not_empty=True)) | |||
r1 | return _PasswordResetForm | |||
r3881 | def RepoForm(localizer, edit=False, old_data=None, repo_groups=None, allow_disabled=False): | |||
r2351 | _ = localizer | |||
r1 | old_data = old_data or {} | |||
repo_groups = repo_groups or [] | ||||
supported_backends = BACKENDS.keys() | ||||
class _RepoForm(formencode.Schema): | ||||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True), | ||||
r2351 | v.SlugifyName(localizer), v.CannotHaveGitSuffix(localizer)) | |||
repo_group = All(v.CanWriteGroup(localizer, old_data), | ||||
r1 | v.OneOf(repo_groups, hideList=True)) | |||
repo_type = v.OneOf(supported_backends, required=False, | ||||
if_missing=old_data.get('repo_type')) | ||||
repo_description = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
repo_private = v.StringBoolean(if_missing=False) | ||||
repo_copy_permissions = v.StringBoolean(if_missing=False) | ||||
clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False)) | ||||
repo_enable_statistics = v.StringBoolean(if_missing=False) | ||||
repo_enable_downloads = v.StringBoolean(if_missing=False) | ||||
repo_enable_locking = v.StringBoolean(if_missing=False) | ||||
if edit: | ||||
# this is repo owner | ||||
r224 | user = All( | |||
v.UnicodeString(not_empty=True), | ||||
r2351 | v.ValidRepoUser(localizer, allow_disabled)) | |||
r1 | clone_uri_change = v.UnicodeString( | |||
not_empty=False, if_missing=v.Missing) | ||||
r2351 | chained_validators = [v.ValidCloneUri(localizer), | |||
v.ValidRepoName(localizer, edit, old_data)] | ||||
r1 | return _RepoForm | |||
r2351 | def RepoPermsForm(localizer): | |||
_ = localizer | ||||
r1 | class _RepoPermsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
r2351 | chained_validators = [v.ValidPerms(localizer, type_='repo')] | |||
r1 | return _RepoPermsForm | |||
r2351 | def RepoGroupPermsForm(localizer, valid_recursive_choices): | |||
_ = localizer | ||||
r1 | class _RepoGroupPermsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
recursive = v.OneOf(valid_recursive_choices) | ||||
r2351 | chained_validators = [v.ValidPerms(localizer, type_='repo_group')] | |||
r1 | return _RepoGroupPermsForm | |||
r2351 | def UserGroupPermsForm(localizer): | |||
_ = localizer | ||||
r1 | class _UserPermsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
r2351 | chained_validators = [v.ValidPerms(localizer, type_='user_group')] | |||
r1 | return _UserPermsForm | |||
r2351 | def RepoFieldForm(localizer): | |||
_ = localizer | ||||
r1 | class _RepoFieldForm(formencode.Schema): | |||
filter_extra_fields = True | ||||
allow_extra_fields = True | ||||
r2351 | new_field_key = All(v.FieldKey(localizer), | |||
r1 | v.UnicodeString(strip=True, min=3, not_empty=True)) | |||
r5096 | new_field_value = v.UnicodeString(not_empty=False, if_missing='') | |||
r1 | new_field_type = v.OneOf(['str', 'unicode', 'list', 'tuple'], | |||
if_missing='str') | ||||
new_field_label = v.UnicodeString(not_empty=False) | ||||
new_field_desc = v.UnicodeString(not_empty=False) | ||||
return _RepoFieldForm | ||||
r2351 | def RepoForkForm(localizer, edit=False, old_data=None, | |||
r3881 | supported_backends=BACKENDS.keys(), repo_groups=None): | |||
r2351 | _ = localizer | |||
old_data = old_data or {} | ||||
repo_groups = repo_groups or [] | ||||
r1 | class _RepoForkForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True), | ||||
r2351 | v.SlugifyName(localizer)) | |||
repo_group = All(v.CanWriteGroup(localizer, ), | ||||
r1 | v.OneOf(repo_groups, hideList=True)) | |||
r2351 | repo_type = All(v.ValidForkType(localizer, old_data), v.OneOf(supported_backends)) | |||
r1 | description = v.UnicodeString(strip=True, min=1, not_empty=True) | |||
private = v.StringBoolean(if_missing=False) | ||||
copy_permissions = v.StringBoolean(if_missing=False) | ||||
fork_parent_id = v.UnicodeString() | ||||
r2351 | chained_validators = [v.ValidForkName(localizer, edit, old_data)] | |||
r1 | return _RepoForkForm | |||
r2351 | def ApplicationSettingsForm(localizer): | |||
_ = localizer | ||||
r1 | class _ApplicationSettingsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
rhodecode_title = v.UnicodeString(strip=True, max=40, not_empty=False) | ||||
rhodecode_realm = v.UnicodeString(strip=True, min=1, not_empty=True) | ||||
rhodecode_pre_code = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
rhodecode_post_code = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
rhodecode_captcha_public_key = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
rhodecode_captcha_private_key = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
r1094 | rhodecode_create_personal_repo_group = v.StringBoolean(if_missing=False) | |||
rhodecode_personal_repo_group_pattern = v.UnicodeString(strip=True, min=1, not_empty=False) | ||||
r1 | return _ApplicationSettingsForm | |||
r2351 | def ApplicationVisualisationForm(localizer): | |||
r2616 | from rhodecode.model.db import Repository | |||
r2351 | _ = localizer | |||
r1 | class _ApplicationVisualisationForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
rhodecode_show_public_icon = v.StringBoolean(if_missing=False) | ||||
rhodecode_show_private_icon = v.StringBoolean(if_missing=False) | ||||
rhodecode_stylify_metatags = v.StringBoolean(if_missing=False) | ||||
rhodecode_repository_fields = v.StringBoolean(if_missing=False) | ||||
rhodecode_lightweight_journal = v.StringBoolean(if_missing=False) | ||||
rhodecode_dashboard_items = v.Int(min=5, not_empty=True) | ||||
rhodecode_admin_grid_items = v.Int(min=5, not_empty=True) | ||||
rhodecode_show_version = v.StringBoolean(if_missing=False) | ||||
rhodecode_use_gravatar = v.StringBoolean(if_missing=False) | ||||
rhodecode_markup_renderer = v.OneOf(['markdown', 'rst']) | ||||
rhodecode_gravatar_url = v.UnicodeString(min=3) | ||||
r2616 | rhodecode_clone_uri_tmpl = v.UnicodeString(not_empty=False, if_empty=Repository.DEFAULT_CLONE_URI) | |||
r4629 | rhodecode_clone_uri_id_tmpl = v.UnicodeString(not_empty=False, if_empty=Repository.DEFAULT_CLONE_URI_ID) | |||
r2616 | rhodecode_clone_uri_ssh_tmpl = v.UnicodeString(not_empty=False, if_empty=Repository.DEFAULT_CLONE_URI_SSH) | |||
r1 | rhodecode_support_url = v.UnicodeString() | |||
rhodecode_show_revision_number = v.StringBoolean(if_missing=False) | ||||
rhodecode_show_sha_length = v.Int(min=4, not_empty=True) | ||||
return _ApplicationVisualisationForm | ||||
class _BaseVcsSettingsForm(formencode.Schema): | ||||
r2351 | ||||
r1 | allow_extra_fields = True | |||
filter_extra_fields = False | ||||
hooks_changegroup_repo_size = v.StringBoolean(if_missing=False) | ||||
hooks_changegroup_push_logger = v.StringBoolean(if_missing=False) | ||||
hooks_outgoing_pull_logger = v.StringBoolean(if_missing=False) | ||||
r1570 | # PR/Code-review | |||
rhodecode_pr_merge_enabled = v.StringBoolean(if_missing=False) | ||||
rhodecode_use_outdated_comments = v.StringBoolean(if_missing=False) | ||||
# hg | ||||
r1 | extensions_largefiles = v.StringBoolean(if_missing=False) | |||
r1738 | extensions_evolve = v.StringBoolean(if_missing=False) | |||
r1 | phases_publish = v.StringBoolean(if_missing=False) | |||
Mathieu Cantin
|
r2055 | |||
Martin Bornhold
|
r358 | rhodecode_hg_use_rebase_for_merging = v.StringBoolean(if_missing=False) | ||
Mathieu Cantin
|
r2055 | rhodecode_hg_close_branch_before_merging = v.StringBoolean(if_missing=False) | ||
r1 | ||||
r1570 | # git | |||
vcs_git_lfs_enabled = v.StringBoolean(if_missing=False) | ||||
r2056 | rhodecode_git_use_rebase_for_merging = v.StringBoolean(if_missing=False) | |||
rhodecode_git_close_branch_before_merging = v.StringBoolean(if_missing=False) | ||||
r1570 | ||||
Bartłomiej Wołyńczyk
|
r2685 | # cache | ||
rhodecode_diff_cache = v.StringBoolean(if_missing=False) | ||||
r1 | ||||
r2351 | def ApplicationUiSettingsForm(localizer): | |||
_ = localizer | ||||
r1 | class _ApplicationUiSettingsForm(_BaseVcsSettingsForm): | |||
r1563 | largefiles_usercache = All( | |||
r2351 | v.ValidPath(localizer), | |||
r1570 | v.UnicodeString(strip=True, min=2, not_empty=True)) | |||
vcs_git_lfs_store_location = All( | ||||
r2351 | v.ValidPath(localizer), | |||
r1570 | v.UnicodeString(strip=True, min=2, not_empty=True)) | |||
r1 | extensions_hggit = v.StringBoolean(if_missing=False) | |||
r2351 | new_svn_branch = v.ValidSvnPattern(localizer, section='vcs_svn_branch') | |||
new_svn_tag = v.ValidSvnPattern(localizer, section='vcs_svn_tag') | ||||
r1 | return _ApplicationUiSettingsForm | |||
r2351 | def RepoVcsSettingsForm(localizer, repo_name): | |||
_ = localizer | ||||
r1 | class _RepoVcsSettingsForm(_BaseVcsSettingsForm): | |||
inherit_global_settings = v.StringBoolean(if_missing=False) | ||||
r2351 | new_svn_branch = v.ValidSvnPattern(localizer, | |||
r1 | section='vcs_svn_branch', repo_name=repo_name) | |||
r2351 | new_svn_tag = v.ValidSvnPattern(localizer, | |||
r1 | section='vcs_svn_tag', repo_name=repo_name) | |||
return _RepoVcsSettingsForm | ||||
r2351 | def LabsSettingsForm(localizer): | |||
_ = localizer | ||||
r1 | class _LabSettingsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
return _LabSettingsForm | ||||
r1034 | def ApplicationPermissionsForm( | |||
r2351 | localizer, register_choices, password_reset_choices, | |||
extern_activate_choices): | ||||
_ = localizer | ||||
r1 | class _DefaultPermissionsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
anonymous = v.StringBoolean(if_missing=False) | ||||
default_register = v.OneOf(register_choices) | ||||
default_register_message = v.UnicodeString() | ||||
r1034 | default_password_reset = v.OneOf(password_reset_choices) | |||
r1 | default_extern_activate = v.OneOf(extern_activate_choices) | |||
return _DefaultPermissionsForm | ||||
r2351 | def ObjectPermissionsForm(localizer, repo_perms_choices, group_perms_choices, | |||
r1 | user_group_perms_choices): | |||
r2351 | _ = localizer | |||
r1 | class _ObjectPermissionsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
overwrite_default_repo = v.StringBoolean(if_missing=False) | ||||
overwrite_default_group = v.StringBoolean(if_missing=False) | ||||
overwrite_default_user_group = v.StringBoolean(if_missing=False) | ||||
r2975 | ||||
r1 | default_repo_perm = v.OneOf(repo_perms_choices) | |||
default_group_perm = v.OneOf(group_perms_choices) | ||||
default_user_group_perm = v.OneOf(user_group_perms_choices) | ||||
r2975 | ||||
r1 | return _ObjectPermissionsForm | |||
r2975 | def BranchPermissionsForm(localizer, branch_perms_choices): | |||
_ = localizer | ||||
class _BranchPermissionsForm(formencode.Schema): | ||||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
overwrite_default_branch = v.StringBoolean(if_missing=False) | ||||
default_branch_perm = v.OneOf(branch_perms_choices) | ||||
return _BranchPermissionsForm | ||||
r2351 | def UserPermissionsForm(localizer, create_choices, create_on_write_choices, | |||
r1 | repo_group_create_choices, user_group_create_choices, | |||
fork_choices, inherit_default_permissions_choices): | ||||
r2351 | _ = localizer | |||
r1 | class _DefaultPermissionsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
anonymous = v.StringBoolean(if_missing=False) | ||||
default_repo_create = v.OneOf(create_choices) | ||||
default_repo_create_on_write = v.OneOf(create_on_write_choices) | ||||
default_user_group_create = v.OneOf(user_group_create_choices) | ||||
default_repo_group_create = v.OneOf(repo_group_create_choices) | ||||
default_fork_create = v.OneOf(fork_choices) | ||||
default_inherit_default_permissions = v.OneOf(inherit_default_permissions_choices) | ||||
return _DefaultPermissionsForm | ||||
r2351 | def UserIndividualPermissionsForm(localizer): | |||
_ = localizer | ||||
r1 | class _DefaultPermissionsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
inherit_default_permissions = v.StringBoolean(if_missing=False) | ||||
return _DefaultPermissionsForm | ||||
r2351 | def DefaultsForm(localizer, edit=False, old_data=None, supported_backends=BACKENDS.keys()): | |||
_ = localizer | ||||
old_data = old_data or {} | ||||
r1 | class _DefaultsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
default_repo_type = v.OneOf(supported_backends) | ||||
default_repo_private = v.StringBoolean(if_missing=False) | ||||
default_repo_enable_statistics = v.StringBoolean(if_missing=False) | ||||
default_repo_enable_downloads = v.StringBoolean(if_missing=False) | ||||
default_repo_enable_locking = v.StringBoolean(if_missing=False) | ||||
return _DefaultsForm | ||||
r2351 | def AuthSettingsForm(localizer): | |||
_ = localizer | ||||
r1 | class _AuthSettingsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
r2351 | auth_plugins = All(v.ValidAuthPlugins(localizer), | |||
v.UniqueListFromString(localizer)(not_empty=True)) | ||||
r1 | return _AuthSettingsForm | |||
r2351 | def UserExtraEmailForm(localizer): | |||
_ = localizer | ||||
r1 | class _UserExtraEmailForm(formencode.Schema): | |||
r2351 | email = All(v.UniqSystemEmail(localizer), v.Email(not_empty=True)) | |||
r1 | return _UserExtraEmailForm | |||
r2351 | def UserExtraIpForm(localizer): | |||
_ = localizer | ||||
r1 | class _UserExtraIpForm(formencode.Schema): | |||
r2351 | ip = v.ValidIp(localizer)(not_empty=True) | |||
r1 | return _UserExtraIpForm | |||
r2351 | def PullRequestForm(localizer, repo_id): | |||
_ = localizer | ||||
r873 | ||||
class ReviewerForm(formencode.Schema): | ||||
user_id = v.Int(not_empty=True) | ||||
reasons = All() | ||||
r2484 | rules = All(v.UniqueList(localizer, convert=int)()) | |||
r1769 | mandatory = v.StringBoolean() | |||
r4500 | role = v.String(if_missing='reviewer') | |||
class ObserverForm(formencode.Schema): | ||||
user_id = v.Int(not_empty=True) | ||||
reasons = All() | ||||
rules = All(v.UniqueList(localizer, convert=int)()) | ||||
mandatory = v.StringBoolean() | ||||
role = v.String(if_missing='observer') | ||||
r873 | ||||
r1 | class _PullRequestForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = True | ||||
r1769 | common_ancestor = v.UnicodeString(strip=True, required=True) | |||
r1 | source_repo = v.UnicodeString(strip=True, required=True) | |||
source_ref = v.UnicodeString(strip=True, required=True) | ||||
target_repo = v.UnicodeString(strip=True, required=True) | ||||
target_ref = v.UnicodeString(strip=True, required=True) | ||||
r2351 | revisions = All(#v.NotReviewedRevisions(localizer, repo_id)(), | |||
v.UniqueList(localizer)(not_empty=True)) | ||||
r873 | review_members = formencode.ForEach(ReviewerForm()) | |||
r4500 | observer_members = formencode.ForEach(ObserverForm()) | |||
r3647 | pullrequest_title = v.UnicodeString(strip=True, required=True, min=1, max=255) | |||
r1 | pullrequest_desc = v.UnicodeString(strip=True, required=False) | |||
r2903 | description_renderer = v.UnicodeString(strip=True, required=False) | |||
r1 | ||||
return _PullRequestForm | ||||
r2351 | def IssueTrackerPatternsForm(localizer): | |||
_ = localizer | ||||
r1 | class _IssueTrackerPatternsForm(formencode.Schema): | |||
allow_extra_fields = True | ||||
filter_extra_fields = False | ||||
r2351 | chained_validators = [v.ValidPattern(localizer)] | |||
r1 | return _IssueTrackerPatternsForm | |||