qmsk/irclogs/utils.py
changeset 140 6db2527b67cf
parent 129 67a30d680f60
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk/irclogs/utils.py	Sun Sep 13 01:15:56 2009 +0300
@@ -0,0 +1,137 @@
+"""
+    Miscellaneous things
+"""
+
+import datetime, calendar, pytz
+import os, errno
+
+from qmsk.web.urltree import URLType
+
+class URLChannelName (URLType) :
+    """
+        Handle LogChannel names in URLs. Deals with instances of LogChannel
+    """
+
+    def __init__ (self, channels) :
+        """
+            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 URLDateType (URLType) :
+    """
+        Handle dates in URLs as naive datetime objects (with indeterminate time info)
+    """
+
+    def __init__ (self, date_fmt) :
+        """
+            Format/parse dates using the given format
+        """
+
+        self.date_fmt = date_fmt
+    
+    def parse (self, date_str) :
+        """
+            date_str -> naive datetime.datetime
+        """
+        
+        return datetime.datetime.strptime(date_str, self.date_fmt)
+    
+    def build (self, date) :
+        """
+            datetime.date -> date_str
+        """
+
+        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 from_utc_timestamp(int(timestamp_str))
+    
+    def build (self, dtz) :
+        """
+            pytz.utc datetime.datetime -> timestamp_str
+        """
+        
+        return str(to_utc_timestamp(dtz))
+
+def from_utc_timestamp (timestamp) :
+    """
+        Converts a UNIX timestamp into a datetime.datetime
+    """
+
+    return datetime.datetime.utcfromtimestamp(timestamp).replace(tzinfo=pytz.utc)
+
+def to_utc_timestamp (dt) :
+    """
+        Converts a datetime.datetime into a UNIX timestamp
+    """
+
+    return calendar.timegm(dt.utctimetuple())
+
+def mtime (path, ignore_missing=False) :
+    """
+        Gets the mtime for the given path as an UTC datetime, or None, if the file doesn't exist and ignore_missing
+    """
+
+    try :
+        # stat
+        st = os.stat(path)
+    
+    # trap IOError
+    except os.error, e :
+        # ENOENT?
+        if ignore_missing and e.errno == errno.ENOENT :
+            return None
+
+        else :
+            raise
+
+    else :
+        # decode
+        return from_utc_timestamp(st.st_mtime)
+
+class FixedOffsetTimezone (pytz._FixedOffset) :
+    """
+        A Fixed-offset timezone with no DST info, compatible with pytz.
+
+        This is based on pytz._FixedOffset, but overrides dst() to return timedelta(0)
+    """
+
+    def __init__ (self, minutes) :
+        """
+            Minutes is simply the offset from UTC in minutes, positive or negative, at most 24h.
+        """
+
+        pytz._FixedOffset.__init__(self, minutes)
+
+    def dst (self, dt) :
+        """
+            No DST info
+        """
+
+        return datetime.timedelta(0)
+