--- a/src/pyams_utils/date.py Wed Nov 20 19:26:23 2019 +0100
+++ b/src/pyams_utils/date.py Fri Nov 22 18:51:37 2019 +0100
@@ -16,8 +16,6 @@
dates and datetimes.
"""
-__docformat__ = 'restructuredtext'
-
from datetime import datetime
from zope.datetime import parseDatetimetz
@@ -29,14 +27,17 @@
from pyams_utils.request import check_request
from pyams_utils.timezone import gmtime, tztime
+
+__docformat__ = 'restructuredtext'
+
from pyams_utils import _
def unidate(value):
"""Get specified date converted to unicode ISO format
-
+
Dates are always assumed to be stored in GMT timezone
-
+
:param date value: input date to convert to unicode
:return: unicode; input date converted to unicode
@@ -54,9 +55,9 @@
def parse_date(value):
"""Get date specified in unicode ISO format to Python datetime object
-
+
Dates are always assumed to be stored in GMT timezone
-
+
:param str value: unicode date to be parsed
:return: datetime; the specified value, converted to datetime
@@ -71,7 +72,7 @@
def date_to_datetime(value):
"""Get datetime value converted from a date or datetime object
-
+
:param date/datetime value: a date or datetime value to convert
:return: datetime; input value converted to datetime
@@ -88,7 +89,7 @@
"""
if not value:
return None
- if type(value) is datetime:
+ if isinstance(value, datetime):
return value
return datetime(value.year, value.month, value.day)
@@ -100,11 +101,11 @@
EXT_DATETIME_FORMAT = _("on %d/%m/%Y at %H:%M")
-def format_date(value, format=EXT_DATE_FORMAT, request=None):
+def format_date(value, format_string=EXT_DATE_FORMAT, request=None):
"""Format given date with the given format
:param datetime value: the value to format
- :param str format: a format string to use by `strftime` function
+ :param str format_string: a format string to use by `strftime` function
:param request: the request from which to extract localization info for translation
:return: str; input datetime converted to given format
@@ -121,14 +122,14 @@
if request is None:
request = check_request()
localizer = request.localizer
- return datetime.strftime(tztime(value), localizer.translate(format))
+ return datetime.strftime(tztime(value), localizer.translate(format_string))
-def format_datetime(value, format=EXT_DATETIME_FORMAT, request=None):
+def format_datetime(value, format_string=EXT_DATETIME_FORMAT, request=None):
"""Format given datetime with the given format including time
:param datetime value: the value to format
- :param str format: a format string to use by `strftime` function
+ :param str format_string: a format string to use by `strftime` function
:param request: request; the request from which to extract localization info for translation
:return: str; input datetime converted to given format
@@ -140,11 +141,12 @@
>>> format_datetime(value, SH_DATETIME_FORMAT)
'15/11/2016 - 10:13'
"""
- return format_date(value, format, request)
+ return format_date(value, format_string, request)
def get_age(value, request=None):
- """Get 'human' age of a given datetime (including timezone) compared to current datetime (in UTC)
+ """Get 'human' age of a given datetime (including timezone) compared to current datetime
+ (in UTC)
:param datetime value: input datetime to be compared with current datetime
:return: str; the delta value, converted to months, weeks, days, hours or minutes
@@ -155,30 +157,31 @@
now = gmtime(datetime.utcnow())
delta = now - gmtime(value)
if delta.days > 60:
- return translate(_("%d months ago")) % int(round(delta.days * 1.0 / 30))
+ result = translate(_("%d months ago")) % int(round(delta.days * 1.0 / 30))
elif delta.days > 10:
- return translate(_("%d weeks ago")) % int(round(delta.days * 1.0 / 7))
+ result = translate(_("%d weeks ago")) % int(round(delta.days * 1.0 / 7))
elif delta.days > 2:
- return translate(_("%d days ago")) % delta.days
+ result = translate(_("%d days ago")) % delta.days
elif delta.days == 2:
- return translate(_("the day before yesterday"))
+ result = translate(_("the day before yesterday"))
elif delta.days == 1:
- return translate(_("yesterday"))
- else:
+ result = translate(_("yesterday"))
+ else: # less than one day
hours = int(round(delta.seconds * 1.0 / 3600))
if hours > 1:
- return translate(_("%d hours ago")) % hours
+ result = translate(_("%d hours ago")) % hours
elif delta.seconds > 300:
- return translate(_("%d minutes ago")) % int(round(delta.seconds * 1.0 / 60))
+ result = translate(_("%d minutes ago")) % int(round(delta.seconds * 1.0 / 60))
else:
- return translate(_("less than 5 minutes ago"))
+ result = translate(_("less than 5 minutes ago"))
+ return result
-def get_duration(v1, v2=None, request=None):
+def get_duration(first, last=None, request=None): # pylint: disable=too-many-branches
"""Get 'human' delta as string between two dates
- :param datetime v1: start date
- :param datetime v2: end date, or current date (in UTC) if None
+ :param datetime first: start date
+ :param datetime last: end date, or current date (in UTC) if None
:param request: the request from which to extract localization infos
:return: str; approximate delta between the two input dates
@@ -221,39 +224,41 @@
>>> get_duration(date1, date2, request)
'15 seconds'
"""
- if v2 is None:
- v2 = datetime.utcnow()
- assert isinstance(v1, datetime) and isinstance(v2, datetime)
+ if last is None:
+ last = datetime.utcnow()
+ assert isinstance(first, datetime) and isinstance(last, datetime)
if request is None:
request = check_request()
translate = request.localizer.translate
- v1, v2 = min(v1, v2), max(v1, v2)
- delta = v2 - v1
+ first, last = min(first, last), max(first, last)
+ delta = last - first
if delta.days > 60:
- return translate(_("%d months")) % int(round(delta.days * 1.0 / 30))
+ result = translate(_("%d months")) % int(round(delta.days * 1.0 / 30))
elif delta.days > 10:
- return translate(_("%d weeks")) % int(round(delta.days * 1.0 / 7))
+ result = translate(_("%d weeks")) % int(round(delta.days * 1.0 / 7))
elif delta.days >= 2:
- return translate(_("%d days")) % delta.days
+ result = translate(_("%d days")) % delta.days
else:
hours = int(round(delta.seconds * 1.0 / 3600))
if delta.days == 1:
if hours == 0:
- return translate(_("24 hours"))
+ result = translate(_("24 hours"))
else:
- return translate(_("%d day and %d hours")) % (delta.days, hours)
+ result = translate(_("%d day and %d hours")) % (delta.days, hours)
else:
if hours > 2:
- return translate(_("%d hours")) % hours
+ result = translate(_("%d hours")) % hours
else:
minutes = int(round(delta.seconds * 1.0 / 60))
if minutes > 2:
- return translate(_("%d minutes")) % minutes
+ result = translate(_("%d minutes")) % minutes
else:
- return translate(_("%d seconds")) % delta.seconds
+ result = translate(_("%d seconds")) % delta.seconds
+ return result
-@adapter_config(name='timestamp', context=(Interface, Interface, Interface), provides=ITALESExtension)
+@adapter_config(name='timestamp', context=(Interface, Interface, Interface),
+ provides=ITALESExtension)
class TimestampTalesAdapter(ContextRequestViewAdapter):
"""extension:timestamp(context) TALES adapter
@@ -261,14 +266,14 @@
"""
def render(self, context=None, formatting=None):
+ """Render TALES extension"""
if context is None:
context = self.request.context
if formatting == 'iso':
format_func = datetime.isoformat
else:
format_func = datetime.timestamp
- dc = IZopeDublinCore(context, None)
- if dc is None:
- return format_func(tztime(datetime.utcnow()))
- else:
- return format_func(tztime(dc.modified))
+ zdc = IZopeDublinCore(context, None)
+ if zdc is None:
+ return format_func(tztime(zdc.modified))
+ return format_func(tztime(datetime.utcnow()))