From 8c3230ad434c4e0894e8f36e05d63702d11ebe84 Mon Sep 17 00:00:00 2001 From: James Turk Date: Thu, 22 Oct 2009 14:50:01 -0400 Subject: [PATCH] initial working version --- layar/__init__.py | 0 layar/models.py | 3 ++ layar/views.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 layar/__init__.py create mode 100644 layar/models.py create mode 100644 layar/views.py diff --git a/layar/__init__.py b/layar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/layar/models.py b/layar/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/layar/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/layar/views.py b/layar/views.py new file mode 100644 index 0000000..890283a --- /dev/null +++ b/layar/views.py @@ -0,0 +1,101 @@ +from hashlib import sha1 +from django.conf import settings +from django.http import HttpResponse +from django.utils import simplejson as json + +class LayarException(Exception): + def __init__(self, code, message): + self.code = code + self.message = message + +class POI(object): + + def __init__(self, id, lat, lon, title, actions=None, image_url=None, + line2=None, line3=None, line4=None, type=0, attribution=None): + self.id = str(id) + self.lat = lat + self.lon = lon + self.title = title # recommended max len 60 + self.imageURL = image_url + self.line2 = line2 # recommended max len 35 + self.line3 = line3 + self.line4 = line4 + self.type = type + self.attribution = attribution # recommended max len 45 + self.actions = actions + + def to_dict(self): + d = dict(self.__dict__) + + # do lat/long conversion + if isinstance(self.lat, float): + d['lat'] = int(self.lat*1000000) + if isinstance(self.lon, float): + d['lon'] = int(self.lon*1000000) + + # convert actions dictionary into expected format + if self.actions: + d['actions'] = [{'label':k, 'uri':v} for k,v in self.actions.iteritems()] + else: + d['actions'] = [] + + return d + +class LayarView(object): + + results_per_page = 15 + max_results = 50 + + def __init__(self): + self.developer_key = settings.LAYAR_DEVELOPER_KEY + + def __call__(self, request): + user_id = request.GET['userId'] + developer_id = request.GET['developerId'] + developer_hash = request.GET['developerHash'] + timestamp = request.GET['timestamp'] + layer_name = request.GET['layerName'] + latitude = request.GET['lat'] + longitude = request.GET['lon'] + accuracy = request.GET['accuracy'] + radius = request.GET['radius'] + radio_option = request.GET.get('RADIOLIST') + search_query = request.GET.get('SEARCHBOX') + custom_slider = request.GET.get('CUSTOM_SLIDER') + page_key = request.GET.get('pageKey') + + # oauth: oauth_consumer_key, oauth_signature_method, oauth_timestamp, + # oauth_nonce, oauth_version, oauth_signature + + layar_response = dict(hotspots=[], layer=layer_name, errorCode=0, + errorString='ok', nextPageKey=None, morePages=False) + + try: + + # verify hash + key = self.developer_key + timestamp + if sha1(key).hexdigest() != developer_hash: + raise LayarException(20, 'Bad developerHash') + + try: + poi_func = getattr(self, 'get_%s_pois' % layer_name) + except AttributeError: + raise LayarException(21, 'no such layer: %s' % layer_name) + + pois = poi_func(latitude=latitude, longitude=longitude, radius=radius, + start_index=0, + radio_option=radio_option, search_query=search_query, + custom_slider=custom_slider) + + # pagination logic + if len(pois) > self.max_results: + pois = pois[:self.max_results] + + layar_response['hotspots'] = [poi.to_dict() for poi in pois] + + except LayarException, e: + layar_response['errorCode'] = e.code + layar_response['errorString'] = e.message + + content = json.dumps(layar_response) + return HttpResponse(content, content_type='application/javascript; charset=utf-8')