# HG changeset patch # User Tero Marttila # Date 1234210630 -7200 # Node ID 5ade0288f2ec45ad4609e0df986596af5e0c20b3 # Parent e909bde831e7b53c56119b07ba24b741ee9386a8 implement line-links as UTC timestamps diff -r e909bde831e7 -r 5ade0288f2ec handlers.py --- a/handlers.py Mon Feb 09 14:07:19 2009 +0200 +++ b/handlers.py Mon Feb 09 22:17:10 2009 +0200 @@ -85,6 +85,30 @@ lines = lines, ) +@preferences.handler(prefs.formatter, prefs.timezone) +def channel_link (request, channel, timestamp, formatter, timezone) : + """ + Display channel_date for specific UTC timestamp + """ + + # convert timestamp to user's timezone + timestamp = timestamp.astimezone(timezone) + + # get latest events + lines = channel.source.get_date(timestamp) + + # lines + lines = formatter.format_html(lines) + + # render + return templates.render_to_response("channel_date", + req = request, + prefs = request.prefs, + channel = channel, + date = timestamp, + lines = lines, + ) + @preferences.handler(prefs.timezone) def channel_calendar (request, channel, year, month, timezone) : """ diff -r e909bde831e7 -r 5ade0288f2ec helpers.py --- a/helpers.py Mon Feb 09 14:07:19 2009 +0200 +++ b/helpers.py Mon Feb 09 22:17:10 2009 +0200 @@ -6,7 +6,7 @@ import qmsk.web.helpers -import preferences +import preferences, urls class Helpers (qmsk.web.helpers.Helpers) : """ @@ -144,4 +144,11 @@ """ return url.build(self.ctx['req'], **params) + + def utc_timestamp (self, dtz) : + """ + Build an UTC timestamp from the given datetime + """ + return urls.types['ts'].build(dtz) + diff -r e909bde831e7 -r 5ade0288f2ec log_formatter.py --- a/log_formatter.py Mon Feb 09 14:07:19 2009 +0200 +++ b/log_formatter.py Mon Feb 09 22:17:10 2009 +0200 @@ -11,9 +11,16 @@ Provides a method to format series of LogLines into various output formats, with varying themes. """ - # the formatter's code name + # machine-readable name name = None - + + # human-readable name + title = None + + ## parameters + # use a fixed-width font for HTML output + html_fixedwidth = True + def __init__ (self, tz, timestamp_fmt="%H:%M:%S") : """ Initialize to format timestamps with the given timezone and timestamp @@ -108,37 +115,35 @@ # ...handle each line for line in lines : # using __TYPES - yield self._format_line_text(line, self.__FMT, full_timestamps) + yield line, self._format_line_text(line, self.__FMT, full_timestamps) class IrssiFormatter (IrssiTextFormatter, BaseHTMLFormatter) : """ Implements plain black-and-white irssi-style formatting """ - + + # name name = 'irssi' title = "Irssi (plain)" + # parameters + html_fixedwidth = True + def format_html (self, lines, full_timestamps=False) : """ - Just uses format_txt, but wraps in

+            Just uses format_txt, but processes links, etc
         """
         
-        # open pre
-        yield "
"
-        
         # format using IrssiTextFormatter
-        for line in self.format_txt(lines, full_timestamps) :
+        for line, txt in self.format_txt(lines, full_timestamps) :
             # escape HTML
-            line = xml.sax.saxutils.escape(line)
+            html = xml.sax.saxutils.escape(txt)
 
             # process links
-            line = self._process_links(line)
+            html = self._process_links(html)
 
             # yield
-            yield line
-
-        # close pre
-        yield "
" + yield line, html # define formatters by name FORMATTERS = { diff -r e909bde831e7 -r 5ade0288f2ec log_source.py --- a/log_source.py Mon Feb 09 14:07:19 2009 +0200 +++ b/log_source.py Mon Feb 09 22:17:10 2009 +0200 @@ -358,6 +358,11 @@ # as dates d_begin = dtz_begin.date() d_end = dtz_end.date() + +# print +# print "LogDirectory.get_date - %s" % dt +# print "\t %s %s" % (d_begin, dtz_begin) +# print "\t-> %s %s" % (d_end, dtz_end) # if they're the same, just pull the full log for that date if d_begin == d_end : diff -r e909bde831e7 -r 5ade0288f2ec static/irclogs.css --- a/static/irclogs.css Mon Feb 09 14:07:19 2009 +0200 +++ b/static/irclogs.css Mon Feb 09 22:17:10 2009 +0200 @@ -296,3 +296,14 @@ div#lines a { color: black; } + +div#lines a[id] { + color: #ffffff; + text-decoration: none; +} + +div#lines a[id]:hover, +div#lines a[id]:target { + color: #000000; +} + diff -r e909bde831e7 -r 5ade0288f2ec templates/lines.tmpl --- a/templates/lines.tmpl Mon Feb 09 14:07:19 2009 +0200 +++ b/templates/lines.tmpl Mon Feb 09 22:17:10 2009 +0200 @@ -1,5 +1,13 @@ +<% formatter = prefs['formatter'] %> +
-% for index, line in enumerate(lines): -${line} +% if formatter.html_fixedwidth : +
+% endif
+% for line, html in lines:
+»» ${html}
 % endfor
+% if formatter.html_fixedwidth :
+
+% endif
diff -r e909bde831e7 -r 5ade0288f2ec urls.py --- a/urls.py Mon Feb 09 14:07:19 2009 +0200 +++ b/urls.py Mon Feb 09 22:17:10 2009 +0200 @@ -15,16 +15,20 @@ # for configuration import channels +# our URLTypes +types = dict( + # LogChannel + cid = utils.URLChannelName(channels.channel_list.dict()), + + # datetime + date = utils.URLDateType('%Y-%m-%d'), + + # UTC timestamp + ts = utils.URLTimestampType(), +) + # our URLConfig -urls = url = urltree.URLConfig( - type_dict = dict( - # LogChannel - cid = utils.URLChannelName(channels.channel_list.dict()), - - # datetime - date = utils.URLDateType('%Y-%m-%d'), - ) -) +urls = url = urltree.URLConfig(type_dict=types) # urls index = url('/', handlers.index ) @@ -32,6 +36,7 @@ channel_select = url('/channel_select/?channel:cid', handlers.channel_select ) channel = url('/channels/{channel:cid}', handlers.channel_last, count=20 ) channel_last = url('/channels/{channel:cid}/last/{count:int=100}', handlers.channel_last ) +channel_link = url('/channels/{channel:cid}/link/{timestamp:ts}', handlers.channel_link ) channel_calendar = url('/channels/{channel:cid}/calendar/{year:int=0}/{month:int=0}', handlers.channel_calendar ) channel_date = url('/channels/{channel:cid}/date/{date:date}', handlers.channel_date ) channel_search = url('/channels/{channel:cid}/search/?q=&count:int=&skip:int=', handlers.channel_search ) diff -r e909bde831e7 -r 5ade0288f2ec utils.py --- a/utils.py Mon Feb 09 14:07:19 2009 +0200 +++ b/utils.py Mon Feb 09 22:17:10 2009 +0200 @@ -2,7 +2,7 @@ Miscellaneous things """ -import datetime +import datetime, calendar, pytz from qmsk.web.urltree import URLType @@ -58,3 +58,22 @@ return date.strftime(self.date_fmt) +class URLTimestampType (URLType) : + """ + Handles an integer UNIX timestamp as an UTC datetime + """ + + def parse (self, timestamp_str) : + """ + timestamp_str -> pytz.utc datetime.datetime + """ + + return datetime.datetime.utcfromtimestamp(int(timestamp_str)).replace(tzinfo=pytz.utc) + + def build (self, dtz) : + """ + pytz.utc datetime.datetime -> timestamp_str + """ + + return str(calendar.timegm(dtz.utctimetuple())) +