Home | History | Annotate | Download | only in visualizer
      1 # Copyright 2013 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 # This file is expected to be used under another directory to use,
      6 # so we disable checking import path of GAE tools from this directory.
      7 # pylint: disable=F0401,E0611,W0232
      8 
      9 import jinja2
     10 import json
     11 import os
     12 import re
     13 import urllib
     14 import webapp2
     15 
     16 from google.appengine.ext import blobstore
     17 from google.appengine.ext.webapp import blobstore_handlers
     18 
     19 import services
     20 
     21 
     22 JINJA_ENVIRONMENT = jinja2.Environment(
     23   loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
     24   extensions=['jinja2.ext.autoescape'])
     25 
     26 
     27 class MainPage(webapp2.RequestHandler):
     28   """Show breakdown with received profiler-id and template-id. If nothing was
     29   received, show blank page waiting user to upload file."""
     30   def get(self):
     31     page_template = JINJA_ENVIRONMENT.get_template('index.html')
     32     upload_url = blobstore.create_upload_url('/upload')
     33 
     34     # Get profiler id and template id from url query.
     35     run_id = self.request.get('run_id')
     36     tmpl_id = self.request.get('tmpl_id')
     37     upload_msg = self.request.get('upload_msg')
     38 
     39     template_values = {
     40       'upload_url': upload_url,
     41       'upload_msg': upload_msg
     42     }
     43 
     44     if run_id and tmpl_id:
     45       template_values['json'] = services.GetProfiler(run_id)
     46       template_values['template'] = services.GetTemplate(tmpl_id)
     47 
     48     self.response.write(page_template.render(template_values))
     49 
     50 
     51 class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
     52   """Handle file uploading with BlobstoreUploadHandler. BlobstoreUploadHandler
     53   can deal with files overweighing size limitation within one HTTP connection so
     54   that user can upload large json file."""
     55   def post(self):
     56     blob_info = self.get_uploads('file')[0]
     57 
     58     run_id = services.CreateProfiler(blob_info)
     59     default_key = services.CreateTemplates(blob_info)
     60 
     61     # TODO(junjianx): Validation of uploaded file should be done separately.
     62     if not default_key:
     63       # Jump to home page with error message.
     64       req_params = {
     65         'upload_msg': 'No default_template key was found.'
     66       }
     67     else:
     68       # Jump to new graph page using default template.
     69       req_params = {
     70         'run_id': run_id,
     71         'tmpl_id': default_key.urlsafe()
     72       }
     73 
     74     self.redirect('/?' + urllib.urlencode(req_params))
     75 
     76 
     77 class ShareHandler(webapp2.RequestHandler):
     78   """Handle breakdown template sharing. Generate public url for transferred
     79   template and return it back."""
     80   def post(self):
     81     run_id = self.request.POST['run_id']
     82     content = json.loads(self.request.POST['content'])
     83     tmpl_key = services.CreateTemplate(content)
     84 
     85     req_params = {
     86       'run_id': run_id,
     87       'tmpl_id': tmpl_key.urlsafe()
     88     }
     89 
     90     # Take out host url from request by removing share suffix.
     91     url = re.sub('share', '', self.request.url)
     92     self.response.write(url + '?' + urllib.urlencode(req_params))
     93 
     94 
     95 application = webapp2.WSGIApplication([
     96   ('/', MainPage),
     97   ('/upload', UploadHandler),
     98   ('/share', ShareHandler)
     99 ], debug=True)
    100