Compare commits

..

35 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
8 changed files with 210 additions and 21 deletions

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

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import template from django import template
from django.utils import translation from django.utils import translation
from django.db.models import Case, When
from wagtail.core.models import Site, Page from wagtail.core.models import Site, Page
from ..models.forms import ContactForm 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() menuitems = parent.get_children().live().in_menu().specific()
for menuitem in menuitems: for menuitem in menuitems:
menuitem.show_dropdown = has_menu_children(menuitem) menuitem.show_dropdown = has_menu_children(menuitem)
menuitem.active = (calling_page.url.startswith(menuitem.url) if calling_page:
if calling_page else False) menuitem.active = (calling_page.url.startswith(menuitem.url)
try: if calling_page else False)
menuitem.title = menuitem.trans_title try:
except AttributeError: menuitem.title = menuitem.trans_title
pass except AttributeError:
pass
return { return {
'calling_page': calling_page, 'calling_page': calling_page,
'menuitems': menuitems, 'menuitems': menuitems,
'request': context['request'], 'request': context['request'],
} }
def menuitems_children(parent): def menuitems_children(parent, context=None):
remove_mitglied = False remove_mitglied = False
remove_devenez = False remove_devenez = False
if 'Qui sommes-nous' in parent.title: if 'Qui sommes-nous' in parent.title:
@ -77,20 +79,45 @@ def menuitems_children(parent):
items_to_remove = [] items_to_remove = []
for menuitem in menuitems_children: for menuitem in menuitems_children:
try: try:
if type(menuitem) == ContactForm:
menuitem.title = menuitem.title
else:
menuitem.title = menuitem.trans_title
if 'devenez' in menuitem.title.lower() and remove_devenez: if 'devenez' in menuitem.title.lower() and remove_devenez:
items_to_remove.append(menuitem) items_to_remove.append(menuitem)
elif 'mitglied werden' in menuitem.title.lower() and remove_mitglied: elif 'mitglied werden' in menuitem.title.lower() and remove_mitglied:
items_to_remove.append(menuitem) items_to_remove.append(menuitem)
except AttributeError: menuitem.title = menuitem.trans_title
except AttributeError as ae:
pass pass
for item in items_to_remove: for item in items_to_remove:
menuitems_children = menuitems_children & Page.objects.not_page(item) 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 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 # Retrieves the children of the top menu items for the drop downs
@register.inclusion_tag('tags/top_menu_children.html', takes_context=True) @register.inclusion_tag('tags/top_menu_children.html', takes_context=True)
def top_menu_children(context, parent): def top_menu_children(context, parent):
@ -105,6 +132,6 @@ def top_menu_children(context, parent):
def footer_menu(context, parent, calling_page=None): def footer_menu(context, parent, calling_page=None):
return { return {
'calling_page': calling_page, 'calling_page': calling_page,
'menuitems': menuitems_children(parent), 'menuitems': menuitems_children(parent, context),
'request': context['request'], 'request': context['request'],
} }

View file

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

View file

@ -49,6 +49,7 @@
html[lang='fr'] .site-ngo-allianz-ebk .navbar-brand { html[lang='fr'] .site-ngo-allianz-ebk .navbar-brand {
background-image: url('/static/org/NGO-Allianz_Logo-fr.jpg'); background-image: url('/static/org/NGO-Allianz_Logo-fr.jpg');
} }
// -site-ngo-allianz-ebk // -site-ngo-allianz-ebk
// Custom styles for gesundheitsmanifest.ch // Custom styles for gesundheitsmanifest.ch
@ -61,3 +62,18 @@ html[lang='fr'] .site-ngo-allianz-ebk .navbar-brand {
border-bottom: 1px solid #ddd; 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

@ -2,6 +2,9 @@
{% get_site_root as site_root %} {% get_site_root as site_root %}
{% get_site as the_site %} {% get_site as the_site %}
<style>
</style>
<nav class="navbar-pre navbar-fixed-top"> <nav class="navbar-pre navbar-fixed-top">
<div class="container"> <div class="container">
<div class="nav"> <div class="nav">
@ -27,9 +30,16 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a class="navbar-brand" href="{% pageurl site_root %}">
<img src="{% static 'images/public-health-logo-sign.png' %}" alt="[logo]"> <a class="navbar-brand" href="{% pageurl site_root %}">
<span class="hidden-xs">{% contact_name the_site=the_site %}</span></a>
{% 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> </div>
{% block menu %} {% block menu %}

View file

@ -1,4 +1,4 @@
# Updated: 21.07.2021 # Updated: 22.05.2024
# Core # Core
wagtail==2.15.1 wagtail==2.15.1
@ -30,5 +30,7 @@ Pillow==8.4.0
gunicorn gunicorn
whitenoise whitenoise
python-dotenv python-dotenv
ConcurrentLogHandler #ConcurrentLogHandler
unidecode 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