##// END OF EJS Templates
user-group-admin: use a proper auth filter....
marcink -
r1986:64b52a82 default
parent child Browse files
Show More
@@ -1,195 +1,203 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2016-2017 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 import datetime
23 23
24 24 from pyramid.httpexceptions import HTTPFound
25 25 from pyramid.view import view_config
26 26
27 27 from rhodecode.lib.helpers import Page
28 28 from rhodecode.model.scm import UserGroupList
29 29 from rhodecode_tools.lib.ext_json import json
30 30
31 31 from rhodecode.apps._base import BaseAppView, DataGridAppView
32 32 from rhodecode.lib.auth import (
33 33 LoginRequired, HasPermissionAllDecorator, CSRFRequired, NotAnonymous,
34 34 HasUserGroupPermissionAnyDecorator)
35 35 from rhodecode.lib import helpers as h
36 36 from rhodecode.lib.utils import PartialRenderer
37 37 from rhodecode.lib.utils2 import safe_int, safe_unicode
38 38 from rhodecode.model.auth_token import AuthTokenModel
39 39 from rhodecode.model.user import UserModel
40 40 from rhodecode.model.user_group import UserGroupModel
41 41 from rhodecode.model.db import User, UserGroup, UserGroupMember, or_, count
42 42 from rhodecode.model.meta import Session
43 43
44 44 log = logging.getLogger(__name__)
45 45
46 46
47 47 class AdminUserGroupsView(BaseAppView, DataGridAppView):
48 48
49 49 def load_default_context(self):
50 50 c = self._get_local_tmpl_context()
51 51 self._register_global_c(c)
52 52 return c
53 53
54 54 # permission check in data loading of
55 55 # `user_groups_list_data` via UserGroupList
56 56 @NotAnonymous()
57 57 @view_config(
58 58 route_name='user_groups', request_method='GET',
59 59 renderer='rhodecode:templates/admin/user_groups/user_groups.mako')
60 60 def user_groups_list(self):
61 61 c = self.load_default_context()
62 62 return self._get_template_context(c)
63 63
64 64 # permission check inside
65 65 @NotAnonymous()
66 66 @view_config(
67 67 route_name='user_groups_data', request_method='GET',
68 68 renderer='json_ext', xhr=True)
69 69 def user_groups_list_data(self):
70 70 column_map = {
71 71 'active': 'users_group_active',
72 72 'description': 'user_group_description',
73 73 'members': 'members_total',
74 74 'owner': 'user_username',
75 75 'sync': 'group_data'
76 76 }
77 77 draw, start, limit = self._extract_chunk(self.request)
78 78 search_q, order_by, order_dir = self._extract_ordering(
79 79 self.request, column_map=column_map)
80 80
81 81 _render = PartialRenderer('data_table/_dt_elements.mako')
82 82
83 83 def user_group_name(user_group_id, user_group_name):
84 84 return _render("user_group_name", user_group_id, user_group_name)
85 85
86 86 def user_group_actions(user_group_id, user_group_name):
87 87 return _render("user_group_actions", user_group_id, user_group_name)
88 88
89 89 def user_profile(username):
90 90 return _render('user_profile', username)
91 91
92 user_groups_data_total_count = UserGroup.query().count()
92 auth_user_group_list = UserGroupList(
93 UserGroup.query().all(), perm_set=['usergroup.admin'])
94
95 allowed_ids = []
96 for user_group in auth_user_group_list:
97 allowed_ids.append(user_group.users_group_id)
98
99 user_groups_data_total_count = UserGroup.query()\
100 .filter(UserGroup.users_group_id.in_(allowed_ids))\
101 .count()
93 102
94 103 member_count = count(UserGroupMember.user_id)
95 104 base_q = Session.query(
96 105 UserGroup.users_group_name,
97 106 UserGroup.user_group_description,
98 107 UserGroup.users_group_active,
99 108 UserGroup.users_group_id,
100 109 UserGroup.group_data,
101 110 User,
102 111 member_count.label('member_count')
103 112 ) \
113 .filter(UserGroup.users_group_id.in_(allowed_ids)) \
104 114 .outerjoin(UserGroupMember) \
105 115 .join(User, User.user_id == UserGroup.user_id) \
106 116 .group_by(UserGroup, User)
107 117
108 118 if search_q:
109 119 like_expression = u'%{}%'.format(safe_unicode(search_q))
110 120 base_q = base_q.filter(or_(
111 121 UserGroup.users_group_name.ilike(like_expression),
112 122 ))
113 123
114 124 user_groups_data_total_filtered_count = base_q.count()
115 125
116 126 if order_by == 'members_total':
117 127 sort_col = member_count
118 128 elif order_by == 'user_username':
119 129 sort_col = User.username
120 130 else:
121 131 sort_col = getattr(UserGroup, order_by, None)
122 132
123 133 if isinstance(sort_col, count) or sort_col:
124 134 if order_dir == 'asc':
125 135 sort_col = sort_col.asc()
126 136 else:
127 137 sort_col = sort_col.desc()
128 138
129 139 base_q = base_q.order_by(sort_col)
130 140 base_q = base_q.offset(start).limit(limit)
131 141
132 142 # authenticated access to user groups
133 user_group_list = base_q.all()
134 auth_user_group_list = UserGroupList(
135 user_group_list, perm_set=['usergroup.admin'])
143 auth_user_group_list = base_q.all()
136 144
137 145 user_groups_data = []
138 146 for user_gr in auth_user_group_list:
139 147 user_groups_data.append({
140 148 "users_group_name": user_group_name(
141 149 user_gr.users_group_id, h.escape(user_gr.users_group_name)),
142 150 "name_raw": h.escape(user_gr.users_group_name),
143 151 "description": h.escape(user_gr.user_group_description),
144 152 "members": user_gr.member_count,
145 153 # NOTE(marcink): because of advanced query we
146 154 # need to load it like that
147 155 "sync": UserGroup._load_group_data(
148 156 user_gr.group_data).get('extern_type'),
149 157 "active": h.bool2icon(user_gr.users_group_active),
150 158 "owner": user_profile(user_gr.User.username),
151 159 "action": user_group_actions(
152 160 user_gr.users_group_id, user_gr.users_group_name)
153 161 })
154 162
155 163 data = ({
156 164 'draw': draw,
157 165 'data': user_groups_data,
158 166 'recordsTotal': user_groups_data_total_count,
159 167 'recordsFiltered': user_groups_data_total_filtered_count,
160 168 })
161 169
162 170 return data
163 171
164 172 @LoginRequired()
165 173 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
166 174 @view_config(
167 175 route_name='user_group_members_data', request_method='GET',
168 176 renderer='json_ext', xhr=True)
169 177 def user_group_members(self):
170 178 """
171 179 Return members of given user group
172 180 """
173 181 user_group_id = self.request.matchdict['user_group_id']
174 182 user_group = UserGroup.get_or_404(user_group_id)
175 183 group_members_obj = sorted((x.user for x in user_group.members),
176 184 key=lambda u: u.username.lower())
177 185
178 186 group_members = [
179 187 {
180 188 'id': user.user_id,
181 189 'first_name': user.first_name,
182 190 'last_name': user.last_name,
183 191 'username': user.username,
184 192 'icon_link': h.gravatar_url(user.email, 30),
185 193 'value_display': h.person(user.email),
186 194 'value': user.username,
187 195 'value_type': 'user',
188 196 'active': user.active,
189 197 }
190 198 for user in group_members_obj
191 199 ]
192 200
193 201 return {
194 202 'members': group_members
195 203 }
General Comments 0
You need to be logged in to leave comments. Login now