Пример #1
0
def package_versions(context, request):
    """ Render the links for all versions of a package """
    normalized_name = normalize_name(context.name)

    # filename -> url
    pkgs = {}

    # packages in database
    packages = request.db.all(normalized_name)
    if packages and request.access.has_permission(normalized_name, 'read'):
        for package in packages:
            pkgs[package.filename] = package.get_url(request)

    # packages in fallback
    if request.registry.fallback == 'cache' and request.access.can_update_cache():
        locator = FilenameScrapingLocator(request.registry.fallback_url)
        dists = locator.get_project(context.name)
        for dist in six.itervalues(dists):
            filename = posixpath.basename(dist.source_url)
            url = request.app_url('api', 'package', dist.name, filename)
            if filename not in pkgs:
                pkgs[filename] = url

    # just redirect
    if len(pkgs) == 0:
        if request.registry.fallback == 'redirect':
            redirect_url = "%s/%s/" % ( request.registry.fallback_url.rstrip('/'), context.name)
            return HTTPFound(location=redirect_url)
        else:
            return HTTPNotFound()
    else:
        return {"pkgs": pkgs}
Пример #2
0
def package_versions(context, request):
    """ Render the links for all versions of a package """
    normalized_name = normalize_name(context.name)

    packages = request.db.all(normalized_name)
    if packages:
        if not request.access.has_permission(normalized_name, 'read'):
            return request.forbid()
        pkgs = {}
        for package in packages:
            pkgs[package.filename] = package.get_url(request)
        return {'pkgs': pkgs}

    elif request.registry.fallback == 'cache':
        if not request.access.can_update_cache():
            return request.forbid()
        locator = FilenameScrapingLocator(request.registry.fallback_url)
        dists = locator.get_project(context.name)
        if not dists:
            return HTTPNotFound()
        pkgs = {}
        for dist in six.itervalues(dists):
            filename = posixpath.basename(dist.source_url)
            url = request.app_url('api', 'package', dist.name, filename)
            pkgs[filename] = url
        return {'pkgs': pkgs}
    elif request.registry.fallback == 'redirect':
        redirect_url = "%s/%s/" % (
            request.registry.fallback_url.rstrip('/'), context.name)
        return HTTPFound(location=redirect_url)
    else:
        return HTTPNotFound()
Пример #3
0
def download_package(context, request):
    """ Download package, or redirect to the download link """
    package = request.db.fetch(context.filename)
    if not package:
        if request.registry.fallback != 'cache':
            return HTTPNotFound()
        if not request.access.can_update_cache():
            return request.forbid()
        # If we are caching pypi, download the package from pypi and save it
        locator = FilenameScrapingLocator(request.registry.fallback_url)
        dists = locator.get_project(context.name)
        dist = dists.get(context.filename)
        if dist is None:
            return HTTPNotFound()
        LOG.info("Caching %s from %s", context.filename,
                 request.registry.fallback_url)
        package = fetch_dist(request, dist)
    return request.db.download_response(package)
Пример #4
0
def download_package(context, request):
    """ Download package, or redirect to the download link """
    package = request.db.fetch(context.filename)
    if not package:
        if request.registry.fallback != 'cache':
            return HTTPNotFound()
        if not request.access.can_update_cache():
            return request.forbid()
        # If we are caching pypi, download the package from pypi and save it
        locator = FilenameScrapingLocator(request.registry.fallback_url)
        dists = locator.get_project(context.name)
        dist = dists.get(context.filename)
        if dist is None:
            return HTTPNotFound()
        LOG.info("Caching %s from %s", context.filename,
                 request.registry.fallback_url)
        package, data = fetch_dist(request, dist)
        disp = CONTENT_DISPOSITION.tuples(filename=package.filename)
        request.response.headers.update(disp)
        request.response.body = data
        request.response.content_type = 'application/octet-stream'
        return request.response
    response = request.db.download_response(package)
    return response
Пример #5
0
def download_package(context, request):
    """ Download package, or redirect to the download link """
    package = request.db.fetch(context.filename)
    if not package:
        if request.registry.fallback != 'cache':
            return HTTPNotFound()
        if not request.access.can_update_cache():
            return request.forbid()
        # If we are caching pypi, download the package from pypi and save it
        locator = FilenameScrapingLocator(request.registry.fallback_url)
        dists = locator.get_project(context.name)
        dist = dists.get(context.filename)
        if dist is None:
            return HTTPNotFound()
        LOG.info("Caching %s from %s", context.filename,
                 request.registry.fallback_url)
        package = fetch_dist(request, dist)

        # S3 will take a while to catch up (eventual consistency and all that).
        # In the meantime, just give up the link to where you got the original
        # package.
        return HTTPFound(location=dist.source_url)
    else:
        return request.db.download_response(package)
Пример #6
0
def download_package(context, request):
    """ Download package, or redirect to the download link """
    package = request.db.fetch(context.filename)
    if not package:
        if request.registry.fallback != 'cache':
            return HTTPNotFound()
        if not request.access.can_update_cache():
            return request.forbid()
        # If we are caching pypi, download the package from pypi and save it
        locator = FilenameScrapingLocator(request.registry.fallback_url)
        dists = locator.get_project(context.name)
        dist = dists.get(context.filename)
        if dist is None:
            return HTTPNotFound()
        LOG.info("Caching %s from %s", context.filename,
                 request.registry.fallback_url)
        package, data = fetch_dist(request, dist)
        disp = CONTENT_DISPOSITION.tuples(filename=package.filename)
        request.response.headers.update(disp)
        request.response.body = data
        request.response.content_type = 'application/octet-stream'
        return request.response
    response = request.db.download_response(package)
    return response