Mercurial > hg > rlgallery-misc
comparison web/archive.cgi @ 2:8f49df4074d7
Convert web/archive.cgi to use the new SQL timestamps.
The Archivist has replaced UNIX timestamps with python datetime objects
derived from SQL timestamps. There are still a lot of struct_time
objects which should be converted too.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Thu, 26 Jul 2012 08:07:00 -0700 |
parents | 5ba2123d2c20 |
children | a943cfdfbad9 |
comparison
equal
deleted
inserted
replaced
1:def7fecbd437 | 2:8f49df4074d7 |
---|---|
4 import os | 4 import os |
5 import sys | 5 import sys |
6 import re | 6 import re |
7 import time | 7 import time |
8 import calendar | 8 import calendar |
9 from datetime import datetime | |
9 import rlgalldb as rlgall | 10 import rlgalldb as rlgall |
10 import cgitb | 11 import cgitb |
11 | 12 |
12 cgitb.enable() | 13 cgitb.enable() |
13 | 14 |
16 """ | 17 """ |
17 | 18 |
18 ttyrecbase = "/var/dgl/dgldir/ttyrec/" | 19 ttyrecbase = "/var/dgl/dgldir/ttyrec/" |
19 recre = r"(\d{4,4})-(\d{2,2})-(\d{2,2})\.(\d{2,2}):(\d{2,2}):(\d{2,2})\.ttyrec" | 20 recre = r"(\d{4,4})-(\d{2,2})-(\d{2,2})\.(\d{2,2}):(\d{2,2}):(\d{2,2})\.ttyrec" |
20 recrec = re.compile(recre) | 21 recrec = re.compile(recre) |
21 | |
22 def name_in_time(filename, timerange): | |
23 "Checks whether filename is a ttyrec with time between Unix times \ | |
24 timerange[0] and timerange[1]." | |
25 nmatch = recrec.match(filename) | |
26 if not nmatch: | |
27 return False | |
28 ntime = calendar.timegm([int(val) for val in nmatch.groups()]) | |
29 if ntime > timerange[0] and ntime <= timerange[1]: | |
30 return True | |
31 else: | |
32 return False | |
33 | 22 |
34 def input_game(outf, selected=None): | 23 def input_game(outf, selected=None): |
35 "Prints the form components for selecting a game." | 24 "Prints the form components for selecting a game." |
36 selstr = '<option label="{0}" value="{1}" selected="selected">{0}</option>\n' | 25 selstr = '<option label="{0}" value="{1}" selected="selected">{0}</option>\n' |
37 unselstr = '<option label="{0}" value="{1}">{0}</option>\n' | 26 unselstr = '<option label="{0}" value="{1}">{0}</option>\n' |
151 return agame | 140 return agame |
152 errlist.append(cantfind.format(cgi.escape(formgame))) | 141 errlist.append(cantfind.format(cgi.escape(formgame))) |
153 return None | 142 return None |
154 | 143 |
155 def processtime(fdata, errlist, hlist): | 144 def processtime(fdata, errlist, hlist): |
156 "Takes a CGI data object and converts to a Unix timestamp by finding fields \ | 145 "Takes a CGI data object and converts to a datetime object by finding \ |
157 called year, month, etc. Any errors get appended to errlist. hlist \ | 146 fields called year, month, etc. Any errors get appended to errlist. \ |
158 should contain 6 components, for ymd-hms fields." | 147 hlist should contain 6 components, for ymd-hms fields." |
159 | 148 |
160 # Timestamp overrides human-readable, even if it's invalid. | 149 # Timestamp overrides human-readable, even if it's invalid. |
161 badtime = 'The time field is for Unix clocks, which never say anything \ | 150 badtime = 'The time field is for Unix clocks, which never say anything \ |
162 like {0}. Try the form instead.' | 151 like {0}. Try the form instead.' |
163 utime = None | 152 utime = None |
173 utime = 0 | 162 utime = 0 |
174 if utime != None: | 163 if utime != None: |
175 chtime = time.gmtime(utime) | 164 chtime = time.gmtime(utime) |
176 for i in range(6): | 165 for i in range(6): |
177 hlist[i] = chtime[i] | 166 hlist[i] = chtime[i] |
178 return utime | 167 return datetime.fromtimestamp(utime, rlgall.utc) |
179 | 168 |
180 # Now try to get a human-readable specification. | 169 # Now try to get a human-readable specification. |
181 lerrors = [] | 170 lerrors = [] |
182 year = month = day = hour = minute = second = None | 171 year = month = day = hour = minute = second = None |
183 fyear = fdata.getfirst("year") | 172 fyear = fdata.getfirst("year") |
269 else: | 258 else: |
270 hlist[5] = second | 259 hlist[5] = second |
271 if lerrors: | 260 if lerrors: |
272 errlist.extend(lerrors) | 261 errlist.extend(lerrors) |
273 return None | 262 return None |
274 return calendar.timegm([year, month, day, hour, minute, second, 0, 0, 0]) | 263 #return calendar.timegm([year, month, day, hour, minute, second, 0, 0, 0]) |
264 return datetime(year, month, day, hour, minute, second, 0, rlgall.utc) | |
275 | 265 |
276 # Begin processing | 266 # Begin processing |
277 fdata = cgi.FieldStorage() | 267 fdata = cgi.FieldStorage() |
278 | 268 |
279 # If this is true, the user didn't supply any search criteria, so assume it | 269 # If this is true, the user didn't supply any search criteria, so assume it |
280 # doesn't want a search. Otherwise, every error or omission must be printed. | 270 # doesn't want a search. Otherwise, every error or omission must be printed. |
281 isnotsearch = checkempty(fdata) | 271 isnotsearch = checkempty(fdata) |
282 | 272 |
283 errors = [] | 273 errors = [] |
284 formname = dungeon = utime = None | 274 formname = dungeon = searchtime = None |
285 timepieces = [None, None, None, None, None, None] | 275 timepieces = [None, None, None, None, None, None] |
286 | 276 |
287 if not isnotsearch: | 277 if not isnotsearch: |
288 formname = processname(fdata, errors) | 278 formname = processname(fdata, errors) |
289 dungeon = processgame(fdata, errors) | 279 dungeon = processgame(fdata, errors) |
290 utime = processtime(fdata, errors, timepieces) | 280 searchtime = processtime(fdata, errors, timepieces) |
291 | 281 |
292 dosearch = formname != None and dungeon != None and utime != None | 282 dosearch = formname != None and dungeon != None and searchtime != None |
293 | 283 |
294 # Find the actual files, and put them in a list called gamefiles. | 284 # Find the actual files, and put them in a list called gamefiles. |
295 gtimes = [0, int(time.time())] | 285 gtimes = [0, int(time.time())] |
296 relgame = None | 286 relgame = None |
297 gamefiles = [] | 287 gamefiles = [] |
298 if dosearch: | 288 if dosearch: |
299 ttyrecdir = "{0}/{1}/{2}/".format(ttyrecbase, formname, dungeon.uname) | 289 query1 = "SELECT ttyrecs FROM {0} WHERE name = %s AND startt <= %s AND endt >= %s;".format(dungeon.uname) |
300 query1 = "SELECT ttyrecs FROM {0} WHERE name = %s AND stime <= %s AND etime >= %s;".format(dungeon.uname) | 290 query2 = "SELECT ttyrecs FROM {0} WHERE name = %s AND endt >= %s ORDER BY endt LIMIT 1;".format(dungeon.uname) |
301 query2 = "SELECT ttyrecs FROM {0} WHERE name = %s AND etime >= %s ORDER BY etime LIMIT 1;".format(dungeon.uname) | 291 query3 = "SELECT ttyrecs FROM {0} WHERE name = %s AND startt <= %s ORDER BY startt DESC LIMIT 1;".format(dungeon.uname) |
302 query3 = "SELECT ttyrecs FROM {0} WHERE name = %s AND stime <= %s ORDER BY stime DESC LIMIT 1;".format(dungeon.uname) | |
303 conn = rlgall.getconn() | 292 conn = rlgall.getconn() |
304 cur = conn.cursor() | 293 cur = conn.cursor() |
305 cur.execute(query1, [formname, utime, utime]) | 294 cur.execute(query1, [formname, searchtime, searchtime]) |
306 result = cur.fetchone() | 295 result = cur.fetchone() |
307 if result: | 296 if result: |
308 gamefiles = result[0] | 297 gamefiles = result[0] |
309 else: | 298 else: |
310 cur.execute(query2, [formname, utime]) | 299 cur.execute(query2, [formname, searchtime]) |
311 result = cur.fetchone() | 300 result = cur.fetchone() |
312 if result: | 301 if result: |
313 gamefiles = result[0] | 302 gamefiles = result[0] |
314 else: | 303 else: |
315 cur.execute(query3, [formname, utime]) | 304 cur.execute(query3, [formname, searchtime]) |
316 result = cur.fetchone() | 305 result = cur.fetchone() |
317 if result: | 306 if result: |
318 gamefiles = result[0] | 307 gamefiles = result[0] |
319 cur.close() | 308 cur.close() |
320 conn.close() | 309 conn.close() |
329 sys.stdout.write(rlgall.pti.format("Guild Archives")) | 318 sys.stdout.write(rlgall.pti.format("Guild Archives")) |
330 | 319 |
331 if dosearch: | 320 if dosearch: |
332 sys.stdout.write("<p>Expedition by {0} to {1} about {2}:</p>\n".format( | 321 sys.stdout.write("<p>Expedition by {0} to {1} about {2}:</p>\n".format( |
333 rlgall.playerlink(formname), dungeon.name, | 322 rlgall.playerlink(formname), dungeon.name, |
334 time.strftime("%Y/%m/%d %H:%M:%S", time.gmtime(utime)))) | 323 searchtime.strftime("%Y/%m/%d %H:%M:%S"))) |
335 if not gamefiles: | 324 if not gamefiles: |
336 sys.stdout.write("<p>No record found.</p>\n") | 325 sys.stdout.write("<p>No record found.</p>\n") |
337 elif len(gamefiles) == 1: | 326 elif len(gamefiles) == 1: |
338 sys.stdout.write('<p><a href="/ttyrecs/{0}/{1}/{2}">1 ttyrec found.</a>\ | 327 sys.stdout.write('<p><a href="/ttyrecs/{0}/{1}/{2}">1 ttyrec found.</a>\ |
339 </p>\n'.format(formname, dungeon.uname, gamefiles[0])) | 328 </p>\n'.format(formname, dungeon.uname, gamefiles[0])) |
351 sys.stdout.write('<p>') | 340 sys.stdout.write('<p>') |
352 for errmsg in errors: | 341 for errmsg in errors: |
353 sys.stdout.write(errmsg + " ") | 342 sys.stdout.write(errmsg + " ") |
354 sys.stdout.write('</p>\n') | 343 sys.stdout.write('</p>\n') |
355 # Print out a search form, whether a search was done or not. | 344 # Print out a search form, whether a search was done or not. |
356 sys.stdout.write('<form action="/archivedb.cgi" method="get">\n') | 345 sys.stdout.write('<form action="/archive.cgi" method="get">\n') |
357 if dungeon != None: | 346 if dungeon != None: |
358 input_game(sys.stdout, dungeon.uname) | 347 input_game(sys.stdout, dungeon.uname) |
359 else: | 348 else: |
360 input_game(sys.stdout) | 349 input_game(sys.stdout) |
361 if formname != None: | 350 if formname != None: |