src/pyams_utils/date.py
branchdev-tf
changeset 408 cf2304af0fab
parent 380 c062ab4db6cd
child 441 b3b41d340a04
--- 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()))