# HG changeset patch # User Tero Marttila # Date 1234134665 -7200 # Node ID 07ca28f3a9f291a8d7a3e0d3c37083d070b0b8ad # Parent f13cf27a360b39bfc966cf41804e6642a49230de use improved URLConfig/URLType diff -r f13cf27a360b -r 07ca28f3a9f2 channels.py --- a/channels.py Mon Feb 09 00:24:13 2009 +0200 +++ b/channels.py Mon Feb 09 01:11:05 2009 +0200 @@ -47,6 +47,12 @@ """ return self.channels[channel_name] + + def dict (self) : + """ + Returns a { name: LogChannel } dict + """ + return self.channels def __iter__ (self) : """ diff -r f13cf27a360b -r 07ca28f3a9f2 handlers.py --- a/handlers.py Mon Feb 09 00:24:13 2009 +0200 +++ b/handlers.py Mon Feb 09 01:11:05 2009 +0200 @@ -2,6 +2,8 @@ Our URL action handlers """ +import pytz + from qmsk.web import http, template import urls, channels, helpers @@ -37,7 +39,10 @@ # get latest events lines = channel.source.get_latest(count) - # format + # formatter + formatter = formatter(pytz.utc, '%H:%M:%S') + + # lines lines = formatter.format_html(lines) return templates.render_to_response("channel_view", @@ -61,19 +66,28 @@ else : raise http.ResponseError("Unknown filetype %r" % format) +def channel_calendar (request, channel) : + """ + Display a list of avilable logs for some days + """ + + pass + def channel_date (request, channel, date, formatter) : """ Display all log data for the given date """ # XXX: fix date timezone - import pytz date = date.replace(tzinfo=pytz.utc) # get latest events lines = channel.source.get_date(date) - # format + # formatter + formatter = formatter(pytz.utc, '%H:%M:%S') + + # lines lines = formatter.format_html(lines) return templates.render_to_response("channel_date", diff -r f13cf27a360b -r 07ca28f3a9f2 log_formatter.py --- a/log_formatter.py Mon Feb 09 00:24:13 2009 +0200 +++ b/log_formatter.py Mon Feb 09 01:11:05 2009 +0200 @@ -10,6 +10,9 @@ """ Provides a method to format series of LogLines into various output formats, with varying themes """ + + # the formatter's code name + name = None def __init__ (self, tz, timestamp_fmt="%H:%M:%S") : """ @@ -72,6 +75,8 @@ Implements plain black-and-white irssi-style formatting """ + name = 'irssi' + def format_html (self, lines) : """ Just uses format_txt, but wraps in

diff -r f13cf27a360b -r 07ca28f3a9f2 urls.py
--- a/urls.py	Mon Feb 09 00:24:13 2009 +0200
+++ b/urls.py	Mon Feb 09 01:11:05 2009 +0200
@@ -10,16 +10,23 @@
 import handlers
 
 # for types
-import channels, log_formatter, utils
+import utils
+
+# for configuration
+import channels, log_formatter
 
 # our URLConfig
 urls = url = urltree.URLConfig(
-    type_dict   = { 
-        # lookup LogChannel
-        'cid':  channels.channel_list.lookup,
-        'fmt':  log_formatter.by_name,
-        'date': utils.Date(None, '%Y-%m-%d'),
-    }
+    type_dict   = dict(
+        # LogChannel
+        cid     = utils.URLChannelName(channels.channel_list.dict()),
+
+        # LogFormatter
+        fmt     =  utils.URLFormatterName(log_formatter.FORMATTERS),
+
+        # datetime
+        date    = utils.URLDateType('%Y-%m-%d'),
+    )
 )
 
 # urls
@@ -27,6 +34,7 @@
 channel_select  = url('/channel_select/?channel:cid',                                   handlers.channel_select         )
 channel_view    = url('/channels/{channel:cid}/?count:int=10&formatter:fmt=irssi',      handlers.channel_view           )
 channel_last    = url('/channels/{channel:cid}/last/{count:int=100}/{format=html}',     handlers.channel_last           )
+channel_date    = url('/channels/{channel:cid}/calendar',                               handlers.channel_calendar       )
 channel_date    = url('/channels/{channel:cid}/date/{date:date}/?formatter:fmt=irssi',  handlers.channel_date           )
 channel_search  = url('/channels/{channel:cid}/search/?q',                              handlers.channel_search         )
 
diff -r f13cf27a360b -r 07ca28f3a9f2 utils.py
--- a/utils.py	Mon Feb 09 00:24:13 2009 +0200
+++ b/utils.py	Mon Feb 09 01:11:05 2009 +0200
@@ -4,25 +4,84 @@
 
 import datetime
 
-class Date (object) :
+from qmsk.web.urltree import URLType
+
+class URLChannelName (URLType) :
     """
-        Handle dates in URLs as datetime objects (with indeterminate time info) in some timezone
+        Handle LogChannel names in URLs. Deals with instances of LogChannel
     """
 
-    def __init__ (self, tz, date_fmt="%Y-%m-%d") :
+    def __init__ (self, channels) :
         """
-            Format/parse dates in the given timezone using the given format
+            Use the given { name -> LogChannel } dict
+        """
+
+        self.channels = channels
+    
+    def parse (self, chan_name) :
+        """
+            chan_name -> LogChannel
+        """
+
+        return self.channels[chan_name]
+
+    def build (self, chan) :
+        """
+            LogChannel -> chan_name
+        """
+
+        return chan.id
+
+class URLFormatterName (URLType) :
+    """
+        Handle LogFormatter names in URLs. Note that they evaluate into the LogFormatter class itself, not an
+        instance, although build requiers an instance
+    """
+
+    def __init__ (self, formatters) :
+        """
+            Use the given { name -> class LogFormatter } dict
+        """
+
+        self.formatters = formatters
+    
+    def parse (self, fmt_name) :
+        """
+            fmt_name -> class LogFormatter
+        """
+
+        return self.formatters[fmt_name]
+    
+    def build (self, fmt) :
+        """
+            LogFormatter -> fmt_name
+        """
+
+        return fmt.name
+
+class URLDateType (URLType) :
+    """
+        Handle dates in URLs as naive datetime objects (with indeterminate time info)
+    """
+
+    def __init__ (self, date_fmt="%Y-%m-%d") :
+        """
+            Format/parse dates using the given format
+        """
+
+        self.date_fmt = date_fmt
+    
+    def parse (self, date_str) :
+        """
+            date_str -> naive datetime.datetime
         """
         
-        self.tz = tz
-        self.date_fmt = date_fmt
+        return datetime.datetime.strptime(date_str, self.date_fmt)
     
-    __name__ = "date"
+    def build (self, date) :
+        """
+            datetime.date -> date_str
+        """
 
-    def __call__ (self, date_str) :
-        """
-            Parse the given date string
-        """
-        
-        return datetime.datetime.strptime(date_str, self.date_fmt).replace(tzinfo=self.tz)
+        return date.strftime(self.date_fmt)