~rnr-developers/rnr-server/trunk

« back to all changes in this revision

Viewing changes to src/reviewsapp/api/handlers.py

[r=ricardokirkner] Use Django 1.3-style timestamp formatting in json results.

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
    'ShowUsefulnessHandler',
32
32
    'DeleteReviewHandler',
33
33
]
 
34
import json
34
35
import pytz
35
36
import urllib
36
37
 
37
 
from datetime import datetime, timedelta
 
38
from datetime import (
 
39
    date,
 
40
    datetime,
 
41
    time,
 
42
    timedelta,
 
43
)
38
44
 
39
45
from django.conf import settings
 
46
from django.core.serializers.json import DjangoJSONEncoder
40
47
from django.http import (
41
48
    HttpResponse,
42
49
    HttpResponseBadRequest,
44
51
    HttpResponseForbidden,
45
52
)
46
53
from django.shortcuts import get_object_or_404
 
54
from django.utils import datetime_safe
 
55
from piston.emitters import (
 
56
    Emitter,
 
57
    JSONEmitter,
 
58
)
47
59
from piston.handler import BaseHandler
 
60
from piston.utils import Mimer
48
61
 
49
62
from reviewsapp.forms import ReviewForm, ReviewEditForm
50
63
from reviewsapp.models import (
65
78
HttpResponseForbidden._is_string = True
66
79
 
67
80
 
 
81
class Django13JSONEncoder(DjangoJSONEncoder):
 
82
    """
 
83
    JSONEncoder subclass that knows how to encode date/time types in a
 
84
    Django 1.3 compatible way.
 
85
    """
 
86
 
 
87
    DATE_FORMAT = "%Y-%m-%d"
 
88
    TIME_FORMAT = "%H:%M:%S"
 
89
 
 
90
    def default(self, o):
 
91
        if isinstance(o, datetime):
 
92
            d = datetime_safe.new_datetime(o)
 
93
            return d.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT))
 
94
        elif isinstance(o, date):
 
95
            d = datetime_safe.new_date(o)
 
96
            return d.strftime(self.DATE_FORMAT)
 
97
        elif isinstance(o, time):
 
98
            return o.strftime(self.TIME_FORMAT)
 
99
        else:
 
100
            return super(Django13JSONEncoder, self).default(o)
 
101
 
 
102
 
 
103
class Django13JSONEmitter(JSONEmitter):
 
104
    """JSON emitter, using non-iso format for datetimes.
 
105
 
 
106
    This emitter is compatible with django 1.3 style of serializing
 
107
    datetime objects in JSON.
 
108
    """
 
109
    def render(self, request):
 
110
        cb = request.GET.get('callback', None)
 
111
        seria = json.dumps(self.construct(),
 
112
                           cls=Django13JSONEncoder,
 
113
                           ensure_ascii=False, indent=4)
 
114
 
 
115
        # Callback
 
116
        if cb and is_valid_jsonp_callback_value(cb):
 
117
            return '%s(%s)' % (cb, seria)
 
118
 
 
119
        return seria
 
120
 
 
121
 
 
122
Emitter.register('json', Django13JSONEmitter,
 
123
                 'application/json; charset=utf-8')
 
124
Mimer.register(json.loads, ('application/json',))
 
125
 
 
126
 
68
127
class ServerStatusHandler(BaseHandler):
69
128
    allowed_methods = ('GET', 'OPTIONS',)
70
129