]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/handlers_admin.py
planet: Make the publish radio button work.
[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 assert status in ("draft", "published")
88
89 author = self.accounts.find(self.current_user)
90
91 entry = self.planet.create(title=title, markdown=markdown,
92 author=author, status=status, tags=tags.split())
93
94 self.redirect("/planet")
95
96
97 class AdminPlanetEditHandler(AdminPlanetComposeHandler):
98 @tornado.web.authenticated
99 def post(self, slug):
100 entry = self.planet.get_entry_by_slug(slug)
101 if not entry:
102 raise tornado.web.HTTPError(404)
103
104 entry.title = self.get_argument("title")
105 entry.markdown = self.get_argument("markdown")
106 entry.tags = self.get_argument("tags", "").split()
107
108 entry.status = self.get_argument("status", "draft")
109
110 self.redirect("/planet")
111
112
113 class AdminPlanetPublishHandler(AdminBaseHandler):
114 @tornado.web.authenticated
115 def get(self, slug):
116 entry = self.planet.get_entry_by_slug(slug)
117 if not entry:
118 raise tornado.web.HTTPError(404)
119
120 entry.status = "published"
121 entry.published = datetime.datetime.utcnow()
122
123 self.redirect("/planet")
124
125
126 class AdminAccountsBaseHandler(AdminBaseHandler):
127 pass
128
129
130 class AdminAccountsHandler(AdminAccountsBaseHandler):
131 @tornado.web.authenticated
132 def get(self):
133 accounts = self.accounts.list()
134 self.render("admin-accounts.html", accounts=accounts)
135
136
137 class AdminAccountsEditHandler(AdminAccountsBaseHandler):
138 @tornado.web.authenticated
139 def get(self, id):
140 account = self.accounts.search(id)
141 if not account:
142 raise tornado.web.HTTPError(404)
143
144 self.render("admin-accounts-edit.html", account=account)
145
146
147 class AdminAccountsDeleteHandler(AdminAccountsBaseHandler):
148 @tornado.web.authenticated
149 def get(self, id):
150 account = self.accounts.search(id)
151 if not account:
152 raise tornado.web.HTTPError(404)
153
154 self.accounts.delete(id)
155 self.redirect("/accounts")
156
157
158 class AdminMirrorsBaseHandler(AdminBaseHandler):
159 @property
160 def mirrors(self):
161 return backend.Mirrors()
162
163
164 class AdminMirrorsHandler(AdminMirrorsBaseHandler):
165 @tornado.web.authenticated
166 def get(self):
167 mirrors = self.mirrors.list()
168
169 self.render("admin-mirrors.html", mirrors=mirrors)
170
171
172 class AdminMirrorsUpdateHandler(AdminMirrorsBaseHandler):
173 @tornado.web.authenticated
174 def get(self):
175 self.mirrors.check_all()
176 self.redirect("/mirrors")
177
178
179 class AdminMirrorsCreateHandler(AdminMirrorsBaseHandler):
180 @tornado.web.authenticated
181 def get(self, id=None):
182 if id:
183 mirror = self.db.get("SELECT * FROM mirrors WHERE id = '%s'", int(id))
184 else:
185 mirror = tornado.database.Row(
186 id="",
187 hostname="",
188 owner="",
189 location="",
190 path="/",
191 releases="Y",
192 pakfire2="Y",
193 pakfire3="Y",
194 disabled="N"
195 )
196
197 self.render("admin-mirrors-create.html", mirror=mirror)
198
199 @tornado.web.authenticated
200 def post(self, id=None):
201 args = tornado.database.Row()
202 for key in ("id", "hostname", "owner", "location", "path", "releases",
203 "pakfire2", "pakfire3", "disabled"):
204 args[key] = self.get_argument(key, "")
205
206 if args.id:
207 if not self.mirrors.get(args.id):
208 raise tornado.web.HTTPError(404)
209
210 #self.db.execute("""UPDATE mirrors SET
211 # hostname = %s, owner = %s, location = %s, path = %s, mirror = %s,
212 # pakfire2 = %s, pakfire3 = %s, disabled = %s
213 # WHERE id = %s""", args.hostname, args.owner, args.location,
214 # args.path, args.mirror, args.pakfire2, args.pakfire3, args.disabled,
215 # args.id)
216 self.db.update("mirrors", args.id, **args)
217
218 else:
219 #self.db.execute("""INSERT INTO
220 # mirrors(hostname, owner, location, path, mirror, pakfire2, pakfire3, disabled)
221 # VALUES(%s, %s, %s, %s, %s, %s, %s, %s)""", args.hostname, args.owner,
222 # args.location, args.path, args.mirror, args.pakfire2, args.pakfire3, args.disabled)
223 self.db.insert("mirrors", **args)
224
225 # Update database information
226 self.mirrors.check_all()
227
228 self.redirect("/mirrors")
229
230
231 class AdminMirrorsEditHandler(AdminMirrorsCreateHandler):
232 pass
233
234
235 class AdminMirrorsDeleteHandler(AdminMirrorsBaseHandler):
236 @tornado.web.authenticated
237 def get(self, id):
238 self.db.execute("DELETE FROM mirrors WHERE id=%s", id)
239 self.db.execute("DELETE FROM mirror_files WHERE mirror=%s", id)
240 self.redirect("/mirrors")
241
242
243 class AdminMirrorsDetailsHandler(AdminMirrorsBaseHandler):
244 @tornado.web.authenticated
245 def get(self, id):
246 mirror = self.mirrors.get(id)
247 if not mirror:
248 raise tornado.web.HTTPError(404)
249
250 self.render("admin-mirrors-details.html", mirror=mirror)
251
252
253 class AdminNewsBaseHandler(AdminBaseHandler):
254 @property
255 def news(self):
256 return self.backend.news
257
258
259 class AdminNewsHandler(AdminNewsBaseHandler):
260 @tornado.web.authenticated
261 def get(self):
262 news = self.news.list()
263
264 self.render("admin-news.html", news=news)
265
266
267 class AdminNewsCreateHandler(AdminNewsBaseHandler):
268 @tornado.web.authenticated
269 def get(self, id=None):
270 # if XXX
271
272
273 self.render("admin-news-create.html", news=news)
274
275
276 class AdminNewsEditHandler(AdminNewsCreateHandler):
277 pass
278
279
280 class AdminDownloadsHandler(AdminBaseHandler):
281 @tornado.web.authenticated
282 def get(self):
283 self.render("admin-downloads.html",
284 downloads_total = self.downloads.total,
285 downloads_today = self.downloads.today,
286 downloads_yesterday = self.downloads.yesterday,
287 downloads_locations_today = self.downloads.get_countries("today"),
288 downloads_locations_total = self.downloads.get_countries(),
289 )
290
291
292 class AdminDownloadsMirrorsHandler(AdminBaseHandler):
293 @tornado.web.authenticated
294 def get(self):
295 self.render("admin-downloads-mirrors.html",
296 mirror_load_total = self.downloads.get_mirror_load(),
297 mirror_load_today = self.downloads.get_mirror_load("today"),
298 )