Show More
@@ -24,6 +24,8 b'' | |||||
24 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
24 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
25 |
|
25 | |||
26 | import re |
|
26 | import re | |
|
27 | from datetime import datetime | |||
|
28 | from pylons.i18n.translation import _, ungettext | |||
27 | from rhodecode.lib.vcs.utils.lazy import LazyProperty |
|
29 | from rhodecode.lib.vcs.utils.lazy import LazyProperty | |
28 |
|
30 | |||
29 |
|
31 | |||
@@ -284,40 +286,76 b' def engine_from_config(configuration, pr' | |||||
284 | return engine |
|
286 | return engine | |
285 |
|
287 | |||
286 |
|
288 | |||
287 |
def age( |
|
289 | def age(prevdate): | |
288 | """ |
|
290 | """ | |
289 | turns a datetime into an age string. |
|
291 | turns a datetime into an age string. | |
290 |
|
292 | |||
291 |
:param |
|
293 | :param prevdate: datetime object | |
292 | :rtype: unicode |
|
294 | :rtype: unicode | |
293 | :returns: unicode words describing age |
|
295 | :returns: unicode words describing age | |
294 | """ |
|
296 | """ | |
295 |
|
297 | |||
296 | from datetime import datetime |
|
298 | order = ['year', 'month', 'day', 'hour', 'minute', 'second'] | |
297 | from webhelpers.date import time_ago_in_words |
|
299 | deltas = {} | |
|
300 | ||||
|
301 | # Get date parts deltas | |||
|
302 | now = datetime.now() | |||
|
303 | for part in order: | |||
|
304 | deltas[part] = getattr(now, part) - getattr(prevdate, part) | |||
298 |
|
305 | |||
299 | _ = lambda s: s |
|
306 | # Fix negative offsets (there is 1 second between 10:59:59 and 11:00:00, | |
|
307 | # not 1 hour, -59 minutes and -59 seconds) | |||
300 |
|
308 | |||
301 | if not curdate: |
|
309 | for num, length in [(5, 60), (4, 60), (3, 24)]: # seconds, minutes, hours | |
302 | return '' |
|
310 | part = order[num] | |
|
311 | carry_part = order[num - 1] | |||
|
312 | ||||
|
313 | if deltas[part] < 0: | |||
|
314 | deltas[part] += length | |||
|
315 | deltas[carry_part] -= 1 | |||
303 |
|
316 | |||
304 | agescales = [(_(u"year"), 3600 * 24 * 365), |
|
317 | # Same thing for days except that the increment depends on the (variable) | |
305 | (_(u"month"), 3600 * 24 * 30), |
|
318 | # number of days in the month | |
306 | (_(u"day"), 3600 * 24), |
|
319 | month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] | |
307 | (_(u"hour"), 3600), |
|
320 | if deltas['day'] < 0: | |
308 | (_(u"minute"), 60), |
|
321 | if prevdate.month == 2 and (prevdate.year % 4 == 0 and | |
309 | (_(u"second"), 1), ] |
|
322 | (prevdate.year % 100 != 0 or prevdate.year % 400 == 0)): | |
310 |
|
323 | deltas['day'] += 29 | ||
311 | age = datetime.now() - curdate |
|
324 | else: | |
312 | age_seconds = (age.days * agescales[2][1]) + age.seconds |
|
325 | deltas['day'] += month_lengths[prevdate.month - 1] | |
313 |
|
|
326 | ||
314 | for scale in agescales: |
|
327 | deltas['month'] -= 1 | |
315 | if scale[1] <= age_seconds: |
|
328 | ||
316 | if pos == 6: |
|
329 | if deltas['month'] < 0: | |
317 | pos = 5 |
|
330 | deltas['month'] += 12 | |
318 | return '%s %s' % (time_ago_in_words(curdate, |
|
331 | deltas['year'] -= 1 | |
319 | agescales[pos][0]), _('ago')) |
|
332 | ||
320 | pos += 1 |
|
333 | # Format the result | |
|
334 | fmt_funcs = { | |||
|
335 | 'year': lambda d: ungettext(u'%d year', '%d years', d) % d, | |||
|
336 | 'month': lambda d: ungettext(u'%d month', '%d months', d) % d, | |||
|
337 | 'day': lambda d: ungettext(u'%d day', '%d days', d) % d, | |||
|
338 | 'hour': lambda d: ungettext(u'%d hour', '%d hours', d) % d, | |||
|
339 | 'minute': lambda d: ungettext(u'%d minute', '%d minutes', d) % d, | |||
|
340 | 'second': lambda d: ungettext(u'%d second', '%d seconds', d) % d, | |||
|
341 | } | |||
|
342 | ||||
|
343 | for i, part in enumerate(order): | |||
|
344 | value = deltas[part] | |||
|
345 | if value == 0: | |||
|
346 | continue | |||
|
347 | ||||
|
348 | if i < 5: | |||
|
349 | sub_part = order[i + 1] | |||
|
350 | sub_value = deltas[sub_part] | |||
|
351 | else: | |||
|
352 | sub_value = 0 | |||
|
353 | ||||
|
354 | if sub_value == 0: | |||
|
355 | return _(u'%s ago') % fmt_funcs[part](value) | |||
|
356 | ||||
|
357 | return _(u'%s and %s ago') % (fmt_funcs[part](value), | |||
|
358 | fmt_funcs[sub_part](sub_value)) | |||
321 |
|
359 | |||
322 | return _(u'just now') |
|
360 | return _(u'just now') | |
323 |
|
361 |
General Comments 0
You need to be logged in to leave comments.
Login now