[CalendarServer-changes] [5181] CalendarServer/trunk/twext/python/datetime.py
source_changes at macosforge.org
source_changes at macosforge.org
Mon Feb 22 15:55:57 PST 2010
Revision: 5181
http://trac.macosforge.org/projects/calendarserver/changeset/5181
Author: wsanchez at apple.com
Date: 2010-02-22 15:55:57 -0800 (Mon, 22 Feb 2010)
Log Message:
-----------
Add twext.python.datetime
Added Paths:
-----------
CalendarServer/trunk/twext/python/datetime.py
Copied: CalendarServer/trunk/twext/python/datetime.py (from rev 5177, CalendarServer/trunk/twext/python/datetime.py)
===================================================================
--- CalendarServer/trunk/twext/python/datetime.py (rev 0)
+++ CalendarServer/trunk/twext/python/datetime.py 2010-02-22 23:55:57 UTC (rev 5181)
@@ -0,0 +1,163 @@
+##
+# Copyright (c) 2006-2010 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+"""
+Date/time Utilities
+"""
+
+__all__ = [
+ "dateordatetime",
+ "timerange",
+ "utc",
+]
+
+datetime = __import__("datetime").datetime
+from vobject.icalendar import dateTimeToString, dateToString, utc
+
+
+class dateordatetime(object):
+ def __init__(self, dateOrDateTime, defaultTZ=None):
+ """
+ @param dateOrDateTime: a L{date} or L{datetime}.
+ """
+ self._dateOrDateTime = dateOrDateTime
+ if isinstance(dateOrDateTime, datetime):
+ self._isDateTime = True
+ else:
+ self._isDateTime = False
+ self.defaultTZ = defaultTZ
+
+ def _comparableDateTimes(self, other):
+ dt1, dt2 = self.dateTime, other.dateTime
+
+ def getTZInfo(tz):
+ for defaultTZ in (self.defaultTZ, other.defaultTZ):
+ if defaultTZ is not None:
+ return defaultTZ
+ return tz
+
+ if dt1.tzinfo is None and dt2.tzinfo is not None:
+ dt1 = dt1.replace(tzinfo=getTZInfo(dt2.tzinfo))
+ elif dt1.tzinfo is not None and dt2.tzinfo is None:
+ dt2 = dt2.replace(tzinfo=getTZInfo(dt1.tzinfo))
+
+ return dt1, dt2
+
+ def __cmp__(self, other):
+ dt1, dt2 = self._comparableDateTimes(other)
+
+ if dt1 == dt2:
+ return 0
+ elif dt1 < dt2:
+ return -1
+ else:
+ return 1
+
+ def __sub__(self, other):
+ dt1, dt2 = self._comparableDateTimes(other)
+ return dt1 - dt2
+
+ def date(self):
+ if self._isDateTime:
+ return self._dateOrDateTime.date()
+ else:
+ return self._dateOrDateTime
+
+ def datetime(self):
+ if self._isDateTime:
+ return self._dateOrDateTime
+ else:
+ d = self._dateOrDateTime
+ return datetime(d.year, d.month, d.day, tzinfo=self.defaultTZ)
+
+ def iCalendarString(self):
+ if self._isDateTime:
+ return dateTimeToString(self._dateOrDateTime)
+ else:
+ return dateToString(self._dateOrDateTime)
+
+ def asTimeZone(self, tzinfo):
+ if self._isDateTime:
+ d = self._dateOrDateTime
+ if d.tzinfo is None:
+ return self
+ else:
+ return self.__class__(d.astimezone(tzinfo))
+ else:
+ return self
+
+ def asUTC(self):
+ return self.asTimeZone(self, utc)
+
+
+class timerange(object):
+ def __init__(self, start=None, end=None, duration=None):
+ """
+ @param start: a L{dateordatetime}
+ @param end: a L{dateordatetime}
+ @param duration: a L{timedelta}
+ @param tzinfo: a L{tzinfo}
+ """
+ assert end is None or duration is None
+
+ self._start = start
+ if end is not None:
+ self._end = end
+ if duration is not None:
+ self._duration = duration
+
+ def start(self):
+ return self._start
+
+ def end(self):
+ if getattr(self, "_end", None) is None:
+ start = getattr(self, "_start", None)
+ duration = getattr(self, "_duration", None)
+ if start is None or duration is None:
+ self._end = None
+ else:
+ self._end = self._start + self._duration
+ return self._end
+
+ def duration(self):
+ if getattr(self, "_duration", None) is None:
+ start = getattr(self, "_start", None)
+ end = getattr(self, "_end", None)
+ if start is None or end is None:
+ self._duration = None
+ else:
+ self._duration = self._end - self._start
+ return self._duration
+
+ def overlapsWith(self, other):
+ """
+ Determine whether this time range overlaps with another.
+ """
+ if self.start() is not None and other.start() is not None:
+ if self.end() is not None and other.end() is not None:
+ return self.start() < other.end() and self.end() > other.start()
+ elif self.end() is not None:
+ return other.start() < self.end()
+ elif other.end() is not None:
+ self.start() >= other.start() and self.start() < other.end()
+ else:
+ return False
+ elif self.start() is not None:
+ return self.start() < other.end()
+ elif other.start() is not None:
+ return self.end() < other.end() and self.end() > other.start()
+ else:
+ return False
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100222/3b311200/attachment-0001.html>
More information about the calendarserver-changes
mailing list