22
22
from datetime import (
28
from pyramid.view import view_config
29
27
from pyramid.httpexceptions import HTTPBadRequest
31
29
from nfss import database
32
30
from nfss.auth import oauth_protected
35
UTC = timezone(timedelta(0))
38
33
def configure_routes(config):
39
34
"""Add url routes to 'config' object."""
40
35
config.add_route('v1.root', '/')
42
37
config.add_route('v1.test', '/{project}/{test}')
45
@view_config(route_name='v1.root', renderer='json', request_method='GET')
40
def configure_views(config):
41
"""Add views to 'config' object."""
42
config.add_view(root, route_name='v1.root', renderer='json',
44
config.add_view(project, route_name='v1.project', renderer='json',
46
config.add_view(test, route_name='v1.test', renderer='json',
48
config.add_view(test_add, route_name='v1.test', renderer='json',
49
request_method='POST')
47
53
"""Return summary data about the projects and tests."""
48
54
data = database.get_details_for_all_projects(request.database())
74
79
return dict(project_name=project_name, tests=project_data)
77
@view_config(route_name='v1.test', renderer='json', request_method='GET')
79
83
"""Return data points for this particular test.
108
112
def try_parse_date(date_param):
109
113
if date_param is not None:
111
return datetime.fromtimestamp(float(date_param), UTC)
115
return datetime.fromtimestamp(float(date_param), timezone.utc)
117
@view_config(route_name='v1.test', renderer='json', request_method='POST')
121
def get_timestamp_from_request_params(parameters):
122
timestamp = parameters.get('timestamp', None)
125
return datetime.fromtimestamp(timestamp, timezone.utc)
127
raise HTTPBadRequest(
128
'Invalid time zone format; '
129
'Should be epoch seconds in UTC, microseconds optional')
130
return datetime.now(timezone.utc)
133
def raise_if_timestamp_invalid(timestamp):
134
time_delta = (timestamp - datetime.now(tz=timezone.utc))
135
if time_delta.days > 0 or (time_delta.days == 0 and
136
time_delta.seconds > 1800):
137
raise HTTPBadRequest(
138
'Timestamp %s is more than 30 minutes in the future; '
139
'Please check your system clock' % timestamp)
140
if timestamp.year < 2004:
141
raise HTTPBadRequest(
142
'Timestamp %s is older than 2004; '
143
'Please make sure this is a valid Ubuntu benchmark' % timestamp)
118
146
@oauth_protected()
119
147
def test_add(request, oauth_request):
120
148
"""Add data points to this test.
130
158
except KeyError as e:
131
159
raise HTTPBadRequest("Missing data in POST request: %s" % e)
161
timestamp = get_timestamp_from_request_params(request.params)
162
raise_if_timestamp_invalid(timestamp)
133
163
created_id = database.insert_test_data(
134
164
request.database(),
138
oauth_request.client_key
168
oauth_request.client_key,
140
171
return dict(created_id=created_id)