~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/util.py

  • Committer: Michael Hudson
  • Date: 2008-02-27 03:36:09 UTC
  • mto: This revision was merged to the branch mainline in revision 146.
  • Revision ID: michael.hudson@canonical.com-20080227033609-6xz80buvasyekl6a
run reindent.py over the loggerhead package

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
18
#
19
19
 
20
 
try:
21
 
    from xml.etree import ElementTree as ET
22
 
except ImportError:
23
 
    from elementtree import ElementTree as ET
24
 
 
25
20
import base64
26
21
import cgi
27
22
import datetime
37
32
 
38
33
log = logging.getLogger("loggerhead.controllers")
39
34
 
 
35
 
 
36
def timespan(delta):
 
37
    if delta.days > 730:
 
38
        # good grief!
 
39
        return '%d years' % (int(delta.days // 365.25),)
 
40
    if delta.days >= 3:
 
41
        return '%d days' % delta.days
 
42
    seg = []
 
43
    if delta.days > 0:
 
44
        if delta.days == 1:
 
45
            seg.append('1 day')
 
46
        else:
 
47
            seg.append('%d days' % delta.days)
 
48
    hrs = delta.seconds // 3600
 
49
    mins = (delta.seconds % 3600) // 60
 
50
    if hrs > 0:
 
51
        if hrs == 1:
 
52
            seg.append('1 hour')
 
53
        else:
 
54
            seg.append('%d hours' % hrs)
 
55
    if delta.days == 0:
 
56
        if mins > 0:
 
57
            if mins == 1:
 
58
                seg.append('1 minute')
 
59
            else:
 
60
                seg.append('%d minutes' % mins)
 
61
        elif hrs == 0:
 
62
            seg.append('less than a minute')
 
63
    return ', '.join(seg)
 
64
 
 
65
 
 
66
def ago(timestamp):
 
67
    now = datetime.datetime.now()
 
68
    return timespan(now - timestamp) + ' ago'
 
69
 
 
70
 
40
71
def fix_year(year):
41
72
    if year < 70:
42
73
        year += 2000
44
75
        year += 1900
45
76
    return year
46
77
 
47
 
# Display of times.
48
 
 
49
 
# date_day -- just the day
50
 
# date_time -- full date with time
51
 
#
52
 
# displaydate -- for use in sentences
53
 
# approximatedate -- for use in tables
54
 
#
55
 
# displaydate and approximatedate return an elementtree <span> Element
56
 
# with the full date in a tooltip.
57
 
 
58
 
def date_day(value):
59
 
    return value.strftime('%Y-%m-%d')
60
 
 
61
 
 
62
 
def date_time(value):
63
 
    return value.strftime('%Y-%m-%d %T')
64
 
 
65
 
 
66
 
def _displaydate(date):
67
 
    delta = abs(datetime.datetime.now() - date)
68
 
    if delta > datetime.timedelta(1, 0, 0):
69
 
        # far in the past or future, display the date
70
 
        return 'on ' + date_day(date)
71
 
    return _approximatedate(date)
72
 
 
73
 
 
74
 
def _approximatedate(date):
 
78
 
 
79
_g_format = '%Y-%m-%d @ %H:%M'
 
80
 
 
81
def format_date(date):
 
82
    if _g_format == 'fancy':
 
83
        return fancy_format_date(date)
 
84
    return date.strftime(_g_format)
 
85
 
 
86
def fancy_format_date(date):
75
87
    delta = datetime.datetime.now() - date
76
 
    if abs(delta) > datetime.timedelta(1, 0, 0):
77
 
        # far in the past or future, display the date
78
 
        return date_day(date)
79
 
    future = delta < datetime.timedelta(0, 0, 0)
80
 
    delta = abs(delta)
81
 
    days = delta.days
82
 
    hours = delta.seconds / 3600
83
 
    minutes = (delta.seconds - (3600*hours)) / 60
84
 
    seconds = delta.seconds % 60
85
 
    result = ''
86
 
    if future:
87
 
        result += 'in '
88
 
    if days != 0:
89
 
        amount = days
90
 
        unit = 'day'
91
 
    elif hours != 0:
92
 
        amount = hours
93
 
        unit = 'hour'
94
 
    elif minutes != 0:
95
 
        amount = minutes
96
 
        unit = 'minute'
 
88
    if delta.days > 300:
 
89
        return date.strftime('%d %b %Y')
97
90
    else:
98
 
        amount = seconds
99
 
        unit = 'second'
100
 
    if amount != 1:
101
 
        unit += 's'
102
 
    result += '%s %s' % (amount, unit)
103
 
    if not future:
104
 
        result += ' ago'
105
 
        return result
106
 
 
107
 
 
108
 
def _wrap_with_date_time_title(date, formatted_date):
109
 
    elem = ET.Element("span")
110
 
    elem.text = formatted_date
111
 
    elem.set("title", date_time(date))
112
 
    return elem
113
 
 
114
 
 
115
 
def approximatedate(date):
116
 
    #FIXME: Returns an object instead of a string
117
 
    return _wrap_with_date_time_title(date, _approximatedate(date))
118
 
 
119
 
 
120
 
def displaydate(date):
121
 
    return _wrap_with_date_time_title(date, _displaydate(date))
 
91
        return date.strftime('%d %b %H:%M')
 
92
 
 
93
def set_date_format(format):
 
94
    global _g_format
 
95
    _g_format = format
122
96
 
123
97
 
124
98
class Container (object):
356
330
 
357
331
    navigation.prev_page_revid = get_offset(-1 * navigation.pagesize)
358
332
    navigation.next_page_revid = get_offset(1 * navigation.pagesize)
359
 
    prev_page_revno = navigation.branch.history.get_revno(
360
 
            navigation.prev_page_revid)
361
 
    next_page_revno = navigation.branch.history.get_revno(
362
 
            navigation.next_page_revid)
363
 
    start_revno = navigation.branch._history.get_revno(navigation.start_revid)
364
333
 
365
 
    params = { 'filter_file_id': navigation.filter_file_id }
 
334
    params = { 'file_id': navigation.file_id }
366
335
    if getattr(navigation, 'query', None) is not None:
367
336
        params['q'] = navigation.query
368
 
 
369
 
    if getattr(navigation, 'start_revid', None) is not None:
370
 
        params['start_revid'] = start_revno
 
337
    else:
 
338
        params['start_revid'] = navigation.start_revid
371
339
 
372
340
    if navigation.prev_page_revid:
373
 
        navigation.prev_page_url = navigation.branch.context_url(
374
 
            [navigation.scan_url, prev_page_revno], **params)
 
341
        navigation.prev_page_url = navigation.branch.url([ navigation.scan_url, navigation.prev_page_revid ], **get_context(**params))
375
342
    if navigation.next_page_revid:
376
 
        navigation.next_page_url = navigation.branch.context_url(
377
 
            [navigation.scan_url, next_page_revno], **params)
 
343
        navigation.next_page_url = navigation.branch.url([ navigation.scan_url, navigation.next_page_revid ], **get_context(**params))
378
344
 
379
345
 
380
346
def log_exception(log):
453
419
#         current location along the navigation path (while browsing)
454
420
#     - starting revid (start_revid)
455
421
#         the current beginning of navigation (navigation continues back to
456
 
#         the original revision) -- this defines an 'alternate mainline'
457
 
#         when the user navigates into a branch.
 
422
#         the original revision) -- this may not be along the primary revision
 
423
#         path since the user may have navigated into a branch
458
424
#     - file_id
459
 
#         the file being looked at
460
 
#     - filter_file_id
461
425
#         if navigating the revisions that touched a file
462
426
#     - q (query)
463
427
#         if navigating the revisions that matched a search query
474
438
#         for re-ordering an existing page by different sort
475
439
 
476
440
t_context = threading.local()
477
 
_valid = ('start_revid', 'file_id', 'filter_file_id', 'q', 'remember',
478
 
          'compare_revid', 'sort')
 
441
_valid = ('start_revid', 'file_id', 'q', 'remember', 'compare_revid', 'sort')
479
442
 
480
443
 
481
444
def set_context(map):
484
447
 
485
448
def get_context(**overrides):
486
449
    """
487
 
    Soon to be deprecated.
488
 
 
489
 
 
490
450
    return a context map that may be overriden by specific values passed in,
491
451
    but only contains keys from the list of valid context keys.
492
452