Compare commits

...

77 commits

Author SHA1 Message Date
PCoder
493626336f Translate sub menu item 2024-08-25 12:52:02 +05:30
f3ada439fa Merge pull request '12955-add-terms-link-footer' (#11) from 12955-add-terms-link-footer into master
Reviewed-on: #11
2024-07-19 14:43:53 +00:00
PCoder
b3b2a73fc9 Cleanup 2024-07-19 20:13:11 +05:30
PCoder
df467691b8 More reorganize 2024-07-19 20:09:23 +05:30
PCoder
2a6434e569 Simplify 2024-07-19 20:01:32 +05:30
PCoder
87332a9f05 Cleanup 2024-07-19 19:56:32 +05:30
PCoder
822fca63c3 Add add_item_to_page_queryset method 2024-07-19 16:21:47 +02:00
PCoder
9618ac0094 Cleanup and use correct page for EN 2024-07-19 17:50:38 +05:30
app
a7abe02784 Merging 2024-07-19 12:05:03 +00:00
app
454767b551 Fix footer menuitems translation 2024-07-19 11:58:23 +00:00
PCoder
99eb7c39fe Fix error instance 2024-07-19 16:20:19 +05:30
PCoder
780a4ce2d7 Fix bug footer menu items not translated 2024-07-19 14:04:15 +05:30
PCoder
31a0a6b060 Search hostname instead of site object 2024-07-19 14:03:53 +05:30
PCoder
a68dcb7574 Show terms and conditions link in the footer bottom 2024-07-19 13:38:15 +05:30
app
fc6f9e43a7 Merge remote-tracking branch 'origin/master' 2024-07-19 05:54:18 +00:00
PCoder
34ad67e8cd Add favicon-prosalute.ico 2024-06-17 17:37:28 +05:30
PCoder
cd99b1bc4f Check variable before accessing attribute 2024-06-04 17:07:38 +05:30
c5026ad0eb Merge pull request 'Dockerify pro-salute' (#10) from pro-salute into master
Reviewed-on: #10
2024-06-02 04:11:38 +00:00
PCoder
a3cdc6b58a Write DEBUG level logs to stdout 2024-05-31 19:09:01 +05:30
PCoder
b918903fcf Copy setup_libs.sh to /app 2024-05-31 19:08:30 +05:30
PCoder
5ba9ee52ea Create setup_libs.sh 2024-05-31 19:08:08 +05:30
PCoder
5c173f0ffb Revert back installing grunt-cli 2024-05-24 15:55:48 +05:30
PCoder
c88b94f20f Final changes 2024-05-23 17:05:21 +05:30
PCoder
c18fb883cc Revert back dev configuration 2024-05-22 22:25:54 +05:30
PCoder
d24fcd7d86 Merge remote-tracking branch 'origin/master' into pro-salute 2024-05-22 22:24:03 +05:30
PCoder
daf3a6baad Cleanup 2024-05-22 21:56:55 +05:30
PCoder
b5e786e098 Copy built static files to app 2024-05-22 21:55:41 +05:30
PCoder
c013387b03 Generate / copy staticfiles + node libraries 2024-05-22 21:55:04 +05:30
PCoder
aaf1fc1d9b Install yarn + tools 2024-05-22 21:52:23 +05:30
PCoder
1af8fe3767 Use RotatingFileHandler instead of ConcurrentLogHandler
Why?
  error: subprocess-exited-with-error

  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [1 lines of output]
      error in ConcurrentLogHandler setup command: use_2to3 is invalid.
      [end of output]

Looks like the module is incompatible with the latest setuptools. The recommended solution on the Internet seems to be to downgrade setuptools to 57.5.0 ;; however, this still does not solve the issue for my setup
2024-05-22 21:50:56 +05:30
PCoder
0e0b464534 Add django-configurations requirement 2024-05-22 16:53:37 +05:30
PCoder
9863959d88 Add feedler module to the app folder 2024-05-17 19:06:50 +05:30
PCoder
6e835a10e6 Fix required changes 2024-05-15 11:01:32 +05:30
M.Ravi
4099b039f5 Add Dockerfile 2024-05-15 04:04:32 +00:00
M.Ravi
53ae04404b Changes on the nations server 2024-05-15 01:44:31 +00:00
app
e4a1cf5a77 Add migration 2023-05-16 11:49:32 +00:00
app
fdfebf783e Converting richtext stream to str 2023-05-16 11:49:02 +00:00
PCoder
fc03ea5927 Add richtext as a block 2023-05-16 16:11:05 +05:30
app
713f9ca9e3 Working version of adding html_content 2023-05-16 10:30:01 +00:00
app
0289586811 Add custom_filters : ph_html_decode 2023-05-16 10:28:45 +00:00
app
a7fdf769c4 Add migration home.0036_auto_20230515_1556 2023-05-15 13:56:56 +00:00
PCoder
1513c1a4d9 Merge remote-tracking branch 'ungleich/11683-add-spotify-mp3' into 11683-add-spotify-mp3 2023-05-15 19:25:08 +05:30
PCoder
5ddcf13803 New changes 2023-05-15 19:23:37 +05:30
app
9f621c9c3e Add migration home.0035_auto_20230515_1447 2023-05-15 12:48:46 +00:00
PCoder
bd2de38428 Add iframe block for article page 2023-05-15 18:14:06 +05:30
PCoder
79dbc2aa7f Remove title case in template 2022-10-28 19:45:46 +02:00
PCoder
3f46a5c25f Remove title case for menuitem title 2022-10-27 21:12:34 +05:30
d1eecee951 Merge pull request 'Introduce Original image format' (#6) from original-image-format into master
Reviewed-on: #6
2022-07-28 15:19:02 +00:00
PCoder
6818359e1a Remove unwanted code 2022-07-28 20:36:01 +05:30
PCoder
bdff34cf2b Introduce Original image format 2022-07-28 20:19:00 +05:30
app
8a87944e10 Update year in the footer 2022-07-21 14:53:51 +00:00
2c791e7fbc Merge pull request 'Remove styles to hide footer for sphc.ch' (#5) from 10751-add-footer-to-sphc into master
Reviewed-on: #5
2022-07-19 12:55:36 +00:00
d04a6fed60 Merge branch 'master' into 10751-add-footer-to-sphc 2022-07-19 12:54:48 +00:00
PCoder
e056b08609 Remove styles to hide footer for sphc.ch 2022-07-19 14:53:30 +02:00
app
ed9648d81d Add migration 2022-07-14 09:47:21 +00:00
PCoder
df9448e745 Update Changelog 2022-07-12 12:21:49 +05:30
9eaf497430 Merge pull request 'WIP 10694-table-block' (#3) from 10694-table-block into master
Reviewed-on: #3
2022-07-12 06:45:54 +00:00
PCoder
ae3a7d5ca9 Revert back changes to main.scss 2022-07-12 12:14:03 +05:30
PCoder
673ad6b924 Remove unwanted code 2022-07-12 12:11:17 +05:30
PCoder
5f2eedeac9 Merge branch 'master' into 10694-table-block 2022-07-12 12:06:53 +05:30
3946fff314 Merge pull request '10695-header-image' (#4) from 10695-header-image into master
Reviewed-on: #4
2022-07-12 06:32:58 +00:00
PCoder
8927460dd6 Fix accessing the header image's url 2022-07-11 15:04:51 +02:00
PCoder
3a1fa6d724 Use proper field for image 2022-07-11 18:18:55 +05:30
PCoder
849d539478 Add header_image to Article Index Page 2022-07-11 18:12:57 +05:30
PCoder
ae12f220ec Use program_table template for all language tables 2022-07-11 17:35:12 +05:30
PCoder
86242dbfb1 Add missing comma 2022-07-11 17:19:11 +05:30
PCoder
08ca710b99 Put styles into template for the moment 2022-07-11 17:16:20 +05:30
PCoder
78c3548e23 Use correct template path 2022-07-11 13:36:14 +02:00
PCoder
59356a783f Add program_table.html template 2022-07-11 16:51:55 +05:30
PCoder
f1aa2ad418 Use custom table template 2022-07-11 16:51:25 +05:30
PCoder
0691476d99 Cleanup unused code + format 2022-07-11 16:45:46 +05:30
PCoder
a6a00a33f3 Attempt classname for table 2022-07-11 16:21:11 +05:30
PCoder
c70b86a54b Revert back change in page_content 2022-07-11 16:16:57 +05:30
PCoder
6fa462dcf6 Minimal table style 2022-07-11 16:09:50 +05:30
PCoder
3ff5f1eb50 Working TableBlock (but it would be lot easier using a RawHTMLBlock) 2022-07-11 09:32:15 +02:00
PCoder
57e30e6217 WIP: dirty hack to add table to content (not working) 2022-07-07 11:27:38 +02:00
1abbc707f3 Merge pull request '10472/expiry-date-to-entry' (#2) from 10472/expiry-date-to-entry into master
Reviewed-on: #2
2022-05-04 08:32:29 +00:00
23 changed files with 511 additions and 28 deletions

View file

@ -1,3 +1,8 @@
# Change Log
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

104
Dockerfile Normal file
View file

@ -0,0 +1,104 @@
#FROM python:3.10-alpine
FROM docker.io/python:3.10-slim AS base
ENV \
LANG=C.UTF-8 \
LC_ALL=C.UTF-8 \
# python:
PYTHONFAULTHANDLER=1 \
PYTHONUNBUFFERED=1 \
PYTHONHASHSEED=random \
PYTHONDONTWRITEBYTECODE=1
RUN apt-get update
RUN apt-get install -y --no-install-recommends libmagic-dev libglib2.0-dev libpango-1.0-0 libpangoft2-1.0-0
RUN apt-get update && \
apt-get install -y curl gnupg && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && \
apt-get install -y yarn && \
apt-get install -y --no-install-recommends build-essential gcc && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
ENV VIRTUAL_ENV=/venv
# Use production configuration.
ENV DJANGO_SETTINGS_MODULE=publichealth.settings
ENV DJANGO_CONFIGURATION=production
### builder image
FROM base as build
ENV \
# pip:
PIP_NO_CACHE_DIR=off \
PIP_DISABLE_PIP_VERSION_CHECK=on \
PIP_DEFAULT_TIMEOUT=100
RUN python3 -m venv $VIRTUAL_ENV
RUN mkdir -p /build/static
WORKDIR /build
# Install python dependencies.
COPY requirements.txt requirements.txt ./
RUN . /venv/bin/activate && pip install -r requirements.txt
# We will run dumb-init as pid 1.
RUN . /venv/bin/activate && pip install dumb-init
# We will run our app using gunicorn.
RUN . /venv/bin/activate && pip install gunicorn
# Copy local code into to the build image.
COPY . /build
# Copy code required for runtime to the /app folder.
RUN mkdir -p /app
RUN cp -r publichealth feedler yarn.lock manage.py package.json Gruntfile.js setup_libs.sh /app/
#RUN curl -fsSLO https://deb.nodesource.com/setup_18.x && chmod +x setup_18.x && ./setup_18.x
#RUN apt install -y nodejs
#RUN npm install -g grunt-cli
# Collect static data into /app/static.
#RUN . /venv/bin/activate && \
# DJANGO_STATIC_ROOT=/app/static SECRET_KEY=sl DJANGO_SETTINGS_MODULE=publichealth.settings.production ./manage.py collectstatic --no-input -i media
#RUN mkdir -p /app/publichealth/static/libs
#RUN cp -rf node_modules/@bower_components/* /app/publichealth/static/libs
#RUN . /venv/bin/activate && \
# DJANGO_STATIC_ROOT=/app/static SECRET_KEY=sl DJANGO_SETTINGS_MODULE=publichealth.settings.production ./manage.py compress --force
#RUN cp -r /build/static /app/static
### runtime image
FROM base as runtime
#RUN apt-get install -y --no-install-recommends libpango-1.0-0 libpangoft2-1.0-0
#RUN apt-get install -y --no-install-recommends procps iproute2 curl
COPY --from=build /venv /venv
COPY --from=build /app /app
WORKDIR /app
# Ensure exectutables from virtualenv are prefered.
ENV PATH="/venv/bin:$PATH"
ENTRYPOINT ["/venv/bin/dumb-init", "--", "gunicorn", \
"-b [::]:8000", \
"--log-file=-", \
"--worker-tmp-dir", "/dev/shm", \
"--workers=2", "--threads=4", "--worker-class=gthread"]
CMD ["publichealth.wsgi"]

View file

@ -0,0 +1,8 @@
from django import template
from html import unescape
register = template.Library()
@register.filter
def ph_html_decode(value):
return unescape(str(value))

View 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),
),
]

View file

@ -0,0 +1,32 @@
# Generated by Django 3.2.13 on 2023-05-15 12:47
from django.db import migrations
import wagtail.core.blocks
import wagtail.core.fields
import wagtail.embeds.blocks
import wagtail.images.blocks
class Migration(migrations.Migration):
dependencies = [
('home', '0034_auto_20220714_1145'),
]
operations = [
migrations.AlterField(
model_name='articlepage',
name='body_de',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media')), ('iframe', wagtail.embeds.blocks.EmbedBlock())], blank=True, null=True),
),
migrations.AlterField(
model_name='articlepage',
name='body_en',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media')), ('iframe', wagtail.embeds.blocks.EmbedBlock())], blank=True, null=True),
),
migrations.AlterField(
model_name='articlepage',
name='body_fr',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media')), ('iframe', wagtail.embeds.blocks.EmbedBlock())], blank=True, null=True),
),
]

View file

@ -0,0 +1,36 @@
# Generated by Django 3.2.13 on 2023-05-15 13:56
from django.db import migrations
import wagtail.core.blocks
import wagtail.core.fields
import wagtail.images.blocks
class Migration(migrations.Migration):
dependencies = [
('home', '0035_auto_20230515_1447'),
]
operations = [
migrations.AddField(
model_name='articlepage',
name='html_content',
field=wagtail.core.fields.RichTextField(blank=True),
),
migrations.AlterField(
model_name='articlepage',
name='body_de',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media'))], blank=True, null=True),
),
migrations.AlterField(
model_name='articlepage',
name='body_en',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media'))], blank=True, null=True),
),
migrations.AlterField(
model_name='articlepage',
name='body_fr',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media'))], blank=True, null=True),
),
]

View file

@ -0,0 +1,35 @@
# Generated by Django 3.2.13 on 2023-05-16 10:41
from django.db import migrations
import wagtail.core.blocks
import wagtail.core.fields
import wagtail.images.blocks
class Migration(migrations.Migration):
dependencies = [
('home', '0036_auto_20230515_1556'),
]
operations = [
migrations.RemoveField(
model_name='articlepage',
name='html_content',
),
migrations.AlterField(
model_name='articlepage',
name='body_de',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media')), ('iframe', wagtail.core.blocks.RichTextBlock())], blank=True, null=True),
),
migrations.AlterField(
model_name='articlepage',
name='body_en',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media')), ('iframe', wagtail.core.blocks.RichTextBlock())], blank=True, null=True),
),
migrations.AlterField(
model_name='articlepage',
name='body_fr',
field=wagtail.core.fields.StreamField([('paragraph', wagtail.core.blocks.RichTextBlock()), ('section', wagtail.core.blocks.CharBlock(form_classname='full title')), ('info', wagtail.core.blocks.StructBlock([('title', wagtail.core.blocks.CharBlock(required=True)), ('photo', wagtail.images.blocks.ImageChooserBlock(required=True)), ('summary', wagtail.core.blocks.RichTextBlock(required=True)), ('action', wagtail.core.blocks.CharBlock(required=False)), ('url', wagtail.core.blocks.URLBlock(required=False))], icon='help')), ('media', wagtail.core.blocks.ChoiceBlock(choices=[('gallery', 'Image gallery')], icon='media')), ('iframe', wagtail.core.blocks.RichTextBlock())], blank=True, null=True),
),
]

View file

@ -2,3 +2,4 @@ from .forms import *
from .models import *
from .snippets import *
from .admin import *
from .image_formats import *

View 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')
)

View file

@ -17,6 +17,7 @@ from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel, InlinePane
from wagtail.images.blocks import ImageChooserBlock
from wagtail.images.edit_handlers import ImageChooserPanel
from wagtail.search import index
from wagtail.contrib.table_block.blocks import TableBlock
from puput.models import EntryPage, BlogPage
from feedler.models import Entry, Stream
@ -40,6 +41,13 @@ class ArticleIndexPage(Page):
'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_fr = RichTextField(default='', blank=True)
intro_en = RichTextField(default='', blank=True)
@ -49,6 +57,34 @@ class ArticleIndexPage(Page):
'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_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)
@ -73,6 +109,10 @@ class ArticleIndexPage(Page):
FieldPanel('intro_fr'),
FieldPanel('title_en'),
FieldPanel('intro_en'),
ImageChooserPanel('header_image'),
FieldPanel('table_en'),
FieldPanel('table_fr'),
FieldPanel('table_de'),
ImageChooserPanel('feed_image'),
MultiFieldPanel(
[
@ -145,7 +185,8 @@ class ArticlePage(Page):
('info', InfoBlock(icon='help')),
('media', ChoiceBlock(choices=[
('gallery', 'Image gallery'),
], icon='media'))
], icon='media')),
('iframe', RichTextBlock())
], null=True, blank=True)
body_fr = StreamField([
('paragraph', RichTextBlock()),
@ -153,7 +194,8 @@ class ArticlePage(Page):
('info', InfoBlock(icon='help')),
('media', ChoiceBlock(choices=[
('gallery', 'Image gallery'),
], icon='media'))
], icon='media')),
('iframe', RichTextBlock())
], null=True, blank=True)
body_en = StreamField([
('paragraph', RichTextBlock()),
@ -161,7 +203,8 @@ class ArticlePage(Page):
('info', InfoBlock(icon='help')),
('media', ChoiceBlock(choices=[
('gallery', 'Image gallery'),
], icon='media'))
], icon='media')),
('iframe', RichTextBlock())
], null=True, blank=True)
trans_body = TranslatedField(
'body_de',

View file

@ -16,7 +16,18 @@
</section>
{% 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">
<div class="container">
<h2>{{ page.trans_title }}</h2>
@ -34,6 +45,14 @@
</div>
{% endfor %}
</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 -->
</section>

View file

@ -1,4 +1,4 @@
{% load wagtailcore_tags wagtailimages_tags %}
{% load wagtailcore_tags wagtailimages_tags custom_filters %}
{% if page.feed_image %}
<div class="image">
@ -23,6 +23,10 @@
{% if block.value == 'gallery' %}
{% include 'home/photo_gallery.html' %}
{% endif %}
{% elif block.block_type == 'iframe' %}
{% autoescape off %}
{{ block.value|richtext|ph_html_decode}}
{% endautoescape %}
{% elif block.block_type != 'info' %}
<p class="block-{{ block.block_type }}">
{% include_block block %}

View 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>

View file

@ -3,6 +3,6 @@
<ul class="dropdown-menu">
<!--<li><a href="{% pageurl parent %}">{{ parent.title }}</a></li>-->
{% 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 %}
</ul>

View file

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from django import template
from django.utils import translation
from django.db.models import Case, When
from wagtail.core.models import Site, Page
from ..models.forms import ContactForm
@ -54,19 +55,20 @@ def top_menu(context, parent, calling_page=None):
menuitems = parent.get_children().live().in_menu().specific()
for menuitem in menuitems:
menuitem.show_dropdown = has_menu_children(menuitem)
menuitem.active = (calling_page.url.startswith(menuitem.url)
if calling_page else False)
try:
menuitem.title = menuitem.trans_title
except AttributeError:
pass
if calling_page:
menuitem.active = (calling_page.url.startswith(menuitem.url)
if calling_page else False)
try:
menuitem.title = menuitem.trans_title
except AttributeError:
pass
return {
'calling_page': calling_page,
'menuitems': menuitems,
'request': context['request'],
}
def menuitems_children(parent):
def menuitems_children(parent, context=None):
remove_mitglied = False
remove_devenez = False
if 'Qui sommes-nous' in parent.title:
@ -77,20 +79,45 @@ def menuitems_children(parent):
items_to_remove = []
for menuitem in menuitems_children:
try:
if type(menuitem) == ContactForm:
menuitem.title = menuitem.title.title()
else:
menuitem.title = menuitem.trans_title
if 'devenez' in menuitem.title.lower() and remove_devenez:
items_to_remove.append(menuitem)
elif 'mitglied werden' in menuitem.title.lower() and remove_mitglied:
items_to_remove.append(menuitem)
except AttributeError:
menuitem.title = menuitem.trans_title
except AttributeError as ae:
pass
for item in items_to_remove:
menuitems_children = menuitems_children & Page.objects.not_page(item)
if context:
request = context['request']
site = Site.find_for_request(request)
if site.hostname in ['sphc.ch', 'public-health.ch']:
# custom page here is the terms and conditions page for public-health.ch and sphc.ch (common)
if request.__dict__.get('LANGUAGE_CODE', 'de').lower() == 'en':
custom_page_id = 1020
else:
custom_page_id = 994
custom_page = Page.objects.get(id=custom_page_id)
menuitems_children = add_item_to_page_queryset(menuitems_children, custom_page)
for menuitem in menuitems_children:
try:
menuitem.title = menuitem.trans_title
except AttributeError as aee:
pass
return menuitems_children
def add_item_to_page_queryset(queryset, custom_page):
# Convert queryset to a list
pages_list = list(queryset)
# Add the custom page to the list
pages_list.append(custom_page)
# Create a new ordered queryset based on the list order
page_ids = [page.id for page in pages_list]
preserved_order = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(page_ids)])
new_queryset = Page.objects.filter(id__in=page_ids).order_by(preserved_order).specific()
return new_queryset
# Retrieves the children of the top menu items for the drop downs
@register.inclusion_tag('tags/top_menu_children.html', takes_context=True)
def top_menu_children(context, parent):
@ -105,6 +132,6 @@ def top_menu_children(context, parent):
def footer_menu(context, parent, calling_page=None):
return {
'calling_page': calling_page,
'menuitems': menuitems_children(parent),
'menuitems': menuitems_children(parent, context),
'request': context['request'],
}

