##// END OF EJS Templates
release: merge back stable branch into default
marcink -
r2344:e110c80e merge default
parent child Browse files
Show More
@@ -0,0 +1,41 b''
1 |RCE| 4.10.4 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2017-11-14
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13
14
15 General
16 ^^^^^^^
17
18
19
20 Security
21 ^^^^^^^^
22
23
24
25 Performance
26 ^^^^^^^^^^^
27
28
29
30 Fixes
31 ^^^^^
32
33
34 - repository groups: fixed a regressions in update of nested repository groups.
35
36
37 Upgrade notes
38 ^^^^^^^^^^^^^
39
40 - Fixes regression in nested repository groups update. No upgrade problems should
41 be expected
@@ -25,3 +25,4 b' 4ba4d74981cec5d6b28b158f875a2540952c2f74'
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
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.10.4.rst
12 release-notes-4.10.3.rst
13 release-notes-4.10.3.rst
13 release-notes-4.10.2.rst
14 release-notes-4.10.2.rst
14 release-notes-4.10.1.rst
15 release-notes-4.10.1.rst
@@ -169,7 +169,7 b' class RepoGroupSettingsView(RepoGroupApp'
169
169
170 # use the new full name for redirect once we know we updated
170 # use the new full name for redirect once we know we updated
171 # the name on filesystem and in DB
171 # the name on filesystem and in DB
172 new_repo_group_name = schema_data['repo_group_name']
172 new_repo_group_name = schema_data['repo_group']['repo_group_name_with_group']
173
173
174 h.flash(_('Repository Group `{}` updated successfully').format(
174 h.flash(_('Repository Group `{}` updated successfully').format(
175 old_repo_group_name), category='success')
175 old_repo_group_name), category='success')
@@ -32,6 +32,11 b' def get_group_and_repo(repo_name):'
32 repo_name, get_object=True)
32 repo_name, get_object=True)
33
33
34
34
35 def get_repo_group(repo_group_id):
36 from rhodecode.model.repo_group import RepoGroup
37 return RepoGroup.get(repo_group_id), RepoGroup.CHOICES_SEPARATOR
38
39
35 @colander.deferred
40 @colander.deferred
36 def deferred_can_write_to_group_validator(node, kw):
41 def deferred_can_write_to_group_validator(node, kw):
37 old_values = kw.get('old_values') or {}
42 old_values = kw.get('old_values') or {}
@@ -178,6 +183,7 b' class GroupType(colander.Mapping):'
178 parent_group_name,
183 parent_group_name,
179 parent_group) = get_group_and_repo(validated_name)
184 parent_group) = get_group_and_repo(validated_name)
180
185
186 appstruct['repo_group_name_with_group'] = validated_name
181 appstruct['repo_group_name_without_group'] = repo_group_name_without_group
187 appstruct['repo_group_name_without_group'] = repo_group_name_without_group
182 appstruct['repo_group_name'] = parent_group_name or types.RootLocation
188 appstruct['repo_group_name'] = parent_group_name or types.RootLocation
183 if parent_group:
189 if parent_group:
@@ -271,6 +277,14 b' class RepoGroupSettingsSchema(RepoGroupS'
271 appstruct = super(RepoGroupSchema, self).deserialize(cstruct)
277 appstruct = super(RepoGroupSchema, self).deserialize(cstruct)
272 validated_name = appstruct['repo_group_name']
278 validated_name = appstruct['repo_group_name']
273
279
280 # because of repoSchema adds repo-group as an ID, we inject it as
281 # full name here because validators require it, it's unwrapped later
282 # so it's safe to use and final name is going to be without group anyway
283
284 group, separator = get_repo_group(appstruct['repo_group'])
285 if group:
286 validated_name = separator.join([group.group_name, validated_name])
287
274 # second pass to validate permissions to repo_group
288 # second pass to validate permissions to repo_group
275 second = RepoGroupAccessSchema().bind(**self.bindings)
289 second = RepoGroupAccessSchema().bind(**self.bindings)
276 appstruct_second = second.deserialize({'repo_group': validated_name})
290 appstruct_second = second.deserialize({'repo_group': validated_name})
@@ -60,6 +60,7 b' class TestRepoGroupSchema(object):'
60 assert schema_data['repo_group'] == {
60 assert schema_data['repo_group'] == {
61 'repo_group_id': None,
61 'repo_group_id': None,
62 'repo_group_name': types.RootLocation,
62 'repo_group_name': types.RootLocation,
63 'repo_group_name_with_group': u'my_schema_group',
63 'repo_group_name_without_group': u'my_schema_group'}
64 'repo_group_name_without_group': u'my_schema_group'}
64
65
65 @pytest.mark.parametrize('given, err_key, expected_exc', [
66 @pytest.mark.parametrize('given, err_key, expected_exc', [
@@ -96,6 +97,7 b' class TestRepoGroupSchema(object):'
96 assert schema_data['repo_group'] == {
97 assert schema_data['repo_group'] == {
97 'repo_group_id': test_repo_group.group_id,
98 'repo_group_id': test_repo_group.group_id,
98 'repo_group_name': test_repo_group.group_name,
99 'repo_group_name': test_repo_group.group_name,
100 'repo_group_name_with_group': full_name,
99 'repo_group_name_without_group': u'my_schema_group'}
101 'repo_group_name_without_group': u'my_schema_group'}
100
102
101 def test_deserialize_with_group_name_regular_user_no_perms(
103 def test_deserialize_with_group_name_regular_user_no_perms(
General Comments 0
You need to be logged in to leave comments. Login now