##// END OF EJS Templates
user-groups: use request partial renderer and not the pylons one.
marcink -
r2109:52576dab default
parent child Browse files
Show More
@@ -1,247 +1,247 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2016-2017 RhodeCode GmbH
3 # Copyright (C) 2016-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 import logging
21 import logging
22
22
23 import formencode
23 import formencode
24 import formencode.htmlfill
24 import formencode.htmlfill
25
25
26 from pyramid.httpexceptions import HTTPFound
26 from pyramid.httpexceptions import HTTPFound
27 from pyramid.view import view_config
27 from pyramid.view import view_config
28 from pyramid.response import Response
28 from pyramid.response import Response
29 from pyramid.renderers import render
29 from pyramid.renderers import render
30
30
31 from rhodecode.apps._base import BaseAppView, DataGridAppView
31 from rhodecode.apps._base import BaseAppView, DataGridAppView
32 from rhodecode.lib.auth import (
32 from rhodecode.lib.auth import (
33 LoginRequired, NotAnonymous, CSRFRequired, HasPermissionAnyDecorator)
33 LoginRequired, NotAnonymous, CSRFRequired, HasPermissionAnyDecorator)
34 from rhodecode.lib import helpers as h, audit_logger
34 from rhodecode.lib import helpers as h, audit_logger
35 from rhodecode.lib.utils import PartialRenderer
36 from rhodecode.lib.utils2 import safe_unicode
35 from rhodecode.lib.utils2 import safe_unicode
37
36
38 from rhodecode.model.forms import UserGroupForm
37 from rhodecode.model.forms import UserGroupForm
39 from rhodecode.model.permission import PermissionModel
38 from rhodecode.model.permission import PermissionModel
40 from rhodecode.model.scm import UserGroupList
39 from rhodecode.model.scm import UserGroupList
41 from rhodecode.model.db import (
40 from rhodecode.model.db import (
42 or_, count, User, UserGroup, UserGroupMember)
41 or_, count, User, UserGroup, UserGroupMember)
43 from rhodecode.model.meta import Session
42 from rhodecode.model.meta import Session
44 from rhodecode.model.user_group import UserGroupModel
43 from rhodecode.model.user_group import UserGroupModel
45
44
46 log = logging.getLogger(__name__)
45 log = logging.getLogger(__name__)
47
46
48
47
49 class AdminUserGroupsView(BaseAppView, DataGridAppView):
48 class AdminUserGroupsView(BaseAppView, DataGridAppView):
50
49
51 def load_default_context(self):
50 def load_default_context(self):
52 c = self._get_local_tmpl_context()
51 c = self._get_local_tmpl_context()
53
52
54 PermissionModel().set_global_permission_choices(
53 PermissionModel().set_global_permission_choices(
55 c, gettext_translator=self.request.translate)
54 c, gettext_translator=self.request.translate)
56
55
57 self._register_global_c(c)
56 self._register_global_c(c)
58 return c
57 return c
59
58
60 # permission check in data loading of
59 # permission check in data loading of
61 # `user_groups_list_data` via UserGroupList
60 # `user_groups_list_data` via UserGroupList
62 @LoginRequired()
61 @LoginRequired()
63 @NotAnonymous()
62 @NotAnonymous()
64 @view_config(
63 @view_config(
65 route_name='user_groups', request_method='GET',
64 route_name='user_groups', request_method='GET',
66 renderer='rhodecode:templates/admin/user_groups/user_groups.mako')
65 renderer='rhodecode:templates/admin/user_groups/user_groups.mako')
67 def user_groups_list(self):
66 def user_groups_list(self):
68 c = self.load_default_context()
67 c = self.load_default_context()
69 return self._get_template_context(c)
68 return self._get_template_context(c)
70
69
71 # permission check inside
70 # permission check inside
72 @LoginRequired()
71 @LoginRequired()
73 @NotAnonymous()
72 @NotAnonymous()
74 @view_config(
73 @view_config(
75 route_name='user_groups_data', request_method='GET',
74 route_name='user_groups_data', request_method='GET',
76 renderer='json_ext', xhr=True)
75 renderer='json_ext', xhr=True)
77 def user_groups_list_data(self):
76 def user_groups_list_data(self):
78 column_map = {
77 column_map = {
79 'active': 'users_group_active',
78 'active': 'users_group_active',
80 'description': 'user_group_description',
79 'description': 'user_group_description',
81 'members': 'members_total',
80 'members': 'members_total',
82 'owner': 'user_username',
81 'owner': 'user_username',
83 'sync': 'group_data'
82 'sync': 'group_data'
84 }
83 }
85 draw, start, limit = self._extract_chunk(self.request)
84 draw, start, limit = self._extract_chunk(self.request)
86 search_q, order_by, order_dir = self._extract_ordering(
85 search_q, order_by, order_dir = self._extract_ordering(
87 self.request, column_map=column_map)
86 self.request, column_map=column_map)
88
87
89 _render = PartialRenderer('data_table/_dt_elements.mako')
88 _render = self.request.get_partial_renderer(
89 'data_table/_dt_elements.mako')
90
90
91 def user_group_name(user_group_id, user_group_name):
91 def user_group_name(user_group_id, user_group_name):
92 return _render("user_group_name", user_group_id, user_group_name)
92 return _render("user_group_name", user_group_id, user_group_name)
93
93
94 def user_group_actions(user_group_id, user_group_name):
94 def user_group_actions(user_group_id, user_group_name):
95 return _render("user_group_actions", user_group_id, user_group_name)
95 return _render("user_group_actions", user_group_id, user_group_name)
96
96
97 def user_profile(username):
97 def user_profile(username):
98 return _render('user_profile', username)
98 return _render('user_profile', username)
99
99
100 auth_user_group_list = UserGroupList(
100 auth_user_group_list = UserGroupList(
101 UserGroup.query().all(), perm_set=['usergroup.admin'])
101 UserGroup.query().all(), perm_set=['usergroup.admin'])
102
102
103 allowed_ids = []
103 allowed_ids = []
104 for user_group in auth_user_group_list:
104 for user_group in auth_user_group_list:
105 allowed_ids.append(user_group.users_group_id)
105 allowed_ids.append(user_group.users_group_id)
106
106
107 user_groups_data_total_count = UserGroup.query()\
107 user_groups_data_total_count = UserGroup.query()\
108 .filter(UserGroup.users_group_id.in_(allowed_ids))\
108 .filter(UserGroup.users_group_id.in_(allowed_ids))\
109 .count()
109 .count()
110
110
111 member_count = count(UserGroupMember.user_id)
111 member_count = count(UserGroupMember.user_id)
112 base_q = Session.query(
112 base_q = Session.query(
113 UserGroup.users_group_name,
113 UserGroup.users_group_name,
114 UserGroup.user_group_description,
114 UserGroup.user_group_description,
115 UserGroup.users_group_active,
115 UserGroup.users_group_active,
116 UserGroup.users_group_id,
116 UserGroup.users_group_id,
117 UserGroup.group_data,
117 UserGroup.group_data,
118 User,
118 User,
119 member_count.label('member_count')
119 member_count.label('member_count')
120 ) \
120 ) \
121 .filter(UserGroup.users_group_id.in_(allowed_ids)) \
121 .filter(UserGroup.users_group_id.in_(allowed_ids)) \
122 .outerjoin(UserGroupMember) \
122 .outerjoin(UserGroupMember) \
123 .join(User, User.user_id == UserGroup.user_id) \
123 .join(User, User.user_id == UserGroup.user_id) \
124 .group_by(UserGroup, User)
124 .group_by(UserGroup, User)
125
125
126 if search_q:
126 if search_q:
127 like_expression = u'%{}%'.format(safe_unicode(search_q))
127 like_expression = u'%{}%'.format(safe_unicode(search_q))
128 base_q = base_q.filter(or_(
128 base_q = base_q.filter(or_(
129 UserGroup.users_group_name.ilike(like_expression),
129 UserGroup.users_group_name.ilike(like_expression),
130 ))
130 ))
131
131
132 user_groups_data_total_filtered_count = base_q.count()
132 user_groups_data_total_filtered_count = base_q.count()
133
133
134 if order_by == 'members_total':
134 if order_by == 'members_total':
135 sort_col = member_count
135 sort_col = member_count
136 elif order_by == 'user_username':
136 elif order_by == 'user_username':
137 sort_col = User.username
137 sort_col = User.username
138 else:
138 else:
139 sort_col = getattr(UserGroup, order_by, None)
139 sort_col = getattr(UserGroup, order_by, None)
140
140
141 if isinstance(sort_col, count) or sort_col:
141 if isinstance(sort_col, count) or sort_col:
142 if order_dir == 'asc':
142 if order_dir == 'asc':
143 sort_col = sort_col.asc()
143 sort_col = sort_col.asc()
144 else:
144 else:
145 sort_col = sort_col.desc()
145 sort_col = sort_col.desc()
146
146
147 base_q = base_q.order_by(sort_col)
147 base_q = base_q.order_by(sort_col)
148 base_q = base_q.offset(start).limit(limit)
148 base_q = base_q.offset(start).limit(limit)
149
149
150 # authenticated access to user groups
150 # authenticated access to user groups
151 auth_user_group_list = base_q.all()
151 auth_user_group_list = base_q.all()
152
152
153 user_groups_data = []
153 user_groups_data = []
154 for user_gr in auth_user_group_list:
154 for user_gr in auth_user_group_list:
155 user_groups_data.append({
155 user_groups_data.append({
156 "users_group_name": user_group_name(
156 "users_group_name": user_group_name(
157 user_gr.users_group_id, h.escape(user_gr.users_group_name)),
157 user_gr.users_group_id, h.escape(user_gr.users_group_name)),
158 "name_raw": h.escape(user_gr.users_group_name),
158 "name_raw": h.escape(user_gr.users_group_name),
159 "description": h.escape(user_gr.user_group_description),
159 "description": h.escape(user_gr.user_group_description),
160 "members": user_gr.member_count,
160 "members": user_gr.member_count,
161 # NOTE(marcink): because of advanced query we
161 # NOTE(marcink): because of advanced query we
162 # need to load it like that
162 # need to load it like that
163 "sync": UserGroup._load_group_data(
163 "sync": UserGroup._load_group_data(
164 user_gr.group_data).get('extern_type'),
164 user_gr.group_data).get('extern_type'),
165 "active": h.bool2icon(user_gr.users_group_active),
165 "active": h.bool2icon(user_gr.users_group_active),
166 "owner": user_profile(user_gr.User.username),
166 "owner": user_profile(user_gr.User.username),
167 "action": user_group_actions(
167 "action": user_group_actions(
168 user_gr.users_group_id, user_gr.users_group_name)
168 user_gr.users_group_id, user_gr.users_group_name)
169 })
169 })
170
170
171 data = ({
171 data = ({
172 'draw': draw,
172 'draw': draw,
173 'data': user_groups_data,
173 'data': user_groups_data,
174 'recordsTotal': user_groups_data_total_count,
174 'recordsTotal': user_groups_data_total_count,
175 'recordsFiltered': user_groups_data_total_filtered_count,
175 'recordsFiltered': user_groups_data_total_filtered_count,
176 })
176 })
177
177
178 return data
178 return data
179
179
180 @LoginRequired()
180 @LoginRequired()
181 @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
181 @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
182 @view_config(
182 @view_config(
183 route_name='user_groups_new', request_method='GET',
183 route_name='user_groups_new', request_method='GET',
184 renderer='rhodecode:templates/admin/user_groups/user_group_add.mako')
184 renderer='rhodecode:templates/admin/user_groups/user_group_add.mako')
185 def user_groups_new(self):
185 def user_groups_new(self):
186 c = self.load_default_context()
186 c = self.load_default_context()
187 return self._get_template_context(c)
187 return self._get_template_context(c)
188
188
189 @LoginRequired()
189 @LoginRequired()
190 @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
190 @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
191 @CSRFRequired()
191 @CSRFRequired()
192 @view_config(
192 @view_config(
193 route_name='user_groups_create', request_method='POST',
193 route_name='user_groups_create', request_method='POST',
194 renderer='rhodecode:templates/admin/user_groups/user_group_add.mako')
194 renderer='rhodecode:templates/admin/user_groups/user_group_add.mako')
195 def user_groups_create(self):
195 def user_groups_create(self):
196 _ = self.request.translate
196 _ = self.request.translate
197 c = self.load_default_context()
197 c = self.load_default_context()
198 users_group_form = UserGroupForm()()
198 users_group_form = UserGroupForm()()
199
199
200 user_group_name = self.request.POST.get('users_group_name')
200 user_group_name = self.request.POST.get('users_group_name')
201 try:
201 try:
202 form_result = users_group_form.to_python(dict(self.request.POST))
202 form_result = users_group_form.to_python(dict(self.request.POST))
203 user_group = UserGroupModel().create(
203 user_group = UserGroupModel().create(
204 name=form_result['users_group_name'],
204 name=form_result['users_group_name'],
205 description=form_result['user_group_description'],
205 description=form_result['user_group_description'],
206 owner=self._rhodecode_user.user_id,
206 owner=self._rhodecode_user.user_id,
207 active=form_result['users_group_active'])
207 active=form_result['users_group_active'])
208 Session().flush()
208 Session().flush()
209 creation_data = user_group.get_api_data()
209 creation_data = user_group.get_api_data()
210 user_group_name = form_result['users_group_name']
210 user_group_name = form_result['users_group_name']
211
211
212 audit_logger.store_web(
212 audit_logger.store_web(
213 'user_group.create', action_data={'data': creation_data},
213 'user_group.create', action_data={'data': creation_data},
214 user=self._rhodecode_user)
214 user=self._rhodecode_user)
215
215
216 user_group_link = h.link_to(
216 user_group_link = h.link_to(
217 h.escape(user_group_name),
217 h.escape(user_group_name),
218 h.route_path(
218 h.route_path(
219 'edit_user_group', user_group_id=user_group.users_group_id))
219 'edit_user_group', user_group_id=user_group.users_group_id))
220 h.flash(h.literal(_('Created user group %(user_group_link)s')
220 h.flash(h.literal(_('Created user group %(user_group_link)s')
221 % {'user_group_link': user_group_link}),
221 % {'user_group_link': user_group_link}),
222 category='success')
222 category='success')
223 Session().commit()
223 Session().commit()
224 user_group_id = user_group.users_group_id
224 user_group_id = user_group.users_group_id
225 except formencode.Invalid as errors:
225 except formencode.Invalid as errors:
226
226
227 data = render(
227 data = render(
228 'rhodecode:templates/admin/user_groups/user_group_add.mako',
228 'rhodecode:templates/admin/user_groups/user_group_add.mako',
229 self._get_template_context(c), self.request)
229 self._get_template_context(c), self.request)
230 html = formencode.htmlfill.render(
230 html = formencode.htmlfill.render(
231 data,
231 data,
232 defaults=errors.value,
232 defaults=errors.value,
233 errors=errors.error_dict or {},
233 errors=errors.error_dict or {},
234 prefix_error=False,
234 prefix_error=False,
235 encoding="UTF-8",
235 encoding="UTF-8",
236 force_defaults=False
236 force_defaults=False
237 )
237 )
238 return Response(html)
238 return Response(html)
239
239
240 except Exception:
240 except Exception:
241 log.exception("Exception creating user group")
241 log.exception("Exception creating user group")
242 h.flash(_('Error occurred during creation of user group %s') \
242 h.flash(_('Error occurred during creation of user group %s') \
243 % user_group_name, category='error')
243 % user_group_name, category='error')
244 raise HTTPFound(h.route_path('user_groups_new'))
244 raise HTTPFound(h.route_path('user_groups_new'))
245
245
246 raise HTTPFound(
246 raise HTTPFound(
247 h.route_path('edit_user_group', user_group_id=user_group_id))
247 h.route_path('edit_user_group', user_group_id=user_group_id))
General Comments 0
You need to be logged in to leave comments. Login now