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