diff options
author | etienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864> | 2010-04-05 20:58:03 +0000 |
---|---|---|
committer | etienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864> | 2010-04-05 20:58:03 +0000 |
commit | f6892bffd29924e1f0628fafbbfb4f8f1d6d362e (patch) | |
tree | 4a7cfca594354fde14963ee7c86bfb4fbdf962d4 | |
parent | 5f6363cbb2a499ef5009efbe26d9a3b6fc6e16b2 (diff) | |
download | Chimère-f6892bffd29924e1f0628fafbbfb4f8f1d6d362e.tar.bz2 Chimère-f6892bffd29924e1f0628fafbbfb4f8f1d6d362e.zip |
Make available tinyfied urls - #93
git-svn-id: http://www.peacefrogs.net/svn/chimere/trunk@77 9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864
-rw-r--r-- | chimere/main/models.py | 39 | ||||
-rw-r--r-- | chimere/main/views.py | 26 | ||||
-rw-r--r-- | chimere/static/main_map.js | 23 | ||||
-rw-r--r-- | chimere/urls.py | 5 |
4 files changed, 90 insertions, 3 deletions
diff --git a/chimere/main/models.py b/chimere/main/models.py index 4197a23..5c4151c 100644 --- a/chimere/main/models.py +++ b/chimere/main/models.py @@ -43,6 +43,45 @@ class News(models.Model): class Meta: verbose_name = _("News") +class TinyUrl(models.Model): + """Tinyfied version of permalink parameters + """ + parameters = models.CharField(_("Parameters"), max_length=500) + def __unicode__(self): + return self.parameters + class Meta: + verbose_name = _("TinyUrl") + digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + base = len(digits) + + @classmethod + def getParametersByUrn(cls, urn): + c_id = 0 + for idx, char in enumerate(urn): + c_id += cls.digits.index(char)*pow(cls.base, idx) + try: + params = cls.objects.get(id=c_id).parameters + except cls.DoesNotExist: + return '' + return params + + @classmethod + def getUrnByParameters(cls, parameters): + try: + object = cls.objects.get(parameters=parameters) + except cls.DoesNotExist: + object = cls(parameters=parameters) + object.save() + n = object.id + urn = '' + while 1: + idx = n % cls.base + urn = cls.digits[idx] + urn + n = n / cls.base + if n == 0: + break + return urn + class ColorTheme(models.Model): """Color theme """ diff --git a/chimere/main/views.py b/chimere/main/views.py index 52c0627..f065f2c 100644 --- a/chimere/main/views.py +++ b/chimere/main/views.py @@ -33,7 +33,7 @@ from django.core import serializers from chimere import settings from chimere.main.actions import actions from chimere.main.models import Category, SubCategory, PropertyModel, Marker, \ - Route, News, SimpleArea, Area, Color + Route, News, SimpleArea, Area, Color, TinyUrl from chimere.main.widgets import getMapJS, PointChooserWidget, \ RouteChooserWidget, URL_OSM_JS, URL_OSM_CSS @@ -53,7 +53,6 @@ def get_base_response(area_name=""): base_url += '/' base_url += area_name + '/' base_response_dct['extra_url'] = base_url - base_response_dct['area_name'] = area_name if settings.CSS_AREAS and area_name: base_response_dct['css_area'] = area_name + ".css" base_response_dct['area_name'] = area_name @@ -324,3 +323,26 @@ def getAvailableCategories(request, area=None, status='A', force=None): response_dct['sub_categories'] = subcategories return render_to_response('categories.html', response_dct) +def getTinyfiedUrl(request, area_name='', parameters=''): + ''' + Get the tinyfied version of parameters + ''' + try: + urn = TinyUrl.getUrnByParameters(parameters) + except: + return HttpResponse('no results') + response_dct = get_base_response(area_name) + url = settings.SERVER_URL + if url[-1] == '/': + url = url[:-1] + url += response_dct['extra_url'] + 'ty/' + urn + data = '{"urn": "%s", "url":"%s"}' % (urn, url) + return HttpResponse(data) + +def redirectFromTinyURN(request, area_name='', tiny_urn=''): + """ + Redirect from a tiny Urn + """ + parameters = '?' + TinyUrl.getParametersByUrn(tiny_urn) + response_dct = get_base_response(area_name) + return HttpResponseRedirect(response_dct['extra_url'] + parameters) diff --git a/chimere/static/main_map.js b/chimere/static/main_map.js index 792021c..5964aea 100644 --- a/chimere/static/main_map.js +++ b/chimere/static/main_map.js @@ -467,6 +467,29 @@ function createParams(center, zoom, layers) { return params; } +var tiny_url = ''; +var redirect_url = ''; + +function processTinyUrl(url){ + var params = OpenLayers.Util.getParameterString(this.createParams()); + redirect_url = url; + var uri = extra_url + "getTinyUrl/" + params; + OpenLayers.loadURL(uri, '', this, getTinyfiedUrl); +} + +/* get a tiny url */ +function getTinyfiedUrl(response){ + tiny_url = ''; + if (response.responseText.indexOf('no results') == -1) { + var json = new OpenLayers.Format.JSON(); + var result = json.read(response.responseText); + tiny_url = result.url; + if (!redirect_url || !tiny_url) return; + window.open(redirect_url+tiny_url); + } +} + + /* main initialisation function */ function init(){ /* set the main map */ diff --git a/chimere/urls.py b/chimere/urls.py index db1df5f..799f03f 100644 --- a/chimere/urls.py +++ b/chimere/urls.py @@ -69,4 +69,7 @@ urlpatterns += patterns('chimere.main.views', (base + extra + r'getGeoObjects/(?P<category_ids>\w+)(/(?P<status>\w+))?$', 'getGeoObjects'), (base + extra + r'getAvailableCategories/(?P<area>\w+)(/(?P<status>\w+))?(/(?P<force>\w+))?$', - 'getAvailableCategories'),) + 'getAvailableCategories'), +(base + extra + r'getTinyUrl/(.*)$', 'getTinyfiedUrl'), +(base + extra + r'ty/(\w+)$', 'redirectFromTinyURN'), +) |