Add a table view to the repos list page

Fixes #104
This commit is contained in:
Joseph Schorr 2015-06-09 17:58:57 -04:00
parent 7043ddc935
commit 2b1bbcb579
16 changed files with 416 additions and 134 deletions

View file

@ -3,11 +3,16 @@
import logging
import json
import datetime
from datetime import timedelta
from flask import request
from data import model
from data.model import Namespace
from data.database import (Repository as RepositoryTable, Visibility, RepositoryTag,
RepositoryActionCount, fn)
from endpoints.api import (truthy_bool, format_date, nickname, log_action, validate_json_request,
require_repo_read, require_repo_write, require_repo_admin,
RepositoryParamResource, resource, query_param, parse_args, ApiResource,
@ -109,11 +114,12 @@ class RepositoryList(ApiResource):
type=truthy_bool, default=True)
@query_param('private', 'Whether to include private repositories.', type=truthy_bool,
default=True)
@query_param('sort', 'Whether to sort the results.', type=truthy_bool, default=False)
@query_param('count', 'Whether to include a count of the total number of results available.',
type=truthy_bool, default=False)
@query_param('namespace_only', 'Whether to limit only to the given namespace.',
type=truthy_bool, default=False)
@query_param('last_modified', 'Whether to include when the repository was last modified.',
type=truthy_bool, default=False)
@query_param('popularity', 'Whether to include the repository\'s popularity metric.',
type=truthy_bool, default=False)
def get(self, args):
"""Fetch the list of repositories under a variety of situations."""
username = None
@ -126,25 +132,31 @@ class RepositoryList(ApiResource):
response = {}
repo_count = None
if args['count']:
repo_count = model.get_visible_repository_count(username, include_public=args['public'],
namespace=args['namespace'])
response['count'] = repo_count
repo_query = model.get_visible_repositories(username, limit=args['limit'], page=args['page'],
include_public=args['public'], sort=args['sort'],
repo_query = model.get_visible_repositories(username,
limit=args['limit'],
page=args['page'],
include_public=args['public'],
namespace=args['namespace'],
namespace_only=args['namespace_only'])
namespace_only=args['namespace_only'],
include_latest_tag=args['last_modified'],
include_actions=args['popularity'])
def repo_view(repo_obj):
repo = {
'namespace': repo_obj.namespace_user.username,
'name': repo_obj.name,
'description': repo_obj.description,
'is_public': repo_obj.visibility.name == 'public',
'namespace': repo_obj.get(Namespace.username),
'name': repo_obj.get(RepositoryTable.name),
'description': repo_obj.get(RepositoryTable.description),
'is_public': repo_obj.get(Visibility.name) == 'public'
}
if args['last_modified']:
repo['last_modified'] = repo_obj.get(fn.Max(RepositoryTag.lifetime_start_ts))
if args['popularity']:
repo['popularity'] = repo_obj.get(fn.Max(RepositoryActionCount.count)) or 0
if get_authenticated_user():
repo['is_starred'] = repo_obj.id in star_lookup
repo['is_starred'] = repo_obj.get(RepositoryTable.id) in star_lookup
return repo
response['repositories'] = [repo_view(repo) for repo in repo_query]