From 41b26144f51ae84a918ccef2973e0fb37b96309b Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Thu, 22 Oct 2020 14:08:29 +0200 Subject: [PATCH] Add opengraph tags to some pages Add template support for opengraph tags (which will enable things like icons and preview on posts to twitter and facebook and other places) to both base pages and documentation pages. Use this to actually add the tags to docs pages (only v10+ will get text previews, but all should get the titles and image) and news (only news from the project will get an image, all get both title and text) --- pgweb/docs/views.py | 16 ++++++++++++++++ pgweb/news/views.py | 14 +++++++++++++- templates/base/base.html | 10 +++++++++- templates/docs/docspage.html | 9 ++++++++- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/pgweb/docs/views.py b/pgweb/docs/views.py index a10664e1..9f071a50 100644 --- a/pgweb/docs/views.py +++ b/pgweb/docs/views.py @@ -2,6 +2,7 @@ from django.shortcuts import render, get_object_or_404 from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect from django.http import HttpResponse, Http404 from pgweb.util.decorators import login_required, allow_frames, content_sources +from django.template.defaultfilters import strip_tags from django.db.models import Q from django.conf import settings @@ -111,6 +112,14 @@ def docpage(request, version, filename): params=[fullname, fullname, fullname], ).order_by('-version__supported', 'version').only('version', 'file') + # If possible (e.g. if we match), remove the header part of the docs so that we can generate a plain text + # preview. For older versions where this doesn't match, we just leave it empty. + m = re.match(r'^
]*class="navheader"[^>]*>.*?
(.*)$', page.content, re.S) + if m: + contentpreview = strip_tags(m.group(1)) + else: + contentpreview = '' + return render(request, 'docs/docspage.html', { 'page': page, 'supported_versions': [v for v in versions if v.version.supported], @@ -119,6 +128,13 @@ def docpage(request, version, filename): 'title': page.title, 'doc_index_filename': indexname, 'loaddate': loaddate, + 'og': { + 'url': '/docs/{}/{}'.format(page.display_version(), page.file), + 'time': page.version.docsloaded, + 'title': page.title.strip(), + 'description': contentpreview, + 'sitename': 'PostgreSQL Documentation', + } }) diff --git a/pgweb/news/views.py b/pgweb/news/views.py index 24522f8d..68a6cb75 100644 --- a/pgweb/news/views.py +++ b/pgweb/news/views.py @@ -43,11 +43,23 @@ def item(request, itemid, slug=None): news = get_object_or_404(NewsArticle, pk=itemid) if news.modstate != ModerationState.APPROVED: raise Http404 + + fullurl = '/about/news/{}-{}/'.format(slugify(news.title), news.id) if slug != slugify(news.title): - return HttpResponsePermanentRedirect('/about/news/{}-{}/'.format(slugify(news.title), news.id)) + return HttpResponsePermanentRedirect(fullurl) + return render_pgweb(request, 'about', 'news/item.html', { 'obj': news, 'newstags': NewsTag.objects.all(), + 'og': { + 'url': fullurl, + 'author': news.org.name if news.org.name != '_migrated' else '', + 'time': datetime.datetime.combine(news.date, datetime.datetime.min.time()), + 'title': news.title, + 'description': news.content, + 'noimage': news.org.mailtemplate == 'default', # For now, control image by "using a custom logo" + 'sitename': 'PostgreSQL News', + } }) diff --git a/templates/base/base.html b/templates/base/base.html index e6c3c1eb..a2158a49 100644 --- a/templates/base/base.html +++ b/templates/base/base.html @@ -6,7 +6,15 @@ {%block meta%}{%endblock%} {# used for custom meta tags such as description which we don't want for every page #} - + {%if og%} + + +{%if og.author%} {%endif%} + +{%if not og.noimage%} {%endif%} + + + {%endif%} diff --git a/templates/docs/docspage.html b/templates/docs/docspage.html index b73f2a71..f5f3e3b1 100644 --- a/templates/docs/docspage.html +++ b/templates/docs/docspage.html @@ -6,7 +6,14 @@ {%block meta%}{%endblock%} {# used for custom meta tags such as description which we don't want for every page #} - + {%if og%} + + + +{%if not og.noimage%} {%endif%} + +{%if og.description%} {%endif%} + {%endif%} -- 2.39.5