Show More
@@ -39,7 +39,6 b' from rhodecode.lib.base import BaseContr' | |||||
39 |
|
39 | |||
40 | from rhodecode.model.db import User, UsersGroup, Permission, UsersGroupToPerm |
|
40 | from rhodecode.model.db import User, UsersGroup, Permission, UsersGroupToPerm | |
41 | from rhodecode.model.forms import UserForm, UsersGroupForm |
|
41 | from rhodecode.model.forms import UserForm, UsersGroupForm | |
42 | from rhodecode.model.users_group import UsersGroupModel |
|
|||
43 |
|
42 | |||
44 | log = logging.getLogger(__name__) |
|
43 | log = logging.getLogger(__name__) | |
45 |
|
44 | |||
@@ -67,11 +66,11 b' class UsersGroupsController(BaseControll' | |||||
67 | def create(self): |
|
66 | def create(self): | |
68 | """POST /users_groups: Create a new item""" |
|
67 | """POST /users_groups: Create a new item""" | |
69 | # url('users_groups') |
|
68 | # url('users_groups') | |
70 | users_group_model = UsersGroupModel() |
|
69 | ||
71 | users_group_form = UsersGroupForm()() |
|
70 | users_group_form = UsersGroupForm()() | |
72 | try: |
|
71 | try: | |
73 | form_result = users_group_form.to_python(dict(request.POST)) |
|
72 | form_result = users_group_form.to_python(dict(request.POST)) | |
74 |
|
|
73 | UsersGroup.create(form_result) | |
75 | h.flash(_('created users group %s') \ |
|
74 | h.flash(_('created users group %s') \ | |
76 | % form_result['users_group_name'], category='success') |
|
75 | % form_result['users_group_name'], category='success') | |
77 | #action_logger(self.rhodecode_user, 'new_user', '', '', self.sa) |
|
76 | #action_logger(self.rhodecode_user, 'new_user', '', '', self.sa) | |
@@ -103,8 +102,7 b' class UsersGroupsController(BaseControll' | |||||
103 | # method='put') |
|
102 | # method='put') | |
104 | # url('users_group', id=ID) |
|
103 | # url('users_group', id=ID) | |
105 |
|
104 | |||
106 |
users_group |
|
105 | c.users_group = UsersGroup.get(id) | |
107 | c.users_group = users_group_model.get(id) |
|
|||
108 | c.group_members = [(x.user_id, x.user.username) for x in |
|
106 | c.group_members = [(x.user_id, x.user.username) for x in | |
109 | c.users_group.members] |
|
107 | c.users_group.members] | |
110 |
|
108 | |||
@@ -117,7 +115,7 b' class UsersGroupsController(BaseControll' | |||||
117 |
|
115 | |||
118 | try: |
|
116 | try: | |
119 | form_result = users_group_form.to_python(request.POST) |
|
117 | form_result = users_group_form.to_python(request.POST) | |
120 |
|
|
118 | UsersGroup.update(id, form_result) | |
121 | h.flash(_('updated users group %s') \ |
|
119 | h.flash(_('updated users group %s') \ | |
122 | % form_result['users_group_name'], |
|
120 | % form_result['users_group_name'], | |
123 | category='success') |
|
121 | category='success') | |
@@ -150,9 +148,9 b' class UsersGroupsController(BaseControll' | |||||
150 | # h.form(url('users_group', id=ID), |
|
148 | # h.form(url('users_group', id=ID), | |
151 | # method='delete') |
|
149 | # method='delete') | |
152 | # url('users_group', id=ID) |
|
150 | # url('users_group', id=ID) | |
153 | users_group_model = UsersGroupModel() |
|
151 | ||
154 | try: |
|
152 | try: | |
155 |
|
|
153 | UsersGroup.delete(id) | |
156 | h.flash(_('successfully deleted users group'), category='success') |
|
154 | h.flash(_('successfully deleted users group'), category='success') | |
157 | except UsersGroupsAssignedException, e: |
|
155 | except UsersGroupsAssignedException, e: | |
158 | h.flash(e, category='error') |
|
156 | h.flash(e, category='error') |
@@ -42,6 +42,7 b' from vcs.exceptions import RepositoryErr' | |||||
42 | from vcs.utils.lazy import LazyProperty |
|
42 | from vcs.utils.lazy import LazyProperty | |
43 | from vcs.nodes import FileNode |
|
43 | from vcs.nodes import FileNode | |
44 |
|
44 | |||
|
45 | from rhodecode.lib.exceptions import UsersGroupsAssignedException | |||
45 | from rhodecode.lib import str2bool, json, safe_str |
|
46 | from rhodecode.lib import str2bool, json, safe_str | |
46 | from rhodecode.model.meta import Base, Session |
|
47 | from rhodecode.model.meta import Base, Session | |
47 | from rhodecode.model.caching_query import FromCache |
|
48 | from rhodecode.model.caching_query import FromCache | |
@@ -302,6 +303,77 b' class UsersGroup(Base, BaseModel):' | |||||
302 | "get_user_%s" % group_name)) |
|
303 | "get_user_%s" % group_name)) | |
303 | return gr.scalar() |
|
304 | return gr.scalar() | |
304 |
|
305 | |||
|
306 | ||||
|
307 | @classmethod | |||
|
308 | def get(cls, users_group_id, cache=False): | |||
|
309 | users_group = Session.query(cls) | |||
|
310 | if cache: | |||
|
311 | users_group = users_group.options(FromCache("sql_cache_short", | |||
|
312 | "get_users_group_%s" % users_group_id)) | |||
|
313 | return users_group.get(users_group_id) | |||
|
314 | ||||
|
315 | @classmethod | |||
|
316 | def create(cls, form_data): | |||
|
317 | try: | |||
|
318 | new_users_group = cls() | |||
|
319 | for k, v in form_data.items(): | |||
|
320 | setattr(new_users_group, k, v) | |||
|
321 | ||||
|
322 | Session.add(new_users_group) | |||
|
323 | Session.commit() | |||
|
324 | except: | |||
|
325 | log.error(traceback.format_exc()) | |||
|
326 | Session.rollback() | |||
|
327 | raise | |||
|
328 | ||||
|
329 | @classmethod | |||
|
330 | def update(cls, users_group_id, form_data): | |||
|
331 | ||||
|
332 | try: | |||
|
333 | users_group = cls.get(users_group_id, cache=False) | |||
|
334 | ||||
|
335 | for k, v in form_data.items(): | |||
|
336 | if k == 'users_group_members': | |||
|
337 | users_group.members = [] | |||
|
338 | Session.flush() | |||
|
339 | members_list = [] | |||
|
340 | if v: | |||
|
341 | for u_id in set(v): | |||
|
342 | members_list.append(UsersGroupMember( | |||
|
343 | users_group_id, | |||
|
344 | u_id)) | |||
|
345 | setattr(users_group, 'members', members_list) | |||
|
346 | setattr(users_group, k, v) | |||
|
347 | ||||
|
348 | Session.add(users_group) | |||
|
349 | Session.commit() | |||
|
350 | except: | |||
|
351 | log.error(traceback.format_exc()) | |||
|
352 | Session.rollback() | |||
|
353 | raise | |||
|
354 | ||||
|
355 | @classmethod | |||
|
356 | def delete(cls, users_group_id): | |||
|
357 | try: | |||
|
358 | ||||
|
359 | # check if this group is not assigned to repo | |||
|
360 | assigned_groups = UsersGroupRepoToPerm.query()\ | |||
|
361 | .filter(UsersGroupRepoToPerm.users_group_id == | |||
|
362 | users_group_id).all() | |||
|
363 | ||||
|
364 | if assigned_groups: | |||
|
365 | raise UsersGroupsAssignedException('Group assigned to %s' % | |||
|
366 | assigned_groups) | |||
|
367 | ||||
|
368 | users_group = cls.get(users_group_id, cache=False) | |||
|
369 | Session.delete(users_group) | |||
|
370 | Session.commit() | |||
|
371 | except: | |||
|
372 | log.error(traceback.format_exc()) | |||
|
373 | Session.rollback() | |||
|
374 | raise | |||
|
375 | ||||
|
376 | ||||
305 | class UsersGroupMember(Base, BaseModel): |
|
377 | class UsersGroupMember(Base, BaseModel): | |
306 | __tablename__ = 'users_groups_members' |
|
378 | __tablename__ = 'users_groups_members' | |
307 | __table_args__ = {'extend_existing':True} |
|
379 | __table_args__ = {'extend_existing':True} |
@@ -60,10 +60,7 b'' | |||||
60 | </div> |
|
60 | </div> | |
61 | <div class="right"> |
|
61 | <div class="right"> | |
62 | <div id="${cs.raw_id}_changes_info" class="changes"> |
|
62 | <div id="${cs.raw_id}_changes_info" class="changes"> | |
63 | <span id="${cs.raw_id}" class="changed_total tooltip" |
|
63 | <span id="${cs.raw_id}" class="changed_total tooltip" title="${_('Affected number of files, click to show more details')}">${len(cs.affected_files)}</span> | |
64 | title="${_('Affected number of files, click to show more details')}"> |
|
|||
65 | ${len(cs.affected_files)} |
|
|||
66 | </span> |
|
|||
67 | </div> |
|
64 | </div> | |
68 | %if len(cs.parents)>1: |
|
65 | %if len(cs.parents)>1: | |
69 | <div class="merge"> |
|
66 | <div class="merge"> |
@@ -1,4 +1,5 b'' | |||||
1 | from rhodecode.tests import * |
|
1 | from rhodecode.tests import * | |
|
2 | from rhodecode.model.db import UsersGroup | |||
2 |
|
3 | |||
3 | TEST_USERS_GROUP = 'admins_test' |
|
4 | TEST_USERS_GROUP = 'admins_test' | |
4 |
|
5 | |||
@@ -36,13 +37,37 b' class TestAdminUsersGroupsController(Tes' | |||||
36 | response = self.app.put(url('users_group', id=1)) |
|
37 | response = self.app.put(url('users_group', id=1)) | |
37 |
|
38 | |||
38 | def test_update_browser_fakeout(self): |
|
39 | def test_update_browser_fakeout(self): | |
39 |
response = self.app.post(url('users_group', id=1), |
|
40 | response = self.app.post(url('users_group', id=1), | |
|
41 | params=dict(_method='put')) | |||
40 |
|
42 | |||
41 | def test_delete(self): |
|
43 | def test_delete(self): | |
42 | response = self.app.delete(url('users_group', id=1)) |
|
44 | self.log_user() | |
|
45 | users_group_name = TEST_USERS_GROUP + 'another' | |||
|
46 | response = self.app.post(url('users_groups'), | |||
|
47 | {'users_group_name':users_group_name, | |||
|
48 | 'active':True}) | |||
|
49 | response.follow() | |||
|
50 | ||||
|
51 | self.checkSessionFlash(response, | |||
|
52 | 'created users group %s' % users_group_name) | |||
|
53 | ||||
|
54 | ||||
|
55 | gr = self.sa.query(UsersGroup)\ | |||
|
56 | .filter(UsersGroup.users_group_name == | |||
|
57 | users_group_name).one() | |||
|
58 | ||||
|
59 | response = self.app.delete(url('users_group', id=gr.users_group_id)) | |||
|
60 | ||||
|
61 | gr = self.sa.query(UsersGroup)\ | |||
|
62 | .filter(UsersGroup.users_group_name == | |||
|
63 | users_group_name).scalar() | |||
|
64 | ||||
|
65 | self.assertEqual(gr, None) | |||
|
66 | ||||
43 |
|
67 | |||
44 | def test_delete_browser_fakeout(self): |
|
68 | def test_delete_browser_fakeout(self): | |
45 |
response = self.app.post(url('users_group', id=1), |
|
69 | response = self.app.post(url('users_group', id=1), | |
|
70 | params=dict(_method='delete')) | |||
46 |
|
71 | |||
47 | def test_show(self): |
|
72 | def test_show(self): | |
48 | response = self.app.get(url('users_group', id=1)) |
|
73 | response = self.app.get(url('users_group', id=1)) |
@@ -4,35 +4,55 b' class TestChangelogController(TestContro' | |||||
4 |
|
4 | |||
5 | def test_index_hg(self): |
|
5 | def test_index_hg(self): | |
6 | self.log_user() |
|
6 | self.log_user() | |
7 |
response = self.app.get(url(controller='changelog', action='index', |
|
7 | response = self.app.get(url(controller='changelog', action='index', | |
|
8 | repo_name=HG_REPO)) | |||
8 |
|
9 | |||
9 |
assert |
|
10 | self.assertTrue("""<div id="chg_20" class="container">""" | |
10 | assert """<input class="changeset_range" id="5e204e7583b9" name="5e204e7583b9" type="checkbox" value="1" />""" in response.body, 'no checkbox for this commit' |
|
11 | in response.body) | |
11 | assert """<span>commit 154: 5e204e7583b9@2010-08-10 01:18:46</span>""" in response.body , 'no info on this commit' |
|
12 | self.assertTrue("""<input class="changeset_range" id="5e204e7583b9" """ | |
12 | assert """Small update at simplevcs app""" in response.body, 'missing info about commit message' |
|
13 | """name="5e204e7583b9" type="checkbox" value="1" />""" | |
|
14 | in response.body) | |||
|
15 | self.assertTrue("""<span>commit 154: 5e204e7583b9@2010-08-10 """ | |||
|
16 | """01:18:46</span>""" in response.body) | |||
|
17 | self.assertTrue("""Small update at simplevcs app""" in response.body) | |||
13 |
|
18 | |||
14 | assert """<span class="removed tooltip" title="<b>removed</b>: No Files">0</span>""" in response.body, 'wrong info about removed nodes' |
|
19 | ||
15 | assert """<span class="changed tooltip" title="<b>changed</b>: <br/> vcs/backends/hg.py<br/> vcs/web/simplevcs/models.py">2</span>""" in response.body, 'wrong info about changed nodes' |
|
20 | self.assertTrue("""<span id="5e204e7583b9c8e7b93a020bd036564b1e""" | |
16 | assert """<span class="added tooltip" title="<b>added</b>: <br/> vcs/web/simplevcs/managers.py">1</span>""" in response.body, 'wrong info about added nodes' |
|
21 | """731dae" class="changed_total tooltip" """ | |
|
22 | """title="Affected number of files, click to """ | |||
|
23 | """show more details">3</span>""" in response.body) | |||
17 |
|
24 | |||
18 | #pagination |
|
25 | #pagination | |
19 |
|
26 | |||
20 |
response = self.app.get(url(controller='changelog', action='index', |
|
27 | response = self.app.get(url(controller='changelog', action='index', | |
21 | response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':2}) |
|
28 | repo_name=HG_REPO), {'page':1}) | |
22 |
response = self.app.get(url(controller='changelog', action='index', |
|
29 | response = self.app.get(url(controller='changelog', action='index', | |
23 | response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':4}) |
|
30 | repo_name=HG_REPO), {'page':2}) | |
24 |
response = self.app.get(url(controller='changelog', action='index', |
|
31 | response = self.app.get(url(controller='changelog', action='index', | |
25 | response = self.app.get(url(controller='changelog', action='index', repo_name=HG_REPO), {'page':6}) |
|
32 | repo_name=HG_REPO), {'page':3}) | |
|
33 | response = self.app.get(url(controller='changelog', action='index', | |||
|
34 | repo_name=HG_REPO), {'page':4}) | |||
|
35 | response = self.app.get(url(controller='changelog', action='index', | |||
|
36 | repo_name=HG_REPO), {'page':5}) | |||
|
37 | response = self.app.get(url(controller='changelog', action='index', | |||
|
38 | repo_name=HG_REPO), {'page':6}) | |||
26 |
|
39 | |||
27 |
|
40 | |||
28 | # Test response after pagination... |
|
41 | # Test response after pagination... | |
29 | print response.body |
|
42 | self.assertTrue("""<input class="changeset_range" id="46ad32a4f974" """ | |
30 | assert """<input class="changeset_range" id="46ad32a4f974" name="46ad32a4f974" type="checkbox" value="1" />""" in response.body, 'no checkbox for this commit' |
|
43 | """name="46ad32a4f974" type="checkbox" value="1" />""" | |
31 | assert """<span>commit 64: 46ad32a4f974@2010-04-20 00:33:21</span>"""in response.body, 'wrong info about commit 64' |
|
44 | in response.body) | |
32 | assert """<span class="removed tooltip" title="<b>removed</b>: <br/> docs/api.rst">1</span>"""in response.body, 'wrong info about number of removed' |
|
45 | self.assertTrue("""<span>commit 64: 46ad32a4f974@2010-04-20""" | |
33 | assert """<span class="changed tooltip" title="<b>changed</b>: <br/> .hgignore<br/> README.rst<br/> docs/conf.py<br/> docs/index.rst<br/> setup.py<br/> tests/test_hg.py<br/> tests/test_nodes.py<br/> vcs/__init__.py<br/> vcs/backends/__init__.py<br/> vcs/backends/base.py<br/> vcs/backends/hg.py<br/> vcs/nodes.py<br/> vcs/utils/__init__.py">13</span>"""in response.body, 'wrong info about number of changes' |
|
46 | """ 00:33:21</span>"""in response.body) | |
34 | assert """<span class="added tooltip" title="<b>added</b>: <br/> docs/api/backends/hg.rst<br/> docs/api/backends/index.rst<br/> docs/api/index.rst<br/> docs/api/nodes.rst<br/> docs/api/web/index.rst<br/> docs/api/web/simplevcs.rst<br/> docs/installation.rst<br/> docs/quickstart.rst<br/> setup.cfg<br/> vcs/utils/baseui_config.py<br/> vcs/utils/web.py<br/> vcs/web/__init__.py<br/> vcs/web/exceptions.py<br/> vcs/web/simplevcs/__init__.py<br/> vcs/web/simplevcs/exceptions.py<br/> vcs/web/simplevcs/middleware.py<br/> vcs/web/simplevcs/models.py<br/> vcs/web/simplevcs/settings.py<br/> vcs/web/simplevcs/utils.py<br/> vcs/web/simplevcs/views.py">20</span>"""in response.body, 'wrong info about number of added' |
|
47 | ||
35 | assert """<div class="message"><a href="/%s/changeset/46ad32a4f974e45472a898c6b0acb600320579b1">Merge with 2e6a2bf9356ca56df08807f4ad86d480da72a8f4</a></div>""" % HG_REPO in response.body, 'wrong info about commit 64 is a merge' |
|
48 | self.assertTrue("""<span id="46ad32a4f974e45472a898c6b0acb600320""" | |
|
49 | """579b1" class="changed_total tooltip" """ | |||
|
50 | """title="Affected number of files, click to """ | |||
|
51 | """show more details">21</span>"""in response.body) | |||
|
52 | self.assertTrue("""<div class="message"><a href="/%s/changeset/""" | |||
|
53 | """46ad32a4f974e45472a898c6b0acb600320579b1">""" | |||
|
54 | """Merge with 2e6a2bf9356ca56df08807f4ad86d48""" | |||
|
55 | """0da72a8f4</a></div>""" % HG_REPO in response.body) | |||
36 |
|
56 | |||
37 |
|
57 | |||
38 |
|
58 |
1 | NO CONTENT: file was removed |
|
NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now