예제 #1
0
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
예제 #2
0
파일: release.py 프로젝트: zhill/quay
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)
예제 #3
0
파일: channel.py 프로젝트: xzwupeng/quay
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
예제 #4
0
파일: channel.py 프로젝트: xzwupeng/quay
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)
예제 #5
0
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