From fde96c736a0fc927e1cbbe1dda4d288dfa9eea41 Mon Sep 17 00:00:00 2001 From: jakedt Date: Wed, 5 Mar 2014 15:50:32 -0500 Subject: [PATCH] Fix a problem with initdb and add a limit to the builds API. --- data/model.py | 16 ++++++---------- endpoints/api.py | 12 +++++++----- initdb.py | 2 +- test/data/test.db | Bin 454656 -> 171008 bytes 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/data/model.py b/data/model.py index cd447fe0f..33ceebaff 100644 --- a/data/model.py +++ b/data/model.py @@ -1395,7 +1395,7 @@ def load_token_data(code): def get_repository_build(namespace_name, repository_name, build_uuid): try: - query = list_repository_builds(namespace_name, repository_name) + query = list_repository_builds(namespace_name, repository_name, 1) return query.where(RepositoryBuild.uuid == build_uuid).get() except RepositoryBuild.DoesNotExist: @@ -1403,7 +1403,7 @@ def get_repository_build(namespace_name, repository_name, build_uuid): raise InvalidRepositoryBuildException(msg) -def list_repository_builds(namespace_name, repository_name, +def list_repository_builds(namespace_name, repository_name, limit, include_inactive=True): query = (RepositoryBuild .select(RepositoryBuild, RepositoryBuildTrigger, BuildTriggerService) @@ -1412,7 +1412,8 @@ def list_repository_builds(namespace_name, repository_name, .join(RepositoryBuildTrigger, JOIN_LEFT_OUTER) .join(BuildTriggerService, JOIN_LEFT_OUTER) .where(Repository.name == repository_name, - Repository.namespace == namespace_name)) + Repository.namespace == namespace_name) + .limit(limit)) if not include_inactive: query = query.where(RepositoryBuild.phase != 'error', @@ -1537,11 +1538,6 @@ def list_build_triggers(namespace_name, repository_name): def list_trigger_builds(namespace_name, repository_name, trigger_uuid, - limit=None): - query = (list_repository_builds(namespace_name, repository_name) + limit): + query = (list_repository_builds(namespace_name, repository_name, limit) .where(RepositoryBuildTrigger.uuid == trigger_uuid)) - - if limit: - return query.limit(limit) - else: - return query diff --git a/endpoints/api.py b/endpoints/api.py index d9ef53c09..0a4700a22 100644 --- a/endpoints/api.py +++ b/endpoints/api.py @@ -1105,7 +1105,7 @@ def get_repo(namespace, repository): tag_dict = {tag.name: tag_view(tag) for tag in tags} can_write = ModifyRepositoryPermission(namespace, repository).can() can_admin = AdministerRepositoryPermission(namespace, repository).can() - active_builds = model.list_repository_builds(namespace, repository, + active_builds = model.list_repository_builds(namespace, repository, 1, include_inactive=False) return jsonify({ @@ -1160,9 +1160,11 @@ def build_status_view(build_obj, can_write=False): def get_repo_builds(namespace, repository): permission = ReadRepositoryPermission(namespace, repository) is_public = model.repository_is_public(namespace, repository) - if permission.can() or is_public: + if permission.can() or is_public: + limit = request.args.get('limit', 5) + builds = list(model.list_repository_builds(namespace, repository, limit)) + can_write = ModifyRepositoryPermission(namespace, repository).can() - builds = model.list_repository_builds(namespace, repository) return jsonify({ 'builds': [build_status_view(build, can_write) for build in builds] }) @@ -1501,8 +1503,8 @@ def list_trigger_recent_builds(namespace, repository, trigger_uuid): permission = AdministerRepositoryPermission(namespace, repository) if permission.can(): limit = request.args.get('limit', 5) - builds = model.list_trigger_builds(namespace, repository, trigger_uuid, - limit) + builds = list(model.list_trigger_builds(namespace, repository, + trigger_uuid, limit)) return jsonify({ 'builds': [build_status_view(build, True) for build in builds] }) diff --git a/initdb.py b/initdb.py index a39db7fc2..a1e2fe646 100644 --- a/initdb.py +++ b/initdb.py @@ -328,7 +328,7 @@ def populate_database(): 'build_subdir': '', } build = model.create_repository_build(building, token, job_config, - '701dcc3724fb4f2ea6c31400528343cd' + '701dcc3724fb4f2ea6c31400528343cd', 'build-name', trigger) build.uuid = 'deadbeef-dead-beef-dead-beefdeadbeef' build.save() diff --git a/test/data/test.db b/test/data/test.db index d2ae417262924f663ea4b0bc582cc76e0d1ba429..9779208a8859fc77e4860974aa2c534dc515b959 100644 GIT binary patch delta 12975 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 delta 14994 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 u`GBnL1o~gC3Ya1Q