diff options
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 |
commit | 96eee66985a22619eb71cacf396ee609058459fc (patch) | |
tree | c6a21923d5e313691afc406934b37ff7ae0d1df9 | |
parent | a489cfe6556d26af0e280d533f78c9a378cc4929 (diff) | |
download | Chimère-96eee66985a22619eb71cacf396ee609058459fc.tar.bz2 Chimère-96eee66985a22619eb71cacf396ee609058459fc.zip |
Inform OpenGraph tags (specialy for Facebook share)
-rw-r--r-- | chimere/models.py | 46 | ||||
-rw-r--r-- | chimere/templates/base.html | 16 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/map.html | 2 | ||||
-rw-r--r-- | chimere/views.py | 56 |
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 += "¤t_feature={}".format(current_item) + redir_url += "#" + parameters + return HttpResponseRedirect(redir_url) class CategoryDirectoryView(ListView): |