diff --git a/elections2021/migrations/0037_bannerorder_elections2021bannerlistpage.py b/elections2021/migrations/0037_bannerorder_elections2021bannerlistpage.py new file mode 100644 index 0000000000000000000000000000000000000000..f62a31c8a67f357db80a39ccf89e246d9087c1b5 --- /dev/null +++ b/elections2021/migrations/0037_bannerorder_elections2021bannerlistpage.py @@ -0,0 +1,133 @@ +# Generated by Django 3.2.5 on 2021-08-17 10:18 + +import django.db.models.deletion +import wagtail.contrib.routable_page.models +import wagtail.core.blocks +import wagtail.core.fields +import wagtail.images.blocks +import wagtailmetadata.models +from django.db import migrations, models + +import shared.models + + +class Migration(migrations.Migration): + + dependencies = [ + ("wagtailimages", "0023_add_choose_permissions"), + ("wagtailcore", "0062_comment_models_and_pagesubscription"), + ("elections2021", "0036_auto_20210811_1505"), + ] + + operations = [ + migrations.CreateModel( + name="BannerOrder", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("code", models.CharField(max_length=10)), + ("name", models.CharField(max_length=35)), + ("surname", models.CharField(max_length=70)), + ("place_of_birth", models.CharField(max_length=70)), + ("date_of_birth", models.DateField()), + ("phone", models.CharField(max_length=20)), + ("email", models.EmailField(max_length=70)), + ], + ), + migrations.CreateModel( + name="Elections2021BannerListPage", + fields=[ + ( + "page_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="wagtailcore.page", + ), + ), + ( + "subtitle", + models.CharField( + blank=True, max_length=100, verbose_name="podtitulek" + ), + ), + ( + "banners", + wagtail.core.fields.StreamField( + [ + ( + "banners", + wagtail.core.blocks.StructBlock( + [ + ( + "code", + wagtail.core.blocks.CharBlock( + label="kód banneru" + ), + ), + ( + "candidate1", + wagtail.core.blocks.CharBlock( + label="první kandidát", required=False + ), + ), + ( + "candidate2", + wagtail.core.blocks.CharBlock( + label="druhý kandidát", required=False + ), + ), + ( + "tagline", + wagtail.core.blocks.CharBlock( + label="slogan", required=False + ), + ), + ( + "preview", + wagtail.images.blocks.ImageChooserBlock( + label="náhled" + ), + ), + ] + ), + ) + ], + blank=True, + verbose_name="plachty", + ), + ), + ( + "search_image", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="wagtailimages.image", + verbose_name="Search image", + ), + ), + ], + options={ + "verbose_name": "Plachty", + }, + bases=( + shared.models.SubpageMixin, + wagtailmetadata.models.WagtailImageMetadataMixin, + wagtail.contrib.routable_page.models.RoutablePageMixin, + "wagtailcore.page", + models.Model, + ), + ), + ] diff --git a/elections2021/models.py b/elections2021/models.py index 60d9789d1e98f14a6783f5a5a3ce00c270b910eb..defff4a33bc2161dc88c419448284efea9d9c02e 100644 --- a/elections2021/models.py +++ b/elections2021/models.py @@ -302,6 +302,7 @@ class Elections2021HomePage(MetadataPageMixin, RoutablePageMixin, Page): "elections2021.Elections2021DownloadsPage", "elections2021.Elections2021GovernmentTeamPage", "elections2021.Elections2021CalendarPage", + "elections2021.Elections2021BannerListPage", ] ### OTHERS @@ -2447,3 +2448,99 @@ class Elections2021CalendarPage(SubpageMixin, MetadataPageMixin, CalendarMixin, event["pir"]["name"] = " ".join(pir_name) return self.calendar + + +class BannerBlock(blocks.StructBlock): + code = blocks.CharBlock(label="kód banneru") + candidate1 = blocks.CharBlock(label="první kandidát", required=False) + candidate2 = blocks.CharBlock(label="druhý kandidát", required=False) + tagline = blocks.CharBlock(label="slogan", required=False) + preview = ImageChooserBlock(label="náhled") + + class Meta: + label = "plachta" + icon = "flag" + template = "elections2021/_banner_block.html" + + +class BannerOrder(models.Model): + code = models.CharField(max_length=10) + name = models.CharField(max_length=35) + surname = models.CharField(max_length=70) + place_of_birth = models.CharField(max_length=70) + date_of_birth = models.DateField() + phone = models.CharField(max_length=20) + email = models.EmailField(max_length=70) + + +class BannerForm(forms.ModelForm): + class Meta: + model = BannerOrder + fields = [ + "code", + "name", + "surname", + "place_of_birth", + "date_of_birth", + "phone", + "email", + ] + + +class Elections2021BannerListPage( + SubpageMixin, MetadataPageMixin, RoutablePageMixin, Page +): + ### FIELDS + + subtitle = models.CharField(max_length=100, blank=True, verbose_name="podtitulek") + banners = StreamField( + [("banners", BannerBlock())], verbose_name="objednávání plachet", blank=True + ) + + ### PANELS + + content_panels = Page.content_panels + [ + FieldPanel("subtitle"), + FieldPanel("banners"), + ] + + promote_panels = [ + MultiFieldPanel( + [ + FieldPanel("slug"), + FieldPanel("seo_title"), + FieldPanel("search_description"), + ImageChooserPanel("search_image"), + HelpPanel(help.build(help.NO_SEO_TITLE, NO_SEARCH_IMAGE_USE_PHOTO)), + ], + gettext_lazy("Common page configuration"), + ), + CommentPanel(), + ] + + settings_panels = [] + + ### RELATIONS + + parent_page_types = ["elections2021.Elections2021HomePage"] + subpage_types = [] + + ### OTHERS + + class Meta: + verbose_name = "Plachty" + + def serve(self, request, *a, **kw): + if request.method == "POST": + form = BannerForm(request.POST) + form.has_been_saved = False + + if form.is_valid(): + order = form.save() + form.has_been_saved = True + else: + form = BannerForm() + form.has_been_saved = False + + request.banner_form = form + return super().serve(request, *a, **kw) diff --git a/elections2021/templates/elections2021/_banner_block.html b/elections2021/templates/elections2021/_banner_block.html new file mode 100644 index 0000000000000000000000000000000000000000..a554476e7709ab5045e678b243fe752cde5f8742 --- /dev/null +++ b/elections2021/templates/elections2021/_banner_block.html @@ -0,0 +1,16 @@ +{% load static wagtailcore_tags wagtailimages_tags elections2021_extras %} +<h3 class="pb-2 font-bold text-lg flex flex-col justify-end" style="min-height: 3.5rem"> + <p class="my-1 w-full"> + {% if block.value.candidate1 and block.value.candidate2 %} + {{ block.value.candidate1 }} + {{ block.value.candidate2 }} + {% elif block.value.candidate1 %} + {{ block.value.candidate1 }} + {% elif block.value.candidate2 %} + {{ block.value.candidate2 }} + {% endif %} + </p> + <p class="my-1">{{ block.value.tagline }}</p> +</h3> +<div class="card bg-white text-black card--hoveractive"> + {% image block.value.preview fill-800x412 %} +</div> diff --git a/elections2021/templates/elections2021/banner_list.html b/elections2021/templates/elections2021/banner_list.html new file mode 100644 index 0000000000000000000000000000000000000000..f57a2704e392fe61e7a9489a9489ca88763de1a3 --- /dev/null +++ b/elections2021/templates/elections2021/banner_list.html @@ -0,0 +1,12 @@ +{% load wagtailcore_tags wagtailimages_tags %} +<div class="grid grid-cols-1 md:grid-cols-2"> + {% for block in page.banners %} + {% if block.value.code != request.GET.code %} + <div class="col p-4 mb-8"> + <a href="?code={{block.value.code|urlencode}}" class="block"> + {% include_block block %} + </a> + </div> + {% endif %} + {% endfor %} +</div> diff --git a/elections2021/templates/elections2021/banner_order_form.html b/elections2021/templates/elections2021/banner_order_form.html new file mode 100644 index 0000000000000000000000000000000000000000..7df2ded705cc1067aca98c7a6032cbdb2c804d96 --- /dev/null +++ b/elections2021/templates/elections2021/banner_order_form.html @@ -0,0 +1,115 @@ +{% load wagtailimages_tags %} +{% for block in page.banners %} +{% if block.value.code == request.GET.code %} +<form class="mb-16 text-white bg-black p-4" method="POST" action=""> + {% csrf_token %} + <div class="grid grid-cols-1 sm:grid-cols-2 gap-8"> + <div class="col"> + <h2 class="head-alt-sm mb-4">Objednáváte</h2> + <h3 class="pb-3 font-bold text-lg"> + <p class="my-1"> + {% if block.value.candidate1 and block.value.candidate2 %} + {{ block.value.candidate1 }} + {{ block.value.candidate2 }} + {% elif block.value.candidate1 %} + {{ block.value.candidate1 }} + {% elif block.value.candidate2 %} + {{ block.value.candidate2 }} + {% endif %} + </p> + <p class="my-1">{{ block.value.tagline }}</p> + </h3> + <div>{% image block.value.preview fill-800x412 %}</div> + </div> + <div class="col"> + + <h2 class="head-alt-sm mb-4">Informace o dárci</h2> + + <div class="grid grid-cols-4 gap-4"> + <div class="form-field col-span-2 form-field-required"> + <label class="form-field__label" for="name">Jméno</label> + <div class="form-field__wrapper form-field__wrapper--shadowed {% if request.banner_form.errors.name %}form-field--error{% endif %}"> + <input type="text" class="text-input form-field__control text-black" id="name" name="name" value="{{request.banner_form.name.value|default_if_none:""}}" placeholder="Jan" /> + </div> + {% for error in request.banner_form.errors.name %} + <div class="form-field__error">{{error}}</div> + {% endfor %} + </div> + + <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.surname %}form-field--error{% endif %}"> + <label class="form-field__label" for="surname">Příjmení</label> + <div class="form-field__wrapper form-field__wrapper--shadowed"> + <input type="text" class="text-input form-field__control text-black" id="surname" name="surname" value="{{request.banner_form.surname.value|default_if_none:""}}" placeholder="Vlaštovka" /> + </div> + {% for error in request.banner_form.errors.surname %} + <div class="form-field__error">{{error}}</div> + {% endfor %} + </div> + + <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.place_of_birth %}form-field--error{% endif %}"> + <label class="form-field__label" for="place_of_birth">Místo narození</label> + <div class="form-field__wrapper form-field__wrapper--shadowed"> + <input type="text" class="text-input form-field__control text-black" id="place_of_birth" name="place_of_birth" value="{{request.banner_form.place_of_birth.value|default_if_none:""}}" placeholder="Sedlíšťka" /> + </div> + {% for error in request.banner_form.errors.place_of_birth %} + <div class="form-field__error">{{error}}</div> + {% endfor %} + </div> + + <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.date_of_birth %}form-field--error{% endif %}"> + <label class="form-field__label" for="date_of_birth">Datum narození</label> + <div class="form-field__wrapper form-field__wrapper--shadowed"> + <input type="date" class="text-input form-field__control text-black" id="date_of_birth" name="date_of_birth" value="{{request.banner_form.date_of_birth.value|default_if_none:""}}" placeholder="1.1.1990" /> + </div> + {% for error in request.banner_form.errors.date_of_birth %} + <div class="form-field__error">{{error}}</div> + {% endfor %} + </div> + </div> + + <input type="hidden" name="code" value="{{request.GET.code|urlencode}}"> + + <p class="my-5"> + Pokud nám pomůžete v kampani vyvěšením venkovní reklamy, + musíme o tomto Vašem nefinančním daru informovat stát, + který vaše údaje uveřejní. + </p> + + <h2 class="head-alt-sm my-5">Kontaktní údaje</h2> + + <div class="grid grid-cols-4 gap-4"> + <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.phone %}form-field--error{% endif %}"> + <label class="form-field__label" for="phone">Telefonní číslo</label> + <div class="form-field__wrapper form-field__wrapper--shadowed"> + <input type="tel" class="text-input form-field__control text-black" id="phone" name="phone" value="{{request.banner_form.phone.value|default_if_none:""}}" placeholder="" /> + </div> + {% for error in request.banner_form.errors.phone %} + <div class="form-field__error">{{error}}</div> + {% endfor %} + </div> + <div class="form-field col-span-2 form-field-required {% if request.banner_form.errors.email %}form-field--error{% endif %}"> + <label class="form-field__label" for="email">Emailová adresa</label> + <div class="form-field__wrapper form-field__wrapper--shadowed"> + <input type="email" class="text-input form-field__control text-black" id="email" name="email" value="{{request.banner_form.email.value|default_if_none:""}}" placeholder="" /> + </div> + {% for error in request.banner_form.errors.email %} + <div class="form-field__error">{{error}}</div> + {% endfor %} + </div> + </div> + + <p class="my-5"> + Kontaktní údaje využijí naši koordinátoři k tomu, aby se s vámi + domluvili na podrobnostech předání. Po skončení této volební kampaně + vaše kontaktní údaje vymažeme. + </p> + + <div class="mt-5 text-center lg:text-right"> + <button class="btn text-lg max-w-full"> + <div class="btn__body bg-white text-black">Souhlasím a objednávám</div> + </button> + </div> + </div> + </div> +</form> +{% endif %} +{% endfor %} diff --git a/elections2021/templates/elections2021/elections2021_banner_list_page.html b/elections2021/templates/elections2021/elections2021_banner_list_page.html new file mode 100644 index 0000000000000000000000000000000000000000..af9f491a4e7e4d84827a63e4d7a8ed6b91f31690 --- /dev/null +++ b/elections2021/templates/elections2021/elections2021_banner_list_page.html @@ -0,0 +1,31 @@ +{% extends "elections2021/base.html" %} +{% load static wagtailcore_tags wagtailimages_tags %} + +{% block content_header %} + <article class="relative bg-lemon md:bg-split-color px-4 md:pl-8 md:pr-0 2xl:px-8 hero py-0 w-full "> + <div class="2xl:container w-auto bg-lemon md:pl-20 pr-0 grid lg:grid-rows-1 h-40 sm:h-56 md:h-64 lg:grid-cols-7 items-center 2xl:mx-auto"> + <div class="lg:row-span-1 lg:col-span-4 order-1 md:pr-20"> + <h1 class="head-alt-md sm:head-alt-lg pt-1 max-w-xl">{{ page.title }}</h1> + <h2 class="head-alt-sm sm:head-alt-md pt-1 max-w-xl">{{ page.subtitle }}</h2> + </div> + <div class="text-center hidden lg:block lg:row-span-2 lg:col-span-3 order-2 h-full 2xl:right-0 2xl:text-right"> + <i class="h-64 py-12 inline-block ico--bookmark banner__icon"></i> + </div> + </div> + </article> +{% endblock %} + +{% block content %} +<div class="container container--default pt-8 pb-8 px-0 md:px-1"> + {% if request.banner_form.has_been_saved %} + <div class="w-xl px-4 mt-8 mb-16"> + <h2 class="head-alt-md">Děkujeme!</h2> + <p class="head-alt-sm w-xl mt-1">Vaše objednávka byla uložena.</p> + <p class="text-xl w-xl mt-4">Krajský koordinátor se s vámi co nejdříve spojí a domluví s vámi detaily.</p> + </div> + {% else %} + {% include "elections2021/banner_order_form.html" %} + {% include "elections2021/banner_list.html" %} + {% endif %} +</div> +{% endblock %}