This repository has been archived by the owner on Aug 27, 2023. It is now read-only.
/
simple.py
82 lines (73 loc) · 2.9 KB
/
simple.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
""" Views for simple pip interaction """
import six
from pyramid.httpexceptions import HTTPBadRequest, HTTPFound, HTTPNotFound
from pyramid.view import view_config
import posixpath
from pypicloud.route import Root, SimplePackageResource, SimpleResource
from pypicloud.util import normalize_name, FilenameScrapingLocator
from pyramid_duh import argify, addslash
@view_config(context=Root, request_method='POST', subpath=(), renderer='json')
@view_config(context=SimpleResource, request_method='POST', subpath=(),
renderer='json')
@argify
def upload(request, name, version, content):
""" Handle update commands """
action = request.param(':action')
name = normalize_name(name)
if action == 'file_upload':
if not request.access.has_permission(name, 'write'):
return request.forbid()
try:
return request.db.upload(content.filename, content.file, name=name,
version=version)
except ValueError as e:
return HTTPBadRequest(*e.args)
else:
return HTTPBadRequest("Unknown action '%s'" % action)
@view_config(context=SimpleResource, request_method='GET', subpath=(),
renderer='simple.jinja2')
@addslash
def simple(request):
""" Render the list of all unique package names """
names = request.db.distinct()
i = 0
while i < len(names):
name = names[i]
if not request.access.has_permission(name, 'read'):
del names[i]
continue
i += 1
return {'pkgs': names}
@view_config(context=SimplePackageResource, request_method='GET', subpath=(),
renderer='package.jinja2')
@addslash
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()