summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-03-20 17:12:27 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-03-20 17:13:52 +0100
commit96eee66985a22619eb71cacf396ee609058459fc (patch)
treec6a21923d5e313691afc406934b37ff7ae0d1df9
parenta489cfe6556d26af0e280d533f78c9a378cc4929 (diff)
downloadChimère-96eee66985a22619eb71cacf396ee609058459fc.tar.bz2
Chimère-96eee66985a22619eb71cacf396ee609058459fc.zip
Inform OpenGraph tags (specialy for Facebook share)
-rw-r--r--chimere/models.py46
-rw-r--r--chimere/templates/base.html16
-rw-r--r--chimere/templates/chimere/blocks/map.html2
-rw-r--r--chimere/views.py56
4 files changed, 90 insertions, 30 deletions
diff --git a/chimere/models.py b/chimere/models.py
index f08ff7a..d4b3219 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -634,6 +634,31 @@ class GeographicItem(models.Model):
def geometry(self):
return getattr(self, self.geom_attr).wkt
+ def text_description(self):
+ """
+ Convert the html description into a text description
+ """
+ if not hasattr(self, 'description'):
+ return ""
+ soup = BeautifulSoup(self.description)
+ # kill all script and style elements
+ for script in soup(["script", "style"]):
+ script.extract() # rip it out
+
+ # get text
+ text = soup.get_text()
+
+ # break into lines and remove leading and trailing space on each
+ lines = (line.strip() for line in text.splitlines())
+ # break multi-headlines into a line each
+ chunks = (phrase.strip() for line in lines for phrase in
+ line.split(" "))
+ # drop blank lines
+ text = '\n'.join(chunk for chunk in chunks if chunk)
+ # drop line breaks
+ text = text.replace('\n', ' ')
+ return text
+
def _get_geom_item_fk_name(self):
geom_attr = self.geom_attr
return GEOM_TO_GEOM_ITEM[geom_attr].lower()
@@ -765,6 +790,12 @@ class GeographicItem(models.Model):
for pict in self.pictures.all()]
return picts
+ @property
+ def image(self):
+ if not self.pictures.count():
+ return
+ return self.pictures.order_by('pk').all()[0]
+
def get_full_dict(self):
dct = {}
# get all property even the one not displayed
@@ -851,6 +882,7 @@ class Marker(GeographicItem):
is_front_page = models.NullBooleanField(_("Is front page"), blank=True,
null=True)
objects = models.GeoManager()
+ geom_attr = 'point'
class Meta:
ordering = ('status', 'name')
@@ -884,10 +916,6 @@ class Marker(GeographicItem):
def short_desc(self):
return shortify(self.description)
- @property
- def geom_attr(self):
- return 'point'
-
def getLatitude(self):
"""
Return the latitude
@@ -1086,15 +1114,12 @@ class Polygon(GeographicItem):
_("Inner color"), max_length=200,
help_text=_("HTML code/name"), blank=True, null=True)
objects = models.GeoManager()
+ geom_attr = 'polygon'
class Meta:
ordering = ('status', 'name')
verbose_name = _("Polygon")
- @property
- def geom_attr(self):
- return 'polygon'
-
def getGeoJSON(self, color="#000", inner_color='#0F0'):
'''Return a GeoJSON string
'''
@@ -1543,15 +1568,12 @@ class Route(GeographicItem):
_("Color"), max_length=200, help_text=_("HTML code/name"),
blank=True, null=True)
objects = models.GeoManager()
+ geom_attr = 'route'
class Meta:
ordering = ('status', 'name')
verbose_name = _("Route")
- @property
- def geom_attr(self):
- return 'route'
-
def getGeoJSON(self, color="#000"):
'''Return a GeoJSON string
'''
diff --git a/chimere/templates/base.html b/chimere/templates/base.html
index a346878..5d1a67f 100644
--- a/chimere/templates/base.html
+++ b/chimere/templates/base.html
@@ -5,6 +5,22 @@
<title>{% block title %}{{PROJECT_NAME}}{% endblock %}</title>
{% if MOBILE %}<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">{% endif %}
+
+ {% block og %}
+ <meta property="og:title" content="{{PROJECT_NAME}}" />
+ <meta property="og:type" content="article" />
+ {% if current_feature %}
+ <meta property="og:url" content="{{current_site}}{% if tiny %}/ty/{{tiny}}{% endif %}" />
+ {% if current_feature.image %}
+ <meta property="og:image" content="{{current_site}}{{current_feature.image.picture.url}}" />
+ {% endif %}
+ <meta property="og:description"
+ content="{{current_feature.text_description}}" />
+ {% else %}
+ <meta property="og:url" content="{{current_site}}" />
+ {% endif %}
+ {% endblock %}
+
{% block extra_head %}
{% endblock %}
</head>
diff --git a/chimere/templates/chimere/blocks/map.html b/chimere/templates/chimere/blocks/map.html
index 87d0efc..4f56ad2 100644
--- a/chimere/templates/chimere/blocks/map.html
+++ b/chimere/templates/chimere/blocks/map.html
@@ -55,7 +55,7 @@ $("#{{map_id}}").show();
{% if p_display_submited %}"display_submited": {{ p_display_submited }},{% endif %}
{% if area_id %}'area_id': "{{area_id}}",{% endif %}
{% if p_current_feature %}
- "display_feature": {{ p_current_feature }},{% endif %}
+ "display_feature": "{{ p_current_feature }}",{% endif %}
{% if p_current_route %}
"display_route": {{ p_current_route }},{% endif %}
{% if popupContentFull %}"popupContentFull": true,{% endif %}
diff --git a/chimere/views.py b/chimere/views.py
index b83b102..a8fe22e 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -79,11 +79,15 @@ def get_base_response(request, area_name=""):
"""
Get the base url
"""
- base_response_dct = {'media_path': settings.MEDIA_URL,
- 'version': get_version()}
- base_response_dct['MOBILE'] = \
- settings.MOBILE_TEST or \
- get_current_site(request).domain in settings.MOBILE_DOMAINS
+ current_site = get_current_site(request)
+ base_response_dct = {
+ 'media_path': settings.MEDIA_URL, 'version': get_version(),
+ 'current_site': (request.is_secure() and "https://"
+ or "http://") + current_site.domain,
+ "MOBILE": settings.MOBILE_TEST or
+ current_site.domain in settings.MOBILE_DOMAINS
+ }
+
base_url = reverse("chimere:index")
if not base_url.startswith('/'):
base_url = '/' + base_url
@@ -176,13 +180,22 @@ def index(request, area_name=None, default_area=None, simple=False,
settings.CHIMERE_ENABLE_ROUTING:
response_dct['itinerary_form'] = RoutingForm()
response_dct['routing_transport'] = settings.CHIMERE_ROUTING_TRANSPORT
- if request.GET and 'current_feature' in request.GET:
- try:
- m = Marker.objects.get(pk=request.GET['current_feature'])
- if m.route:
- response_dct['current_route'] = m.route.pk
- except:
- pass
+ if request.GET and "current_feature" in request.GET:
+ item_key = request.GET['current_feature']
+ current_cls = None
+ for cls in (Marker, Polygon, Route):
+ if item_key.startswith(cls.__name__.lower() + '-'):
+ current_cls = cls
+ break
+ if current_cls:
+ try:
+ response_dct["current_feature"] = current_cls.objects.get(
+ status='A',
+ pk=item_key[len(current_cls.geom_attr + '-') + 1:])
+ except current_cls.DoesNotExist:
+ pass
+ if request.GET and "ty" in request.GET:
+ response_dct['tiny'] = request.GET["ty"]
response_dct.update({
'actions': actions(response_dct['area_name']),
'action_selected': ('view',),
@@ -195,7 +208,6 @@ def index(request, area_name=None, default_area=None, simple=False,
'dynamic_categories': response_dct['dynamic_categories'],
'zoomout': zoomout,
'has_default_area': Area.objects.filter(default=True).count(),
- 'zoomout': zoomout,
'has_search': hasattr(settings, 'CHIMERE_SEARCH_ENGINE') and
settings.CHIMERE_SEARCH_ENGINE
})
@@ -909,9 +921,9 @@ def getCategory(request, area_name='', category_id=0):
def getTinyfiedUrl(request, parameters, area_name=''):
- '''
+ """
Get the tinyfied version of parameters
- '''
+ """
data = {"urn": "", "url": "", "text": ""}
try:
urn = TinyUrl.getUrnByParameters(parameters)
@@ -943,11 +955,21 @@ def redirectFromTinyURN(request, area_name='', tiny_urn=''):
"""
Redirect from a tiny Urn
"""
- parameters = '#' + TinyUrl.getParametersByUrn(tiny_urn)
+ parameters = TinyUrl.getParametersByUrn(tiny_urn)
+
+ detail = parameters.split(';')
+ current_item = None
+ if len(detail) >= 5:
+ current_item = detail[4]
+
response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
- return HttpResponseRedirect(response_dct['extra_url'] + parameters)
+ redir_url = response_dct['extra_url'] + "?ty={}".format(tiny_urn)
+ if current_item:
+ redir_url += "&current_feature={}".format(current_item)
+ redir_url += "#" + parameters
+ return HttpResponseRedirect(redir_url)
class CategoryDirectoryView(ListView):