Move more logic from handler classes to model classes and add unit tests
[WebKit-https.git] / Websites / webkit-perf.appspot.com / report_process_handler.py
1 #!/usr/bin/env python
2 # Copyright (C) 2012 Google Inc. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
6 # met:
7 #
8 #     * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 #     * Redistributions in binary form must reproduce the above
11 # copyright notice, this list of conditions and the following disclaimer
12 # in the documentation and/or other materials provided with the
13 # distribution.
14 #     * Neither the name of Google Inc. nor the names of its
15 # contributors may be used to endorse or promote products derived from
16 # this software without specific prior written permission.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 import webapp2
31 from google.appengine.ext import db
32
33 import time
34
35 from controller import schedule_runs_update
36 from controller import schedule_dashboard_update
37 from controller import schedule_manifest_update
38 from models import Build
39 from models import ReportLog
40 from models import Test
41 from models import TestResult
42
43
44 class ReportProcessHandler(webapp2.RequestHandler):
45     def post(self):
46         self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'
47
48         log_id = int(self.request.get('id', 0))
49
50         log = ReportLog.get_by_id(log_id)
51         if not log or not log.commit:
52             self.response.out.write("Not processed")
53             return
54
55         branch = log.branch()
56         platform = log.platform()
57         build = Build.get_or_insert_from_log(log)
58
59         for test_name, result in log.results().iteritems():
60             test = Test.update_or_insert(test_name, branch, platform)
61             TestResult.get_or_insert_from_parsed_json(test_name, build, result)
62             schedule_runs_update(test.id, branch.id, platform.id)
63
64         log = ReportLog.get(log.key())
65         log.delete()
66
67         # We need to update dashboard and manifest because they are affected by the existance of test results
68         schedule_dashboard_update()
69         schedule_manifest_update()
70
71         self.response.out.write('OK')