Merge remote-tracking branch 'origin/master' into pro-salute
This commit is contained in:
commit
d24fcd7d86
14 changed files with 210 additions and 7 deletions
|
@ -1,3 +1,8 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
Please see [Pull Request history](https://github.com/datalets/public-health-ch/pulls?q=is%3Apr+is%3Aclosed) on GitHub.
|
Please see [Pull Request history](https://github.com/datalets/public-health-ch/pulls?q=is%3Apr+is%3Aclosed) on GitHub.
|
||||||
|
|
||||||
|
## 2.0.0 - 2022-07-12
|
||||||
|
|
||||||
|
- 10694: Introduce table block to show program details
|
||||||
|
- 10695: Add a header image to the article index template
|
||||||
|
|
18
feedler/migrations/0009_entry_expire_at.py
Normal file
18
feedler/migrations/0009_entry_expire_at.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.2.13 on 2022-05-03 10:09
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('feedler', '0008_auto_20171117_1647'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='entry',
|
||||||
|
name='expire_at',
|
||||||
|
field=models.DateTimeField(blank=True, null=True, verbose_name='expiry date/time'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,9 +1,10 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import datetime
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import translation
|
from django.utils import translation
|
||||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from wagtail.core.models import Page, Orderable
|
from wagtail.core.models import Page, Orderable
|
||||||
from wagtail.admin.edit_handlers import FieldPanel
|
from wagtail.admin.edit_handlers import FieldPanel
|
||||||
from wagtail.core.fields import RichTextField
|
from wagtail.core.fields import RichTextField
|
||||||
|
@ -39,6 +40,11 @@ class Entry(models.Model):
|
||||||
lang = models.CharField(max_length=2, blank=True, default='', choices=LANGUAGE_CHOICES)
|
lang = models.CharField(max_length=2, blank=True, default='', choices=LANGUAGE_CHOICES)
|
||||||
content = models.TextField()
|
content = models.TextField()
|
||||||
tags = models.TextField(blank=True)
|
tags = models.TextField(blank=True)
|
||||||
|
expire_at = models.DateTimeField(
|
||||||
|
verbose_name=_("expiry date/time"),
|
||||||
|
blank=True,
|
||||||
|
null=True
|
||||||
|
)
|
||||||
|
|
||||||
stream = models.ForeignKey(Stream,
|
stream = models.ForeignKey(Stream,
|
||||||
blank=False, on_delete=models.CASCADE,
|
blank=False, on_delete=models.CASCADE,
|
||||||
|
@ -68,7 +74,9 @@ class FeedPage(Page):
|
||||||
@property
|
@property
|
||||||
def feedentries(self):
|
def feedentries(self):
|
||||||
if self.stream:
|
if self.stream:
|
||||||
entries = Entry.objects.filter(stream=self.stream)
|
entries = Entry.objects.filter(stream=self.stream).filter(
|
||||||
|
models.Q(expire_at__isnull=True) | models.Q(expire_at__gt=datetime.datetime.now())
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
entries = Entry.objects.all()
|
entries = Entry.objects.all()
|
||||||
# Filter out by chosen language
|
# Filter out by chosen language
|
||||||
|
|
37
publichealth/home/migrations/0034_auto_20220714_1145.py
Normal file
37
publichealth/home/migrations/0034_auto_20220714_1145.py
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# Generated by Django 3.2.13 on 2022-07-14 09:45
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import wagtail.contrib.table_block.blocks
|
||||||
|
import wagtail.core.fields
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('wagtailimages', '0023_add_choose_permissions'),
|
||||||
|
('home', '0033_auto_20220207_0731'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='articleindexpage',
|
||||||
|
name='header_image',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='articleindexpage',
|
||||||
|
name='table_de',
|
||||||
|
field=wagtail.core.fields.StreamField([('table_de', wagtail.contrib.table_block.blocks.TableBlock(template='home/program_table.html'))], blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='articleindexpage',
|
||||||
|
name='table_en',
|
||||||
|
field=wagtail.core.fields.StreamField([('table_en', wagtail.contrib.table_block.blocks.TableBlock(template='home/program_table.html'))], blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='articleindexpage',
|
||||||
|
name='table_fr',
|
||||||
|
field=wagtail.core.fields.StreamField([('table_fr', wagtail.contrib.table_block.blocks.TableBlock(template='home/program_table.html'))], blank=True, null=True),
|
||||||
|
),
|
||||||
|
]
|
|
@ -2,3 +2,4 @@ from .forms import *
|
||||||
from .models import *
|
from .models import *
|
||||||
from .snippets import *
|
from .snippets import *
|
||||||
from .admin import *
|
from .admin import *
|
||||||
|
from .image_formats import *
|
||||||
|
|
17
publichealth/home/models/image_formats.py
Normal file
17
publichealth/home/models/image_formats.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# image_formats.py
|
||||||
|
from django.utils.html import format_html
|
||||||
|
from wagtail.images.formats import Format, register_image_format
|
||||||
|
|
||||||
|
|
||||||
|
class OriginalImageFormat(Format):
|
||||||
|
|
||||||
|
def image_to_html(self, image, alt_text, extra_attributes=None):
|
||||||
|
|
||||||
|
default_html = super().image_to_html(image, alt_text, extra_attributes)
|
||||||
|
|
||||||
|
return format_html("{}", default_html, alt_text)
|
||||||
|
|
||||||
|
|
||||||
|
register_image_format(
|
||||||
|
OriginalImageFormat('original_fullwidth', 'Original image', 'bodytext-image', 'original')
|
||||||
|
)
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import translation
|
from django.utils import translation
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -15,6 +17,7 @@ from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel, InlinePane
|
||||||
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 wagtail.search import index
|
from wagtail.search import index
|
||||||
|
from wagtail.contrib.table_block.blocks import TableBlock
|
||||||
|
|
||||||
from puput.models import EntryPage, BlogPage
|
from puput.models import EntryPage, BlogPage
|
||||||
from feedler.models import Entry, Stream
|
from feedler.models import Entry, Stream
|
||||||
|
@ -38,6 +41,13 @@ class ArticleIndexPage(Page):
|
||||||
'title_en',
|
'title_en',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
header_image = models.ForeignKey(
|
||||||
|
'wagtailimages.Image',
|
||||||
|
null=True, blank=True,
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
related_name='+'
|
||||||
|
)
|
||||||
|
|
||||||
intro_de = RichTextField(default='', blank=True)
|
intro_de = RichTextField(default='', blank=True)
|
||||||
intro_fr = RichTextField(default='', blank=True)
|
intro_fr = RichTextField(default='', blank=True)
|
||||||
intro_en = RichTextField(default='', blank=True)
|
intro_en = RichTextField(default='', blank=True)
|
||||||
|
@ -47,6 +57,34 @@ class ArticleIndexPage(Page):
|
||||||
'intro_en',
|
'intro_en',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
table_en = StreamField(
|
||||||
|
[
|
||||||
|
('table_en', TableBlock(template='home/program_table.html'))
|
||||||
|
],
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
table_de = StreamField(
|
||||||
|
[
|
||||||
|
('table_de', TableBlock(template='home/program_table.html'))
|
||||||
|
],
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
table_fr = StreamField(
|
||||||
|
[
|
||||||
|
('table_fr', TableBlock(template='home/program_table.html'))
|
||||||
|
],
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
trans_table = TranslatedField(
|
||||||
|
'table_de',
|
||||||
|
'table_fr',
|
||||||
|
'table_en',
|
||||||
|
)
|
||||||
|
|
||||||
subscribe_label_de = models.CharField("Button Label (de)", default='', blank=True, max_length=250)
|
subscribe_label_de = models.CharField("Button Label (de)", default='', blank=True, max_length=250)
|
||||||
subscribe_label_fr = models.CharField("Button Label (fr)", default='', blank=True, max_length=250)
|
subscribe_label_fr = models.CharField("Button Label (fr)", default='', blank=True, max_length=250)
|
||||||
subscribe_label_en = models.CharField("Button Label (en)", default='', blank=True, max_length=250)
|
subscribe_label_en = models.CharField("Button Label (en)", default='', blank=True, max_length=250)
|
||||||
|
@ -71,6 +109,10 @@ class ArticleIndexPage(Page):
|
||||||
FieldPanel('intro_fr'),
|
FieldPanel('intro_fr'),
|
||||||
FieldPanel('title_en'),
|
FieldPanel('title_en'),
|
||||||
FieldPanel('intro_en'),
|
FieldPanel('intro_en'),
|
||||||
|
ImageChooserPanel('header_image'),
|
||||||
|
FieldPanel('table_en'),
|
||||||
|
FieldPanel('table_fr'),
|
||||||
|
FieldPanel('table_de'),
|
||||||
ImageChooserPanel('feed_image'),
|
ImageChooserPanel('feed_image'),
|
||||||
MultiFieldPanel(
|
MultiFieldPanel(
|
||||||
[
|
[
|
||||||
|
@ -320,7 +362,9 @@ class HomePage(Page):
|
||||||
@property
|
@property
|
||||||
def newsentries(self):
|
def newsentries(self):
|
||||||
# Get the last few news entries for the home page
|
# Get the last few news entries for the home page
|
||||||
entries = Entry.objects.all().order_by('-published')
|
entries = Entry.objects.filter(
|
||||||
|
models.Q(expire_at__isnull=True) | models.Q(expire_at__gt=datetime.datetime.now())
|
||||||
|
).all().order_by('-published')
|
||||||
# Filter out by current language
|
# Filter out by current language
|
||||||
curlang = translation.get_language()
|
curlang = translation.get_language()
|
||||||
if curlang in ['de']:
|
if curlang in ['de']:
|
||||||
|
|
|
@ -16,7 +16,18 @@
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
{% if page.header_image %}
|
||||||
|
{% image page.header_image fill-1908x400 as img %}
|
||||||
|
<div id="carousel-banner" class="slide">
|
||||||
|
<div class="carousel-inner slick slick-initialized slick-slider" role="listbox">
|
||||||
|
|
||||||
|
<div class="slick-list draggable" tabindex="0"><div class="slick-track" style="opacity: 1; width: 1908px;"><div class="item slick-slide slick-active" data-slick-index="0" style="width: 1908px; position: relative; left: 0px; top: 0px; z-index: 900; opacity: 1;">
|
||||||
|
<img style="background-image:url({{img.url}})">
|
||||||
|
</div></div></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
<section id="article-index" class="article-index-page">
|
<section id="article-index" class="article-index-page">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h2>{{ page.trans_title }}</h2>
|
<h2>{{ page.trans_title }}</h2>
|
||||||
|
@ -34,6 +45,14 @@
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Table content -->
|
||||||
|
<div class="article-table table-program" role="main">
|
||||||
|
{% for block in page.trans_table %}
|
||||||
|
{% if block.block_type == 'table_en' or block.block_type == 'table_fr' or block.block_type == 'table_de' %}
|
||||||
|
{% include_block block %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
</div><!-- /container -->
|
</div><!-- /container -->
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
53
publichealth/home/templates/home/program_table.html
Normal file
53
publichealth/home/templates/home/program_table.html
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<style>
|
||||||
|
.table-program td, th {
|
||||||
|
padding: 0 10px !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<table class="table-program">
|
||||||
|
{% if table_header %}
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
{% for column in table_header %}
|
||||||
|
<th>
|
||||||
|
{% if column.strip %}
|
||||||
|
{% if html_renderer %}
|
||||||
|
{{ column.strip|safe|linebreaksbr }}
|
||||||
|
{% else %}
|
||||||
|
{{ column.strip|linebreaksbr }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{% endif %}
|
||||||
|
<tbody>
|
||||||
|
{% for row in data %}
|
||||||
|
<tr>
|
||||||
|
{% for column in row %}
|
||||||
|
{% if first_col_is_header and forloop.first %}
|
||||||
|
<th>
|
||||||
|
{% if column.strip %}
|
||||||
|
{% if html_renderer %}
|
||||||
|
{{ column.strip|safe|linebreaksbr }}
|
||||||
|
{% else %}
|
||||||
|
{{ column.strip|linebreaksbr }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</th>
|
||||||
|
{% else %}
|
||||||
|
<td>
|
||||||
|
{% if column.strip %}
|
||||||
|
{% if html_renderer %}
|
||||||
|
{{ column.strip|safe|linebreaksbr }}
|
||||||
|
{% else %}
|
||||||
|
{{ column.strip|linebreaksbr }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
|
@ -3,6 +3,6 @@
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<!--<li><a href="{% pageurl parent %}">{{ parent.title }}</a></li>-->
|
<!--<li><a href="{% pageurl parent %}">{{ parent.title }}</a></li>-->
|
||||||
{% for child in menuitems_children %}
|
{% for child in menuitems_children %}
|
||||||
<li><a href="{% pageurl child %}">{{ child.title|title }}</a></li>
|
<li><a href="{% pageurl child %}">{{ child.title }}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -78,7 +78,7 @@ def menuitems_children(parent):
|
||||||
for menuitem in menuitems_children:
|
for menuitem in menuitems_children:
|
||||||
try:
|
try:
|
||||||
if type(menuitem) == ContactForm:
|
if type(menuitem) == ContactForm:
|
||||||
menuitem.title = menuitem.title.title()
|
menuitem.title = menuitem.title
|
||||||
else:
|
else:
|
||||||
menuitem.title = menuitem.trans_title
|
menuitem.title = menuitem.trans_title
|
||||||
if 'devenez' in menuitem.title.lower() and remove_devenez:
|
if 'devenez' in menuitem.title.lower() and remove_devenez:
|
||||||
|
|
|
@ -44,6 +44,7 @@ INSTALLED_APPS = [
|
||||||
'wagtail.contrib.redirects',
|
'wagtail.contrib.redirects',
|
||||||
'wagtail.contrib.search_promotions',
|
'wagtail.contrib.search_promotions',
|
||||||
"wagtail.contrib.legacy.richtext",
|
"wagtail.contrib.legacy.richtext",
|
||||||
|
'wagtail.contrib.table_block',
|
||||||
|
|
||||||
'wagtail.embeds',
|
'wagtail.embeds',
|
||||||
'wagtail.sites',
|
'wagtail.sites',
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
// Language menu hack, until this is configurable
|
// Language menu hack, until this is configurable
|
||||||
nav .language-nav a[lang='en'] { display: inline; }
|
nav .language-nav a[lang='en'] { display: inline; }
|
||||||
|
|
||||||
#footer, .contact-nav .link { display: none; }
|
//#footer, .contact-nav .link { display: none; }
|
||||||
|
|
||||||
a.navbar-brand {
|
a.navbar-brand {
|
||||||
height: 60px;
|
height: 60px;
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
<div class="copyright">
|
<div class="copyright">
|
||||||
{% contact_name the_site=the_site %}
|
{% contact_name the_site=the_site %}
|
||||||
© 2020
|
© 2022
|
||||||
• <a href="https://public-health.ch/privacy/">Privacy</a>
|
• <a href="https://public-health.ch/privacy/">Privacy</a>
|
||||||
• <a href="https://public-health.ch/impressum/">Impressum</a>
|
• <a href="https://public-health.ch/impressum/">Impressum</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue