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