blob: 005753c350a0c9312b26a4d40817da46ce987194 [file] [log] [blame]
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Downloads a single time series as CSV."""
import csv
import logging
import StringIO
from dashboard import request_handler
from dashboard import utils
from dashboard.models import graph_data
class GraphCsvHandler(request_handler.RequestHandler):
"""Get data from data store and outputs it in CSV format."""
def get(self):
"""Gets CSV from data store and outputs it.
Request parameters:
test_path: Full test path of one trace.
rev: End revision number; if not given, latest revision is used.
num_points: Number of Rows to get data for.
attr: Comma-separated list of attributes (columns) to return.
Outputs:
CSV file contents.
"""
test_path = self.request.get('test_path')
rev = self.request.get('rev')
num_points = int(self.request.get('num_points', 500))
attributes = self.request.get('attr', 'revision,value').split(',')
if not test_path:
self.ReportError('No test path given.', status=400)
return
logging.info('Got request to /graph_csv for test: "%s".', test_path)
test_key = utils.TestKey(test_path)
q = graph_data.Row.query()
q = q.filter(graph_data.Row.parent_test == test_key)
if rev:
q = q.filter(graph_data.Row.revision <= int(rev))
q = q.order(-graph_data.Row.revision)
points = reversed(q.fetch(limit=num_points))
rows = self._GenerateRows(points, attributes)
output = StringIO.StringIO()
csv.writer(output).writerows(rows)
self.response.headers['Content-Type'] = 'text/csv'
self.response.headers['Content-Disposition'] = (
'attachment; filename=%s.csv' % test_key.string_id())
self.response.out.write(output.getvalue())
def post(self):
"""A post request is the same as a get request for this endpoint."""
self.get()
def _GenerateRows(self, points, attributes):
"""Generate all the rows based on the attributes given.
Args:
points: A list of Row entities.
attributes: A list of properties of Row entities to get.
Returns:
A list of lists of attribute values for the given points.
"""
rows = [attributes]
for point in points:
row = []
for attr in attributes:
row.append(getattr(point, attr, ''))
rows.append(row)
return rows