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