]> git.ipfire.org Git - people/jschlag/pbs.git/blame - src/web/handlers_packages.py
Allow checking if a certain file exists in a package
[people/jschlag/pbs.git] / src / web / handlers_packages.py
CommitLineData
f6e6ff79
MT
1#!/usr/bin/python
2
01197c1d
MT
3import mimetypes
4import os.path
f6e6ff79
MT
5import tornado.web
6
2c909128 7from .handlers_base import BaseHandler
f6e6ff79 8
2c909128 9from ..constants import BUFFER_SIZE
01197c1d 10
f6e6ff79
MT
11class PackageIDDetailHandler(BaseHandler):
12 def get(self, id):
13 package = self.packages.get_by_id(id)
14 if not package:
15 return tornado.web.HTTPError(404, "Package not found: %s" % id)
16
17 self.render("package-detail.html", package=package)
18
19
20class PackageListHandler(BaseHandler):
21 def get(self):
22 packages = {}
23
24 show = self.get_argument("show", None)
25 if show == "all":
26 states = None
27 elif show == "obsoletes":
28 states = ["obsolete"]
29 elif show == "broken":
30 states = ["broken"]
31 else:
32 states = ["building", "stable", "testing"]
33
34 # Get all packages that fulfill the required parameters.
1104bcbf 35 pkgs = self.pakfire.packages.get_all_names(
f6e6ff79
MT
36 user=self.current_user, states=states)
37
38 # Sort all packages in an array like "<first char>" --> [packages, ...]
39 # to print them in a table for each letter of the alphabet.
40 for pkg in pkgs:
41 c = pkg[0][0].lower()
42
43 if not packages.has_key(c):
44 packages[c] = []
45
46 packages[c].append(pkg)
47
48 self.render("packages-list.html", packages=packages)
49
50
51class PackageNameHandler(BaseHandler):
52 def get(self, name):
1104bcbf 53 builds = self.pakfire.builds.get_active_builds(name)
fd0e70ec 54 if not builds:
f6e6ff79
MT
55 raise tornado.web.HTTPError(404, "Package '%s' was not found" % name)
56
fd0e70ec
MT
57 # Get the latest build to show the package meta information.
58 latest_build = builds[0]
f6e6ff79
MT
59
60 # Get the latest bugs from bugzilla.
61 bugs = self.pakfire.bugzilla.get_bugs_from_component(name)
62
fd0e70ec
MT
63 self.render("package-detail-list.html", name=name, builds=builds,
64 latest_build=latest_build, pkg=latest_build.pkg, bugs=bugs)
f6e6ff79
MT
65
66
a15d6139
MT
67class PackageScratchBuildsHandler(BaseHandler):
68 def get(self, name):
69 offset = self.get_argument("offset", 0)
70 limit = self.get_argument("limit", 10)
71
72 scratch_builds = self.pakfire.builds.get_by_name(name, type="scratch",
1104bcbf 73 limit=limit, offset=offset)
a15d6139
MT
74
75 if scratch_builds:
76 latest_build = scratch_builds[0]
77 else:
1104bcbf 78 release_builds = self.pakfire.builds.get_by_name(name, type="release", limit=1)
a15d6139
MT
79 if not release_builds:
80 raise tornado.web.HTTPError(404, "Could not find any build with this name: %s" % name)
81
82 latest_build = release_builds[0]
83
84 self.render("packages/builds/scratch.html", builds=scratch_builds,
85 pkg=latest_build.pkg)
86
87
4b1e87c4
MT
88class PackageChangelogHandler(BaseHandler):
89 def get(self, name):
90 limit = self.get_argument("limit", 10)
91 try:
92 limit = int(limit)
93 except ValueError:
94 limit = 10
95
96 offset = self.get_argument("offset", 0)
97 try:
98 offset = int(offset)
99 except ValueError:
100 offset = 0
101
102 # Get one more build than requested to find out if there are more items
103 # to display (next button).
104 builds = self.pakfire.builds.get_changelog(name, limit=limit + 1, offset=offset)
105
106 if len(builds) >= limit:
107 have_next = True
108 else:
109 have_next = False
110
111 if offset < limit:
112 have_prev = False
113 else:
114 have_prev = True
115
116 # Clip list to limit.
117 builds = builds[:limit]
118
119 self.render("packages/changelog.html", name=name, builds=builds,
120 limit=limit, offset=offset, have_prev=have_prev, have_next=have_next)
121
122
f6e6ff79
MT
123class PackageDetailHandler(BaseHandler):
124 def get(self, uuid):
125 pkg = self.pakfire.packages.get_by_uuid(uuid)
126 if not pkg:
127 raise tornado.web.HTTPError(404, "Package not found: %s" % uuid)
128
129 self.render("package-detail.html", pkg=pkg)
130
131 @tornado.web.authenticated
132 def post(self, name, epoch, version, release):
133 pkg = self.pakfire.packages.get_by_tuple(name, epoch, version, release)
134
135 action = self.get_argument("action", None)
136
137 if action == "comment":
138 vote = self.get_argument("vote", None)
139 if not self.current_user.is_tester() and \
140 not self.current_user.is_admin():
141 vote = None
142
143 pkg.comment(self.current_user.id, self.get_argument("text"),
144 vote or "none")
145
146 self.render("package-detail.html", pkg=pkg)
147
148
149class PackagePropertiesHandler(BaseHandler):
150 @tornado.web.authenticated
151 def get(self, name):
1104bcbf 152 build = self.pakfire.builds.get_latest_by_name(name)
f6e6ff79
MT
153
154 if not build:
155 raise tornado.web.HTTPError(404, "Package '%s' was not found" % name)
156
157 # Check if the user has sufficient permissions.
158 if not build.has_perm(self.current_user):
159 raise tornado.web.HTTPError(403, "User %s is not allowed to manage build %s" \
160 % (self.current_user, build))
161
162 self.render("package-properties.html", build=build,
163 pkg=build.pkg, properties=build.pkg.properties)
164
165 @tornado.web.authenticated
166 def post(self, name):
1104bcbf 167 build = self.pakfire.builds.get_latest_by_name(name)
f6e6ff79
MT
168
169 if not build:
170 raise tornado.web.HTTPError(404, "Package '%s' was not found" % name)
171
172 # Check if the user has sufficient permissions.
173 if not build.has_perm(self.current_user):
174 raise tornado.web.HTTPError(403, "User %s is not allowed to manage build %s" \
175 % (self.current_user, build))
176
177 critical_path = self.get_argument("critical_path", False)
178 if critical_path:
179 critical_path = True
180 else:
181 critical_path = False
182 build.pkg.update_property("critical_path", critical_path)
01197c1d
MT
183
184
185class PackageFileDownloadHandler(BaseHandler):
de4e09a5 186 def get_file(self, pkg_uuid, filename):
01197c1d
MT
187 # Fetch package.
188 pkg = self.pakfire.packages.get_by_uuid(pkg_uuid)
189 if not pkg:
190 raise tornado.web.HTTPError(404, "Package not found: %s" % pkg_uuid)
191
192 # Check if the package has got a file with the given name.
6a6aaccd
MT
193 file = pkg.get_file(filename)
194 if not file:
01197c1d
MT
195 raise tornado.web.HTTPError(404, "Package %s does not contain file %s" % (pkg, filename))
196
197 # Open the package in the filesystem.
6a6aaccd 198 pkg_file = pkg.open()
01197c1d 199 if not pkg_file:
e088f666 200 raise tornado.web.HTTPError(404, "Could not open package %s" % pkg.path)
01197c1d
MT
201
202 # Open the file to transfer it to the client.
203 f = pkg_file.open_file(filename)
204 if not f:
205 raise tornado.web.HTTPError(404, "Package %s does not contain file %s" % (pkg_file, filename))
206
01197c1d
MT
207 # Guess the MIME type of the file.
208 (type, encoding) = mimetypes.guess_type(filename)
209 if not type:
210 type = "text/plain"
de4e09a5
MT
211
212 return (pkg, f, type)
213
214 def get(self, pkg_uuid, filename):
215 pkg, f, mimetype = self.get_file(pkg_uuid, filename)
216
217 # Send the filename and mimetype in header.
218 self.set_header("Content-Disposition", "attachment; filename=%s" % os.path.basename(filename))
219 self.set_header("Content-Type", mimetype)
01197c1d
MT
220
221 # Transfer the content chunk by chunk.
222 while True:
223 buf = f.read(BUFFER_SIZE)
224 if not buf:
225 break
226
227 self.write(buf)
228
229 f.close()
230
231 # Done.
232 self.finish()
de4e09a5
MT
233
234
235class PackageFileViewHandler(PackageFileDownloadHandler):
236 def get(self, pkg_uuid, filename):
237 pkg, f, mimetype = self.get_file(pkg_uuid, filename)
238
239 # Read in the data.
240 content = f.read()
241 f.close()
242
5669a87f 243 self.render("packages/view-file.html", pkg=pkg, filename=filename,
de4e09a5 244 mimetype=mimetype, content=content, filesize=f.size)
bc293d03
MT
245
246
247class PackageBuildsTimesHandler(BaseHandler):
248 def get(self, name):
1104bcbf 249 latest_build = self.pakfire.builds.get_latest_by_name(name, type="release")
bc293d03
MT
250
251 # If no build with this name was found, we cannot go on.
252 if not latest_build:
253 raise tornado.web.HTTPError(404)
254
255 # Get the summary stats.
4f90cf84 256 build_times_summary = self.pakfire.builds.get_build_times_summary(name)
bc293d03
MT
257
258 self.render("packages/builds/times.html", pkg=latest_build.pkg,
259 build_times_summary=build_times_summary)