From d2a4c9d05a83bdca4c601ec34fad6dc3df70abde Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Mon, 20 Mar 2017 19:05:55 -0400 Subject: [PATCH] data.model.repository: audited for repo_kind usage --- data/model/repository.py | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/data/model/repository.py b/data/model/repository.py index b25ac69ff..984519f1d 100644 --- a/data/model/repository.py +++ b/data/model/repository.py @@ -26,10 +26,11 @@ def get_public_repo_visibility(): return _basequery.get_public_repo_visibility() -def create_repository(namespace, name, creating_user, visibility='private'): +def create_repository(namespace, name, creating_user, visibility='private', repo_kind='image'): private = Visibility.get(name=visibility) namespace_user = User.get(username=namespace) - repo = Repository.create(name=name, visibility=private, namespace_user=namespace_user) + repo = Repository.create(name=name, visibility=private, namespace_user=namespace_user, + kind=Repository.kind.get_id(repo_kind)) admin = Role.get(name='admin') yesterday = datetime.now() - timedelta(days=1) @@ -103,7 +104,7 @@ def _get_gc_expiration_policies(): def get_random_gc_policy(): """ Return a single random policy from the database to use when garbage collecting. - """ + """ return random.choice(_get_gc_expiration_policies()) @@ -259,7 +260,7 @@ def unstar_repository(user, repository): raise DataModelException('Star not found.') -def get_user_starred_repositories(user): +def get_user_starred_repositories(user, repo_kind='image'): """ Retrieves all of the repositories a user has starred. """ query = (Repository .select(Repository, User, Visibility, Repository.id.alias('rid')) @@ -268,7 +269,8 @@ def get_user_starred_repositories(user): .join(User) .switch(Repository) .join(Visibility) - .where(Star.user == user)) + .where(Star.user == user, + Repository.kind == Repository.kind.get_id(repo_kind))) return query @@ -302,8 +304,8 @@ def get_when_last_modified(repository_ids): return last_modified_map -def get_visible_repositories(username, namespace=None, include_public=False, start_id=None, - limit=None): +def get_visible_repositories(username, namespace=None, repo_kind='image', include_public=False, + start_id=None, limit=None): """ Returns the repositories visible to the given user (if any). """ if not include_public and not username: @@ -321,7 +323,7 @@ def get_visible_repositories(username, namespace=None, include_public=False, sta # Note: We only need the permissions table if we will filter based on a user's permissions. query = query.switch(Repository).distinct().join(RepositoryPermission, JOIN_LEFT_OUTER) - query = _basequery.filter_to_repos_for_user(query, username, namespace, include_public, + query = _basequery.filter_to_repos_for_user(query, username, namespace, repo_kind, include_public, start_id=start_id) if limit is not None: @@ -330,14 +332,15 @@ def get_visible_repositories(username, namespace=None, include_public=False, sta return query -def get_filtered_matching_repositories(lookup_value, filter_username=None, offset=0, limit=25): +def get_filtered_matching_repositories(lookup_value, filter_username=None, repo_kind='image', + offset=0, limit=25): """ Returns an iterator of all repositories matching the given lookup value, with optional filtering to a specific user. If the user is unspecified, only public repositories will be returned. """ # Build the unfiltered search query. - unfiltered_query = _get_sorted_matching_repositories(lookup_value, + unfiltered_query = _get_sorted_matching_repositories(lookup_value, repo_kind=repo_kind, include_private=filter_username is not None) # Add a filter to the iterator, if necessary. @@ -395,7 +398,7 @@ def _filter_repositories_visible_to_username(unfiltered_query, filter_username, iteration_count = iteration_count + 1 -def _get_sorted_matching_repositories(lookup_value, include_private=False): +def _get_sorted_matching_repositories(lookup_value, repo_kind='image', include_private=False): """ Returns a query of repositories matching the given lookup string, with optional inclusion of private repositories. Note that this method does *not* filter results based on visibility to users. @@ -405,7 +408,8 @@ def _get_sorted_matching_repositories(lookup_value, include_private=False): query = (Repository .select(Repository, Namespace) .join(Namespace, on=(Namespace.id == Repository.namespace_user)) - .where(Repository.name.match(lookup_value) | Repository.description.match(lookup_value)) + .where(Repository.name.match(lookup_value) | Repository.description.match(lookup_value), + Repository.kind == Repository.kind.get_id(repo_kind)) .group_by(Repository.id, Namespace.id)) if not include_private: @@ -438,7 +442,8 @@ def repository_is_public(namespace_name, repository_name): .join(Namespace, on=(Repository.namespace_user == Namespace.id)) .switch(Repository) .join(Visibility) - .where(Namespace.username == namespace_name, Repository.name == repository_name, + .where(Namespace.username == namespace_name, + Repository.name == repository_name, Visibility.name == 'public') .get()) return True @@ -461,7 +466,8 @@ def get_email_authorized_for_repo(namespace, repository, email): .select(RepositoryAuthorizedEmail, Repository, Namespace) .join(Repository) .join(Namespace, on=(Repository.namespace_user == Namespace.id)) - .where(Namespace.username == namespace, Repository.name == repository, + .where(Namespace.username == namespace, + Repository.name == repository, RepositoryAuthorizedEmail.email == email) .get()) except RepositoryAuthorizedEmail.DoesNotExist: @@ -495,7 +501,7 @@ def confirm_email_authorization_for_repo(code): return found -def list_popular_public_repos(action_count_threshold, time_span): +def list_popular_public_repos(action_count_threshold, time_span, repo_kind='image'): cutoff = datetime.now() - time_span return (Repository .select(Namespace.username, Repository.name) @@ -503,7 +509,8 @@ def list_popular_public_repos(action_count_threshold, time_span): .switch(Repository) .join(RepositoryActionCount) .where(RepositoryActionCount.date >= cutoff, - Repository.visibility == get_public_repo_visibility()) + Repository.visibility == get_public_repo_visibility(), + Repository.kind == Repository.kind.get_id(repo_kind)) .group_by(RepositoryActionCount.repository, Repository.name, Namespace.username) .having(fn.Sum(RepositoryActionCount.count) >= action_count_threshold) .tuples())