diff --git a/donate/migrations/0002_auto_20200601_2324.py b/donate/migrations/0002_auto_20200601_2324.py new file mode 100644 index 0000000000000000000000000000000000000000..29c8bc99947a269a974dc6b0f6d98c9af7dacf51 --- /dev/null +++ b/donate/migrations/0002_auto_20200601_2324.py @@ -0,0 +1,63 @@ +# Generated by Django 3.0.6 on 2020-06-01 21:24 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("wagtailimages", "0022_uploadedimage"), + ("donate", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="donatehomepage", + name="search_image", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="wagtailimages.Image", + verbose_name="Search image", + ), + ), + migrations.AddField( + model_name="donateprojectindexpage", + name="search_image", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="wagtailimages.Image", + verbose_name="Search image", + ), + ), + migrations.AddField( + model_name="donateregionindexpage", + name="search_image", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="wagtailimages.Image", + verbose_name="Search image", + ), + ), + migrations.AddField( + model_name="donateregionpage", + name="search_image", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="wagtailimages.Image", + verbose_name="Search image", + ), + ), + ] diff --git a/donate/models.py b/donate/models.py index ad5b4b22cada5606978cea8e37f2fa7cd5fb8a29..f8b874e4983f1d214ab5c25d9a315eeb60084744 100644 --- a/donate/models.py +++ b/donate/models.py @@ -10,6 +10,22 @@ from wagtail.core.fields import RichTextField, StreamField from wagtail.core.models import Page from wagtail.images.blocks import ImageChooserBlock from wagtail.images.edit_handlers import ImageChooserPanel +from wagtailmetadata.models import MetadataPageMixin + +from tuning import help + + +class SubpageMixin: + """Must be used in class definition before MetadataPageMixin!""" + + @property + def root_page(self): + if not hasattr(self, "_root_page"): + self._root_page = self.get_parent().specific + return self._root_page + + def get_meta_image(self): + return self.search_image or self.root_page.get_meta_image() def get_url(page, request, dest_page_type): @@ -19,7 +35,7 @@ def get_url(page, request, dest_page_type): return "#" -class DonateHomePage(Page): +class DonateHomePage(Page, MetadataPageMixin): # lead section lead_title = models.CharField("hlavní nadpis", max_length=250, blank=True) lead_body = models.TextField("hlavní popis", blank=True) @@ -75,12 +91,10 @@ class DonateHomePage(Page): promote_panels = [ MultiFieldPanel( [ - HelpPanel( - "Název stránky na předchozím tabu slouží k rozlišení stránek " - "v Majáku. V prohlížeči se zobrazí tento titulek." - ), FieldPanel("seo_title"), FieldPanel("search_description"), + ImageChooserPanel("search_image"), + HelpPanel(help.build(help.IMPORTANT_TITLE)), ], gettext_lazy("Common page configuration"), ), @@ -131,13 +145,15 @@ class DonateHomePage(Page): return context -class DonateRegionIndexPage(Page): +class DonateRegionIndexPage(Page, SubpageMixin, MetadataPageMixin): promote_panels = [ MultiFieldPanel( [ FieldPanel("slug"), FieldPanel("seo_title"), FieldPanel("search_description"), + ImageChooserPanel("search_image"), + HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)), ], gettext_lazy("Common page configuration"), ), @@ -154,19 +170,13 @@ class DonateRegionIndexPage(Page): class Meta: verbose_name = "Přehled krajů" - @property - def root_page(self): - if not hasattr(self, "_root_page"): - self._root_page = self.get_parent().specific - return self._root_page - def get_context(self, request): context = super().get_context(request) context["regions"] = self.get_children().live().specific() return context -class DonateRegionPage(Page): +class DonateRegionPage(Page, SubpageMixin, MetadataPageMixin): perex = models.TextField("krátký popis do přehledu krajů") main_title = models.CharField("hlavní nadpis na stránce", max_length=250) body = RichTextField("obsah") @@ -183,6 +193,14 @@ class DonateRegionPage(Page): FieldPanel("slug"), FieldPanel("seo_title"), FieldPanel("search_description"), + ImageChooserPanel("search_image"), + HelpPanel( + help.build( + "Pokud není zadán <strong>Titulek stránky</strong>, použije " + "se <strong>Hlavní nadpis</strong> (tab obsah).", + help.NO_SEARCH_IMAGE, + ) + ), ], gettext_lazy("Common page configuration"), ), @@ -205,19 +223,24 @@ class DonateRegionPage(Page): self._root_page = self.get_ancestors().type(DonateHomePage).specific().get() return self._root_page + def get_meta_title(self): + return self.seo_title or self.main_title + def get_context(self, request): context = super().get_context(request) context["other_regions"] = self.get_siblings(inclusive=False).live() return context -class DonateProjectIndexPage(Page): +class DonateProjectIndexPage(Page, SubpageMixin, MetadataPageMixin): promote_panels = [ MultiFieldPanel( [ FieldPanel("slug"), FieldPanel("seo_title"), FieldPanel("search_description"), + ImageChooserPanel("search_image"), + HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)), ], gettext_lazy("Common page configuration"), ), @@ -234,12 +257,6 @@ class DonateProjectIndexPage(Page): class Meta: verbose_name = "Přehled projektů" - @property - def root_page(self): - if not hasattr(self, "_root_page"): - self._root_page = self.get_parent().specific - return self._root_page - def get_context(self, request): context = super().get_context(request) context["projects"] = ( @@ -248,7 +265,7 @@ class DonateProjectIndexPage(Page): return context -class DonateProjectPage(Page): +class DonateProjectPage(Page, SubpageMixin, MetadataPageMixin): date = models.DateField("běží od") perex = models.TextField("krátký popis") body = RichTextField("obsah") @@ -265,6 +282,8 @@ class DonateProjectPage(Page): verbose_name="galerie fotek", blank=True, ) + # we will use photo as search image + search_image = None content_panels = Page.content_panels + [ MultiFieldPanel( @@ -282,6 +301,14 @@ class DonateProjectPage(Page): FieldPanel("slug"), FieldPanel("seo_title"), FieldPanel("search_description"), + HelpPanel( + help.build( + "Pokud není zadán <strong>Titulek stránky</strong>, použije " + "se „Podpoř projekt <strong>Název</strong>“ (tab obsah).", + "Pokud není zadán <strong>Popis vyhledávání</strong>, použije " + "se prvních 150 znaků <strong>Perexu</strong> (tab obsah).", + ) + ), ], gettext_lazy("Common page configuration"), ), @@ -302,6 +329,23 @@ class DonateProjectPage(Page): self._root_page = self.get_ancestors().type(DonateHomePage).specific().get() return self._root_page + def get_meta_image(self): + return self.photo + + def get_meta_title(self): + return self.seo_title or self.main_title + + def get_meta_description(self): + if self.search_description: + return self.search_description + if len(self.perex) > 150: + return str(self.perex)[:150] + "..." + return self.perex + + @property + def main_title(self): + return f"Podpoř projekt {self.title}" + def get_context(self, request): context = super().get_context(request) context["other_projects"] = ( diff --git a/donate/templates/donate/base.html b/donate/templates/donate/base.html index 6b9ed8e3b5cf9fa82e0e5ab22a81741090fd0b3c..fa89b4f9d720b02ffee70d62bcd47218ef44a9cb 100644 --- a/donate/templates/donate/base.html +++ b/donate/templates/donate/base.html @@ -1,4 +1,4 @@ -{% load static wagtailuserbar wagtailcore_tags wagtailimages_tags %} +{% load static wagtailuserbar wagtailcore_tags wagtailimages_tags wagtailmetadata_tags %} <!doctype html> <html lang="cs"> <head> @@ -21,25 +21,10 @@ <!-- Meta --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> - <meta name="description" content="{{ page.search_description }}"> - <meta name="author" content="Daniel Hlavacek"> - <title>{% firstof page.seo_title page.title %}</title> - - <!-- OpenGraph info --> - <meta property="og:title" content="{% firstof page.seo_title page.title %}" /> - <meta property="og:type" content="website" /> - <meta property="og:locale" content="cs_CZ" /> - <meta property="og:url" content="{{ page.full_url }}" /> - {# TODO #} - <meta property="og:image" content="{% static "shared/img/og_image.jpg" %}" /> - <meta property="og:description" content="{{ page.search_description }}" /> + {% meta_tags %} <!-- Favicon --> - <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-196.png" %}" sizes="196x196"> - <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-128.png" %}" sizes="128x128"> - <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-96.png" %}" sizes="96x96"> - <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-32.png" %}" sizes="32x32"> - <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-16.png" %}" sizes="16x16"> + {% include "shared/favicon_snippet.html" %} <!-- Bootstrap CSS --> <link rel="stylesheet" href="{% static "shared/vendor/bootstrap-4.4.1/css/bootstrap.min.css" %}"> diff --git a/donate/templates/donate/donate_project_page.html b/donate/templates/donate/donate_project_page.html index 12c22e0fa1882f9e9fe39e9dd1f04ca7238d953c..6584c54dea453cef39e61462c3afa67e301b941b 100644 --- a/donate/templates/donate/donate_project_page.html +++ b/donate/templates/donate/donate_project_page.html @@ -8,7 +8,7 @@ <section class="section--alternate project__header"> <div class="container"> - <h1 class="lead heading">Podpoř projekt {{ page.title }}</h1> + <h1 class="lead heading">{{ page.main_title }}</h1> <div class="row align-items-center"> <div class="col-12 col-md-6 mb-3 mb-md-0">