def list_packages_query(models_ref, namespace=None, media_type=None, search_query=None, username=None): """ List and filter repository by search query. """ Tag = models_ref.Tag if username and not search_query: repositories = model.repository.get_visible_repositories(username, kind_filter='application', include_public=True, namespace=namespace, limit=50) if not repositories: return [] repo_query = (Repository .select(Repository, Namespace.username) .join(Namespace, on=(Repository.namespace_user == Namespace.id)) .where(Repository.id << [repo.rid for repo in repositories])) if namespace: repo_query = (repo_query .where(Namespace.username == namespace)) else: if search_query is not None: fields = [model.repository.SEARCH_FIELDS.name.name] repositories = model.repository.get_app_search(search_query, username=username, search_fields=fields, limit=50) if not repositories: return [] repo_query = (Repository .select(Repository, Namespace.username) .join(Namespace, on=(Repository.namespace_user == Namespace.id)) .where(Repository.id << [repo.id for repo in repositories])) else: repo_query = (Repository .select(Repository, Namespace.username) .join(Namespace, on=(Repository.namespace_user == Namespace.id)) .where(Repository.visibility == model.repository.get_public_repo_visibility(), Repository.kind == Repository.kind.get_id('application'))) if namespace: repo_query = (repo_query .where(Namespace.username == namespace)) tag_query = (Tag .select() .where(Tag.tag_kind == Tag.tag_kind.get_id('release')) .order_by(Tag.lifetime_start)) if media_type: tag_query = tag_model.filter_tags_by_media_type(tag_query, media_type, models_ref) tag_query = tag_model.tag_is_alive(tag_query, Tag) query = prefetch(repo_query, tag_query) return query
def get_release_objs(repo, models_ref, media_type=None): """ Returns an array of Tag for a repo, with optional filtering by media_type. """ Tag = models_ref.Tag release_query = Tag.select().where( Tag.repository == repo, Tag.tag_kind == Tag.tag_kind.get_id("release")) if media_type: release_query = tag_model.filter_tags_by_media_type( release_query, media_type, models_ref) return tag_model.tag_is_alive(release_query, Tag)
def get_tag_channels(repo, tag_name, models_ref, active=True): """ Find the Channels associated with a Tag. """ Tag = models_ref.Tag tag = tag_model.get_tag(repo, tag_name, models_ref, "release") query = tag.tag_parents if active: query = tag_model.tag_is_alive(query, Tag) return query
def get_repo_channels(repo, models_ref): """ Creates or updates a channel to include a particular tag. """ Channel = models_ref.Channel Tag = models_ref.Tag tag_kind_id = Channel.tag_kind.get_id('channel') query = (Channel.select(Channel, Tag).join(Tag, on=(Tag.id == Channel.linked_tag)).where( Channel.repository == repo, Channel.tag_kind == tag_kind_id)) return tag_model.tag_is_alive(query, Channel)
def get_manifest_types(repo, models_ref, release=None): """ Returns an array of MediaTypes.name for a repo, can filter by tag """ Tag = models_ref.Tag ManifestListManifest = models_ref.ManifestListManifest query = tag_model.tag_is_alive( Tag.select(MediaType.name).join( ManifestListManifest, on=(ManifestListManifest.manifest_list == Tag.manifest_list)).join( MediaType, on=(ManifestListManifest.media_type == MediaType.id)).where( Tag.repository == repo, Tag.tag_kind == Tag.tag_kind.get_id('release')), Tag) if release: query = query.where(Tag.name == release) manifests = set() for m in query.distinct().tuples(): manifests.add(get_media_type(m[0])) return manifests