Skip to content
Snippets Groups Projects
Commit 43588f50 authored by Tomáš Valenta's avatar Tomáš Valenta
Browse files

finish everything in new elections web except for program

parent 6254561a
No related branches found
No related tags found
2 merge requests!876Fix shared articles & release elections web,!863Add elections web
Pipeline #16119 passed
Showing
with 383 additions and 20 deletions
from wagtail.blocks import StructBlock
from wagtail.images.blocks import ImageChooserBlock
from wagtail.blocks import (
RichTextBlock,
TextBlock,
PageChooserBlock,
ListBlock
)
class ElectionsCarouselBlock(StructBlock):
image = ImageChooserBlock(label="Obrázek na pozadí")
class Meta:
template = "styleguide2/includes/molecules/menus/europarl/carousel.html"
template = "styleguide2/includes/molecules/menus/elections/carousel.html"
icon = "form"
label = "Carousel"
class CandidateBlock(StructBlock):
page = PageChooserBlock(
label="Stránka",
page_type=[
"elections.ElectionsCandidatePage"
]
)
image = ImageChooserBlock(
label="Obrázek",
help_text="Pokud není vybrán, použije se obrázek ze stránky kandidáta",
required=False
)
description = TextBlock(
label="Popis",
required=False,
help_text="Pokud zůstane prázdné, použije se popis ze stránky kandidáta"
)
class Meta:
template = "styleguide2/includes/molecules/candidates/elections/candidate_primary_box.html"
icon = "form"
label = "Kandidát"
class CandidateListBlock(StructBlock):
candidates = ListBlock(
CandidateBlock(),
label="Kandidáti",
)
class Meta:
template = "styleguide2/includes/organisms/candidates/elections/candidate_primary_list.html"
icon = "form"
label = "Seznam kandidátů"
# Generated by Django 4.1.10 on 2024-01-05 16:23
from django.db import migrations, models
import django.db.models.deletion
import shared.models.base
import wagtail.blocks
import wagtail.fields
import wagtail.images.blocks
import wagtailmetadata.models
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0083_workflowcontenttype'),
('calendar_utils', '0004_auto_20220505_1228'),
('wagtailimages', '0025_alter_image_file_alter_rendition_file'),
('elections', '0006_alter_electionshomepage_content'),
]
operations = [
migrations.AlterField(
model_name='electionshomepage',
name='content',
field=wagtail.fields.StreamField([('carousel', wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek na pozadí'))])), ('candidate', wagtail.blocks.StructBlock([('candidates', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('candidate', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['elections.ElectionsCandidatePage'])), ('description', wagtail.blocks.RichTextBlock(help_text='Pokud zůstane prázdné, použije se popis ze stránky kandidáta', label='Popis', required=False))]), label='Kandidáti'))]))], blank=True, use_json_field=True, verbose_name='Hlavní obsah'),
),
migrations.CreateModel(
name='ElectionsCandidatesPage',
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')),
('calendar_url', models.URLField(blank=True, help_text='Kalendář se po uložení stránky aktualizuje na pozadí. U plnějších kalendářů to může trvat i desítky sekund.', null=True, verbose_name='URL kalendáře ve formátu iCal')),
('calendar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='calendar_utils.calendar')),
('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': 'Kandidáti',
},
bases=(shared.models.base.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
),
migrations.CreateModel(
name='ElectionsCandidatePage',
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')),
('calendar_url', models.URLField(blank=True, help_text='Kalendář se po uložení stránky aktualizuje na pozadí. U plnějších kalendářů to může trvat i desítky sekund.', null=True, verbose_name='URL kalendáře ve formátu iCal')),
('position', models.CharField(blank=True, max_length=64, null=True, verbose_name='Pozice/povolání')),
('perex', wagtail.fields.RichTextField()),
('email', models.CharField(blank=True, max_length=128, null=True, verbose_name='E-mail')),
('phone', models.CharField(blank=True, max_length=16, null=True, verbose_name='Telefonní kontakt')),
('social_links', wagtail.fields.StreamField([('social_links', wagtail.blocks.StructBlock([('text', wagtail.blocks.CharBlock(label='Název')), ('link', wagtail.blocks.URLBlock(label='Odkaz')), ('icon', wagtail.blocks.CharBlock(help_text='Seznam ikon - https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons <br/>Název ikony zadejte bez tečky na začátku', label='Ikona'))]))], blank=True, use_json_field=True, verbose_name='Odkazy na sociální sítě')),
('related_candidates', wagtail.fields.StreamField([('candidate', wagtail.blocks.PageChooserBlock(label='Detail kandidáta', page_type=['elections.ElectionsCandidatePage']))], blank=True, use_json_field=True, verbose_name='Další kandidáti')),
('calendar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='calendar_utils.calendar')),
('image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='wagtailimages.image', verbose_name='Obrázek')),
('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={
'abstract': False,
},
bases=(shared.models.base.SubpageMixin, wagtailmetadata.models.WagtailImageMetadataMixin, 'wagtailcore.page', models.Model),
),
]
# Generated by Django 4.1.10 on 2024-01-05 17:20
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('elections', '0007_alter_electionshomepage_content_and_more'),
]
operations = [
migrations.AlterField(
model_name='electionsarticlepage',
name='author_page',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='elections.electionscandidatepage', verbose_name='Stránka autora (kandidáta)'),
),
]
# Generated by Django 4.1.10 on 2024-01-05 17:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('elections', '0008_alter_electionsarticlepage_author_page'),
]
operations = [
migrations.AddField(
model_name='electionscandidatepage',
name='articles_heading',
field=models.CharField(default='Aktuality', help_text='Např. "Aktuality Mikuláše Peksy".', max_length=32, verbose_name='Nadpis sekce s články'),
preserve_default=False,
),
]
# Generated by Django 4.1.10 on 2024-01-05 17:35
from django.db import migrations
import wagtail.blocks
import wagtail.fields
import wagtail.images.blocks
class Migration(migrations.Migration):
dependencies = [
('elections', '0009_electionscandidatepage_articles_heading'),
]
operations = [
migrations.AlterModelOptions(
name='electionscandidatepage',
options={'verbose_name': 'Kandidát'},
),
migrations.AlterField(
model_name='electionshomepage',
name='content',
field=wagtail.fields.StreamField([('carousel', wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek na pozadí'))])), ('candidate', wagtail.blocks.StructBlock([('candidates', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('candidate', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['elections.ElectionsCandidatePage'])), ('image', wagtail.images.blocks.ImageChooserBlock(help_text='Pokud není vybrán, použije se obrázek ze stránky kandidáta', label='Obrázek', required=False)), ('description', wagtail.blocks.RichTextBlock(help_text='Pokud zůstane prázdné, použije se popis ze stránky kandidáta', label='Popis', required=False))]), label='Kandidáti'))]))], blank=True, use_json_field=True, verbose_name='Hlavní obsah'),
),
]
# Generated by Django 4.1.10 on 2024-01-05 17:44
from django.db import migrations
import wagtail.blocks
import wagtail.fields
import wagtail.images.blocks
class Migration(migrations.Migration):
dependencies = [
('elections', '0010_alter_electionscandidatepage_options_and_more'),
]
operations = [
migrations.AlterField(
model_name='electionshomepage',
name='content',
field=wagtail.fields.StreamField([('carousel', wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek na pozadí'))])), ('candidate', wagtail.blocks.StructBlock([('candidates', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['elections.ElectionsCandidatePage'])), ('image', wagtail.images.blocks.ImageChooserBlock(help_text='Pokud není vybrán, použije se obrázek ze stránky kandidáta', label='Obrázek', required=False)), ('description', wagtail.blocks.TextBlock(help_text='Pokud zůstane prázdné, použije se popis ze stránky kandidáta', label='Popis', required=False))]), label='Kandidáti'))]))], blank=True, use_json_field=True, verbose_name='Hlavní obsah'),
),
]
......@@ -55,6 +55,7 @@ class ElectionsHomePage(MainHomePageMixin):
content = StreamField(
[
("carousel", blocks.ElectionsCarouselBlock()),
("candidate", blocks.CandidateListBlock())
],
verbose_name="Hlavní obsah",
blank=True,
......@@ -72,6 +73,7 @@ class ElectionsHomePage(MainHomePageMixin):
subpage_types = [
"elections.ElectionsArticlesPage",
"elections.ElectionsCandidatesPage",
"elections.ElectionsSearchPage",
]
......@@ -92,10 +94,6 @@ class ElectionsHomePage(MainHomePageMixin):
def search_page_model(self):
return ElectionsSearchPage
@property
def people_page(self):
return self._first_subpage_of_type(ElectionsPeoplePage)
@property
def root_page(self):
return self
......@@ -126,11 +124,11 @@ class ElectionsArticleTag(TaggedItemBase):
class ElectionsArticlePage(MainArticlePageMixin):
author_page = models.ForeignKey(
"main.MainPersonPage",
"elections.ElectionsCandidatePage",
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name="Stránka autora (osoby)",
verbose_name="Stránka autora (kandidáta)",
)
tags = ClusterTaggableManager(
through=ElectionsArticleTag,
......@@ -158,3 +156,112 @@ class ElectionsSearchPage(MainSearchPageMixin):
ElectionsPersonPage,
ElectionsSimplePage,
]
class ElectionsCandidatesPage(
ExtendedMetadataPageMixin,
SubpageMixin,
MetadataPageMixin,
CalendarMixin,
PageInMenuMixin,
Page,
):
parent_page_types = ["elections.ElectionsHomePage"]
subpage_types = ["elections.ElectionsCandidatePage"]
class Meta:
verbose_name = "Kandidáti"
class ElectionsCandidatePage(
ExtendedMetadataPageMixin,
SubpageMixin,
MetadataPageMixin,
CalendarMixin,
PageInMenuMixin,
Page,
):
## FIELDS
image = models.ForeignKey(
"wagtailimages.Image",
on_delete=models.PROTECT,
blank=True,
null=True,
verbose_name="Obrázek",
related_name="+",
)
position = models.CharField(
"Pozice/povolání", max_length=64, blank=True, null=True
)
perex = RichTextField()
email = models.CharField("E-mail", max_length=128, blank=True, null=True)
phone = models.CharField("Telefonní kontakt", max_length=16, blank=True, null=True)
social_links = StreamField(
[
("social_links", shared_blocks.SocialLinkBlock()),
],
verbose_name="Odkazy na sociální sítě",
blank=True,
use_json_field=True,
)
articles_heading = models.CharField(
"Nadpis sekce s články",
max_length=32,
help_text="Např. \"Aktuality Mikuláše Peksy\"."
)
related_candidates = StreamField(
[
(
"candidate",
PageChooserBlock(page_type="elections.ElectionsCandidatePage", label="Detail kandidáta"),
)
],
verbose_name="Další kandidáti",
blank=True,
use_json_field=True,
)
## PANELS
content_panels = Page.content_panels + [
FieldPanel("image"),
FieldPanel("position"),
FieldPanel("perex"),
FieldPanel("email"),
FieldPanel("phone"),
FieldPanel("social_links"),
FieldPanel("articles_heading"),
FieldPanel("related_candidates"),
]
promote_panels = make_promote_panels()
## RELATIONS
parent_page_types = ["elections.ElectionsCandidatesPage"]
subpage_types = []
## META
class Meta:
verbose_name = "Kandidát"
## FUNCTIONS
def get_context(self, request) -> dict:
context = super().get_context(request)
context["article_data_list"] = (
ElectionsArticlePage.objects.filter(author_page=self.id)
.order_by("-date")
.live()[:3]
)
return context
{% extends "styleguide2/base.html" %}
{% block content %}
{% include 'styleguide2/includes/organisms/layout/elections/navbar.html' with selected_item=page.get_menu_title %}
<main role="main">
{% include 'styleguide2/includes/organisms/header/elections/candidate_header.html' with title=page.title position=page.position perex=page.perex image=page.image email=page.email phone=page.phone social_links=page.social_links %}
{% if article_data_list %}
{% include 'styleguide2/includes/organisms/articles/elections/candidate_articles_section.html' with title=page.articles_heading %}
{% endif %}
{% if page.related_candidates %}
{% include 'styleguide2/includes/organisms/candidates/elections/candidate_footer_list.html' with candidates=page.related_candidates %}
{% endif %}
</main>
{% endblock %}
{% extends "styleguide2/home_page.html" %}
{% load wagtailcore_tags %}
{% block content %}
{% include 'styleguide2/includes/organisms/layout/elections/navbar.html' with is_transparent=True %}
<main role="main">
{% for block in page.content %}
{% include_block block %}
{% endfor %}
{% include "styleguide2/includes/organisms/main_section/newsletter_section.html" %}
</main>
{% endblock %}
{% extends 'patterns/atoms/header/navigation.html' %}
{% extends 'styleguide2/includes/atoms/header/navigation.html' %}
{% block classes %}
flex gap-3 text-black {{ classes }}
......
<div>
<h3
class="
hidden font-alt text-[3.5rem] mb-3
xl:block
"
>Kontakty</h3>
</div>
<div class="flex flex-col gap-2 text-lg">
{% if phone %}
<a href="tel:{{ phone }}" class="font-bold underline">
{{ phone }}
</a>
{% endif %}
{% if email %}
<a href="{{ email }}" class="font-bold underline">
{{ email }}
</a>
{% endif %}
<div class="flex flex-col pt-4 gap-3">
{% for social_link in social_links %}
<div class="flex items-center gap-2">
<i class="{{ social_link.value.icon }}"></i>
<a href="{{ social_link.value.link }}" class="underline">
{{ social_link.value.text }}
</a>
</div>
{% endfor %}
</div>
</div>
{% load wagtailimages_tags %}
<a
href="#"
class="
......@@ -8,17 +10,19 @@
lg:min-w-[24rem]
"
>
{% image candidate_page.image original as candidate_image %}
<img
class="w-3/5"
src="{{ image_source }}"
src="{{ candidate_image.url }}"
>
<div class="flex flex-col justify-end">
<h3
class="head-4xl group-hover:underline underline-offset-3"
>{{ name }}</h3>
>{{ candidate_page.title }}</h3>
<p class="!no-underline">
{{ position }}
{{ candidate_page.position }}
</p>
</div>
</a>
{% load wagtailimages_tags %}
<ui-candidate-primary-box
name="{{ name }}"
position="{{ position }}"
description="{{ description }}"
url="{{ url }}"
image-source="{{ image_source }}"
image-source="{{ candidate_image.url }}"
></ui-candidate-primary-box>
context:
image_source: '../../../../../static/images/mikulas-arrow.png'
name: 'Mikuláš Peksa'
position: 'Europoslanec'
......@@ -9,11 +9,11 @@
xl:py-24 xl:flex-row xl:gap-4
"
>
<h2 class="head-14xl head-compact">
{{ self.title }}
<h2 class="{% block heading_classes %}head-14xl head-compact{% endblock %}">
{% if not title %}{{ self.title }}{% else %}{{ title }}{% endif %}
</h2>
<p class="max-w-[350px] font-condensed text-xl">
{{ self.description }}
{% if not description %}{{ self.description }}{% else %}{{ description }}{% endif %}
</p>
</div>
......
{% extends 'patterns/organisms/articles/articles_section.html' %}
{% extends 'styleguide2/includes/organisms/articles/articles_section.html' %}
{% block wrapper_classes %}
bg-pirati-yellow text-black
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment