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