~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/util.py

  • Committer: Robert Collins
  • Date: 2012-02-02 07:42:24 UTC
  • Revision ID: robertc@robertcollins.net-20120202074224-ujea2ocm1u1ws1en
    - Make tz calculations consistent and use UTC in the UI everywhere we show
      a precise timestamp. (Robert Collins, #594591)

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
# Display of times.
53
53
 
54
54
# date_day -- just the day
55
 
# date_time -- full date with time
 
55
# date_time -- full date with time (UTC)
56
56
#
57
 
# displaydate -- for use in sentences
58
57
# approximatedate -- for use in tables
59
58
#
60
 
# displaydate and approximatedate return an elementtree <span> Element
61
 
# with the full date in a tooltip.
 
59
# approximatedate return an elementtree <span> Element
 
60
# with the full date (UTC) in a tooltip.
62
61
 
63
62
 
64
63
def date_day(value):
67
66
 
68
67
def date_time(value):
69
68
    if value is not None:
70
 
        return value.strftime('%Y-%m-%d %H:%M:%S')
 
69
        # Note: this assumes that the value is UTC in some fashion.
 
70
        return value.strftime('%Y-%m-%d %H:%M:%S UTC')
71
71
    else:
72
72
        return 'N/A'
73
73
 
74
74
 
75
 
def _displaydate(date):
76
 
    delta = abs(datetime.datetime.now() - date)
77
 
    if delta > datetime.timedelta(1, 0, 0):
78
 
        # far in the past or future, display the date
79
 
        return 'on ' + date_day(date)
80
 
    return _approximatedate(date)
81
 
 
82
 
 
83
75
def _approximatedate(date):
84
76
    delta = datetime.datetime.now() - date
85
77
    if abs(delta) > datetime.timedelta(1, 0, 0):
126
118
    return _wrap_with_date_time_title(date, _approximatedate(date))
127
119
 
128
120
 
129
 
def displaydate(date):
130
 
    return _wrap_with_date_time_title(date, _displaydate(date))
131
 
 
132
 
 
133
121
class Container(object):
134
122
    """
135
123
    Convert a dict into an object with attributes.
226
214
def html_escape(s):
227
215
    """Transform dangerous (X)HTML characters into entities.
228
216
 
229
 
    Like cgi.escape, except also escaping " and '. This makes it safe to use
 
217
    Like cgi.escape, except also escaping \" and '. This makes it safe to use
230
218
    in both attribute and element content.
231
219
 
232
220
    If you want to safely fill a format string with escaped values, use
484
472
    for index, dir_name in enumerate(dir_parts):
485
473
        inner_breadcrumbs.append({
486
474
            'dir_name': dir_name,
487
 
            'file_id': inv.path2id('/'.join(dir_parts[:index + 1])),
 
475
            'path': '/'.join(dir_parts[:index + 1]),
488
476
            'suffix': '/' + view,
489
477
        })
490
478
    return inner_breadcrumbs
555
543
#         for re-ordering an existing page by different sort
556
544
 
557
545
t_context = threading.local()
558
 
_valid = ('start_revid', 'file_id', 'filter_file_id', 'q', 'remember',
559
 
          'compare_revid', 'sort')
 
546
_valid = (
 
547
    'start_revid', 'filter_file_id', 'q', 'remember', 'compare_revid', 'sort')
560
548
 
561
549
 
562
550
def set_context(map):
663
651
            else:
664
652
                raise
665
653
    return new_application
 
654
 
 
655
 
 
656
def convert_to_json_ready(obj):
 
657
    if isinstance(obj, Container):
 
658
        d = obj.__dict__.copy()
 
659
        del d['_properties']
 
660
        return d
 
661
    elif isinstance(obj, datetime.datetime):
 
662
        return tuple(obj.utctimetuple())
 
663
    raise TypeError(repr(obj) + " is not JSON serializable")