Skip to content
Snippets Groups Projects
Commit de4bd61e authored by OndraRehounek's avatar OndraRehounek
Browse files

district: Pirate center page

parent d63eb849
No related branches found
No related tags found
2 merge requests!418Release,!414district and region modules
Pipeline #6126 passed
Showing with 460 additions and 33 deletions
...@@ -5,10 +5,40 @@ from wagtail.core.blocks import ( ...@@ -5,10 +5,40 @@ from wagtail.core.blocks import (
PageChooserBlock, PageChooserBlock,
StructBlock, StructBlock,
TextBlock, TextBlock,
URLBlock,
) )
from wagtail.images.blocks import ImageChooserBlock from wagtail.images.blocks import ImageChooserBlock
class AddressBlock(StructBlock):
title = CharBlock(label="Titulek", required=True)
embed_map = URLBlock(
label="Odkaz na embed mapku",
required=False,
help_text="Hodnota 'src' v <iframe>",
)
address = TextBlock(label="Adresa", required=True)
address_info = TextBlock(label="Info k adrese", required=False)
class Meta:
template = "district/blocks/address_block.html"
icon = "home"
label = "Adresa"
class ContactBlock(StructBlock):
title = CharBlock(label="Titulek", required=True)
contact_list = ListBlock(
PageChooserBlock(label="Osoba", page_type=["district.DistrictPersonPage"]),
label="List kontaktů",
)
class Meta:
template = "district/blocks/contact_block.html"
icon = "mail"
label = "Kontakt"
class HomepageHeaderBlock(StructBlock): class HomepageHeaderBlock(StructBlock):
title = CharBlock(label="Titulek", required=True) title = CharBlock(label="Titulek", required=True)
subtitle = CharBlock(label="Podtitulek", required=False) subtitle = CharBlock(label="Podtitulek", required=False)
......
# Generated by Django 3.2.8 on 2021-11-18 11:40
import django.db.models.deletion
import wagtail.core.fields
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"),
("calendar_utils", "0002_auto_20200523_0243"),
("district", "0014_districthomepage_fallback_image"),
]
operations = [
migrations.AlterField(
model_name="districtarticlepage",
name="author_page",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="district.districtpersonpage",
),
),
migrations.CreateModel(
name="DistrictCenterPage",
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,
null=True,
verbose_name="URL kalendáře ve formátu iCal",
),
),
(
"perex",
models.TextField(blank=True, null=True, verbose_name="Perex"),
),
(
"text",
wagtail.core.fields.RichTextField(null=True, verbose_name="Text"),
),
(
"background_photo",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="wagtailimages.image",
),
),
(
"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": "Stránka pirátského centra",
},
bases=(
shared.models.SubpageMixin,
wagtailmetadata.models.WagtailImageMetadataMixin,
"wagtailcore.page",
models.Model,
),
),
]
# Generated by Django 3.2.8 on 2021-11-18 12:29
import wagtail.core.blocks
import wagtail.core.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("district", "0015_auto_20211118_1240"),
]
operations = [
migrations.AddField(
model_name="districtcenterpage",
name="sidebar_content",
field=wagtail.core.fields.StreamField(
[
(
"address",
wagtail.core.blocks.StructBlock(
[
(
"title",
wagtail.core.blocks.CharBlock(
label="Titulek", required=True
),
),
(
"embed_map",
wagtail.core.blocks.URLBlock(
label="Odkaz na embed mapku", required=False
),
),
(
"address",
wagtail.core.blocks.TextBlock(
label="Adresa", required=True
),
),
(
"address_info",
wagtail.core.blocks.TextBlock(
label="Info k adrese", required=False
),
),
]
),
),
(
"contact",
wagtail.core.blocks.StructBlock(
[
(
"title",
wagtail.core.blocks.CharBlock(
label="Titulek", required=True
),
),
(
"contact_list",
wagtail.core.blocks.ListBlock(
wagtail.core.blocks.PageChooserBlock(
label="Osoba",
page_type=["district.DistrictPersonPage"],
),
label="List kontaktů",
),
),
]
),
),
],
blank=True,
verbose_name="Obsah bočního panelu",
),
),
]
...@@ -23,6 +23,8 @@ from shared.models import ArticleMixin, Person, SubpageMixin ...@@ -23,6 +23,8 @@ from shared.models import ArticleMixin, Person, SubpageMixin
from uniweb.constants import RICH_TEXT_FEATURES from uniweb.constants import RICH_TEXT_FEATURES
from .blocks import ( from .blocks import (
AddressBlock,
ContactBlock,
HomepageHeaderBlock, HomepageHeaderBlock,
PeopleGroupListBlock, PeopleGroupListBlock,
RedmineProgramBlock, RedmineProgramBlock,
...@@ -151,6 +153,7 @@ class DistrictHomePage(MetadataPageMixin, CalendarMixin, Page): ...@@ -151,6 +153,7 @@ class DistrictHomePage(MetadataPageMixin, CalendarMixin, Page):
subpage_types = [ subpage_types = [
"district.DistrictArticlesPage", "district.DistrictArticlesPage",
"district.DistrictCenterPage",
"district.DistrictContactPage", "district.DistrictContactPage",
"district.DistrictPeoplePage", "district.DistrictPeoplePage",
"district.DistrictProgramPage", "district.DistrictProgramPage",
...@@ -565,3 +568,57 @@ class DistrictProgramPage(SubpageMixin, MetadataPageMixin, Page): ...@@ -565,3 +568,57 @@ class DistrictProgramPage(SubpageMixin, MetadataPageMixin, Page):
class Meta: class Meta:
verbose_name = "Program" verbose_name = "Program"
class DistrictCenterPage(CalendarMixin, SubpageMixin, MetadataPageMixin, Page):
### FIELDS
perex = models.TextField("Perex", blank=True, null=True)
background_photo = models.ForeignKey(
"wagtailimages.Image",
on_delete=models.PROTECT,
blank=True,
null=True,
related_name="+",
)
text = RichTextField("Text", null=True)
sidebar_content = StreamField(
[("address", AddressBlock()), ("contact", ContactBlock())],
verbose_name="Obsah bočního panelu",
blank=True,
)
### PANELS
content_panels = Page.content_panels + [
FieldPanel("perex"),
ImageChooserPanel("background_photo"),
FieldPanel("text"),
FieldPanel("calendar_url"),
StreamFieldPanel("sidebar_content"),
]
### RELATIONS
parent_page_types = ["district.DistrictHomePage"]
subpage_types = []
### OTHERS
class Meta:
verbose_name = "Stránka pirátského centra"
def get_background_photo(self):
"""
Vrací background_photo pro pozadí na stránce, pokud není nastaveno,
vezme falbback z homepage
"""
return (
self.background_photo
if self.background_photo
else self.root_page.fallback_image
)
@property
def has_calendar(self):
return self.calendar_id is not None
<h2 class="head-heavy-sm mb-2">
{{ self.title }}
</h2>
<iframe
src="{{ self.embed_map }}"
width="100%" height="300" id="mapa-mobile" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false"
tabindex="0"
></iframe>
<p>
{{ self.address | linebreaks }}
</p>
{% if self.address_info %}
<p>
<small>
{{ self.address_info }}
</small>
</p>
{% endif %}
<h2 class="head-heavy-sm mb-2">
{{ self.title }}
</h2>
{% for person_page in self.contact_list %}
{% include "shared/person_badge_snippet.html" %}
{% endfor %}
{% extends "district/base.html" %}
{% load wagtailcore_tags wagtailimages_tags shared_filters %}
{% block subheader %}
{% image page.get_background_photo width-1920 as bg_img %}
<aside class="hero hero--image py-16 " style="--image-url: url({{ bg_img.url }})">
<div class="container container--default">
<h1 class="head-alt-md md:head-alt-lg max-w-2xl">
{{ page.title }}
</h1>
<h2 class="head-xs mt-2">
{{ page.subtitle }}
</h2>
</div>
</aside>
{% endblock %}
{% block content %}
<div class="container container--default pt-8 lg:pb-16">
<article>
<div class="lg:flex lg:space-x-8 xl:space-x-16">
<div class="lg:w-3/5 xl:w-2/3">
<div class="content-block">
{{ page.text | richtext }}
</div>
{% include "district/include/small_calendar_snippet.html" %}
</div>
<div class="pt-8 lg:w-2/5 xl:w-1/3 lg:pt-0">
<div class="lg:card lg:elevation-10">
<div class="lg:card__body">
<div class="content-block">
{% for block in page.sidebar_content %}
{% include_block block %}
{% if not forloop.last %}
<hr>
{% endif %}
{% endfor %}
</div>
</div>
</div>
{% include "shared/followus_snippet_column.html" %}
</div>
</div>
</article>
</div>
{% endblock %}
{% if page.has_calendar %}
<h2 class="head-heavy-sm mb-4 mt-4">
Kalendář akcí
</h2>
<div class="mb-4">
{% for event in page.root_page.calendar.current_events %}
<div class="grid grid-cols-12 items-center calendar-table-row calendar-table-row--standalone">
<div class="col-span-2 text-orange-300 head-alt-md calendar-table-row__col">
<span>{{ event.begin|date:"j." }}</span>
</div>
<div class="col-span-8 grid grid-cols-3 calendar-table-row__col">
<div class="col-span-3 md:col-span-1">
<strong class="block">{{ event.begin|date:"l j. E"|capfirst }}</strong>
<p class="font-light text-sm mt-1">{{ event.duration }}</p></div>
<div class="col-span-3 md:col-span-2 mt-4 md:mt-0">
<span class="font-bold block">
{{ event.name }}
</span>
{% if event.description %}
<p class="font-light text-sm mt-1">{{ event.description | safe }}</p>
{% endif %}
</div>
</div>
<div class="col-span-2 text-center font-light calendar-table-row__col">
{% if event.location and 'jitsi.pirati' in event.location %}
<a href="{{ event.location }}" class="icon-link">
<i aria-hidden="true" class="ico--link text-violet-300 mr-1"></i>
<span>Jitsi URL</span>
</a>
{% elif event.location %}
<a href="https://maps.google.com/maps?q={{ event.location }}" class="icon-link">
<i aria-hidden="true" class="ico--location text-violet-300 mr-1"></i>
<span>Mapa</span>
</a>
{% endif %}
</div>
</div>
{% empty %}
<div class="content-block">
<p>Žádné události.</p>
</div>
{% endfor %}
</div>
{# <button class="btn btn--icon btn--orange-300 btn--hoveractive btn--fullwidth md:btn--autowidth">#}
{# <div class="btn__body-wrap">#}
{# <div class="btn__body ">Další akce</div>#}
{# <div class="btn__icon ">#}
{# <i class="ico--chevron-right"></i>#}
{# </div>#}
{# </div>#}
{# </button> TODO? #}
{% endif %}
<div class="container container--default"> <div class="container container--default">
{% if page.root_page.has_calendar %} {% if page.root_page.has_calendar %}
<div class="calendar grid grid-cols-4">
<div class="col-span-4 xl:col-span-1">
<aside class="banner bg-orange-300 text-white h-full"><i class="ico--calendar banner__icon"></i>
<div class="banner__body"><h1 class="head-alt-md banner__cta">Kalendář</h1>
<button class="btn btn--white btn--fullwidth sm:btn--autowidth mt-8">
<div class="btn__body">Zobrazit další</div>
</button>
</div>
</aside>
</div>
<div class="col-span-4 xl:col-span-3">
{% for event in page.root_page.calendar.current_events %} {% for event in page.root_page.calendar.current_events %}
<div class="grid grid-cols-12 items-center calendar-table-row calendar-table-row--standalone"> <div class="grid grid-cols-12 items-center calendar-table-row">
<div class="col-span-2 text-blue-200 head-alt-md calendar-table-row__col"> <div class="col-span-2 text-orange-300 head-alt-md calendar-table-row__col">
<span>{{ event.begin|date:"j." }}</span> <span>{{ event.begin|date:"j." }}</span>
</div> </div>
<div class="col-span-8 grid grid-cols-3 calendar-table-row__col"> <div class="col-span-8 grid grid-cols-3 col-gap-4 calendar-table-row__col calendar-table-row__col--norborder">
<div class="col-span-3 md:col-span-1"> <div class="col-span-3 md:col-span-1">
<strong class="block">{{ event.begin|date:"l j. E"|capfirst }}</strong> <strong class="block">{{ event.begin|date:"l j. E"|capfirst }}</strong>
<p class="font-light text-sm mt-1">{{ event.duration }}</p> <p class="font-light text-sm mt-1">{{ event.duration }}</p></div>
</div>
<div class="col-span-3 md:col-span-2 mt-4 md:mt-0"> <div class="col-span-3 md:col-span-2 mt-4 md:mt-0">
<strong class="block">{{ event.name }}</strong> <span class="font-bold block">
{{ event.name }}
</span>
{% if event.description %} {% if event.description %}
<p class="font-light text-sm mt-1">{{ event.description | safe }}</p> <p class="font-light text-sm mt-1">{{ event.description | safe }}</p>
{% endif %} {% endif %}
{% if event.location %}
<p class="font-light text-sm mt-1">{{ event.location }}</p>
{% endif %}
</div> </div>
</div> </div>
<div class="col-span-2 text-center font-light calendar-table-row__col"> <div class="col-span-2 text-center font-light calendar-table-row__col">
{% if event.location %} {% if event.location and 'jitsi.pirati' in event.location %}
<a href="{{ event.location }}" class="icon-link">
<i aria-hidden="true" class="ico--link text-violet-300 mr-1"></i>
{# <i aria-hidden="true" class="ico--jitsi text-violet-300 mr-1"></i> TODO requires latest styleguide version #}
<span>Jitsi URL</span>
</a>
{% elif event.location %}
<a href="https://maps.google.com/maps?q={{ event.location }}" class="icon-link"> <a href="https://maps.google.com/maps?q={{ event.location }}" class="icon-link">
<i class="ico--location text-violet-300 mr-1" aria-hidden="true"></i> <i aria-hidden="true" class="ico--location text-violet-300 mr-1"></i>
<span>Mapa</span> <span>Mapa</span>
</a> </a>
{% endif %} {% endif %}
...@@ -34,6 +49,8 @@ ...@@ -34,6 +49,8 @@
<p>Žádné události.</p> <p>Žádné události.</p>
</div> </div>
{% endfor %} {% endfor %}
</div>
</div>
{% else %} {% else %}
<div class="content-block"> <div class="content-block">
<p>Žádné události.</p> <p>Žádné události.</p>
......
<div class="flex flex-col lg:flex-row lg:space-x-8"> <div class="flex flex-col lg:flex-row lg:space-x-8">
<a href="{{ page.facebook }}" <a href="{% firstof page.facebook page.root_page.facebook %}"
class="super-button bg-brands-facebook text-white container-padding--zero lg:container-padding--auto lg:w-1/2 m-2"> class="super-button bg-brands-facebook text-white container-padding--zero lg:container-padding--auto lg:w-1/2 m-2">
<span class="super-button__body">Sledujte nás na Facebooku</span> <span class="super-button__body">Sledujte nás na Facebooku</span>
<i class="super-button__icon ico--facebook"></i> <i class="super-button__icon ico--facebook"></i>
</a> </a>
<a href="{{ page.forum }}" <a href="{% firstof page.forum page.root_page.forum %}"
class="super-button bg-black text-white container-padding--zero lg:container-padding--auto lg:w-1/2 m-2"> class="super-button bg-black text-white container-padding--zero lg:container-padding--auto lg:w-1/2 m-2">
<span class="super-button__body">Sledujte naše fórum</span> <span class="super-button__body">Sledujte naše fórum</span>
<i class="super-button__icon ico--bubbles"></i> <i class="super-button__icon ico--bubbles"></i>
......
<div class="flex flex-col">
<a href="{% firstof page.facebook page.root_page.facebook %}"
class="super-button bg-brands-facebook text-white container-padding--zero lg:container-padding--auto m-2">
<span class="super-button__body">Sledujte nás na Facebooku</span>
<i class="super-button__icon ico--facebook"></i>
</a>
<a href="{% firstof page.forum page.root_page.forum %}"
class="super-button bg-black text-white container-padding--zero lg:container-padding--auto m-2">
<span class="super-button__body">Sledujte naše fórum</span>
<i class="super-button__icon ico--bubbles"></i>
</a>
</div>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment