# Copyright 2009 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import logging import os import datetime from django.utils import simplejson from google.appengine.ext import webapp from google.appengine.ext.webapp import template from google.appengine.ext.webapp.util import run_wsgi_app from google.appengine.ext import db from google.appengine.api import quota import settings import api import quartermile class ProxiedHandler(webapp.RequestHandler): def _encode(self, obj): """ Method used by simplejson to encode model types to JSON. """ if hasattr(obj, "json") and callable(getattr(obj, "json")): return obj.json() elif isinstance(obj, datetime.datetime): return obj.strftime("%a, %d %b %Y %H:%M:%S %Z%z") elif isinstance(obj, datetime.date): return obj.strftime("%d %b %Y") raise TypeError(repr(obj) + " is not JSON serializable") def post(self, label): postdata = simplejson.loads(self.request.body) data = {} for entry in postdata: data[entry['id']] = entry['data'] qm_viewer = api.get_viewer(self.request) if data.has_key('viewer') and data['viewer'].has_key('displayName'): quartermile.account_update_name(qm_viewer, data['viewer']['displayName']) qm_team = qm_viewer.account.team qm_team_activity = None qm_team_data = None qm_team_suggest = None if qm_team: qm_team_id = qm_team.team_id qm_team_activity = quartermile.activity_get_by_team(qm_team_id) qm_team_data = quartermile.data_get_by_team(qm_team_id) else: qm_team_suggest = quartermile.team_get_interesting() encoder = simplejson.JSONEncoder() encoder.default = self._encode data['quartermile'] = { 'viewer' : qm_viewer, 'team' : qm_team, 'team_activities' : qm_team_activity['activities'][:10], 'team_data' : encoder.encode(qm_team_data), 'team_suggest' : qm_team_suggest, } data['urls'] = { 'host' : self.request.host_url, } self.render(label + ".html", data) logging.info("Proxied render cost %s CPU megacycles" % quota.get_request_cpu_usage()) def render(self, template, data): self.response.headers.add_header('Content-Type', 'text/html;charset=UTF-8') cwd = os.path.dirname(__file__) path = os.path.join(cwd, "templates", "pages", template) self.response.out.write(webapp.template.render(path, data)) if __name__ == '__main__': handlers = [ ('/(proxied).*', ProxiedHandler), ('/(optimal).*', ProxiedHandler), ] run_wsgi_app(webapp.WSGIApplication(handlers, debug=settings.DEBUG))