def default_timezone(context=None): """Return the timezone from the portal or user. :param context: Optional context. If not given, the current Site is used. :type context: Content object :returns: Timezone identifier. :rtype: string """ # TODO: test member timezone if not context: context = getSite() membership = getToolByName(context, 'portal_membership', None) if membership and not membership.isAnonymousUser(): # the user has not logged in member = membership.getAuthenticatedMember() member_timezone = member.getProperty('timezone', None) if member_timezone: return pytz.timezone(member_timezone).zone portal_timezone = None reg = queryUtility(IRegistry, context=context, default=None) if reg: portal_timezone= reg.forInterface( IEventSettings, prefix="plone.app.event").portal_timezone # fallback to what plone.event is doing if not portal_timezone: portal_timezone = fallback_default_timezone() if portal_timezone in replacement_zones.keys(): portal_timezone = replacement_zones[portal_timezone] portal_timezone = validated_timezone(portal_timezone, FALLBACK_TIMEZONE) return portal_timezone
def DT(dt, exact=False): """Return a Zope DateTime instance from a Python datetime instance. :param dt: Python datetime, Python date, Zope DateTime instance or string. :param exact: If True, the resolution goes down to microseconds. If False, the resolution are seconds. Defaul is False. :type exact: Boolean :returns: Zope DateTime :rtype: Zope DateTime """ def _adjust_DT(DT, exact): if exact: ret = DT else: ret = DateTime( DT.year(), DT.month(), DT.day(), DT.hour(), DT.minute(), int(DT.second()), DT.timezone() ) return ret tz = default_timezone(getSite()) ret = None if is_datetime(dt): zone_id = getattr(dt.tzinfo, 'zone', tz) tz = validated_timezone(zone_id, tz) second = dt.second if exact: second += dt.microsecond / 1000000.0 ret = DateTime( dt.year, dt.month, dt.day, dt.hour, dt.minute, second, tz ) elif is_date(dt): ret = DateTime(dt.year, dt.month, dt.day, 0, 0, 0, tz) elif isinstance(dt, DateTime): # No timezone validation. DateTime knows how to handle it's zones. ret = _adjust_DT(dt, exact=exact) else: # Try to convert by DateTime itself ret = _adjust_DT(DateTime(dt), exact=exact) return ret
def default_timezone(context=None, as_tzinfo=False): """Return the timezone from the portal or user. :param context: Optional context. If not given, the current Site is used. :type context: Content object :param as_tzinfo: Return the default timezone as tzinfo object. :type as_tzinfo: boolean :returns: Timezone identifier or tzinfo object. :rtype: string or tzinfo object """ # TODO: test member timezone if not context: context = getSite() membership = getToolByName(context, 'portal_membership', None) if membership and not membership.isAnonymousUser(): # user not logged in member = membership.getAuthenticatedMember() member_timezone = member.getProperty('timezone', None) if member_timezone: info = pytz.timezone(member_timezone) return info if as_tzinfo else info.zone portal_timezone = None reg = queryUtility(IRegistry, context=context, default=None) if reg: portal_timezone = reg.forInterface( IEventSettings, prefix="plone.app.event", check=False # Don't fail, if portal_timezone isn't set. ).portal_timezone # fallback to what plone.event is doing if not portal_timezone: portal_timezone = fallback_default_timezone() # Change any ambiguous timezone abbreviations to their most common # non-ambigious timezone name. if portal_timezone in replacement_zones.keys(): portal_timezone = replacement_zones[portal_timezone] portal_timezone = validated_timezone(portal_timezone, FALLBACK_TIMEZONE) if as_tzinfo: return pytz.timezone(portal_timezone) return portal_timezone
def default_timezone(context=None, as_tzinfo=False): """Return the timezone from the portal or user. :param context: Optional context. If not given, the current Site is used. :type context: Content object :param as_tzinfo: Return the default timezone as tzinfo object. :type as_tzinfo: boolean :returns: Timezone identifier or tzinfo object. :rtype: string or tzinfo object """ # TODO: test member timezone if not context: context = getSite() membership = getToolByName(context, 'portal_membership', None) if membership and not membership.isAnonymousUser(): # user not logged in member = membership.getAuthenticatedMember() member_timezone = member.getProperty('timezone', None) if member_timezone: return pytz.timezone(member_timezone).zone portal_timezone = None reg = queryUtility(IRegistry, context=context, default=None) if reg: try: portal_timezone = reg.forInterface( IEventSettings, prefix="plone.app.event").portal_timezone except KeyError: # plone.registry warns that registry settings can not be # available or valid pass # fallback to what plone.event is doing if not portal_timezone: portal_timezone = fallback_default_timezone() # Change any ambiguous timezone abbreviations to their most common # non-ambigious timezone name. if portal_timezone in replacement_zones.keys(): portal_timezone = replacement_zones[portal_timezone] portal_timezone = validated_timezone(portal_timezone, FALLBACK_TIMEZONE) if as_tzinfo: return pytz.timezone(portal_timezone) return portal_timezone
def default_timezone(context=None, as_tzinfo=False): """Return the timezone from the portal or user. :param context: Optional context. If not given, the current Site is used. :type context: Content object :param as_tzinfo: Return the default timezone as tzinfo object. :type as_tzinfo: boolean :returns: Timezone identifier or tzinfo object. :rtype: string or tzinfo object """ # TODO: test member timezone if not context: context = getSite() membership = getToolByName(context, 'portal_membership', None) if membership and not membership.isAnonymousUser(): # user not logged in member = membership.getAuthenticatedMember() member_timezone = member.getProperty('timezone', None) if member_timezone: info = pytz.timezone(member_timezone) return info if as_tzinfo else info.zone reg_key = 'plone.portal_timezone' registry = getUtility(IRegistry) portal_timezone = registry.get(reg_key, None) # fallback to what plone.event is doing if not portal_timezone: portal_timezone = fallback_default_timezone() # Change any ambiguous timezone abbreviations to their most common # non-ambigious timezone name. if portal_timezone in replacement_zones.keys(): portal_timezone = replacement_zones[portal_timezone] portal_timezone = validated_timezone(portal_timezone, FALLBACK_TIMEZONE) if as_tzinfo: return pytz.timezone(portal_timezone) return portal_timezone
def DT(dt): """Return a Zope DateTime instance from a Python datetime instance. :param dt: Python datetime instance. :type dt: Python datetime :returns: Zope DateTime :rtype: Zope DateTime """ tz = default_timezone(getSite()) ret = None if isinstance(dt, datetime): zone_id = getattr(dt.tzinfo, 'zone', tz) tz = validated_timezone(zone_id, tz) ret = DateTime(dt.year, dt.month, dt.day,\ dt.hour, dt.minute, dt.second, tz) elif isinstance(dt, date): ret = DateTime(dt.year, dt.month, dt.day, 0, 0, 0, tz) elif isinstance(dt, DateTime): # No timezone validation. DateTime knows how to handle it's zones. ret = dt return ret