import os import wsgiref.handlers from google.appengine.ext import webapp from google.appengine.ext import db from google.appengine.ext.webapp import template from geohash import Geostring, Geohash from django.utils import simplejson from model import Tag def clean(tag): if tag.startswith("#"): tag = tag[1:] return tag class MainHandler(webapp.RequestHandler): def get(self): self.show() def show(self, data={}): template_path = os.path.join(os.path.dirname(__file__), 'index.html') self.response.headers['Content-Type'] = 'text/html' self.response.out.write(template.render(template_path, data)) def post(self): name = clean(self.request.get("name")) results = Tag.all().filter("name =", name).fetch(1) lon = float(self.request.get("longitude")) lat = float(self.request.get("latitude")) geostring = str(Geohash((lon, lat))) if results: tag = results[0] tag.name = name tag.geostring = geostring msg = "Location for %s updated." % name else: tag = Tag(name = name, geostring = geostring) msg = "Location for %s added." % name tag.put() self.show({"msg":msg}) class JSONHandler(webapp.RequestHandler): def get(self): name = clean(self.request.get("tag")) results = Tag.all().filter("name =", name).fetch(1) data = None for result in results: point = Geohash(result.geostring).point() data = {"name": result.name, "longitude": point[0], "latitude": point[1] } data = simplejson.dumps(data) if self.request.get("callback"): data = "%s(%s)" % (self.request.get("callback"), data) self.response.out.write(data) class BoundsHandler(webapp.RequestHandler): def get(self): rget = self.request.get southwest = str(Geohash((float(rget("swlon")), float(rget("swlat"))))) northeast = str(Geohash((float(rget("nelon")), float(rget("nelat"))))) results = db.GqlQuery("select * from Tag where geostring > :2 and geostring < :1", northeast, southwest) data = [] for result in results: point = Geohash(result.geostring).point() data.append({"name":result.name,"longitude":point[0],"latitude":point[1]}) data = simplejson.dumps(data) if self.request.get("callback"): data = "%s(%s)" % (self.request.get("callback"), data) self.response.out.write(data) if __name__ == '__main__': application = webapp.WSGIApplication([ ('/', MainHandler), ('/tag.json', JSONHandler), ('/bounds.json', BoundsHandler) ], debug=True) wsgiref.handlers.CGIHandler().run(application)