]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/handlers_download.py
Fix tracker.ipfire.org.
[people/shoehn/ipfire.org.git] / webapp / handlers_download.py
1 #!/usr/bin/python
2
3 import logging
4 import random
5 import tornado.web
6
7 import backend
8
9 from handlers_base import *
10
11 class DownloadsIndexHandler(BaseHandler):
12 def get(self):
13 releases = self.releases.get_all()
14
15 self.render("downloads-index.html", releases=releases)
16
17
18 class DownloadsReleaseHandler(BaseHandler):
19 def get(self, release):
20 release = self.releases.get_by_sname(release)
21
22 if not release:
23 release = self.releases.get_by_id(release)
24
25 if not release:
26 raise tornado.web.HTTPError(404)
27
28 self.render("downloads-item.html", release=release, latest=False)
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
37 self.render("downloads-item.html", release=release, latest=True)
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):
76 def prepare(self):
77 self.set_header("Pragma", "no-cache")
78
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):
86 exists = self.mirrors.file_exists(filename)
87 if not exists:
88 raise tornado.web.HTTPError(404, "File not found: %s" % filename)
89
90 # Find mirrors located near to the user.
91 # If we have not found any, we use a random one.
92 remote_location = self.get_remote_location()
93
94 if remote_location:
95 mirrors = self.mirrors.get_for_location(remote_location, filename=filename)
96
97 if mirrors:
98 return random.choice(mirrors)
99
100 return self.mirrors.get_random(filename=filename)
101
102 def redirect_to_mirror(self, filename, log_download=False):
103 # Find a random mirror.
104 mirror = self.find_mirror(filename)
105
106 # Construct the redirection URL.
107 download_url = mirror.build_url(filename)
108
109 # Redirect the request.
110 self.redirect(download_url)
111
112 if not log_download:
113 return
114
115 remote_location = self.get_remote_location()
116 if remote_location:
117 country_code = remote_location.country
118 else:
119 country_code = None
120
121 self.db.execute("INSERT INTO log_download(filename, mirror, country_code) \
122 VALUES(%s, %s, %s)", filename, mirror.id, country_code)
123
124
125 class DownloadCompatHandler(BaseHandler):
126 def get(self, path, url):
127 for filename in self.mirrors.get_all_files():
128 if not filename.endswith("/%s" % url):
129 continue
130
131 self.redirect("/%s" % filename)
132 return
133
134 raise tornado.web.HTTPError(404)
135
136
137 class DownloadSplashHandler(BaseHandler):
138 def get(self):
139 self.render("download-splash.html")