;ς 2°φBc@sΠdZdkZdkZdkZdklZeZd„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „ZeiƒZd „Zd „Zdfd„ƒYZdefd„ƒYZdS(sr Things common to the SchoolTool server and clients. $Id: common.py,v 1.2 2004/09/17 13:58:25 dreamcatcher Exp $ N(sDateTimecCst|iƒd ŒSdS(Ni(sDateTimesdates timetuple(sdate((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pysdt2DT3scCs*tt|iƒd ƒ}ti|ŒSdS(Ni(smapsintsdatespartssargssdatetime(sdatesargs((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pysDT2dt6scCs1t|tiƒot|ƒ}n|iƒSdS(N(s isinstancesdatesdatetimesdt2DTsTime(sdate((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pystoTime;scCs|i|idSdS(sO Converts a timedelta to an integer representing the number of minutes i€QN(stdssecondssdays(std((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys toSeconds@scCsby8tt|idƒƒ\}}}ti|||ƒSWn#t j ot d|ƒ‚nXdS(sΐParse a ISO-8601 YYYY-MM-DD date value. Examples: >>> parse_date('2003-09-01') datetime.date(2003, 9, 1) >>> parse_date('20030901') Traceback (most recent call last): ... ValueError: Invalid date: '20030901' >>> parse_date('2003-IX-01') Traceback (most recent call last): ... ValueError: Invalid date: '2003-IX-01' >>> parse_date('2003-09-31') Traceback (most recent call last): ... ValueError: Invalid date: '2003-09-31' >>> parse_date('2003-09-30-15-42') Traceback (most recent call last): ... ValueError: Invalid date: '2003-09-30-15-42' s-sInvalid date: %rN( smapsintsvaluessplitsysmsdsdatetimesdates ValueError(svaluesdsmsy((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys parse_dateFs !cCs\y2tt|idƒƒ\}}ti||ƒSWn#tj otd|ƒ‚nXdS(sqParse a ISO 8601 HH:MM time value. Examples: >>> parse_time('01:25') datetime.time(1, 25) >>> parse_time('9:15') datetime.time(9, 15) >>> parse_time('12:1') datetime.time(12, 1) >>> parse_time('00:00') datetime.time(0, 0) >>> parse_time('23:59') datetime.time(23, 59) >>> parse_time('24:00') Traceback (most recent call last): ... ValueError: Invalid time: '24:00' >>> parse_time('06:30PM') Traceback (most recent call last): ... ValueError: Invalid time: '06:30PM' s:sInvalid time: %rN( smapsintsvaluessplitshsmsdatetimestimes ValueError(svalueshsm((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys parse_timefs cCs±tid|ƒ}| otd|ƒ‚n|iƒd}|ot|dd ƒ}nd}tt|iƒd ƒ\}}}}}}ti|||||||ƒSdS(sParse a ISO 8601 date/time value. Only a small subset of ISO 8601 is accepted: YYYY-MM-DD HH:MM:SS YYYY-MM-DD HH:MM:SS.ssssss YYYY-MM-DDTHH:MM:SS YYYY-MM-DDTHH:MM:SS.ssssss Returns a datetime.datetime object without a time zone. Examples: >>> parse_datetime('2003-04-05 11:22:33.456789') datetime.datetime(2003, 4, 5, 11, 22, 33, 456789) >>> parse_datetime('2003-04-05 11:22:33.456') datetime.datetime(2003, 4, 5, 11, 22, 33, 456000) >>> parse_datetime('2003-04-05 11:22:33.45678999') datetime.datetime(2003, 4, 5, 11, 22, 33, 456789) >>> parse_datetime('01/02/03') Traceback (most recent call last): ... ValueError: Bad datetime: 01/02/03 s2(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+)([.](\d+))?$sBad datetime: %sis00000iiN(sresmatchsssms ValueErrorsgroupsssssssssintsmapsysdshhsmmssssdatetime(sssmmsysmshhsssssssssssd((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pysparse_datetime†s+cCsφ|iƒ}dt|ƒf\}}x(||jo || o|d7}q'W||jodSn||}dt|ƒf\}}x3||jo||ddfjo|d7}q‰Wdigi }||D]}|||ƒqΤ~ƒSdS(sRemove leading indentation from triple-quoted strings. Example: >>> dedent(''' ... some text ... is here ... with maybe some indents ... ''') ... 'some text\nis here\n with maybe some indents\n' Corner cases (mixing tabs and spaces, lines that are indented less than the first line) are not handled yet. iiss s s N( stexts splitlinesslinesslensfirstslimits firstlinesindentsjoinsappends_[1]sline(stextsindents firstlinesliness_[1]slimitslinesfirst((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pysdedent―s   $cCs&|tjotSnt|dƒSdS(s†Convert an UTF-8 string to Unicode. Example: >>> to_unicode('\xc4\x84\xc5\xbeuol\xc5\xb3') u'\u0104\u017euol\u0173' For convenience, to_unicode accepts None as the argument value. This makes it easier to use it with libxml2 functions such as nsProp, which return None for missing attribute values. >>> to_unicode(None) is None True sUTF-8N(sssNonesunicode(ss((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys to_unicodeΜs cCs|itdƒSdS(sΐConvert a Unicode string to the current locale encoding. Example: >>> from schooltool import common >>> old_locale_charset = common.locale_charset >>> common.locale_charset = 'UTF-8' >>> to_locale(u'\u263B') '\xe2\x98\xbb' >>> common.locale_charset = 'ASCII' >>> to_locale(u'Unrepresentable: \u263B') 'Unrepresentable: ?' >>> locale_charset = old_locale_charset sreplaceN(sussencodeslocale_charset(sus((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys to_localeεscCst|tƒSdS(swConvert an 8-bit string in locale encoding to Unicode. Example: >>> from schooltool import common >>> old_locale_charset = common.locale_charset >>> from_locale('xyzzy') u'xyzzy' >>> common.locale_charset = 'UTF-8' >>> from_locale('\xe2\x98\xbb') u'\u263b' >>> locale_charset = old_locale_charset N(sunicodessslocale_charset(ss((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys from_localeϋss StreamWrappercBs2tZdZd„Zd„Zd„Zd„ZRS(sE Unicode-friendly wrapper for writable file-like objects. Here the terms 'encoding' and 'charset' are used interchangeably. The main use case for StreamWrapper is wrapping sys.stdout and sys.stder so that you can forget worrying about charsets of your data. >>> from StringIO import StringIO >>> from schooltool import common >>> old_locale_charset = common.locale_charset >>> common.locale_charset = 'UTF-8' >>> sw = StreamWrapper(StringIO()) >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7" >>> sw.stm.getvalue() 'Hello, world! \xc2\xb7\xe2\x98\xbb\xc2\xb7\n' By default printing Unicode strings to stdout/stderr will raise Unicode errors if the stream encoding does not include some characters you are printing. StreamWrapper will replace unconvertable characters to question marks, therefore you should only use it for informative messages where such loss of information is acceptable. >>> common.locale_charset = 'US-ASCII' >>> sw = StreamWrapper(StringIO()) >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7" >>> sw.stm.getvalue() 'Hello, world! ???\n' StreamWrapper converts all unicode strings that are written to it to the encoding defined in the wrapped stream's 'encoding' attribute, or, if that is None, to the locale encoding. Typically the stream's encoding attribute is set when the stream is connected to a console device, and None when the stream is connected to a file. On Unix systems the console encoding matches the locale charset, but on Win32 systems they differ. >>> s = StringIO() >>> s.encoding = 'ISO-8859-1' >>> sw = StreamWrapper(s) >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7" >>> sw.stm.getvalue() 'Hello, world! \xb7?\xb7\n' You can print other kinds of objects: >>> sw = StreamWrapper(StringIO()) >>> print >> sw, 1, 2, >>> print >> sw, 3 >>> sw.stm.getvalue() '1 2 3\n' but not 8-bit strings: >>> sw = StreamWrapper(StringIO()) >>> print >> sw, "\xff" Traceback (most recent call last): ... UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) In addition to 'write' StreamWrapper provides 'flush' and 'writelines' >>> sw = StreamWrapper(StringIO()) >>> sw.write('xyzzy\n') >>> sw.flush() >>> sw.writelines(['a', 'b', 'c', 'd']) >>> sw.stm.getvalue() 'xyzzy\nabcd' cCs?||_t|dtƒ|_|itjo t|_ndS(Nsencoding(sstmsselfsgetattrsNonesencodingslocale_charset(sselfsstm((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys__init__Ws cCs#|ii|i|idƒƒdS(Nsreplace(sselfsstmswritesobjsencodesencoding(sselfsobj((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pyswrite]scCs|iiƒdS(N(sselfsstmsflush(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pysflush`scCs"x|D]}|i|ƒqWdS(N(sseqsobjsselfswrite(sselfsseqsobj((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys writelinescs(s__name__s __module__s__doc__s__init__swritesflushs writelines(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys StreamWrappers E   sUnicodeAwareExceptioncBstZdZd„ZRS(sζUnicode-friendly exception. >>> e1 = UnicodeAwareException(u"\u2639") >>> unicode(e1) u'\u2639' >>> e2 = UnicodeAwareException(u"\u2639", e1) >>> unicode(e2) u'\u2639 \u2639' cCsditt|iƒƒSdS(Nu (sjoinsmapsunicodesselfsargs(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys __unicode__us(s__name__s __module__s__doc__s __unicode__(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pysUnicodeAwareExceptionhs (s__doc__sreslocalesdatetimesDateTimestypes __metaclass__sdt2DTsDT2dtstoTimes toSecondss parse_dates parse_timesparse_datetimesdedents to_unicodesgetpreferredencodingslocale_charsets to_locales from_locales StreamWrappers ExceptionsUnicodeAwareException(sdedents toSecondss __metaclass__s parse_datesdt2DTslocalesparse_datetimeslocale_charsets from_localesDateTimes StreamWrappersres to_localestoTimesDT2dts parse_timesdatetimesUnicodeAwareExceptions to_unicode((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/common.pys?*s&         )     X