View file

@ -44,6 +44,7 @@ INSTALLED_APPS = [
'wagtail.contrib.redirects',
'wagtail.contrib.search_promotions',
"wagtail.contrib.legacy.richtext",
'wagtail.contrib.table_block',
'wagtail.embeds',
'wagtail.sites',
@ -108,6 +109,9 @@ TEMPLATES = [
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'libraries': {
'custom_filters': 'publichealth.home.custom_filters',
},
},
},
]

View file

@ -1,6 +1,9 @@
import logging
import os
import sys
import dj_database_url
from logging.handlers import RotatingFileHandler
from .base import *
# Do not set SECRET_KEY, Postgres or LDAP password or any other sensitive data here.
@ -149,10 +152,19 @@ LOGGING = {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'stream': sys.stdout,
'formatter': 'simple',
},
},
'formatters': {
'default': {
'verbose': '[%(asctime)s] (%(process)d/%(thread)d) %(name)s %(levelname)s: %(message)s'
},
'simple': {
'verbose': '[%(asctime)s] (%(process)d/%(thread)d) %(name)s %(levelname)s: %(message)s'
}
},
'loggers': {
@ -194,7 +206,7 @@ if 'LOG_DIR' in env:
# Public Health Schweiz log
LOGGING['handlers']['publichealth_file'] = {
'level': 'INFO',
'class': 'cloghandler.ConcurrentRotatingFileHandler',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(env['LOG_DIR'], 'publichealth.log'),
'maxBytes': 5242880, # 5MB
'backupCount': 5
@ -204,7 +216,7 @@ if 'LOG_DIR' in env:
# Wagtail log
LOGGING['handlers']['wagtail_file'] = {
'level': 'WARNING',
'class': 'cloghandler.ConcurrentRotatingFileHandler',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(env['LOG_DIR'], 'wagtail.log'),
'maxBytes': 5242880, # 5MB
'backupCount': 5
@ -214,7 +226,7 @@ if 'LOG_DIR' in env:
# Error log
LOGGING['handlers']['errors_file'] = {
'level': 'ERROR',
'class': 'cloghandler.ConcurrentRotatingFileHandler',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(env['LOG_DIR'], 'error.log'),
'maxBytes': 5242880, # 5MB
'backupCount': 5

View file

@ -10,7 +10,7 @@
// Language menu hack, until this is configurable
nav .language-nav a[lang='en'] { display: inline; }
#footer, .contact-nav .link { display: none; }
//#footer, .contact-nav .link { display: none; }
a.navbar-brand {
height: 60px;
@ -49,6 +49,7 @@
html[lang='fr'] .site-ngo-allianz-ebk .navbar-brand {
background-image: url('/static/org/NGO-Allianz_Logo-fr.jpg');
}
// -site-ngo-allianz-ebk
// Custom styles for gesundheitsmanifest.ch
@ -61,3 +62,18 @@ html[lang='fr'] .site-ngo-allianz-ebk .navbar-brand {
border-bottom: 1px solid #ddd;
}
}
.site-dev-pro-salutech {
.navbar-brand {
width: 240px;
height: 64px;
background-size: contain !important;
background-repeat: no-repeat;
background-image: url('/static/images/pro-salute-logo.png');
font-size: 0px !important;
img { display: none !important; }
}
#carousel-banner .carousel-caption { display: none; }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -32,7 +32,7 @@
<div class="copyright">
{% contact_name the_site=the_site %}
&copy; 2020
&copy; 2022
&bull; <a href="https://public-health.ch/privacy/">Privacy</a>
&bull; <a href="https://public-health.ch/impressum/">Impressum</a>
</div>

View file

@ -2,6 +2,9 @@
{% get_site_root as site_root %}
{% get_site as the_site %}
<style>
</style>
<nav class="navbar-pre navbar-fixed-top">
<div class="container">
<div class="nav">
@ -27,9 +30,16 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{% pageurl site_root %}">
<img src="{% static 'images/public-health-logo-sign.png' %}" alt="[logo]">
<span class="hidden-xs">{% contact_name the_site=the_site %}</span></a>
<a class="navbar-brand" href="{% pageurl site_root %}">
{% if the_site|default:""|truncatechars:"255" == "dev.pro-salute.ch"%}
<img src="{% static 'images/pro-salute-logo.png' %}" alt="Pro Salute Logo">
{% else %}
<img src="{% static 'images/public-health-logo-sign.png' %}" alt="[logo]">
{% endif %}
<span class="hidden-xs">{% contact_name the_site=the_site %}</span></a>
</div>
{% block menu %}

View file

@ -1,4 +1,4 @@
# Updated: 21.07.2021
# Updated: 22.05.2024
# Core
wagtail==2.15.1
@ -30,5 +30,7 @@ Pillow==8.4.0
gunicorn
whitenoise
python-dotenv
ConcurrentLogHandler
#ConcurrentLogHandler
unidecode
django-configurations

18
setup_libs.sh Executable file
View file

@ -0,0 +1,18 @@
#!/bin/bash
cd /app
rm -rf node_modules
yarn install
mkdir -p /app/publichealth/static/libs
echo "created /app/publichealth/static/libs contents "
ls /app/publichealth/static/libs
cp -rf node_modules/@bower_components/* /app/publichealth/static/libs/
# static resources
python manage.py collectstatic --no-input -i media --settings=publichealth.settings.production
python manage.py compress --force --settings=publichealth.settings.production
if [ -d /app/static ]; then
echo "Copying"
cp -a /app/static /pod
fi