summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoretienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864>2010-04-05 20:58:03 +0000
committeretienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864>2010-04-05 20:58:03 +0000
commitf6892bffd29924e1f0628fafbbfb4f8f1d6d362e (patch)
tree4a7cfca594354fde14963ee7c86bfb4fbdf962d4
parent5f6363cbb2a499ef5009efbe26d9a3b6fc6e16b2 (diff)
downloadChimè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.py39
-rw-r--r--chimere/main/views.py26
-rw-r--r--chimere/static/main_map.js23
-rw-r--r--chimere/urls.py5
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'),
+)