]> git.ipfire.org Git - ipfire.org.git/blob - www/webapp/datastore/releases.py
Some very big changes I cannot break down to distinct commits.
[ipfire.org.git] / www / webapp / datastore / releases.py
1 #!/usr/bin/python
2
3 import simplejson
4
5 from tornado.database import Row
6
7 class ReleaseItem(Row):
8 options = {
9 "iso" : {
10 "prio" : 10,
11 "desc" : "Installable CD image",
12 "url" : "http://download.ipfire.org/iso/",
13 "rem" : "Use this image to burn a CD and install IPFire from it.",
14 },
15 "torrent" : {
16 "prio" : 20,
17 "desc" : "Torrent file",
18 "url" : "http://download.ipfire.org/torrent/",
19 "rem" : "Download the CD image from the torrent network.",
20 },
21 "flash" : {
22 "prio" : 40,
23 "desc" : "Flash image",
24 "url" : "http://download.ipfire.org/iso/",
25 "rem" : "An image that is meant to run on embedded devices.",
26 },
27 "alix" : {
28 "prio" : 41,
29 "desc" : "Alix image",
30 "url" : "http://download.ipfire.org/iso/",
31 "rem" : "Flash image where a serial console is enabled by default.",
32 },
33 "usbfdd" : {
34 "prio" : 30,
35 "desc" : "USB FDD image",
36 "url" : "http://download.ipfire.org/iso/",
37 "rem" : "Install IPFire from a floppy-formated USB key.",
38 },
39 "usbhdd" : {
40 "prio" : 30,
41 "desc" : "USB HDD image",
42 "url" : "http://download.ipfire.org/iso/",
43 "rem" : "If the floppy image doesn't work, use this image instead.",
44 },
45 "xen" : {
46 "prio" : 50,
47 "desc" : "Pregenerated Xen image",
48 "url" : "http://download.ipfire.org/iso/",
49 "rem" : "A ready-to-run image for Xen.",
50 },
51 }
52
53 def __init__(self, info):
54 self.info = info
55
56 def __getattr__(self, key):
57 return self.info[key]
58
59 @property
60 def downloads(self):
61 ret = []
62 for fileitem in self.info["files"]:
63 filetype = fileitem["type"]
64 ret.append(Row(
65 desc = self.options[filetype]["desc"],
66 file = fileitem["name"],
67 hash = fileitem.get("hash", None),
68 prio = self.options[filetype]["prio"],
69 rem = self.options[filetype]["rem"],
70 sha1 = fileitem.get("sha1", None),
71 type = filetype,
72 url = self.options[filetype]["url"] + fileitem["name"],
73 ))
74
75 ret.sort(lambda a, b: cmp(a.prio, b.prio))
76 return ret
77
78 @property
79 def iso(self):
80 for download in self.downloads:
81 if download.type == "iso":
82 return download
83
84 @property
85 def torrent(self):
86 for download in self.downloads:
87 if download.type == "torrent":
88 return download
89
90 @property
91 def stable(self):
92 return self.status == "stable"
93
94 @property
95 def development(self):
96 return self.status == "development"
97
98
99 class Releases(object):
100 def __init__(self, application, filename="releases.json"):
101 self.application = application
102 self.items = []
103
104 if filename:
105 self.load(filename)
106
107 def load(self, filename):
108 with open(filename) as f:
109 self.items = [ReleaseItem(i) for i in simplejson.load(f)]
110
111 @property
112 def all(self):
113 return self.items
114
115 @property
116 def online(self):
117 ret = []
118 for item in self.all:
119 if item.online:
120 ret.append(item)
121 return ret
122
123 @property
124 def offline(self):
125 ret = []
126 for item in self.all:
127 if not item.online:
128 ret.append(item)
129 return ret
130
131 @property
132 def latest(self):
133 if self.stable:
134 return self.stable[0]
135
136 @property
137 def latest_devel(self):
138 if self.development:
139 return self.development[0]
140
141 @property
142 def stable(self):
143 ret = []
144 for item in self.online:
145 if item.stable:
146 ret.append(item)
147 return ret
148
149 @property
150 def development(self):
151 ret = []
152 for item in self.online:
153 if item.development:
154 ret.append(item)
155 return ret
156
157 @property
158 def torrents(self):
159 ret = []
160 for item in self.online:
161 if item.torrent:
162 ret.append(item)
163 return ret