##// END OF EJS Templates
release: merge back stable branch into default
marcink -
r2391:d5c3a511 merge default
parent child Browse files
Show More
@@ -0,0 +1,55 b''
1 |RCE| 4.10.5 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2017-11-23
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13
14
15 General
16 ^^^^^^^
17
18 - dependencies: pin against rhodecode-tools 0.13.1. Fixes a cleanup-repos bug.
19
20
21 Security
22 ^^^^^^^^
23
24 - Pull requests: security(low), check for permissions on exposure of repo-refs.
25 Prevents exposure of branches/tags on private repositories.
26 - Metatags: limit the scope of url => metatag to http, https and / links.
27 Prevents possible JS injection in those types of links which is unsafe.
28
29
30 Performance
31 ^^^^^^^^^^^
32
33
34
35 Fixes
36 ^^^^^
37
38
39 - Emails: fixed validation of emails with whitespace in them.
40 - Repo groups: fix bad route redirect on check if user tried to revoke
41 permissions on himself.
42 - Comments: place the left over comments (outdated/misplaced) to the left or
43 right pane in side-by-side diff.
44 - Comments: allow to properly initialize outdated comments that are still attached.
45 Fixes a problem when outdated TODO notes couldn't be properly resolved.
46 - Diffs: fixed problem with rendering no newline at the end of file markers.
47 In case of unified diff that would show incorrect diffs in rare cases.
48 - Settings: fix potential 500 problem on bad data passed in.
49
50
51 Upgrade notes
52 ^^^^^^^^^^^^^
53
54 - Fixes regression in nested repository groups update. No upgrade problems should
55 be expected
@@ -1,28 +1,29 b''
1 1bd3e92b7e2e2d2024152b34bb88dff1db544a71 v4.0.0
1 1bd3e92b7e2e2d2024152b34bb88dff1db544a71 v4.0.0
2 170c5398320ea6cddd50955e88d408794c21d43a v4.0.1
2 170c5398320ea6cddd50955e88d408794c21d43a v4.0.1
3 c3fe200198f5aa34cf2e4066df2881a9cefe3704 v4.1.0
3 c3fe200198f5aa34cf2e4066df2881a9cefe3704 v4.1.0
4 7fd5c850745e2ea821fb4406af5f4bff9b0a7526 v4.1.1
4 7fd5c850745e2ea821fb4406af5f4bff9b0a7526 v4.1.1
5 41c87da28a179953df86061d817bc35533c66dd2 v4.1.2
5 41c87da28a179953df86061d817bc35533c66dd2 v4.1.2
6 baaf9f5bcea3bae0ef12ae20c8b270482e62abb6 v4.2.0
6 baaf9f5bcea3bae0ef12ae20c8b270482e62abb6 v4.2.0
7 32a70c7e56844a825f61df496ee5eaf8c3c4e189 v4.2.1
7 32a70c7e56844a825f61df496ee5eaf8c3c4e189 v4.2.1
8 fa695cdb411d294679ac081d595ac654e5613b03 v4.3.0
8 fa695cdb411d294679ac081d595ac654e5613b03 v4.3.0
9 0e4dc11b58cad833c513fe17bac39e6850edf959 v4.3.1
9 0e4dc11b58cad833c513fe17bac39e6850edf959 v4.3.1
10 8a876f48f5cb1d018b837db28ff928500cb32cfb v4.4.0
10 8a876f48f5cb1d018b837db28ff928500cb32cfb v4.4.0
11 8dd86b410b1aac086ffdfc524ef300f896af5047 v4.4.1
11 8dd86b410b1aac086ffdfc524ef300f896af5047 v4.4.1
12 d2514226abc8d3b4f6fb57765f47d1b6fb360a05 v4.4.2
12 d2514226abc8d3b4f6fb57765f47d1b6fb360a05 v4.4.2
13 27d783325930af6dad2741476c0d0b1b7c8415c2 v4.5.0
13 27d783325930af6dad2741476c0d0b1b7c8415c2 v4.5.0
14 7f2016f352abcbdba4a19d4039c386e9629449da v4.5.1
14 7f2016f352abcbdba4a19d4039c386e9629449da v4.5.1
15 416fec799314c70a5c780fb28b3357b08869333a v4.5.2
15 416fec799314c70a5c780fb28b3357b08869333a v4.5.2
16 27c3b85fafc83143e6678fbc3da69e1615bcac55 v4.6.0
16 27c3b85fafc83143e6678fbc3da69e1615bcac55 v4.6.0
17 5ad13deb9118c2a5243d4032d4d9cc174e5872db v4.6.1
17 5ad13deb9118c2a5243d4032d4d9cc174e5872db v4.6.1
18 2be921e01fa24bb102696ada596f87464c3666f6 v4.7.0
18 2be921e01fa24bb102696ada596f87464c3666f6 v4.7.0
19 7198bdec29c2872c974431d55200d0398354cdb1 v4.7.1
19 7198bdec29c2872c974431d55200d0398354cdb1 v4.7.1
20 bd1c8d230fe741c2dfd7100a0ef39fd0774fd581 v4.7.2
20 bd1c8d230fe741c2dfd7100a0ef39fd0774fd581 v4.7.2
21 9731914f89765d9628dc4dddc84bc9402aa124c8 v4.8.0
21 9731914f89765d9628dc4dddc84bc9402aa124c8 v4.8.0
22 c5a2b7d0e4bbdebc4a62d7b624befe375207b659 v4.9.0
22 c5a2b7d0e4bbdebc4a62d7b624befe375207b659 v4.9.0
23 d9aa3b27ac9f7e78359775c75fedf7bfece232f1 v4.9.1
23 d9aa3b27ac9f7e78359775c75fedf7bfece232f1 v4.9.1
24 4ba4d74981cec5d6b28b158f875a2540952c2f74 v4.10.0
24 4ba4d74981cec5d6b28b158f875a2540952c2f74 v4.10.0
25 0a6821cbd6b0b3c21503002f88800679fa35ab63 v4.10.1
25 0a6821cbd6b0b3c21503002f88800679fa35ab63 v4.10.1
26 434ad90ec8d621f4416074b84f6e9ce03964defb v4.10.2
26 434ad90ec8d621f4416074b84f6e9ce03964defb v4.10.2
27 68baee10e698da2724c6e0f698c03a6abb993bf2 v4.10.3
27 68baee10e698da2724c6e0f698c03a6abb993bf2 v4.10.3
28 00821d3afd1dce3f4767cc353f84a17f7d5218a1 v4.10.4
28 00821d3afd1dce3f4767cc353f84a17f7d5218a1 v4.10.4
29 22f6744ad8cc274311825f63f953e4dee2ea5cb9 v4.10.5
@@ -1,105 +1,106 b''
1 .. _rhodecode-release-notes-ref:
1 .. _rhodecode-release-notes-ref:
2
2
3 Release Notes
3 Release Notes
4 =============
4 =============
5
5
6 |RCE| 4.x Versions
6 |RCE| 4.x Versions
7 ------------------
7 ------------------
8
8
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.10.5.rst
12 release-notes-4.10.4.rst
13 release-notes-4.10.4.rst
13 release-notes-4.10.3.rst
14 release-notes-4.10.3.rst
14 release-notes-4.10.2.rst
15 release-notes-4.10.2.rst
15 release-notes-4.10.1.rst
16 release-notes-4.10.1.rst
16 release-notes-4.10.0.rst
17 release-notes-4.10.0.rst
17 release-notes-4.9.1.rst
18 release-notes-4.9.1.rst
18 release-notes-4.9.0.rst
19 release-notes-4.9.0.rst
19 release-notes-4.8.0.rst
20 release-notes-4.8.0.rst
20 release-notes-4.7.2.rst
21 release-notes-4.7.2.rst
21 release-notes-4.7.1.rst
22 release-notes-4.7.1.rst
22 release-notes-4.7.0.rst
23 release-notes-4.7.0.rst
23 release-notes-4.6.1.rst
24 release-notes-4.6.1.rst
24 release-notes-4.6.0.rst
25 release-notes-4.6.0.rst
25 release-notes-4.5.2.rst
26 release-notes-4.5.2.rst
26 release-notes-4.5.1.rst
27 release-notes-4.5.1.rst
27 release-notes-4.5.0.rst
28 release-notes-4.5.0.rst
28 release-notes-4.4.2.rst
29 release-notes-4.4.2.rst
29 release-notes-4.4.1.rst
30 release-notes-4.4.1.rst
30 release-notes-4.4.0.rst
31 release-notes-4.4.0.rst
31 release-notes-4.3.1.rst
32 release-notes-4.3.1.rst
32 release-notes-4.3.0.rst
33 release-notes-4.3.0.rst
33 release-notes-4.2.1.rst
34 release-notes-4.2.1.rst
34 release-notes-4.2.0.rst
35 release-notes-4.2.0.rst
35 release-notes-4.1.2.rst
36 release-notes-4.1.2.rst
36 release-notes-4.1.1.rst
37 release-notes-4.1.1.rst
37 release-notes-4.1.0.rst
38 release-notes-4.1.0.rst
38 release-notes-4.0.1.rst
39 release-notes-4.0.1.rst
39 release-notes-4.0.0.rst
40 release-notes-4.0.0.rst
40
41
41 |RCE| 3.x Versions
42 |RCE| 3.x Versions
42 ------------------
43 ------------------
43
44
44 .. toctree::
45 .. toctree::
45 :maxdepth: 1
46 :maxdepth: 1
46
47
47 release-notes-3.8.4.rst
48 release-notes-3.8.4.rst
48 release-notes-3.8.3.rst
49 release-notes-3.8.3.rst
49 release-notes-3.8.2.rst
50 release-notes-3.8.2.rst
50 release-notes-3.8.1.rst
51 release-notes-3.8.1.rst
51 release-notes-3.8.0.rst
52 release-notes-3.8.0.rst
52 release-notes-3.7.1.rst
53 release-notes-3.7.1.rst
53 release-notes-3.7.0.rst
54 release-notes-3.7.0.rst
54 release-notes-3.6.1.rst
55 release-notes-3.6.1.rst
55 release-notes-3.6.0.rst
56 release-notes-3.6.0.rst
56 release-notes-3.5.2.rst
57 release-notes-3.5.2.rst
57 release-notes-3.5.1.rst
58 release-notes-3.5.1.rst
58 release-notes-3.5.0.rst
59 release-notes-3.5.0.rst
59 release-notes-3.4.1.rst
60 release-notes-3.4.1.rst
60 release-notes-3.4.0.rst
61 release-notes-3.4.0.rst
61 release-notes-3.3.4.rst
62 release-notes-3.3.4.rst
62 release-notes-3.3.3.rst
63 release-notes-3.3.3.rst
63 release-notes-3.3.2.rst
64 release-notes-3.3.2.rst
64 release-notes-3.3.1.rst
65 release-notes-3.3.1.rst
65 release-notes-3.3.0.rst
66 release-notes-3.3.0.rst
66 release-notes-3.2.3.rst
67 release-notes-3.2.3.rst
67 release-notes-3.2.2.rst
68 release-notes-3.2.2.rst
68 release-notes-3.2.1.rst
69 release-notes-3.2.1.rst
69 release-notes-3.2.0.rst
70 release-notes-3.2.0.rst
70 release-notes-3.1.1.rst
71 release-notes-3.1.1.rst
71 release-notes-3.1.0.rst
72 release-notes-3.1.0.rst
72 release-notes-3.0.2.rst
73 release-notes-3.0.2.rst
73 release-notes-3.0.1.rst
74 release-notes-3.0.1.rst
74 release-notes-3.0.0.rst
75 release-notes-3.0.0.rst
75
76
76 |RCE| 2.x Versions
77 |RCE| 2.x Versions
77 ------------------
78 ------------------
78
79
79 .. toctree::
80 .. toctree::
80 :maxdepth: 1
81 :maxdepth: 1
81
82
82 release-notes-2.2.8.rst
83 release-notes-2.2.8.rst
83 release-notes-2.2.7.rst
84 release-notes-2.2.7.rst
84 release-notes-2.2.6.rst
85 release-notes-2.2.6.rst
85 release-notes-2.2.5.rst
86 release-notes-2.2.5.rst
86 release-notes-2.2.4.rst
87 release-notes-2.2.4.rst
87 release-notes-2.2.3.rst
88 release-notes-2.2.3.rst
88 release-notes-2.2.2.rst
89 release-notes-2.2.2.rst
89 release-notes-2.2.1.rst
90 release-notes-2.2.1.rst
90 release-notes-2.2.0.rst
91 release-notes-2.2.0.rst
91 release-notes-2.1.0.rst
92 release-notes-2.1.0.rst
92 release-notes-2.0.2.rst
93 release-notes-2.0.2.rst
93 release-notes-2.0.1.rst
94 release-notes-2.0.1.rst
94 release-notes-2.0.0.rst
95 release-notes-2.0.0.rst
95
96
96 |RCE| 1.x Versions
97 |RCE| 1.x Versions
97 ------------------
98 ------------------
98
99
99 .. toctree::
100 .. toctree::
100 :maxdepth: 1
101 :maxdepth: 1
101
102
102 release-notes-1.7.2.rst
103 release-notes-1.7.2.rst
103 release-notes-1.7.1.rst
104 release-notes-1.7.1.rst
104 release-notes-1.7.0.rst
105 release-notes-1.7.0.rst
105 release-notes-1.6.0.rst
106 release-notes-1.6.0.rst
@@ -1,617 +1,614 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 """
21 """
22 this is forms validation classes
22 this is forms validation classes
23 http://formencode.org/module-formencode.validators.html
23 http://formencode.org/module-formencode.validators.html
24 for list off all availible validators
24 for list off all availible validators
25
25
26 we can create our own validators
26 we can create our own validators
27
27
28 The table below outlines the options which can be used in a schema in addition to the validators themselves
28 The table below outlines the options which can be used in a schema in addition to the validators themselves
29 pre_validators [] These validators will be applied before the schema
29 pre_validators [] These validators will be applied before the schema
30 chained_validators [] These validators will be applied after the schema
30 chained_validators [] These validators will be applied after the schema
31 allow_extra_fields False If True, then it is not an error when keys that aren't associated with a validator are present
31 allow_extra_fields False If True, then it is not an error when keys that aren't associated with a validator are present
32 filter_extra_fields False If True, then keys that aren't associated with a validator are removed
32 filter_extra_fields False If True, then keys that aren't associated with a validator are removed
33 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.
33 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.
34 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
34 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
35
35
36
36
37 <name> = formencode.validators.<name of validator>
37 <name> = formencode.validators.<name of validator>
38 <name> must equal form name
38 <name> must equal form name
39 list=[1,2,3,4,5]
39 list=[1,2,3,4,5]
40 for SELECT use formencode.All(OneOf(list), Int())
40 for SELECT use formencode.All(OneOf(list), Int())
41
41
42 """
42 """
43
43
44 import deform
44 import deform
45 import logging
45 import logging
46 import formencode
46 import formencode
47
47
48 from pkg_resources import resource_filename
48 from pkg_resources import resource_filename
49 from formencode import All, Pipe
49 from formencode import All, Pipe
50
50
51 from pyramid.threadlocal import get_current_request
51 from pyramid.threadlocal import get_current_request
52
52
53 from rhodecode import BACKENDS
53 from rhodecode import BACKENDS
54 from rhodecode.lib import helpers
54 from rhodecode.lib import helpers
55 from rhodecode.model import validators as v
55 from rhodecode.model import validators as v
56
56
57 log = logging.getLogger(__name__)
57 log = logging.getLogger(__name__)
58
58
59
59
60 deform_templates = resource_filename('deform', 'templates')
60 deform_templates = resource_filename('deform', 'templates')
61 rhodecode_templates = resource_filename('rhodecode', 'templates/forms')
61 rhodecode_templates = resource_filename('rhodecode', 'templates/forms')
62 search_path = (rhodecode_templates, deform_templates)
62 search_path = (rhodecode_templates, deform_templates)
63
63
64
64
65 class RhodecodeFormZPTRendererFactory(deform.ZPTRendererFactory):
65 class RhodecodeFormZPTRendererFactory(deform.ZPTRendererFactory):
66 """ Subclass of ZPTRendererFactory to add rhodecode context variables """
66 """ Subclass of ZPTRendererFactory to add rhodecode context variables """
67 def __call__(self, template_name, **kw):
67 def __call__(self, template_name, **kw):
68 kw['h'] = helpers
68 kw['h'] = helpers
69 kw['request'] = get_current_request()
69 kw['request'] = get_current_request()
70 return self.load(template_name)(**kw)
70 return self.load(template_name)(**kw)
71
71
72
72
73 form_renderer = RhodecodeFormZPTRendererFactory(search_path)
73 form_renderer = RhodecodeFormZPTRendererFactory(search_path)
74 deform.Form.set_default_renderer(form_renderer)
74 deform.Form.set_default_renderer(form_renderer)
75
75
76
76
77 def LoginForm(localizer):
77 def LoginForm(localizer):
78 _ = localizer
78 _ = localizer
79
79
80 class _LoginForm(formencode.Schema):
80 class _LoginForm(formencode.Schema):
81 allow_extra_fields = True
81 allow_extra_fields = True
82 filter_extra_fields = True
82 filter_extra_fields = True
83 username = v.UnicodeString(
83 username = v.UnicodeString(
84 strip=True,
84 strip=True,
85 min=1,
85 min=1,
86 not_empty=True,
86 not_empty=True,
87 messages={
87 messages={
88 'empty': _(u'Please enter a login'),
88 'empty': _(u'Please enter a login'),
89 'tooShort': _(u'Enter a value %(min)i characters long or more')
89 'tooShort': _(u'Enter a value %(min)i characters long or more')
90 }
90 }
91 )
91 )
92
92
93 password = v.UnicodeString(
93 password = v.UnicodeString(
94 strip=False,
94 strip=False,
95 min=3,
95 min=3,
96 max=72,
96 max=72,
97 not_empty=True,
97 not_empty=True,
98 messages={
98 messages={
99 'empty': _(u'Please enter a password'),
99 'empty': _(u'Please enter a password'),
100 'tooShort': _(u'Enter %(min)i characters or more')}
100 'tooShort': _(u'Enter %(min)i characters or more')}
101 )
101 )
102
102
103 remember = v.StringBoolean(if_missing=False)
103 remember = v.StringBoolean(if_missing=False)
104
104
105 chained_validators = [v.ValidAuth(localizer)]
105 chained_validators = [v.ValidAuth(localizer)]
106 return _LoginForm
106 return _LoginForm
107
107
108
108
109 def UserForm(localizer, edit=False, available_languages=None, old_data=None):
109 def UserForm(localizer, edit=False, available_languages=None, old_data=None):
110 old_data = old_data or {}
110 old_data = old_data or {}
111 available_languages = available_languages or []
111 available_languages = available_languages or []
112 _ = localizer
112 _ = localizer
113
113
114 class _UserForm(formencode.Schema):
114 class _UserForm(formencode.Schema):
115 allow_extra_fields = True
115 allow_extra_fields = True
116 filter_extra_fields = True
116 filter_extra_fields = True
117 username = All(v.UnicodeString(strip=True, min=1, not_empty=True),
117 username = All(v.UnicodeString(strip=True, min=1, not_empty=True),
118 v.ValidUsername(localizer, edit, old_data))
118 v.ValidUsername(localizer, edit, old_data))
119 if edit:
119 if edit:
120 new_password = All(
120 new_password = All(
121 v.ValidPassword(localizer),
121 v.ValidPassword(localizer),
122 v.UnicodeString(strip=False, min=6, max=72, not_empty=False)
122 v.UnicodeString(strip=False, min=6, max=72, not_empty=False)
123 )
123 )
124 password_confirmation = All(
124 password_confirmation = All(
125 v.ValidPassword(localizer),
125 v.ValidPassword(localizer),
126 v.UnicodeString(strip=False, min=6, max=72, not_empty=False),
126 v.UnicodeString(strip=False, min=6, max=72, not_empty=False),
127 )
127 )
128 admin = v.StringBoolean(if_missing=False)
128 admin = v.StringBoolean(if_missing=False)
129 else:
129 else:
130 password = All(
130 password = All(
131 v.ValidPassword(localizer),
131 v.ValidPassword(localizer),
132 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
132 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
133 )
133 )
134 password_confirmation = All(
134 password_confirmation = All(
135 v.ValidPassword(localizer),
135 v.ValidPassword(localizer),
136 v.UnicodeString(strip=False, min=6, max=72, not_empty=False)
136 v.UnicodeString(strip=False, min=6, max=72, not_empty=False)
137 )
137 )
138
138
139 password_change = v.StringBoolean(if_missing=False)
139 password_change = v.StringBoolean(if_missing=False)
140 create_repo_group = v.StringBoolean(if_missing=False)
140 create_repo_group = v.StringBoolean(if_missing=False)
141
141
142 active = v.StringBoolean(if_missing=False)
142 active = v.StringBoolean(if_missing=False)
143 firstname = v.UnicodeString(strip=True, min=1, not_empty=False)
143 firstname = v.UnicodeString(strip=True, min=1, not_empty=False)
144 lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
144 lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
145 email = All(v.Email(not_empty=True), v.UniqSystemEmail(localizer, old_data))
145 email = All(v.UniqSystemEmail(localizer, old_data), v.Email(not_empty=True))
146 extern_name = v.UnicodeString(strip=True)
146 extern_name = v.UnicodeString(strip=True)
147 extern_type = v.UnicodeString(strip=True)
147 extern_type = v.UnicodeString(strip=True)
148 language = v.OneOf(available_languages, hideList=False,
148 language = v.OneOf(available_languages, hideList=False,
149 testValueList=True, if_missing=None)
149 testValueList=True, if_missing=None)
150 chained_validators = [v.ValidPasswordsMatch(localizer)]
150 chained_validators = [v.ValidPasswordsMatch(localizer)]
151 return _UserForm
151 return _UserForm
152
152
153
153
154 def UserGroupForm(localizer, edit=False, old_data=None, allow_disabled=False):
154 def UserGroupForm(localizer, edit=False, old_data=None, allow_disabled=False):
155 old_data = old_data or {}
155 old_data = old_data or {}
156 _ = localizer
156 _ = localizer
157
157
158 class _UserGroupForm(formencode.Schema):
158 class _UserGroupForm(formencode.Schema):
159 allow_extra_fields = True
159 allow_extra_fields = True
160 filter_extra_fields = True
160 filter_extra_fields = True
161
161
162 users_group_name = All(
162 users_group_name = All(
163 v.UnicodeString(strip=True, min=1, not_empty=True),
163 v.UnicodeString(strip=True, min=1, not_empty=True),
164 v.ValidUserGroup(localizer, edit, old_data)
164 v.ValidUserGroup(localizer, edit, old_data)
165 )
165 )
166 user_group_description = v.UnicodeString(strip=True, min=1,
166 user_group_description = v.UnicodeString(strip=True, min=1,
167 not_empty=False)
167 not_empty=False)
168
168
169 users_group_active = v.StringBoolean(if_missing=False)
169 users_group_active = v.StringBoolean(if_missing=False)
170
170
171 if edit:
171 if edit:
172 # this is user group owner
172 # this is user group owner
173 user = All(
173 user = All(
174 v.UnicodeString(not_empty=True),
174 v.UnicodeString(not_empty=True),
175 v.ValidRepoUser(localizer, allow_disabled))
175 v.ValidRepoUser(localizer, allow_disabled))
176 return _UserGroupForm
176 return _UserGroupForm
177
177
178
178
179 def RepoGroupForm(localizer, edit=False, old_data=None, available_groups=None,
179 def RepoGroupForm(localizer, edit=False, old_data=None, available_groups=None,
180 can_create_in_root=False, allow_disabled=False):
180 can_create_in_root=False, allow_disabled=False):
181 _ = localizer
181 _ = localizer
182 old_data = old_data or {}
182 old_data = old_data or {}
183 available_groups = available_groups or []
183 available_groups = available_groups or []
184
184
185 class _RepoGroupForm(formencode.Schema):
185 class _RepoGroupForm(formencode.Schema):
186 allow_extra_fields = True
186 allow_extra_fields = True
187 filter_extra_fields = False
187 filter_extra_fields = False
188
188
189 group_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
189 group_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
190 v.SlugifyName(localizer),)
190 v.SlugifyName(localizer),)
191 group_description = v.UnicodeString(strip=True, min=1,
191 group_description = v.UnicodeString(strip=True, min=1,
192 not_empty=False)
192 not_empty=False)
193 group_copy_permissions = v.StringBoolean(if_missing=False)
193 group_copy_permissions = v.StringBoolean(if_missing=False)
194
194
195 group_parent_id = v.OneOf(available_groups, hideList=False,
195 group_parent_id = v.OneOf(available_groups, hideList=False,
196 testValueList=True, not_empty=True)
196 testValueList=True, not_empty=True)
197 enable_locking = v.StringBoolean(if_missing=False)
197 enable_locking = v.StringBoolean(if_missing=False)
198 chained_validators = [
198 chained_validators = [
199 v.ValidRepoGroup(localizer, edit, old_data, can_create_in_root)]
199 v.ValidRepoGroup(localizer, edit, old_data, can_create_in_root)]
200
200
201 if edit:
201 if edit:
202 # this is repo group owner
202 # this is repo group owner
203 user = All(
203 user = All(
204 v.UnicodeString(not_empty=True),
204 v.UnicodeString(not_empty=True),
205 v.ValidRepoUser(localizer, allow_disabled))
205 v.ValidRepoUser(localizer, allow_disabled))
206 return _RepoGroupForm
206 return _RepoGroupForm
207
207
208
208
209 def RegisterForm(localizer, edit=False, old_data=None):
209 def RegisterForm(localizer, edit=False, old_data=None):
210 _ = localizer
210 _ = localizer
211 old_data = old_data or {}
211 old_data = old_data or {}
212
212
213 class _RegisterForm(formencode.Schema):
213 class _RegisterForm(formencode.Schema):
214 allow_extra_fields = True
214 allow_extra_fields = True
215 filter_extra_fields = True
215 filter_extra_fields = True
216 username = All(
216 username = All(
217 v.ValidUsername(localizer, edit, old_data),
217 v.ValidUsername(localizer, edit, old_data),
218 v.UnicodeString(strip=True, min=1, not_empty=True)
218 v.UnicodeString(strip=True, min=1, not_empty=True)
219 )
219 )
220 password = All(
220 password = All(
221 v.ValidPassword(localizer),
221 v.ValidPassword(localizer),
222 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
222 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
223 )
223 )
224 password_confirmation = All(
224 password_confirmation = All(
225 v.ValidPassword(localizer),
225 v.ValidPassword(localizer),
226 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
226 v.UnicodeString(strip=False, min=6, max=72, not_empty=True)
227 )
227 )
228 active = v.StringBoolean(if_missing=False)
228 active = v.StringBoolean(if_missing=False)
229 firstname = v.UnicodeString(strip=True, min=1, not_empty=False)
229 firstname = v.UnicodeString(strip=True, min=1, not_empty=False)
230 lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
230 lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
231 email = All(
231 email = All(v.UniqSystemEmail(localizer, old_data), v.Email(not_empty=True))
232 v.Email(not_empty=True),
233 v.UniqSystemEmail(localizer, old_data),
234 v.UnicodeString(strip=True, min=3))
235
232
236 chained_validators = [v.ValidPasswordsMatch(localizer)]
233 chained_validators = [v.ValidPasswordsMatch(localizer)]
237 return _RegisterForm
234 return _RegisterForm
238
235
239
236
240 def PasswordResetForm(localizer):
237 def PasswordResetForm(localizer):
241 _ = localizer
238 _ = localizer
242
239
243 class _PasswordResetForm(formencode.Schema):
240 class _PasswordResetForm(formencode.Schema):
244 allow_extra_fields = True
241 allow_extra_fields = True
245 filter_extra_fields = True
242 filter_extra_fields = True
246 email = All(v.ValidSystemEmail(localizer), v.Email(not_empty=True))
243 email = All(v.ValidSystemEmail(localizer), v.Email(not_empty=True))
247 return _PasswordResetForm
244 return _PasswordResetForm
248
245
249
246
250 def RepoForm(localizer, edit=False, old_data=None, repo_groups=None,
247 def RepoForm(localizer, edit=False, old_data=None, repo_groups=None,
251 landing_revs=None, allow_disabled=False):
248 landing_revs=None, allow_disabled=False):
252 _ = localizer
249 _ = localizer
253 old_data = old_data or {}
250 old_data = old_data or {}
254 repo_groups = repo_groups or []
251 repo_groups = repo_groups or []
255 landing_revs = landing_revs or []
252 landing_revs = landing_revs or []
256 supported_backends = BACKENDS.keys()
253 supported_backends = BACKENDS.keys()
257
254
258 class _RepoForm(formencode.Schema):
255 class _RepoForm(formencode.Schema):
259 allow_extra_fields = True
256 allow_extra_fields = True
260 filter_extra_fields = False
257 filter_extra_fields = False
261 repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
258 repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
262 v.SlugifyName(localizer), v.CannotHaveGitSuffix(localizer))
259 v.SlugifyName(localizer), v.CannotHaveGitSuffix(localizer))
263 repo_group = All(v.CanWriteGroup(localizer, old_data),
260 repo_group = All(v.CanWriteGroup(localizer, old_data),
264 v.OneOf(repo_groups, hideList=True))
261 v.OneOf(repo_groups, hideList=True))
265 repo_type = v.OneOf(supported_backends, required=False,
262 repo_type = v.OneOf(supported_backends, required=False,
266 if_missing=old_data.get('repo_type'))
263 if_missing=old_data.get('repo_type'))
267 repo_description = v.UnicodeString(strip=True, min=1, not_empty=False)
264 repo_description = v.UnicodeString(strip=True, min=1, not_empty=False)
268 repo_private = v.StringBoolean(if_missing=False)
265 repo_private = v.StringBoolean(if_missing=False)
269 repo_landing_rev = v.OneOf(landing_revs, hideList=True)
266 repo_landing_rev = v.OneOf(landing_revs, hideList=True)
270 repo_copy_permissions = v.StringBoolean(if_missing=False)
267 repo_copy_permissions = v.StringBoolean(if_missing=False)
271 clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
268 clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
272
269
273 repo_enable_statistics = v.StringBoolean(if_missing=False)
270 repo_enable_statistics = v.StringBoolean(if_missing=False)
274 repo_enable_downloads = v.StringBoolean(if_missing=False)
271 repo_enable_downloads = v.StringBoolean(if_missing=False)
275 repo_enable_locking = v.StringBoolean(if_missing=False)
272 repo_enable_locking = v.StringBoolean(if_missing=False)
276
273
277 if edit:
274 if edit:
278 # this is repo owner
275 # this is repo owner
279 user = All(
276 user = All(
280 v.UnicodeString(not_empty=True),
277 v.UnicodeString(not_empty=True),
281 v.ValidRepoUser(localizer, allow_disabled))
278 v.ValidRepoUser(localizer, allow_disabled))
282 clone_uri_change = v.UnicodeString(
279 clone_uri_change = v.UnicodeString(
283 not_empty=False, if_missing=v.Missing)
280 not_empty=False, if_missing=v.Missing)
284
281
285 chained_validators = [v.ValidCloneUri(localizer),
282 chained_validators = [v.ValidCloneUri(localizer),
286 v.ValidRepoName(localizer, edit, old_data)]
283 v.ValidRepoName(localizer, edit, old_data)]
287 return _RepoForm
284 return _RepoForm
288
285
289
286
290 def RepoPermsForm(localizer):
287 def RepoPermsForm(localizer):
291 _ = localizer
288 _ = localizer
292
289
293 class _RepoPermsForm(formencode.Schema):
290 class _RepoPermsForm(formencode.Schema):
294 allow_extra_fields = True
291 allow_extra_fields = True
295 filter_extra_fields = False
292 filter_extra_fields = False
296 chained_validators = [v.ValidPerms(localizer, type_='repo')]
293 chained_validators = [v.ValidPerms(localizer, type_='repo')]
297 return _RepoPermsForm
294 return _RepoPermsForm
298
295
299
296
300 def RepoGroupPermsForm(localizer, valid_recursive_choices):
297 def RepoGroupPermsForm(localizer, valid_recursive_choices):
301 _ = localizer
298 _ = localizer
302
299
303 class _RepoGroupPermsForm(formencode.Schema):
300 class _RepoGroupPermsForm(formencode.Schema):
304 allow_extra_fields = True
301 allow_extra_fields = True
305 filter_extra_fields = False
302 filter_extra_fields = False
306 recursive = v.OneOf(valid_recursive_choices)
303 recursive = v.OneOf(valid_recursive_choices)
307 chained_validators = [v.ValidPerms(localizer, type_='repo_group')]
304 chained_validators = [v.ValidPerms(localizer, type_='repo_group')]
308 return _RepoGroupPermsForm
305 return _RepoGroupPermsForm
309
306
310
307
311 def UserGroupPermsForm(localizer):
308 def UserGroupPermsForm(localizer):
312 _ = localizer
309 _ = localizer
313
310
314 class _UserPermsForm(formencode.Schema):
311 class _UserPermsForm(formencode.Schema):
315 allow_extra_fields = True
312 allow_extra_fields = True
316 filter_extra_fields = False
313 filter_extra_fields = False
317 chained_validators = [v.ValidPerms(localizer, type_='user_group')]
314 chained_validators = [v.ValidPerms(localizer, type_='user_group')]
318 return _UserPermsForm
315 return _UserPermsForm
319
316
320
317
321 def RepoFieldForm(localizer):
318 def RepoFieldForm(localizer):
322 _ = localizer
319 _ = localizer
323
320
324 class _RepoFieldForm(formencode.Schema):
321 class _RepoFieldForm(formencode.Schema):
325 filter_extra_fields = True
322 filter_extra_fields = True
326 allow_extra_fields = True
323 allow_extra_fields = True
327
324
328 new_field_key = All(v.FieldKey(localizer),
325 new_field_key = All(v.FieldKey(localizer),
329 v.UnicodeString(strip=True, min=3, not_empty=True))
326 v.UnicodeString(strip=True, min=3, not_empty=True))
330 new_field_value = v.UnicodeString(not_empty=False, if_missing=u'')
327 new_field_value = v.UnicodeString(not_empty=False, if_missing=u'')
331 new_field_type = v.OneOf(['str', 'unicode', 'list', 'tuple'],
328 new_field_type = v.OneOf(['str', 'unicode', 'list', 'tuple'],
332 if_missing='str')
329 if_missing='str')
333 new_field_label = v.UnicodeString(not_empty=False)
330 new_field_label = v.UnicodeString(not_empty=False)
334 new_field_desc = v.UnicodeString(not_empty=False)
331 new_field_desc = v.UnicodeString(not_empty=False)
335 return _RepoFieldForm
332 return _RepoFieldForm
336
333
337
334
338 def RepoForkForm(localizer, edit=False, old_data=None,
335 def RepoForkForm(localizer, edit=False, old_data=None,
339 supported_backends=BACKENDS.keys(), repo_groups=None,
336 supported_backends=BACKENDS.keys(), repo_groups=None,
340 landing_revs=None):
337 landing_revs=None):
341 _ = localizer
338 _ = localizer
342 old_data = old_data or {}
339 old_data = old_data or {}
343 repo_groups = repo_groups or []
340 repo_groups = repo_groups or []
344 landing_revs = landing_revs or []
341 landing_revs = landing_revs or []
345
342
346 class _RepoForkForm(formencode.Schema):
343 class _RepoForkForm(formencode.Schema):
347 allow_extra_fields = True
344 allow_extra_fields = True
348 filter_extra_fields = False
345 filter_extra_fields = False
349 repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
346 repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
350 v.SlugifyName(localizer))
347 v.SlugifyName(localizer))
351 repo_group = All(v.CanWriteGroup(localizer, ),
348 repo_group = All(v.CanWriteGroup(localizer, ),
352 v.OneOf(repo_groups, hideList=True))
349 v.OneOf(repo_groups, hideList=True))
353 repo_type = All(v.ValidForkType(localizer, old_data), v.OneOf(supported_backends))
350 repo_type = All(v.ValidForkType(localizer, old_data), v.OneOf(supported_backends))
354 description = v.UnicodeString(strip=True, min=1, not_empty=True)
351 description = v.UnicodeString(strip=True, min=1, not_empty=True)
355 private = v.StringBoolean(if_missing=False)
352 private = v.StringBoolean(if_missing=False)
356 copy_permissions = v.StringBoolean(if_missing=False)
353 copy_permissions = v.StringBoolean(if_missing=False)
357 fork_parent_id = v.UnicodeString()
354 fork_parent_id = v.UnicodeString()
358 chained_validators = [v.ValidForkName(localizer, edit, old_data)]
355 chained_validators = [v.ValidForkName(localizer, edit, old_data)]
359 landing_rev = v.OneOf(landing_revs, hideList=True)
356 landing_rev = v.OneOf(landing_revs, hideList=True)
360 return _RepoForkForm
357 return _RepoForkForm
361
358
362
359
363 def ApplicationSettingsForm(localizer):
360 def ApplicationSettingsForm(localizer):
364 _ = localizer
361 _ = localizer
365
362
366 class _ApplicationSettingsForm(formencode.Schema):
363 class _ApplicationSettingsForm(formencode.Schema):
367 allow_extra_fields = True
364 allow_extra_fields = True
368 filter_extra_fields = False
365 filter_extra_fields = False
369 rhodecode_title = v.UnicodeString(strip=True, max=40, not_empty=False)
366 rhodecode_title = v.UnicodeString(strip=True, max=40, not_empty=False)
370 rhodecode_realm = v.UnicodeString(strip=True, min=1, not_empty=True)
367 rhodecode_realm = v.UnicodeString(strip=True, min=1, not_empty=True)
371 rhodecode_pre_code = v.UnicodeString(strip=True, min=1, not_empty=False)
368 rhodecode_pre_code = v.UnicodeString(strip=True, min=1, not_empty=False)
372 rhodecode_post_code = v.UnicodeString(strip=True, min=1, not_empty=False)
369 rhodecode_post_code = v.UnicodeString(strip=True, min=1, not_empty=False)
373 rhodecode_captcha_public_key = v.UnicodeString(strip=True, min=1, not_empty=False)
370 rhodecode_captcha_public_key = v.UnicodeString(strip=True, min=1, not_empty=False)
374 rhodecode_captcha_private_key = v.UnicodeString(strip=True, min=1, not_empty=False)
371 rhodecode_captcha_private_key = v.UnicodeString(strip=True, min=1, not_empty=False)
375 rhodecode_create_personal_repo_group = v.StringBoolean(if_missing=False)
372 rhodecode_create_personal_repo_group = v.StringBoolean(if_missing=False)
376 rhodecode_personal_repo_group_pattern = v.UnicodeString(strip=True, min=1, not_empty=False)
373 rhodecode_personal_repo_group_pattern = v.UnicodeString(strip=True, min=1, not_empty=False)
377 return _ApplicationSettingsForm
374 return _ApplicationSettingsForm
378
375
379
376
380 def ApplicationVisualisationForm(localizer):
377 def ApplicationVisualisationForm(localizer):
381 _ = localizer
378 _ = localizer
382
379
383 class _ApplicationVisualisationForm(formencode.Schema):
380 class _ApplicationVisualisationForm(formencode.Schema):
384 allow_extra_fields = True
381 allow_extra_fields = True
385 filter_extra_fields = False
382 filter_extra_fields = False
386 rhodecode_show_public_icon = v.StringBoolean(if_missing=False)
383 rhodecode_show_public_icon = v.StringBoolean(if_missing=False)
387 rhodecode_show_private_icon = v.StringBoolean(if_missing=False)
384 rhodecode_show_private_icon = v.StringBoolean(if_missing=False)
388 rhodecode_stylify_metatags = v.StringBoolean(if_missing=False)
385 rhodecode_stylify_metatags = v.StringBoolean(if_missing=False)
389
386
390 rhodecode_repository_fields = v.StringBoolean(if_missing=False)
387 rhodecode_repository_fields = v.StringBoolean(if_missing=False)
391 rhodecode_lightweight_journal = v.StringBoolean(if_missing=False)
388 rhodecode_lightweight_journal = v.StringBoolean(if_missing=False)
392 rhodecode_dashboard_items = v.Int(min=5, not_empty=True)
389 rhodecode_dashboard_items = v.Int(min=5, not_empty=True)
393 rhodecode_admin_grid_items = v.Int(min=5, not_empty=True)
390 rhodecode_admin_grid_items = v.Int(min=5, not_empty=True)
394 rhodecode_show_version = v.StringBoolean(if_missing=False)
391 rhodecode_show_version = v.StringBoolean(if_missing=False)
395 rhodecode_use_gravatar = v.StringBoolean(if_missing=False)
392 rhodecode_use_gravatar = v.StringBoolean(if_missing=False)
396 rhodecode_markup_renderer = v.OneOf(['markdown', 'rst'])
393 rhodecode_markup_renderer = v.OneOf(['markdown', 'rst'])
397 rhodecode_gravatar_url = v.UnicodeString(min=3)
394 rhodecode_gravatar_url = v.UnicodeString(min=3)
398 rhodecode_clone_uri_tmpl = v.UnicodeString(min=3)
395 rhodecode_clone_uri_tmpl = v.UnicodeString(min=3)
399 rhodecode_support_url = v.UnicodeString()
396 rhodecode_support_url = v.UnicodeString()
400 rhodecode_show_revision_number = v.StringBoolean(if_missing=False)
397 rhodecode_show_revision_number = v.StringBoolean(if_missing=False)
401 rhodecode_show_sha_length = v.Int(min=4, not_empty=True)
398 rhodecode_show_sha_length = v.Int(min=4, not_empty=True)
402 return _ApplicationVisualisationForm
399 return _ApplicationVisualisationForm
403
400
404
401
405 class _BaseVcsSettingsForm(formencode.Schema):
402 class _BaseVcsSettingsForm(formencode.Schema):
406
403
407 allow_extra_fields = True
404 allow_extra_fields = True
408 filter_extra_fields = False
405 filter_extra_fields = False
409 hooks_changegroup_repo_size = v.StringBoolean(if_missing=False)
406 hooks_changegroup_repo_size = v.StringBoolean(if_missing=False)
410 hooks_changegroup_push_logger = v.StringBoolean(if_missing=False)
407 hooks_changegroup_push_logger = v.StringBoolean(if_missing=False)
411 hooks_outgoing_pull_logger = v.StringBoolean(if_missing=False)
408 hooks_outgoing_pull_logger = v.StringBoolean(if_missing=False)
412
409
413 # PR/Code-review
410 # PR/Code-review
414 rhodecode_pr_merge_enabled = v.StringBoolean(if_missing=False)
411 rhodecode_pr_merge_enabled = v.StringBoolean(if_missing=False)
415 rhodecode_use_outdated_comments = v.StringBoolean(if_missing=False)
412 rhodecode_use_outdated_comments = v.StringBoolean(if_missing=False)
416
413
417 # hg
414 # hg
418 extensions_largefiles = v.StringBoolean(if_missing=False)
415 extensions_largefiles = v.StringBoolean(if_missing=False)
419 extensions_evolve = v.StringBoolean(if_missing=False)
416 extensions_evolve = v.StringBoolean(if_missing=False)
420 phases_publish = v.StringBoolean(if_missing=False)
417 phases_publish = v.StringBoolean(if_missing=False)
421
418
422 rhodecode_hg_use_rebase_for_merging = v.StringBoolean(if_missing=False)
419 rhodecode_hg_use_rebase_for_merging = v.StringBoolean(if_missing=False)
423 rhodecode_hg_close_branch_before_merging = v.StringBoolean(if_missing=False)
420 rhodecode_hg_close_branch_before_merging = v.StringBoolean(if_missing=False)
424
421
425 # git
422 # git
426 vcs_git_lfs_enabled = v.StringBoolean(if_missing=False)
423 vcs_git_lfs_enabled = v.StringBoolean(if_missing=False)
427 rhodecode_git_use_rebase_for_merging = v.StringBoolean(if_missing=False)
424 rhodecode_git_use_rebase_for_merging = v.StringBoolean(if_missing=False)
428 rhodecode_git_close_branch_before_merging = v.StringBoolean(if_missing=False)
425 rhodecode_git_close_branch_before_merging = v.StringBoolean(if_missing=False)
429
426
430 # svn
427 # svn
431 vcs_svn_proxy_http_requests_enabled = v.StringBoolean(if_missing=False)
428 vcs_svn_proxy_http_requests_enabled = v.StringBoolean(if_missing=False)
432 vcs_svn_proxy_http_server_url = v.UnicodeString(strip=True, if_missing=None)
429 vcs_svn_proxy_http_server_url = v.UnicodeString(strip=True, if_missing=None)
433
430
434
431
435 def ApplicationUiSettingsForm(localizer):
432 def ApplicationUiSettingsForm(localizer):
436 _ = localizer
433 _ = localizer
437
434
438 class _ApplicationUiSettingsForm(_BaseVcsSettingsForm):
435 class _ApplicationUiSettingsForm(_BaseVcsSettingsForm):
439 web_push_ssl = v.StringBoolean(if_missing=False)
436 web_push_ssl = v.StringBoolean(if_missing=False)
440 paths_root_path = All(
437 paths_root_path = All(
441 v.ValidPath(localizer),
438 v.ValidPath(localizer),
442 v.UnicodeString(strip=True, min=1, not_empty=True)
439 v.UnicodeString(strip=True, min=1, not_empty=True)
443 )
440 )
444 largefiles_usercache = All(
441 largefiles_usercache = All(
445 v.ValidPath(localizer),
442 v.ValidPath(localizer),
446 v.UnicodeString(strip=True, min=2, not_empty=True))
443 v.UnicodeString(strip=True, min=2, not_empty=True))
447 vcs_git_lfs_store_location = All(
444 vcs_git_lfs_store_location = All(
448 v.ValidPath(localizer),
445 v.ValidPath(localizer),
449 v.UnicodeString(strip=True, min=2, not_empty=True))
446 v.UnicodeString(strip=True, min=2, not_empty=True))
450 extensions_hgsubversion = v.StringBoolean(if_missing=False)
447 extensions_hgsubversion = v.StringBoolean(if_missing=False)
451 extensions_hggit = v.StringBoolean(if_missing=False)
448 extensions_hggit = v.StringBoolean(if_missing=False)
452 new_svn_branch = v.ValidSvnPattern(localizer, section='vcs_svn_branch')
449 new_svn_branch = v.ValidSvnPattern(localizer, section='vcs_svn_branch')
453 new_svn_tag = v.ValidSvnPattern(localizer, section='vcs_svn_tag')
450 new_svn_tag = v.ValidSvnPattern(localizer, section='vcs_svn_tag')
454 return _ApplicationUiSettingsForm
451 return _ApplicationUiSettingsForm
455
452
456
453
457 def RepoVcsSettingsForm(localizer, repo_name):
454 def RepoVcsSettingsForm(localizer, repo_name):
458 _ = localizer
455 _ = localizer
459
456
460 class _RepoVcsSettingsForm(_BaseVcsSettingsForm):
457 class _RepoVcsSettingsForm(_BaseVcsSettingsForm):
461 inherit_global_settings = v.StringBoolean(if_missing=False)
458 inherit_global_settings = v.StringBoolean(if_missing=False)
462 new_svn_branch = v.ValidSvnPattern(localizer,
459 new_svn_branch = v.ValidSvnPattern(localizer,
463 section='vcs_svn_branch', repo_name=repo_name)
460 section='vcs_svn_branch', repo_name=repo_name)
464 new_svn_tag = v.ValidSvnPattern(localizer,
461 new_svn_tag = v.ValidSvnPattern(localizer,
465 section='vcs_svn_tag', repo_name=repo_name)
462 section='vcs_svn_tag', repo_name=repo_name)
466 return _RepoVcsSettingsForm
463 return _RepoVcsSettingsForm
467
464
468
465
469 def LabsSettingsForm(localizer):
466 def LabsSettingsForm(localizer):
470 _ = localizer
467 _ = localizer
471
468
472 class _LabSettingsForm(formencode.Schema):
469 class _LabSettingsForm(formencode.Schema):
473 allow_extra_fields = True
470 allow_extra_fields = True
474 filter_extra_fields = False
471 filter_extra_fields = False
475 return _LabSettingsForm
472 return _LabSettingsForm
476
473
477
474
478 def ApplicationPermissionsForm(
475 def ApplicationPermissionsForm(
479 localizer, register_choices, password_reset_choices,
476 localizer, register_choices, password_reset_choices,
480 extern_activate_choices):
477 extern_activate_choices):
481 _ = localizer
478 _ = localizer
482
479
483 class _DefaultPermissionsForm(formencode.Schema):
480 class _DefaultPermissionsForm(formencode.Schema):
484 allow_extra_fields = True
481 allow_extra_fields = True
485 filter_extra_fields = True
482 filter_extra_fields = True
486
483
487 anonymous = v.StringBoolean(if_missing=False)
484 anonymous = v.StringBoolean(if_missing=False)
488 default_register = v.OneOf(register_choices)
485 default_register = v.OneOf(register_choices)
489 default_register_message = v.UnicodeString()
486 default_register_message = v.UnicodeString()
490 default_password_reset = v.OneOf(password_reset_choices)
487 default_password_reset = v.OneOf(password_reset_choices)
491 default_extern_activate = v.OneOf(extern_activate_choices)
488 default_extern_activate = v.OneOf(extern_activate_choices)
492 return _DefaultPermissionsForm
489 return _DefaultPermissionsForm
493
490
494
491
495 def ObjectPermissionsForm(localizer, repo_perms_choices, group_perms_choices,
492 def ObjectPermissionsForm(localizer, repo_perms_choices, group_perms_choices,
496 user_group_perms_choices):
493 user_group_perms_choices):
497 _ = localizer
494 _ = localizer
498
495
499 class _ObjectPermissionsForm(formencode.Schema):
496 class _ObjectPermissionsForm(formencode.Schema):
500 allow_extra_fields = True
497 allow_extra_fields = True
501 filter_extra_fields = True
498 filter_extra_fields = True
502 overwrite_default_repo = v.StringBoolean(if_missing=False)
499 overwrite_default_repo = v.StringBoolean(if_missing=False)
503 overwrite_default_group = v.StringBoolean(if_missing=False)
500 overwrite_default_group = v.StringBoolean(if_missing=False)
504 overwrite_default_user_group = v.StringBoolean(if_missing=False)
501 overwrite_default_user_group = v.StringBoolean(if_missing=False)
505 default_repo_perm = v.OneOf(repo_perms_choices)
502 default_repo_perm = v.OneOf(repo_perms_choices)
506 default_group_perm = v.OneOf(group_perms_choices)
503 default_group_perm = v.OneOf(group_perms_choices)
507 default_user_group_perm = v.OneOf(user_group_perms_choices)
504 default_user_group_perm = v.OneOf(user_group_perms_choices)
508 return _ObjectPermissionsForm
505 return _ObjectPermissionsForm
509
506
510
507
511 def UserPermissionsForm(localizer, create_choices, create_on_write_choices,
508 def UserPermissionsForm(localizer, create_choices, create_on_write_choices,
512 repo_group_create_choices, user_group_create_choices,
509 repo_group_create_choices, user_group_create_choices,
513 fork_choices, inherit_default_permissions_choices):
510 fork_choices, inherit_default_permissions_choices):
514 _ = localizer
511 _ = localizer
515
512
516 class _DefaultPermissionsForm(formencode.Schema):
513 class _DefaultPermissionsForm(formencode.Schema):
517 allow_extra_fields = True
514 allow_extra_fields = True
518 filter_extra_fields = True
515 filter_extra_fields = True
519
516
520 anonymous = v.StringBoolean(if_missing=False)
517 anonymous = v.StringBoolean(if_missing=False)
521
518
522 default_repo_create = v.OneOf(create_choices)
519 default_repo_create = v.OneOf(create_choices)
523 default_repo_create_on_write = v.OneOf(create_on_write_choices)
520 default_repo_create_on_write = v.OneOf(create_on_write_choices)
524 default_user_group_create = v.OneOf(user_group_create_choices)
521 default_user_group_create = v.OneOf(user_group_create_choices)
525 default_repo_group_create = v.OneOf(repo_group_create_choices)
522 default_repo_group_create = v.OneOf(repo_group_create_choices)
526 default_fork_create = v.OneOf(fork_choices)
523 default_fork_create = v.OneOf(fork_choices)
527 default_inherit_default_permissions = v.OneOf(inherit_default_permissions_choices)
524 default_inherit_default_permissions = v.OneOf(inherit_default_permissions_choices)
528 return _DefaultPermissionsForm
525 return _DefaultPermissionsForm
529
526
530
527
531 def UserIndividualPermissionsForm(localizer):
528 def UserIndividualPermissionsForm(localizer):
532 _ = localizer
529 _ = localizer
533
530
534 class _DefaultPermissionsForm(formencode.Schema):
531 class _DefaultPermissionsForm(formencode.Schema):
535 allow_extra_fields = True
532 allow_extra_fields = True
536 filter_extra_fields = True
533 filter_extra_fields = True
537
534
538 inherit_default_permissions = v.StringBoolean(if_missing=False)
535 inherit_default_permissions = v.StringBoolean(if_missing=False)
539 return _DefaultPermissionsForm
536 return _DefaultPermissionsForm
540
537
541
538
542 def DefaultsForm(localizer, edit=False, old_data=None, supported_backends=BACKENDS.keys()):
539 def DefaultsForm(localizer, edit=False, old_data=None, supported_backends=BACKENDS.keys()):
543 _ = localizer
540 _ = localizer
544 old_data = old_data or {}
541 old_data = old_data or {}
545
542
546 class _DefaultsForm(formencode.Schema):
543 class _DefaultsForm(formencode.Schema):
547 allow_extra_fields = True
544 allow_extra_fields = True
548 filter_extra_fields = True
545 filter_extra_fields = True
549 default_repo_type = v.OneOf(supported_backends)
546 default_repo_type = v.OneOf(supported_backends)
550 default_repo_private = v.StringBoolean(if_missing=False)
547 default_repo_private = v.StringBoolean(if_missing=False)
551 default_repo_enable_statistics = v.StringBoolean(if_missing=False)
548 default_repo_enable_statistics = v.StringBoolean(if_missing=False)
552 default_repo_enable_downloads = v.StringBoolean(if_missing=False)
549 default_repo_enable_downloads = v.StringBoolean(if_missing=False)
553 default_repo_enable_locking = v.StringBoolean(if_missing=False)
550 default_repo_enable_locking = v.StringBoolean(if_missing=False)
554 return _DefaultsForm
551 return _DefaultsForm
555
552
556
553
557 def AuthSettingsForm(localizer):
554 def AuthSettingsForm(localizer):
558 _ = localizer
555 _ = localizer
559
556
560 class _AuthSettingsForm(formencode.Schema):
557 class _AuthSettingsForm(formencode.Schema):
561 allow_extra_fields = True
558 allow_extra_fields = True
562 filter_extra_fields = True
559 filter_extra_fields = True
563 auth_plugins = All(v.ValidAuthPlugins(localizer),
560 auth_plugins = All(v.ValidAuthPlugins(localizer),
564 v.UniqueListFromString(localizer)(not_empty=True))
561 v.UniqueListFromString(localizer)(not_empty=True))
565 return _AuthSettingsForm
562 return _AuthSettingsForm
566
563
567
564
568 def UserExtraEmailForm(localizer):
565 def UserExtraEmailForm(localizer):
569 _ = localizer
566 _ = localizer
570
567
571 class _UserExtraEmailForm(formencode.Schema):
568 class _UserExtraEmailForm(formencode.Schema):
572 email = All(v.UniqSystemEmail(localizer), v.Email(not_empty=True))
569 email = All(v.UniqSystemEmail(localizer), v.Email(not_empty=True))
573 return _UserExtraEmailForm
570 return _UserExtraEmailForm
574
571
575
572
576 def UserExtraIpForm(localizer):
573 def UserExtraIpForm(localizer):
577 _ = localizer
574 _ = localizer
578
575
579 class _UserExtraIpForm(formencode.Schema):
576 class _UserExtraIpForm(formencode.Schema):
580 ip = v.ValidIp(localizer)(not_empty=True)
577 ip = v.ValidIp(localizer)(not_empty=True)
581 return _UserExtraIpForm
578 return _UserExtraIpForm
582
579
583
580
584 def PullRequestForm(localizer, repo_id):
581 def PullRequestForm(localizer, repo_id):
585 _ = localizer
582 _ = localizer
586
583
587 class ReviewerForm(formencode.Schema):
584 class ReviewerForm(formencode.Schema):
588 user_id = v.Int(not_empty=True)
585 user_id = v.Int(not_empty=True)
589 reasons = All()
586 reasons = All()
590 mandatory = v.StringBoolean()
587 mandatory = v.StringBoolean()
591
588
592 class _PullRequestForm(formencode.Schema):
589 class _PullRequestForm(formencode.Schema):
593 allow_extra_fields = True
590 allow_extra_fields = True
594 filter_extra_fields = True
591 filter_extra_fields = True
595
592
596 common_ancestor = v.UnicodeString(strip=True, required=True)
593 common_ancestor = v.UnicodeString(strip=True, required=True)
597 source_repo = v.UnicodeString(strip=True, required=True)
594 source_repo = v.UnicodeString(strip=True, required=True)
598 source_ref = v.UnicodeString(strip=True, required=True)
595 source_ref = v.UnicodeString(strip=True, required=True)
599 target_repo = v.UnicodeString(strip=True, required=True)
596 target_repo = v.UnicodeString(strip=True, required=True)
600 target_ref = v.UnicodeString(strip=True, required=True)
597 target_ref = v.UnicodeString(strip=True, required=True)
601 revisions = All(#v.NotReviewedRevisions(localizer, repo_id)(),
598 revisions = All(#v.NotReviewedRevisions(localizer, repo_id)(),
602 v.UniqueList(localizer)(not_empty=True))
599 v.UniqueList(localizer)(not_empty=True))
603 review_members = formencode.ForEach(ReviewerForm())
600 review_members = formencode.ForEach(ReviewerForm())
604 pullrequest_title = v.UnicodeString(strip=True, required=True)
601 pullrequest_title = v.UnicodeString(strip=True, required=True)
605 pullrequest_desc = v.UnicodeString(strip=True, required=False)
602 pullrequest_desc = v.UnicodeString(strip=True, required=False)
606
603
607 return _PullRequestForm
604 return _PullRequestForm
608
605
609
606
610 def IssueTrackerPatternsForm(localizer):
607 def IssueTrackerPatternsForm(localizer):
611 _ = localizer
608 _ = localizer
612
609
613 class _IssueTrackerPatternsForm(formencode.Schema):
610 class _IssueTrackerPatternsForm(formencode.Schema):
614 allow_extra_fields = True
611 allow_extra_fields = True
615 filter_extra_fields = False
612 filter_extra_fields = False
616 chained_validators = [v.ValidPattern(localizer)]
613 chained_validators = [v.ValidPattern(localizer)]
617 return _IssueTrackerPatternsForm
614 return _IssueTrackerPatternsForm
General Comments 0
You need to be logged in to leave comments. Login now