parent
7043ddc935
commit
2b1bbcb579
16 changed files with 416 additions and 134 deletions
|
@ -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]
|
||||
|
|
Reference in a new issue