repository-groups: use lazy loaded admin dashboard
This commit is contained in:
parent
8920170d1d
commit
5ac3be4f4e
10 changed files with 364 additions and 52 deletions
|
|
@ -17,7 +17,7 @@
|
|||
# This program is dual-licensed. If you wish to learn more about the
|
||||
# RhodeCode Enterprise Edition, including its added features, Support services,
|
||||
# and proprietary license terms, please see https://rhodecode.com/licenses/
|
||||
|
||||
import datetime
|
||||
import logging
|
||||
import formencode
|
||||
import formencode.htmlfill
|
||||
|
|
@ -30,16 +30,16 @@ from pyramid.response import Response
|
|||
from rhodecode import events
|
||||
from rhodecode.apps._base import BaseAppView, DataGridAppView
|
||||
|
||||
from rhodecode.lib.ext_json import json
|
||||
from rhodecode.lib.auth import (
|
||||
LoginRequired, CSRFRequired, NotAnonymous,
|
||||
HasPermissionAny, HasRepoGroupPermissionAny)
|
||||
from rhodecode.lib import helpers as h, audit_logger
|
||||
from rhodecode.lib.utils2 import safe_int, safe_unicode
|
||||
from rhodecode.lib.utils2 import safe_int, safe_unicode, datetime_to_time
|
||||
from rhodecode.model.forms import RepoGroupForm
|
||||
from rhodecode.model.repo_group import RepoGroupModel
|
||||
from rhodecode.model.scm import RepoGroupList
|
||||
from rhodecode.model.db import Session, RepoGroup
|
||||
from rhodecode.model.db import (
|
||||
or_, count, func, in_filter_generator, Session, RepoGroup, User, Repository)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
|
@ -88,23 +88,169 @@ class AdminRepoGroupsView(BaseAppView, DataGridAppView):
|
|||
return False
|
||||
return False
|
||||
|
||||
# permission check in data loading of
|
||||
# `repo_group_list_data` via RepoGroupList
|
||||
@LoginRequired()
|
||||
@NotAnonymous()
|
||||
# perms check inside
|
||||
@view_config(
|
||||
route_name='repo_groups', request_method='GET',
|
||||
renderer='rhodecode:templates/admin/repo_groups/repo_groups.mako')
|
||||
def repo_group_list(self):
|
||||
c = self.load_default_context()
|
||||
|
||||
repo_group_list = RepoGroup.get_all_repo_groups()
|
||||
repo_group_list_acl = RepoGroupList(
|
||||
repo_group_list, perm_set=['group.admin'])
|
||||
repo_group_data = RepoGroupModel().get_repo_groups_as_dict(
|
||||
repo_group_list=repo_group_list_acl, admin=True)
|
||||
c.data = json.dumps(repo_group_data)
|
||||
return self._get_template_context(c)
|
||||
|
||||
# permission check inside
|
||||
@LoginRequired()
|
||||
@NotAnonymous()
|
||||
@view_config(
|
||||
route_name='repo_groups_data', request_method='GET',
|
||||
renderer='json_ext', xhr=True)
|
||||
def repo_group_list_data(self):
|
||||
self.load_default_context()
|
||||
column_map = {
|
||||
'name_raw': 'group_name_hash',
|
||||
'desc': 'group_description',
|
||||
'last_change_raw': 'updated_on',
|
||||
'top_level_repos': 'repos_total',
|
||||
'owner': 'user_username',
|
||||
}
|
||||
draw, start, limit = self._extract_chunk(self.request)
|
||||
search_q, order_by, order_dir = self._extract_ordering(
|
||||
self.request, column_map=column_map)
|
||||
|
||||
_render = self.request.get_partial_renderer(
|
||||
'rhodecode:templates/data_table/_dt_elements.mako')
|
||||
c = _render.get_call_context()
|
||||
|
||||
def quick_menu(repo_group_name):
|
||||
return _render('quick_repo_group_menu', repo_group_name)
|
||||
|
||||
def repo_group_lnk(repo_group_name):
|
||||
return _render('repo_group_name', repo_group_name)
|
||||
|
||||
def last_change(last_change):
|
||||
if isinstance(last_change, datetime.datetime) and not last_change.tzinfo:
|
||||
delta = datetime.timedelta(
|
||||
seconds=(datetime.datetime.now() - datetime.datetime.utcnow()).seconds)
|
||||
last_change = last_change + delta
|
||||
return _render("last_change", last_change)
|
||||
|
||||
def desc(desc, personal):
|
||||
return _render(
|
||||
'repo_group_desc', desc, personal, c.visual.stylify_metatags)
|
||||
|
||||
def repo_group_actions(repo_group_id, repo_group_name, gr_count):
|
||||
return _render(
|
||||
'repo_group_actions', repo_group_id, repo_group_name, gr_count)
|
||||
|
||||
def user_profile(username):
|
||||
return _render('user_profile', username)
|
||||
|
||||
auth_repo_group_list = RepoGroupList(
|
||||
RepoGroup.query().all(), perm_set=['group.admin'])
|
||||
|
||||
allowed_ids = [-1]
|
||||
for repo_group in auth_repo_group_list:
|
||||
allowed_ids.append(repo_group.group_id)
|
||||
|
||||
repo_groups_data_total_count = RepoGroup.query()\
|
||||
.filter(or_(
|
||||
# generate multiple IN to fix limitation problems
|
||||
*in_filter_generator(RepoGroup.group_id, allowed_ids)
|
||||
)) \
|
||||
.count()
|
||||
|
||||
repo_groups_data_total_inactive_count = RepoGroup.query()\
|
||||
.filter(RepoGroup.group_id.in_(allowed_ids))\
|
||||
.count()
|
||||
|
||||
repo_count = count(Repository.repo_id)
|
||||
base_q = Session.query(
|
||||
RepoGroup.group_name,
|
||||
RepoGroup.group_name_hash,
|
||||
RepoGroup.group_description,
|
||||
RepoGroup.group_id,
|
||||
RepoGroup.personal,
|
||||
RepoGroup.updated_on,
|
||||
User,
|
||||
repo_count.label('repos_count')
|
||||
) \
|
||||
.filter(or_(
|
||||
# generate multiple IN to fix limitation problems
|
||||
*in_filter_generator(RepoGroup.group_id, allowed_ids)
|
||||
)) \
|
||||
.outerjoin(Repository) \
|
||||
.join(User, User.user_id == RepoGroup.user_id) \
|
||||
.group_by(RepoGroup, User)
|
||||
|
||||
if search_q:
|
||||
like_expression = u'%{}%'.format(safe_unicode(search_q))
|
||||
base_q = base_q.filter(or_(
|
||||
RepoGroup.group_name.ilike(like_expression),
|
||||
))
|
||||
|
||||
repo_groups_data_total_filtered_count = base_q.count()
|
||||
# the inactive isn't really used, but we still make it same as other data grids
|
||||
# which use inactive (users,user groups)
|
||||
repo_groups_data_total_filtered_inactive_count = repo_groups_data_total_filtered_count
|
||||
|
||||
sort_defined = False
|
||||
if order_by == 'group_name':
|
||||
sort_col = func.lower(RepoGroup.group_name)
|
||||
sort_defined = True
|
||||
elif order_by == 'repos_total':
|
||||
sort_col = repo_count
|
||||
sort_defined = True
|
||||
elif order_by == 'user_username':
|
||||
sort_col = User.username
|
||||
else:
|
||||
sort_col = getattr(RepoGroup, order_by, None)
|
||||
|
||||
if sort_defined or sort_col:
|
||||
if order_dir == 'asc':
|
||||
sort_col = sort_col.asc()
|
||||
else:
|
||||
sort_col = sort_col.desc()
|
||||
|
||||
base_q = base_q.order_by(sort_col)
|
||||
base_q = base_q.offset(start).limit(limit)
|
||||
|
||||
# authenticated access to user groups
|
||||
auth_repo_group_list = base_q.all()
|
||||
|
||||
repo_groups_data = []
|
||||
for repo_gr in auth_repo_group_list:
|
||||
row = {
|
||||
"menu": quick_menu(repo_gr.group_name),
|
||||
"name": repo_group_lnk(repo_gr.group_name),
|
||||
"name_raw": repo_gr.group_name,
|
||||
"last_change": last_change(repo_gr.updated_on),
|
||||
"last_change_raw": datetime_to_time(repo_gr.updated_on),
|
||||
|
||||
"last_changeset": "",
|
||||
"last_changeset_raw": "",
|
||||
|
||||
"desc": desc(repo_gr.group_description, repo_gr.personal),
|
||||
"owner": user_profile(repo_gr.User.username),
|
||||
"top_level_repos": repo_gr.repos_count,
|
||||
"action": repo_group_actions(
|
||||
repo_gr.group_id, repo_gr.group_name, repo_gr.repos_count),
|
||||
|
||||
}
|
||||
|
||||
repo_groups_data.append(row)
|
||||
|
||||
data = ({
|
||||
'draw': draw,
|
||||
'data': repo_groups_data,
|
||||
'recordsTotal': repo_groups_data_total_count,
|
||||
'recordsTotalInactive': repo_groups_data_total_inactive_count,
|
||||
'recordsFiltered': repo_groups_data_total_filtered_count,
|
||||
'recordsFilteredInactive': repo_groups_data_total_filtered_inactive_count,
|
||||
})
|
||||
|
||||
return data
|
||||
|
||||
@LoginRequired()
|
||||
@NotAnonymous()
|
||||
# perm checks inside
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue