7 from .handlers_base
import BaseHandler
9 from ..constants
import BUFFER_SIZE
11 class PackageIDDetailHandler(BaseHandler
):
13 package
= self
.packages
.get_by_id(id)
15 return tornado
.web
.HTTPError(404, "Package not found: %s" % id)
17 self
.render("package-detail.html", package
=package
)
20 class PackageListHandler(BaseHandler
):
24 show
= self
.get_argument("show", None)
27 elif show
== "obsoletes":
29 elif show
== "broken":
32 states
= ["building", "stable", "testing"]
34 # Get all packages that fulfill the required parameters.
35 pkgs
= self
.pakfire
.packages
.get_all_names(
36 user
=self
.current_user
, states
=states
)
38 # Sort all packages in an array like "<first char>" --> [packages, ...]
39 # to print them in a table for each letter of the alphabet.
43 if not packages
.has_key(c
):
46 packages
[c
].append(pkg
)
48 self
.render("packages-list.html", packages
=packages
)
51 class PackageNameHandler(BaseHandler
):
53 builds
= self
.pakfire
.builds
.get_active_builds(name
)
55 raise tornado
.web
.HTTPError(404, "Package '%s' was not found" % name
)
57 # Get the latest build to show the package meta information.
58 latest_build
= builds
[0]
60 # Get the latest bugs from bugzilla.
61 bugs
= self
.pakfire
.bugzilla
.get_bugs_from_component(name
)
63 self
.render("package-detail-list.html", name
=name
, builds
=builds
,
64 latest_build
=latest_build
, pkg
=latest_build
.pkg
, bugs
=bugs
)
67 class PackageScratchBuildsHandler(BaseHandler
):
69 offset
= self
.get_argument("offset", 0)
70 limit
= self
.get_argument("limit", 10)
72 scratch_builds
= self
.pakfire
.builds
.get_by_name(name
, type="scratch",
73 limit
=limit
, offset
=offset
)
76 latest_build
= scratch_builds
[0]
78 release_builds
= self
.pakfire
.builds
.get_by_name(name
, type="release", limit
=1)
79 if not release_builds
:
80 raise tornado
.web
.HTTPError(404, "Could not find any build with this name: %s" % name
)
82 latest_build
= release_builds
[0]
84 self
.render("packages/builds/scratch.html", builds
=scratch_builds
,
88 class PackageChangelogHandler(BaseHandler
):
90 limit
= self
.get_argument("limit", 10)
96 offset
= self
.get_argument("offset", 0)
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
)
106 if len(builds
) >= limit
:
116 # Clip list to limit.
117 builds
= builds
[:limit
]
119 self
.render("packages/changelog.html", name
=name
, builds
=builds
,
120 limit
=limit
, offset
=offset
, have_prev
=have_prev
, have_next
=have_next
)
123 class PackageDetailHandler(BaseHandler
):
125 pkg
= self
.pakfire
.packages
.get_by_uuid(uuid
)
127 raise tornado
.web
.HTTPError(404, "Package not found: %s" % uuid
)
129 self
.render("package-detail.html", pkg
=pkg
)
131 @tornado.web
.authenticated
132 def post(self
, name
, epoch
, version
, release
):
133 pkg
= self
.pakfire
.packages
.get_by_tuple(name
, epoch
, version
, release
)
135 action
= self
.get_argument("action", None)
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():
143 pkg
.comment(self
.current_user
.id, self
.get_argument("text"),
146 self
.render("package-detail.html", pkg
=pkg
)
149 class PackagePropertiesHandler(BaseHandler
):
150 @tornado.web
.authenticated
152 build
= self
.pakfire
.builds
.get_latest_by_name(name
)
155 raise tornado
.web
.HTTPError(404, "Package '%s' was not found" % name
)
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
))
162 self
.render("package-properties.html", build
=build
,
163 pkg
=build
.pkg
, properties
=build
.pkg
.properties
)
165 @tornado.web
.authenticated
166 def post(self
, name
):
167 build
= self
.pakfire
.builds
.get_latest_by_name(name
)
170 raise tornado
.web
.HTTPError(404, "Package '%s' was not found" % name
)
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
))
177 critical_path
= self
.get_argument("critical_path", False)
181 critical_path
= False
182 build
.pkg
.update_property("critical_path", critical_path
)
185 class PackageFileDownloadHandler(BaseHandler
):
186 def get_file(self
, pkg_uuid
, filename
):
188 pkg
= self
.pakfire
.packages
.get_by_uuid(pkg_uuid
)
190 raise tornado
.web
.HTTPError(404, "Package not found: %s" % pkg_uuid
)
192 # Check if the package has got a file with the given name.
193 file = pkg
.get_file(filename
)
195 raise tornado
.web
.HTTPError(404, "Package %s does not contain file %s" % (pkg
, filename
))
197 # Open the package in the filesystem.
198 pkg_file
= pkg
.open()
200 raise tornado
.web
.HTTPError(404, "Could not open package %s" % pkg
.path
)
202 # Open the file to transfer it to the client.
203 f
= pkg_file
.open_file(filename
)
205 raise tornado
.web
.HTTPError(404, "Package %s does not contain file %s" % (pkg_file
, filename
))
207 # Guess the MIME type of the file.
208 (type, encoding
) = mimetypes
.guess_type(filename
)
212 return (pkg
, f
, type)
214 def get(self
, pkg_uuid
, filename
):
215 pkg
, f
, mimetype
= self
.get_file(pkg_uuid
, filename
)
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
)
221 # Transfer the content chunk by chunk.
223 buf
= f
.read(BUFFER_SIZE
)
235 class PackageFileViewHandler(PackageFileDownloadHandler
):
236 def get(self
, pkg_uuid
, filename
):
237 pkg
, f
, mimetype
= self
.get_file(pkg_uuid
, filename
)
243 self
.render("packages/view-file.html", pkg
=pkg
, filename
=filename
,
244 mimetype
=mimetype
, content
=content
, filesize
=f
.size
)
247 class PackageBuildsTimesHandler(BaseHandler
):
249 latest_build
= self
.pakfire
.builds
.get_latest_by_name(name
, type="release")
251 # If no build with this name was found, we cannot go on.
253 raise tornado
.web
.HTTPError(404)
255 # Get the summary stats.
256 build_times_summary
= self
.pakfire
.builds
.get_build_times_summary(name
)
258 self
.render("packages/builds/times.html", pkg
=latest_build
.pkg
,
259 build_times_summary
=build_times_summary
)