Skip to content
Snippets Groups Projects
Commit 402a632a authored by jan.bednarik's avatar jan.bednarik
Browse files

senat campaign: Calendar

parent 969f4580
No related branches found
No related tags found
1 merge request!11Calendar
Pipeline #580 failed
...@@ -36,6 +36,20 @@ jako přehled pluginů a rozšíření pro Wagtail. ...@@ -36,6 +36,20 @@ jako přehled pluginů a rozšíření pro Wagtail.
Appky v sobě mají modely pro stránky a statické soubory a templaty. Momentálně se Appky v sobě mají modely pro stránky a statické soubory a templaty. Momentálně se
mezi weby nic z toho nesdílí. mezi weby nic z toho nesdílí.
### Kalendáře
Pro práci s kalendáři v iCal formátu je připravena appka `calendar_utils`.
Poskytuje `CalendarMixin` do modelu, který přidá fieldy `calendar_url` pro
editaci a `calendar` pro vazbu na model `Calendar` (který se plní a automaticky
spravuje na pozadí). Typicky se použije ve Wagtail settings pro web, kde stačí
`calendar_url` zpřístupnit pro editaci.
Kalendář se stáhne při uložení modelu obsahujícího `CalendarMixin`.
Appka přidává management command `update_callendars`, který stahuje a updatuje
kalendáře. Je třeba ho pravidelně volat na pozadí (přes CRON).
## Deployment ## Deployment
### Konfigurace ### Konfigurace
......
# Generated by Django 3.0.6 on 2020-05-23 00:41
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("calendar_utils", "0001_initial"),
("senat_campaign", "0002_senatcampaignwebsettings_matomo_id"),
]
operations = [
migrations.AddField(
model_name="senatcampaignwebsettings",
name="calendar",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.PROTECT,
to="calendar_utils.Calendar",
),
),
migrations.AddField(
model_name="senatcampaignwebsettings",
name="calendar_url",
field=models.URLField(
blank=True, null=True, verbose_name="URL kalendáře ve formátu iCal"
),
),
]
...@@ -13,6 +13,8 @@ from wagtail.documents.blocks import DocumentChooserBlock ...@@ -13,6 +13,8 @@ from wagtail.documents.blocks import DocumentChooserBlock
from wagtail.images.blocks import ImageChooserBlock from wagtail.images.blocks import ImageChooserBlock
from wagtail.images.edit_handlers import ImageChooserPanel from wagtail.images.edit_handlers import ImageChooserPanel
from calendar_utils.models import CalendarMixin
class SenatCampaignHomePage(Page): class SenatCampaignHomePage(Page):
# top section # top section
...@@ -81,7 +83,7 @@ class SenatCampaignHomePage(Page): ...@@ -81,7 +83,7 @@ class SenatCampaignHomePage(Page):
is_home = True is_home = True
class Meta: class Meta:
verbose_name = f"Senát kampaň" verbose_name = "Senát kampaň"
def get_context(self, request): def get_context(self, request):
context = super().get_context(request) context = super().get_context(request)
...@@ -128,7 +130,7 @@ class SenatCampaignNewsIndexPage(Page): ...@@ -128,7 +130,7 @@ class SenatCampaignNewsIndexPage(Page):
is_home = False is_home = False
class Meta: class Meta:
verbose_name = f"Aktuality" verbose_name = "Aktuality"
def get_context(self, request): def get_context(self, request):
context = super().get_context(request) context = super().get_context(request)
...@@ -163,7 +165,7 @@ class SenatCampaignNewsPage(Page): ...@@ -163,7 +165,7 @@ class SenatCampaignNewsPage(Page):
is_home = False is_home = False
class Meta: class Meta:
verbose_name = f"Aktualita" verbose_name = "Aktualita"
def get_context(self, request): def get_context(self, request):
context = super().get_context(request) context = super().get_context(request)
...@@ -208,7 +210,7 @@ class SenatCampaignProgramPage(Page): ...@@ -208,7 +210,7 @@ class SenatCampaignProgramPage(Page):
is_home = False is_home = False
class Meta: class Meta:
verbose_name = f"Program" verbose_name = "Program"
class SenatCampaignCookiesPage(Page): class SenatCampaignCookiesPage(Page):
...@@ -225,7 +227,7 @@ class SenatCampaignCookiesPage(Page): ...@@ -225,7 +227,7 @@ class SenatCampaignCookiesPage(Page):
is_home = False is_home = False
class Meta: class Meta:
verbose_name = f"Cookies" verbose_name = "Cookies"
class ContactBlock(blocks.StructBlock): class ContactBlock(blocks.StructBlock):
...@@ -241,7 +243,7 @@ class ContactBlock(blocks.StructBlock): ...@@ -241,7 +243,7 @@ class ContactBlock(blocks.StructBlock):
@register_setting @register_setting
class SenatCampaignWebSettings(BaseSetting): class SenatCampaignWebSettings(BaseSetting, CalendarMixin):
first_name = models.CharField("jméno kandidáta", max_length=250) first_name = models.CharField("jméno kandidáta", max_length=250)
last_name = models.CharField("příjmení kandidáta", max_length=250) last_name = models.CharField("příjmení kandidáta", max_length=250)
facebook = models.URLField("Facebook URL", blank=True, null=True) facebook = models.URLField("Facebook URL", blank=True, null=True)
...@@ -255,13 +257,13 @@ class SenatCampaignWebSettings(BaseSetting): ...@@ -255,13 +257,13 @@ class SenatCampaignWebSettings(BaseSetting):
"Matomo ID pro sledování návštěvnosti", blank=True, null=True "Matomo ID pro sledování návštěvnosti", blank=True, null=True
) )
# TODO Matomo
# TODO donations # TODO donations
first_tab_panels = [ first_tab_panels = [
FieldPanel("first_name"), FieldPanel("first_name"),
FieldPanel("last_name"), FieldPanel("last_name"),
FieldPanel("matomo_id"), FieldPanel("matomo_id"),
FieldPanel("calendar_url"),
] ]
second_tab_panels = [ second_tab_panels = [
...@@ -283,8 +285,10 @@ class SenatCampaignWebSettings(BaseSetting): ...@@ -283,8 +285,10 @@ class SenatCampaignWebSettings(BaseSetting):
] ]
) )
select_related = ["calendar"]
class Meta: class Meta:
verbose_name = f"Senát kampaň" verbose_name = "Senát kampaň"
@property @property
def full_name(self): def full_name(self):
...@@ -299,9 +303,8 @@ class SenatCampaignWebSettings(BaseSetting): ...@@ -299,9 +303,8 @@ class SenatCampaignWebSettings(BaseSetting):
return SenatCampaignNewsIndexPage.objects.in_site(self.site).live().exists() return SenatCampaignNewsIndexPage.objects.in_site(self.site).live().exists()
@property @property
def has_callendar(self): def has_calendar(self):
# TODO return self.calendar_id is not None
return False
@property @property
def has_donations(self): def has_donations(self):
......
...@@ -146,7 +146,7 @@ ...@@ -146,7 +146,7 @@
{% endif %} {% endif %}
</li> </li>
{% endif %} {% endif %}
{% if web_settings.has_callendar %} {% if web_settings.has_calendar %}
<li class="nav-item"> <li class="nav-item">
{% if page.is_home %} {% if page.is_home %}
<a class="nav-link js-scroll-anchor" href="#kalendar">Kalendář</a> <a class="nav-link js-scroll-anchor" href="#kalendar">Kalendář</a>
......
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>{{ event.begin|date:"d" }}.</h3>
</div>
<div class="calendar__row__date2">
<h6>{{ event.begin|date:"j.n.Y" }}</h6>
<p>{{ event.duration }}</p>
</div>
<div class="calendar__row__content">
<h6>{{ event.name }}</h6>
<p>{{ event.location }}</p>
</div>
</div><!-- /calendar__row -->
...@@ -151,7 +151,7 @@ ...@@ -151,7 +151,7 @@
{% if web_settings.has_news %} {% if web_settings.has_news %}
<section class="section--primary{% if web_settings.has_callendar %} section--no-bottom-padding{% endif %}" id="aktuality"> <section class="section--primary{% if web_settings.has_calendar %} section--no-bottom-padding{% endif %}" id="aktuality">
<div class="container"> <div class="container">
<h2 class="lead page-subheading mb-4">Aktuality</h2> <h2 class="lead page-subheading mb-4">Aktuality</h2>
...@@ -184,7 +184,7 @@ ...@@ -184,7 +184,7 @@
{% endif %} {% endif %}
{% if web_settings.has_callendar %} {% if web_settings.has_calendar %}
<section class="section--primary" id="kalendar"> <section class="section--primary" id="kalendar">
<div class="container"> <div class="container">
...@@ -201,95 +201,13 @@ ...@@ -201,95 +201,13 @@
</div><!-- /calendar__left --> </div><!-- /calendar__left -->
<div class="calendar__right"> <div class="calendar__right">
{% for event in web_settings.calendar.actual_events %}
<div class="calendar__row"> {% include "senat_campaign/calendar_event_snippet.html" %}
<div class="calendar__row__date1"> {% empty %}
<h3>18.</h3>
</div>
<div class="calendar__row__date2">
<h6>18.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content">
<h6>Rozdávání novin na vlakovém nádraží Beroun</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat volutpat.
</p>
</div>
</div><!-- /calendar__row -->
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>17.</h3>
</div>
<div class="calendar__row__date2">
<h6>17.4.2020</h6>
<p>13:00 - 17:00</p>
</div>
<div class="calendar__row__content"> <div class="calendar__row__content">
<h6>Stánkování Náměstí Republiky</h6> <p>Žádné události.</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. </p>
</div> </div>
</div><!-- /calendar__row --> {% endfor %}
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>16.</h3>
</div>
<div class="calendar__row__date2">
<h6>16.4.2020</h6>
<p>20:00 - 22:00</p>
</div>
<div class="calendar__row__content">
<h6>Posezení se senátorem</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat volutpat.
Maecenas sollicitudin. Aliquam erat volutpat.</p>
</div>
</div><!-- /calendar__row -->
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>15.</h3>
</div>
<div class="calendar__row__date2">
<h6>15.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content">
<h6>Pivobraní Mikulovice náměstí</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat volutpat.
</p>
</div>
</div><!-- /calendar__row -->
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>14.</h3>
</div>
<div class="calendar__row__date2">
<h6>14.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content">
<h6>Vinobraní na náměstí Chrudim</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat volutpat.
</p>
</div>
</div><!-- /calendar__row -->
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>13.</h3>
</div>
<div class="calendar__row__date2">
<h6>13.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content">
<h6>Stánkování na farmářských trzích Bohnice</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat volutpat.
</p>
</div>
</div><!-- /calendar__row -->
</div><!-- /calendar__right --> </div><!-- /calendar__right -->
...@@ -329,7 +247,7 @@ ...@@ -329,7 +247,7 @@
{% endif %} {% endif %}
{% if web_settings.has_callendar %} {% if web_settings.has_calendar %}
<!-- Calendar modal --> <!-- Calendar modal -->
<div class="modal fade calendar__modal" id="calendarModal" tabindex="-1" role="dialog" <div class="modal fade calendar__modal" id="calendarModal" tabindex="-1" role="dialog"
aria-labelledby="calendarModalTitle" aria-hidden="true"> aria-labelledby="calendarModalTitle" aria-hidden="true">
...@@ -359,122 +277,28 @@ ...@@ -359,122 +277,28 @@
aria-labelledby="upcomingEvents-tab"> aria-labelledby="upcomingEvents-tab">
<div class="calendar__right"> <div class="calendar__right">
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>18.</h3>
</div>
<div class="calendar__row__date2">
<h6>18.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content">
<h6>Rozdávání novin na vlakovém nádraží Beroun</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat
volutpat.
</p>
</div>
</div><!-- /calendar__row -->
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>17.</h3>
</div>
<div class="calendar__row__date2">
<h6>17.4.2020</h6>
<p>13:00 - 17:00</p>
</div>
<div class="calendar__row__content">
<h6>Stánkování Náměstí Republiky</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. </p>
</div>
</div><!-- /calendar__row -->
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>16.</h3>
</div>
<div class="calendar__row__date2">
<h6>16.4.2020</h6>
<p>20:00 - 22:00</p>
</div>
<div class="calendar__row__content">
<h6>Posezení se senátorem</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat
volutpat.
Maecenas sollicitudin. Aliquam erat volutpat.</p>
</div>
</div><!-- /calendar__row -->
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>15.</h3>
</div>
<div class="calendar__row__date2">
<h6>15.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content">
<h6>Pivobraní Mikulovice náměstí</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat
volutpat.
</p>
</div>
</div><!-- /calendar__row -->
<div class="calendar__row"> {% for event in web_settings.calendar.future_events %}
<div class="calendar__row__date1"> {% include "senat_campaign/calendar_event_snippet.html" %}
<h3>14.</h3> {% empty %}
</div>
<div class="calendar__row__date2">
<h6>14.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content"> <div class="calendar__row__content">
<h6>Vinobraní na náměstí Chrudim</h6> <p>Žádné události.</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat
volutpat.
</p>
</div> </div>
</div><!-- /calendar__row --> {% endfor %}
<div class="calendar__row">
<div class="calendar__row__date1">
<h3>13.</h3>
</div>
<div class="calendar__row__date2">
<h6>13.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content">
<h6>Stánkování na farmářských trzích Bohnice</h6>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat
volutpat.
</p>
</div>
</div><!-- /calendar__row -->
</div><!-- /calendar__right --> </div><!-- /calendar__right -->
</div><!-- /tab-pane --> </div><!-- /tab-pane -->
<div class="tab-pane fade" id="pastEvents" role="tabpanel" aria-labelledby="pastEvents-tab"> <div class="tab-pane fade" id="pastEvents" role="tabpanel" aria-labelledby="pastEvents-tab">
<div class="calendar__right"> <div class="calendar__right">
<div class="calendar__row"> {% for event in web_settings.calendar.past_events|slice:":10" %}
<div class="calendar__row__date1"> {% include "senat_campaign/calendar_event_snippet.html" %}
<h3>18.</h3> {% empty %}
</div>
<div class="calendar__row__date2">
<h6>18.4.2020</h6>
<p>celý den</p>
</div>
<div class="calendar__row__content"> <div class="calendar__row__content">
<h6>Rozdávání novin na vlakovém nádraží Beroun</h6> <p>Žádné události.</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sollicitudin. Aliquam erat
volutpat.
</p>
</div> </div>
</div><!-- /calendar__row --> {% endfor %}
</div><!-- /calendar__right --> </div><!-- /calendar__right -->
</div><!-- /tab-pane --> </div><!-- /tab-pane -->
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment