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