Start on new interactive search

This commit is contained in:
Joseph Schorr 2015-04-06 19:17:18 -04:00
parent 2ece1170a1
commit 951b0cbab8
7 changed files with 505 additions and 107 deletions

View file

@ -6,8 +6,10 @@ from auth.permissions import (OrganizationMemberPermission, ViewTeamPermission,
AdministerOrganizationPermission)
from auth.auth_context import get_authenticated_user
from auth import scopes
from app import avatar
from app import avatar, get_app_url
from operator import itemgetter
import math
@resource('/v1/entities/<prefix>')
class EntitySearch(ApiResource):
@ -101,6 +103,79 @@ class EntitySearch(ApiResource):
}
@resource('/v1/find/all')
class ConductSearch(ApiResource):
""" Resource for finding users, repositories, teams, etc. """
@parse_args
@query_param('query', 'The search query.', type=str, default='')
@require_scope(scopes.READ_REPO)
@nickname('conductSearch')
def get(self, args):
""" Get a list of entities and resources that match the specified query. """
prefix = args['query']
username = None
results = []
def entity_view(entity):
kind = 'user'
avatar_data = avatar.get_data_for_user(entity)
href = '/user/' + entity.username
if entity.organization:
kind = 'organization'
avatar_data = avatar.get_data_for_org(entity)
href = '/organization/' + entity.username
elif entity.robot:
kind = 'robot'
href = '/user?tab=robots'
avatar_data = None
return {
'kind': kind,
'avatar': avatar_data,
'name': entity.username,
'score': 1,
'href': href
}
if get_authenticated_user():
username = get_authenticated_user().username
# Find the matching teams.
matching_teams = model.get_matching_user_teams(prefix, get_authenticated_user())
for team in matching_teams:
results.append({
'kind': 'team',
'name': team.name,
'organization': entity_view(team.organization),
'avatar': avatar.get_data_for_team(team),
'score': 2,
'href': '/organization/' + team.organization.username + '/teams/' + team.name
})
# Find the matching repositories.
matching_repos = model.get_matching_repositories(prefix, username)
matching_repo_counts = {t[0]: t[1] for t in model.get_repository_pull_counts(matching_repos)}
for repo in matching_repos:
results.append({
'kind': 'repository',
'namespace': entity_view(repo.namespace_user),
'name': repo.name,
'description': repo.description,
'is_public': repo.visibility.name == 'public',
'score': math.log(matching_repo_counts.get(repo.id, 1), 10),
'href': '/repository/' + repo.namespace_user.username + '/' + repo.name
})
# Find the matching users, robots and organizations.
matching_entities = model.get_matching_user_entities(prefix, get_authenticated_user())
for entity in matching_entities:
results.append(entity_view(entity))
return {'results': sorted(results, key=itemgetter('score'), reverse=True)}
@resource('/v1/find/repository')
class FindRepositories(ApiResource):
""" Resource for finding repositories. """