[Checkins] SVN: z3ext.formatter/trunk/src/z3ext/formatter/ added humandatetime tests
Nikolay Kim
fafhrd91 at gmail.com
Wed Sep 30 10:38:04 EDT 2009
Log message for revision 104652:
added humandatetime tests
Changed:
U z3ext.formatter/trunk/src/z3ext/formatter/README.txt
U z3ext.formatter/trunk/src/z3ext/formatter/humandatetime.py
U z3ext.formatter/trunk/src/z3ext/formatter/resources/humandatetime.js
U z3ext.formatter/trunk/src/z3ext/formatter/tests.py
-=-
Modified: z3ext.formatter/trunk/src/z3ext/formatter/README.txt
===================================================================
--- z3ext.formatter/trunk/src/z3ext/formatter/README.txt 2009-09-30 14:10:55 UTC (rev 104651)
+++ z3ext.formatter/trunk/src/z3ext/formatter/README.txt 2009-09-30 14:38:04 UTC (rev 104652)
@@ -114,7 +114,7 @@
</html>
-Now let's chane timezone to US/Pacific, we change only time zone
+Now let's chane timezone to US/Pacific, we change only time zone
not datetime value
>>> configlet.timezone = 'US/Pacific'
@@ -280,8 +280,8 @@
================
We should define formatter factory and formatter itself
-Let's implement formatter that accept string and currency name and
-format as currency. Format of TALES expression whould be as
+Let's implement formatter that accept string and currency name and
+format as currency. Format of TALES expression whould be as
'formatter:<formatter name>,<formatter var1>,<formatter var2>,...:<path expression>'
<formatter name> is name of adapter that adapts IHTTPRequest to IFormatterFactory
also expression will pass <formatter var[1-...]> as args to factory.
@@ -332,3 +332,202 @@
>>> print page.render(request)
121.04 $
121.04 Eur
+
+
+humanDatetime formatter
+-----------------------
+
+ >>> now = datetime.now(UTC)
+
+ >>> fpage = ZPTPage()
+ >>> fpage.pt_edit(u'''
+ ... <html>
+ ... <body>
+ ... <tal:block tal:content="structure formatter:humanDatetime:options/now" />
+ ... <tal:block tal:content="structure formatter:humanDatetime,short:options/now" />
+ ... <tal:block tal:content="structure formatter:humanDatetime,medium:options/now" />
+ ... <tal:block tal:content="structure formatter:humanDatetime,full:options/now" />
+ ... </body>
+ ... </html>''', 'text/html')
+
+Now datetime
+
+ >>> print fpage.render(request, now=now)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">0 second(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">0 second(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">0 second(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">0 second(s) ago</span>
+ </body>
+ </html>
+
+ >>> today = now - timedelta(seconds=1)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">1 second(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 second(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 second(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 second(s) ago</span>
+ </body>
+ </html>
+
+ >>> today = now - timedelta(minutes=1)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">1 minute(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 minute(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 minute(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 minute(s) ago</span>
+ </body>
+ </html>
+
+ >>> today = now - timedelta(hours=1)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">1 hour(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 hour(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 hour(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 hour(s) ago</span>
+ </body>
+ </html>
+
+ >>> today = now - timedelta(days=1)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">1 day(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 day(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 day(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 day(s) ago</span>
+ </body>
+ </html>
+
+ >>> today = now - timedelta(days=7)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">1 week(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 week(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 week(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 week(s) ago</span>
+ </body>
+ </html>
+
+ >>> today = now - timedelta(days=30)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">1 month(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 month(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 month(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 month(s) ago</span>
+ </body>
+ </html>
+
+ >>> today = now - timedelta(days=367)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">1 year(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 year(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 year(s) ago</span>
+ <span class="z3ext-formatter-humandatetime" value="...">1 year(s) ago</span>
+ </body>
+ </html>
+
+Tomorrow's datetime
+
+ >>> today = now + timedelta(seconds=1)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 second(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 second(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 second(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 second(s)</span>
+ </body>
+ </html>
+
+ >>> today = now + timedelta(minutes=1)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 minute(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 minute(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 minute(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 minute(s)</span>
+ </body>
+ </html>
+
+ >>> today = now + timedelta(hours=1)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 hour(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 hour(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 hour(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 hour(s)</span>
+ </body>
+ </html>
+
+ >>> today = now + timedelta(days=1)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 day(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 day(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 day(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 day(s)</span>
+ </body>
+ </html>
+
+ >>> today = now + timedelta(days=7)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 week(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 week(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 week(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 week(s)</span>
+ </body>
+ </html>
+
+ >>> today = now + timedelta(days=30)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 month(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 month(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 month(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 month(s)</span>
+ </body>
+ </html>
+
+ >>> today = now + timedelta(days=365)
+
+ >>> print fpage.render(request, now=today)
+ <html>
+ <body>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 year(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 year(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 year(s)</span>
+ <span class="z3ext-formatter-humandatetime" value="...">in 1 year(s)</span>
+ </body>
+ </html>
\ No newline at end of file
Modified: z3ext.formatter/trunk/src/z3ext/formatter/humandatetime.py
===================================================================
--- z3ext.formatter/trunk/src/z3ext/formatter/humandatetime.py 2009-09-30 14:10:55 UTC (rev 104651)
+++ z3ext.formatter/trunk/src/z3ext/formatter/humandatetime.py 2009-09-30 14:38:04 UTC (rev 104652)
@@ -15,63 +15,78 @@
$Id$
"""
-from pytz import utc, timezone
-from datetime import datetime
+from pytz import utc, timezone, FixedOffset
+from datetime import datetime, timedelta
from zope import interface, component
from zope.i18n import translate
from zope.component import getUtility
from zope.publisher.interfaces.http import IHTTPRequest
-from interfaces import IFormatter, IFormatterFactory, IFormatterConfiglet
+from interfaces import IFormatter, IFormatterFactory, IFormatterConfiglet, _
class HumanDatetimeFormatter(object):
interface.implements(IFormatter)
+ messages = {'past': {'year': u'${value} year(s) ago',
+ 'month': u'${value} month(s) ago',
+ 'week': u'${value} week(s) ago',
+ 'day': u'${value} day(s) ago',
+ 'hour': u'${value} hour(s) ago',
+ 'minute': u'${value} minute(s) ago',
+ 'second': u'${value} second(s) ago',
+ },
+ 'future': {'year': u'in ${value} year(s)',
+ 'month': u'in ${value} month(s)',
+ 'week': u'in ${value} week(s)',
+ 'day': u'in ${value} day(s)',
+ 'hour': u'in ${value} hour(s)',
+ 'minute': u'in ${value} minute(s)',
+ 'second': u'in ${value} second(s)',
+ }}
+
def __init__(self, request, *args):
self.request = request
def format(self, value):
- configlet = getUtility(IFormatterConfiglet)
- tz = timezone(configlet.timezone)
-
if value.tzinfo is None:
- value = datetime(value.year, value.month, value.day, value.hour,
- value.minute, value.second, value.microsecond, tz)
+ value = utc.localize(datetime)
+ now = datetime.now(utc)
+ delta = now - value.astimezone(utc)
+ key = 'past'
+ if delta < timedelta():
+ delta = - delta + timedelta(seconds=1) #due to python implementation
+ key = 'future'
+ offset = (value.tzinfo.utcoffset(value).seconds/600)*10
+ value = FixedOffset(offset).normalize(value)
- value = value.astimezone(tz)
- delta = datetime.now(utc) - value.astimezone(utc)
-
years, months, weeks, hours, minutes = (
delta.days/365, delta.days/30, delta.days/7,
delta.seconds/3600, delta.seconds/60)
formatted = None
if years > 0:
- formatted = translate(
- u'${value} year(s) ago', 'z3ext.formatter',
- mapping={'value': years})
-
- if months > 0:
- formatted = translate(u'${value} month(s) ago', 'z3ext.formatter',
+ formatted = translate(self.messages[key]['year'], 'z3ext.formatter',
+ mapping={'value': years})
+ elif months > 0:
+ formatted = translate(self.messages[key]['month'],'z3ext.formatter',
mapping={'value': months})
elif weeks > 0:
- formatted = translate(u'${value} week(s) ago', 'z3ext.formatter',
+ formatted = translate(self.messages[key]['week'], 'z3ext.formatter',
mapping={'value': weeks})
elif delta.days > 0:
- formatted = translate(u'${value} day(s) ago', 'z3ext.formatter',
+ formatted = translate(self.messages[key]['day'], 'z3ext.formatter',
mapping={'value': delta.days})
elif hours > 0:
- formatted = translate(u'${value} hour(s) ago', 'z3ext.formatter',
+ formatted = translate(self.messages[key]['hour'], 'z3ext.formatter',
mapping={'value': hours})
elif minutes > 0:
- formatted = translate(u'${value} minute(s) ago', 'z3ext.formatter',
+ formatted = translate(self.messages[key]['minute'], 'z3ext.formatter',
mapping={'value': minutes})
else:
- formatted = translate(u'${value} second(s) ago', 'z3ext.formatter',
+ formatted = translate(self.messages[key]['second'], 'z3ext.formatter',
mapping={'value': delta.seconds})
-
return """<span class="z3ext-formatter-humandatetime" value="%s">%s</span>""" \
- % (value.strftime('%Y %B %d %H:%M:%S %Z'), formatted)
+ % (value.strftime('%Y %B %d %H:%M:%S %z'), formatted)
class HumanDatetimeFormatterFactory(object):
Modified: z3ext.formatter/trunk/src/z3ext/formatter/resources/humandatetime.js
===================================================================
--- z3ext.formatter/trunk/src/z3ext/formatter/resources/humandatetime.js 2009-09-30 14:10:55 UTC (rev 104651)
+++ z3ext.formatter/trunk/src/z3ext/formatter/resources/humandatetime.js 2009-09-30 14:38:04 UTC (rev 104652)
@@ -1,21 +1,34 @@
-var my_dictionary = {
- 'year(s) ago' : 'year(s) ago',
- 'month(s) ago' : 'month(s) ago',
- 'weeks(s) ago': 'weeks(s) ago',
- 'days(s) ago' : 'days(s) ago',
- 'hours(s) ago' : 'hours(s) ago',
- 'minutes(s) ago' : 'minutes(s) ago',
- 'second(s) ago' : 'second(s) ago'
+var past_dictionary = {
+ '%s year(s) ago' : '%s year(s) ago',
+ '%s month(s) ago' : '%s month(s) ago',
+ '%s week(s) ago': '%s week(s) ago',
+ '%s day(s) ago' : '%s day(s) ago',
+ '%s hour(s) ago' : '%s hour(s) ago',
+ '%s minute(s) ago' : '%s minute(s) ago',
+ '%s second(s) ago' : '%s second(s) ago'
};
-$.i18n.setDictionary(my_dictionary);
+var future_dictionary = {
+ '%s year(s) ago' : '%s year(s) ago',
+ '%s month(s) ago' : '%s month(s) ago',
+ '%s week(s) ago': '%s week(s) ago',
+ '%s day(s) ago' : '%s day(s) ago',
+ '%s hour(s) ago' : '%s hour(s) ago',
+ '%s minute(s) ago' : '%s minute(s) ago',
+ '%s second(s) ago' : '%s second(s) ago'
+ };
function setFormatter(el)
{
- var time = new Date()
+ var time = new Date();
time.setTime(Date.parse(el.attr('value')));
var new_time = new Date();
delta = new_time-time;
+ $.i18n.setDictionary(past_dictionary);
+ if (delta < 0) {
+ delta = Math.abs(delta);
+ $.i18n.setDictionary(future_dictionary)
+ }
years = Math.floor(delta/(365*24*60*60*1000.0));
months = Math.floor(delta/(30*24*60*60*1000.0));
weeks = Math.floor(delta/(7*24*60*60*1000.0));
@@ -25,19 +38,19 @@
seconds = Math.floor(delta/(1000.0));
var res;
if (years)
- res = years + ' ' +$.i18n._('year(s) ago')
+ res = $.i18n._('%s year(s) ago', [years])
else if (months)
- res = months + ' ' +$.i18n._('month(s) ago')
+ res = $.i18n._('%s month(s) ago', [months])
else if (weeks)
- res = weeks + ' ' +$.i18n._('weeks(s) ago')
+ res = $.i18n._('%s week(s) ago', [weeks])
else if (days)
- res = days + ' ' +$.i18n._('days(s) ago')
+ res = $.i18n._('%s day(s) ago', [days])
else if (hours)
- res = hours + ' ' +$.i18n._('hours(s) ago')
+ res = $.i18n._('%s hour(s) ago', [hours])
else if (minutes)
- res = minutes + ' ' +$.i18n._('minutes(s) ago')
+ res = $.i18n._('%s minute(s) ago', [minutes])
else
- res = seconds + ' ' +$.i18n._('second(s) ago')
+ res = $.i18n._('%s second(s) ago', [seconds])
el.text(res);
el.attr('processed', 'true')
}
@@ -52,43 +65,4 @@
setFormatter(el);
}
}
-});
-
-/*
-d1 = datetime.now(utc)
-d2 = value.astimezone(utc)
-
-delta = d1 - d2
-
-years, months, weeks, hours, minutes = (
- delta.days/365, delta.days/30, delta.days/7,
- delta.seconds/3600, delta.seconds/60)
-
-if years > 0:
- return translate(
- u'${value} year(s) ago', 'z3ext.formatter',
- mapping={'value': years})
-
-if months > 0:
- return translate(u'${value} month(s) ago', 'z3ext.formatter',
- mapping={'value': months})
-
-if weeks > 0:
- return translate(u'${value} week(s) ago', 'z3ext.formatter',
- mapping={'value': weeks})
-
-if delta.days > 0:
- return translate(u'${value} day(s) ago', 'z3ext.formatter',
- mapping={'value': delta.days})
-
-if hours > 0:
- return translate(u'${value} hour(s) ago', 'z3ext.formatter',
- mapping={'value': hours})
-
-if minutes > 0:
- return translate(u'${value} minute(s) ago', 'z3ext.formatter',
- mapping={'value': minutes})
-
-return translate(u'${value} second(s) ago', 'z3ext.formatter',
- mapping={'value': delta.seconds})
-*/
\ No newline at end of file
+});
\ No newline at end of file
Modified: z3ext.formatter/trunk/src/z3ext/formatter/tests.py
===================================================================
--- z3ext.formatter/trunk/src/z3ext/formatter/tests.py 2009-09-30 14:10:55 UTC (rev 104651)
+++ z3ext.formatter/trunk/src/z3ext/formatter/tests.py 2009-09-30 14:38:04 UTC (rev 104652)
@@ -30,7 +30,7 @@
from z3ext.controlpanel.testing import setUpControlPanel
from z3ext.formatter import \
- dformatter, dtformatter, fancydatetime, timeformatter
+ dformatter, dtformatter, fancydatetime, timeformatter, humandatetime
from z3ext.formatter.expression import FormatterExpression
@@ -54,6 +54,8 @@
provideAdapter(dtformatter.DatetimeFormatterFactory, name='dateTime')
provideAdapter(
fancydatetime.FancyDatetimeFormatterFactory, name='fancyDatetime')
+ provideAdapter(
+ humandatetime.HumanDatetimeFormatterFactory, name='humanDatetime')
provideAdapter(timeformatter.TimeFormatterFactory, name='time')
More information about the checkins
mailing list