127 lines
3.6 KiB
Python
127 lines
3.6 KiB
Python
|
"""
|
||
|
SleekXMPP: The Sleek XMPP Library
|
||
|
Copyright (C) 2010 Nathanael C. Fritz
|
||
|
This file is part of SleekXMPP.
|
||
|
|
||
|
See the file LICENSE for copying permission.
|
||
|
"""
|
||
|
|
||
|
import datetime as dt
|
||
|
from dateutil.tz import tzoffset, tzutc
|
||
|
|
||
|
from sleekxmpp.xmlstream import ElementBase
|
||
|
from sleekxmpp.plugins import xep_0082
|
||
|
|
||
|
|
||
|
class EntityTime(ElementBase):
|
||
|
|
||
|
"""
|
||
|
The <time> element represents the local time for an XMPP agent.
|
||
|
The time is expressed in UTC to make synchronization easier
|
||
|
between entities, but the offset for the local timezone is also
|
||
|
included.
|
||
|
|
||
|
Example <time> stanzas:
|
||
|
<iq type="result">
|
||
|
<time xmlns="urn:xmpp:time">
|
||
|
<utc>2011-07-03T11:37:12.234569</utc>
|
||
|
<tzo>-07:00</tzo>
|
||
|
</time>
|
||
|
</iq>
|
||
|
|
||
|
Stanza Interface:
|
||
|
time -- The local time for the entity (updates utc and tzo).
|
||
|
utc -- The UTC equivalent to local time.
|
||
|
tzo -- The local timezone offset from UTC.
|
||
|
|
||
|
Methods:
|
||
|
get_time -- Return local time datetime object.
|
||
|
set_time -- Set UTC and TZO fields.
|
||
|
del_time -- Remove both UTC and TZO fields.
|
||
|
get_utc -- Return datetime object of UTC time.
|
||
|
set_utc -- Set the UTC time.
|
||
|
get_tzo -- Return tzinfo object.
|
||
|
set_tzo -- Set the local timezone offset.
|
||
|
"""
|
||
|
|
||
|
name = 'time'
|
||
|
namespace = 'urn:xmpp:time'
|
||
|
plugin_attrib = 'entity_time'
|
||
|
interfaces = set(('tzo', 'utc', 'time'))
|
||
|
sub_interfaces = interfaces
|
||
|
|
||
|
def set_time(self, value):
|
||
|
"""
|
||
|
Set both the UTC and TZO fields given a time object.
|
||
|
|
||
|
Arguments:
|
||
|
value -- A datetime object or properly formatted
|
||
|
string equivalent.
|
||
|
"""
|
||
|
date = value
|
||
|
if not isinstance(value, dt.datetime):
|
||
|
date = xep_0082.parse(value)
|
||
|
self['utc'] = date
|
||
|
self['tzo'] = date.tzinfo
|
||
|
|
||
|
def get_time(self):
|
||
|
"""
|
||
|
Return the entity's local time based on the UTC and TZO data.
|
||
|
"""
|
||
|
date = self['utc']
|
||
|
tz = self['tzo']
|
||
|
return date.astimezone(tz)
|
||
|
|
||
|
def del_time(self):
|
||
|
"""Remove both the UTC and TZO fields."""
|
||
|
del self['utc']
|
||
|
del self['tzo']
|
||
|
|
||
|
def get_tzo(self):
|
||
|
"""
|
||
|
Return the timezone offset from UTC as a tzinfo object.
|
||
|
"""
|
||
|
tzo = self._get_sub_text('tzo')
|
||
|
if tzo == '':
|
||
|
tzo = 'Z'
|
||
|
time = xep_0082.parse('00:00:00%s' % tzo)
|
||
|
return time.tzinfo
|
||
|
|
||
|
def set_tzo(self, value):
|
||
|
"""
|
||
|
Set the timezone offset from UTC.
|
||
|
|
||
|
Arguments:
|
||
|
value -- Either a tzinfo object or the number of
|
||
|
seconds (positive or negative) to offset.
|
||
|
"""
|
||
|
time = xep_0082.time(offset=value)
|
||
|
if xep_0082.parse(time).tzinfo == tzutc():
|
||
|
self._set_sub_text('tzo', 'Z')
|
||
|
else:
|
||
|
self._set_sub_text('tzo', time[-6:])
|
||
|
|
||
|
def get_utc(self):
|
||
|
"""
|
||
|
Return the time in UTC as a datetime object.
|
||
|
"""
|
||
|
value = self._get_sub_text('utc')
|
||
|
if value == '':
|
||
|
return xep_0082.parse(xep_0082.datetime())
|
||
|
return xep_0082.parse('%sZ' % value)
|
||
|
|
||
|
def set_utc(self, value):
|
||
|
"""
|
||
|
Set the time in UTC.
|
||
|
|
||
|
Arguments:
|
||
|
value -- A datetime object or properly formatted
|
||
|
string equivalent.
|
||
|
"""
|
||
|
date = value
|
||
|
if not isinstance(value, dt.datetime):
|
||
|
date = xep_0082.parse(value)
|
||
|
date = date.astimezone(tzutc())
|
||
|
value = xep_0082.format_datetime(date)[:-1]
|
||
|
self._set_sub_text('utc', value)
|