]>
Commit | Line | Data |
---|---|---|
940227cb MT |
1 | #!/usr/bin/python |
2 | ||
54af860e | 3 | import logging |
940227cb | 4 | import random |
940227cb MT |
5 | import tornado.web |
6 | ||
54af860e MT |
7 | import backend |
8 | ||
940227cb MT |
9 | from handlers_base import * |
10 | ||
11 | class DownloadsIndexHandler(BaseHandler): | |
12 | def get(self): | |
7771acea MT |
13 | releases = self.releases.get_all() |
14 | ||
15 | self.render("downloads-index.html", releases=releases) | |
940227cb MT |
16 | |
17 | ||
18 | class DownloadsReleaseHandler(BaseHandler): | |
19 | def get(self, release): | |
9068dba1 MT |
20 | release = self.releases.get_by_sname(release) |
21 | ||
22 | if not release: | |
23 | release = self.releases.get_by_id(release) | |
24 | ||
940227cb MT |
25 | if not release: |
26 | raise tornado.web.HTTPError(404) | |
27 | ||
7771acea | 28 | self.render("downloads-item.html", release=release, latest=False) |
940227cb MT |
29 | |
30 | ||
31 | class DownloadsLatestHandler(BaseHandler): | |
32 | def get(self): | |
33 | release = self.releases.get_latest() | |
34 | if not release: | |
35 | raise tornado.web.HTTPError(404) | |
36 | ||
7771acea | 37 | self.render("downloads-item.html", release=release, latest=True) |
940227cb MT |
38 | |
39 | ||
40 | class DownloadsOlderHandler(BaseHandler): | |
41 | def get(self): | |
42 | releases = self.releases.get_stable() | |
43 | ||
44 | # Drop the latest release | |
45 | if releases: | |
46 | releases = releases[1:] | |
47 | ||
48 | self.render("downloads-older.html", releases=releases) | |
49 | ||
50 | ||
51 | class DownloadsDevelopmentHandler(BaseHandler): | |
52 | def get(self): | |
53 | releases = self.releases.get_unstable() | |
54 | ||
55 | self.render("downloads-development.html", releases=releases) | |
56 | ||
57 | ||
58 | class DownloadHandler(BaseHandler): | |
59 | def get(self): | |
60 | self.render("downloads.html", release=self.releases.get_latest()) | |
61 | ||
62 | ||
63 | class DownloadAllHandler(BaseHandler): | |
64 | def get(self): | |
65 | self.render("downloads-all.html", | |
66 | releases=self.releases.get_stable()) | |
67 | ||
68 | ||
69 | class DownloadDevelopmentHandler(BaseHandler): | |
70 | def get(self): | |
71 | self.render("downloads-development.html", | |
72 | releases=self.releases.get_unstable()) | |
73 | ||
74 | ||
75 | class DownloadFileHandler(BaseHandler): | |
9068dba1 | 76 | def prepare(self): |
54af860e | 77 | self.set_header("Pragma", "no-cache") |
54af860e | 78 | |
9068dba1 MT |
79 | def head(self, filename): |
80 | self.redirect_to_mirror(filename) | |
81 | ||
82 | def get(self, filename): | |
83 | self.redirect_to_mirror(filename, log_download=True) | |
84 | ||
85 | def find_mirror(self, filename): | |
0673d1b0 MT |
86 | # Get all mirrors... |
87 | mirrors = self.mirrors.get_all() | |
88 | mirrors = mirrors.get_with_file(filename) | |
89 | mirrors = mirrors.get_with_state("UP") | |
54af860e MT |
90 | |
91 | if not mirrors: | |
92 | raise tornado.web.HTTPError(404, "File not found: %s" % filename) | |
940227cb | 93 | |
0673d1b0 MT |
94 | # Find mirrors located near to the user. |
95 | # If we have not found any, we use all. | |
9068dba1 | 96 | remote_location = self.get_remote_location() |
0673d1b0 | 97 | |
9068dba1 MT |
98 | if remote_location: |
99 | mirrors_nearby = mirrors.get_for_location(remote_location) | |
940227cb | 100 | |
9068dba1 MT |
101 | if mirrors_nearby: |
102 | mirrors = mirrors_nearby | |
54af860e | 103 | |
9068dba1 MT |
104 | return mirrors.get_random() |
105 | ||
106 | def redirect_to_mirror(self, filename, log_download=False): | |
107 | # Find a random mirror. | |
108 | mirror = self.find_mirror(filename) | |
109 | ||
110 | # Construct the redirection URL. | |
111 | download_url = mirror.build_url(filename) | |
112 | ||
113 | # Redirect the request. | |
114 | self.redirect(download_url) | |
122c9026 | 115 | |
9068dba1 MT |
116 | if not log_download: |
117 | return | |
118 | ||
119 | remote_location = self.get_remote_location() | |
120 | if remote_location: | |
121 | country_code = remote_location.country | |
122 | else: | |
123 | country_code = None | |
124 | ||
125 | self.db.execute("INSERT INTO log_download(filename, mirror, country_code) \ | |
126 | VALUES(%s, %s, %s)", filename, mirror.id, country_code) | |
edd297c4 MT |
127 | |
128 | ||
129 | class DownloadCompatHandler(BaseHandler): | |
130 | def get(self, path, url): | |
131 | _filename = None | |
132 | ||
133 | for filename in self.mirrors.get_all_files(): | |
134 | if filename.endswith("/%s" % url): | |
135 | _filename = filename | |
136 | break | |
137 | ||
138 | if not _filename: | |
139 | raise tornado.web.HTTPError(404) | |
140 | ||
141 | self.redirect("/%s" % _filename) | |
142 | ||
9068dba1 | 143 | |
60024cc8 MT |
144 | class DownloadSplashHandler(BaseHandler): |
145 | def get(self): | |
146 | self.render("download-splash.html") |