]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/webapp/handlers_admin.py
Website update.
[people/shoehn/ipfire.org.git] / www / webapp / handlers_admin.py
1 #!/usr/bin/python
2
3 import tornado.web
4
5 import matplotlib
6 matplotlib.use("Agg")
7
8 import matplotlib.pyplot as plt
9 import matplotlib.dates
10
11 from handlers_base import *
12
13 import backend
14
15 class AdminBaseHandler(BaseHandler):
16 @property
17 def accounts(self):
18 return backend.Accounts()
19
20 @property
21 def planet(self):
22 return backend.Planet()
23
24 @property
25 def downloads(self):
26 return backend.Downloads()
27
28 def get_current_user(self):
29 return self.get_secure_cookie("account")
30
31
32 class AdminLoginHandler(AdminBaseHandler):
33 def get(self):
34 self.render("admin-login.html")
35
36 def post(self):
37 account = self.accounts.search(self.get_argument("name"))
38 if not account:
39 raise tornado.web.HTTPError(403)
40
41 if account.check_password(self.get_argument("password")):
42 self.set_secure_cookie("account", account.uid)
43 else:
44 raise tornado.web.HTTPError(403)
45
46 self.redirect("/")
47
48
49 class AdminLogoutHandler(AdminBaseHandler):
50 def get(self):
51 self.clear_cookie("account")
52 self.redirect("/")
53
54
55 class AdminIndexHandler(AdminBaseHandler):
56 @tornado.web.authenticated
57 def get(self):
58 self.render("admin-index.html")
59
60
61 class AdminApiPlanetRenderMarkupHandler(AdminBaseHandler):
62 @tornado.web.authenticated
63 def get(self):
64 text = self.get_argument("text", "")
65
66 # Render markup
67 self.write(self.planet.render(text))
68 self.finish()
69
70
71 class AdminPlanetHandler(AdminBaseHandler):
72 @tornado.web.authenticated
73 def get(self):
74 entries = self.planet.get_entries(limit=100)
75
76 self.render("admin-planet.html", entries=entries)
77
78
79 class AdminPlanetComposeHandler(AdminBaseHandler):
80 @tornado.web.authenticated
81 def get(self, id=None):
82 entry = backend.PlanetEntry()
83
84 if id:
85 entry = self.planet.get_entry_by_id(id)
86
87 self.render("admin-planet-compose.html", entry=entry)
88
89 @tornado.web.authenticated
90 def post(self, id=None):
91 id = self.get_argument("id", id)
92
93 entry = backend.PlanetEntry()
94
95 if id:
96 entry = self.planet.get_entry_by_id(id)
97
98 entry.set("title", self.get_argument("title"))
99 entry.set("markdown", self.get_argument("markdown"))
100 entry.set("author_id", self.current_user)
101
102 if id:
103 self.planet.update_entry(entry)
104 else:
105 self.planet.save_entry(entry)
106
107 self.redirect("/planet")
108
109
110 class AdminPlanetEditHandler(AdminPlanetComposeHandler):
111 pass
112
113
114 class AdminAccountsBaseHandler(AdminBaseHandler):
115 pass
116
117
118 class AdminAccountsHandler(AdminAccountsBaseHandler):
119 @tornado.web.authenticated
120 def get(self):
121 accounts = self.accounts.list()
122 self.render("admin-accounts.html", accounts=accounts)
123
124
125 class AdminAccountsEditHandler(AdminAccountsBaseHandler):
126 @tornado.web.authenticated
127 def get(self, id):
128 account = self.accounts.search(id)
129 if not account:
130 raise tornado.web.HTTPError(404)
131
132 self.render("admin-accounts-edit.html", account=account)
133
134
135 class AdminAccountsDeleteHandler(AdminAccountsBaseHandler):
136 @tornado.web.authenticated
137 def get(self, id):
138 account = self.accounts.search(id)
139 if not account:
140 raise tornado.web.HTTPError(404)
141
142 self.accounts.delete(id)
143 self.redirect("/accounts")
144
145
146 class AdminMirrorsBaseHandler(AdminBaseHandler):
147 @property
148 def mirrors(self):
149 return backend.Mirrors()
150
151
152 class AdminMirrorsHandler(AdminMirrorsBaseHandler):
153 @tornado.web.authenticated
154 def get(self):
155 mirrors = self.mirrors.list()
156
157 self.render("admin-mirrors.html", mirrors=mirrors)
158
159
160 class AdminMirrorsUpdateHandler(AdminMirrorsBaseHandler):
161 @tornado.web.authenticated
162 def get(self):
163 self.mirrors.check_all()
164 self.redirect("/mirrors")
165
166
167 class AdminMirrorsCreateHandler(AdminMirrorsBaseHandler):
168 @tornado.web.authenticated
169 def get(self, id=None):
170 if id:
171 mirror = self.db.get("SELECT * FROM mirrors WHERE id = '%s'", int(id))
172 else:
173 mirror = tornado.database.Row(
174 id="",
175 hostname="",
176 owner="",
177 location="",
178 path="/",
179 releases="Y",
180 pakfire2="Y",
181 pakfire3="Y",
182 disabled="N"
183 )
184
185 self.render("admin-mirrors-create.html", mirror=mirror)
186
187 @tornado.web.authenticated
188 def post(self, id=None):
189 args = tornado.database.Row()
190 for key in ("id", "hostname", "owner", "location", "path", "releases",
191 "pakfire2", "pakfire3", "disabled"):
192 args[key] = self.get_argument(key, "")
193
194 if args.id:
195 if not self.mirrors.get(args.id):
196 raise tornado.web.HTTPError(404)
197
198 #self.db.execute("""UPDATE mirrors SET
199 # hostname = %s, owner = %s, location = %s, path = %s, mirror = %s,
200 # pakfire2 = %s, pakfire3 = %s, disabled = %s
201 # WHERE id = %s""", args.hostname, args.owner, args.location,
202 # args.path, args.mirror, args.pakfire2, args.pakfire3, args.disabled,
203 # args.id)
204 self.db.update("mirrors", args.id, **args)
205
206 else:
207 #self.db.execute("""INSERT INTO
208 # mirrors(hostname, owner, location, path, mirror, pakfire2, pakfire3, disabled)
209 # VALUES(%s, %s, %s, %s, %s, %s, %s, %s)""", args.hostname, args.owner,
210 # args.location, args.path, args.mirror, args.pakfire2, args.pakfire3, args.disabled)
211 self.db.insert("mirrors", **args)
212
213 # Update database information
214 self.mirrors.check_all()
215
216 self.redirect("/mirrors")
217
218
219 class AdminMirrorsEditHandler(AdminMirrorsCreateHandler):
220 pass
221
222
223 class AdminMirrorsDeleteHandler(AdminMirrorsBaseHandler):
224 @tornado.web.authenticated
225 def get(self, id):
226 self.db.execute("DELETE FROM mirrors WHERE id=%s", id)
227 self.db.execute("DELETE FROM mirror_files WHERE mirror=%s", id)
228 self.redirect("/mirrors")
229
230
231 class AdminMirrorsDetailsHandler(AdminMirrorsBaseHandler):
232 @tornado.web.authenticated
233 def get(self, id):
234 mirror = self.mirrors.get(id)
235 if not mirror:
236 raise tornado.web.HTTPError(404)
237
238 self.render("admin-mirrors-details.html", mirror=mirror)
239
240
241 class AdminNewsBaseHandler(AdminBaseHandler):
242 @property
243 def news(self):
244 return self.backend.news
245
246
247 class AdminNewsHandler(AdminNewsBaseHandler):
248 @tornado.web.authenticated
249 def get(self):
250 news = self.news.list()
251
252 self.render("admin-news.html", news=news)
253
254
255 class AdminNewsCreateHandler(AdminNewsBaseHandler):
256 @tornado.web.authenticated
257 def get(self, id=None):
258 # if XXX
259
260
261 self.render("admin-news-create.html", news=news)
262
263
264 class AdminNewsEditHandler(AdminNewsCreateHandler):
265 pass
266
267
268 class AdminDownloadsHandler(AdminBaseHandler):
269 @tornado.web.authenticated
270 def get(self):
271 self.render("admin-downloads.html",
272 downloads_total = self.downloads.total,
273 downloads_today = self.downloads.today,
274 downloads_yesterday = self.downloads.yesterday,
275 downloads_locations_today = self.downloads.get_countries("today"),
276 downloads_locations_total = self.downloads.get_countries(),
277 )
278
279
280 class AdminDownloadsMirrorsHandler(AdminBaseHandler):
281 @tornado.web.authenticated
282 def get(self):
283 self.render("admin-downloads-mirrors.html",
284 mirror_load_total = self.downloads.get_mirror_load(),
285 mirror_load_today = self.downloads.get_mirror_load("today"),
286 )
287
288
289 class AdminDownloadsGraphHandler(AdminBaseHandler):
290 @tornado.web.authenticated
291 def get(self):
292 x = []
293 y = []
294 for row in self.downloads.daily_map:
295 x.append(matplotlib.dates.date2num(row.date))
296 y.append(row.downloads)
297
298 print x, y
299
300 # Create output image.
301 fig = plt.figure()
302
303 # Plot the data.
304 plot = fig.add_subplot(111)
305 plot.plot(x, y)
306
307 fig.savefig("nice-image.svg")