Merged in beta-snippets (pull request #4)

Beta snippets
This commit is contained in:
Oleg Lavrovsky 2017-04-11 21:58:27 +00:00
commit 7c8f70e4d3
25 changed files with 613 additions and 92 deletions

77
Makefile Normal file
View file

@ -0,0 +1,77 @@
export COMPOSE_FILE=./docker-compose.yml
export COMPOSE_PROJECT_NAME=publichealth
default: build
build-cached:
docker-compose build
build:
docker-compose build --no-cache
run:
docker-compose stop web # for restart cases, when already running
docker-compose up
run-detached:
docker-compose up -d
django-restart-detached:
docker-compose stop web
docker-compose up -d web
stop:
docker-compose stop
migrate:
docker-compose exec web ./manage.py migrate
migrations:
docker-compose exec web ./manage.py makemigrations
apply-migrations: migrations migrate
setup:
docker-compose exec web ./manage.py migrate
docker-compose exec web ./manage.py createsuperuser
docker-compose exec web ./manage.py compress
docker-compose exec web ./manage.py collectstatic
release:
docker-compose stop web
docker-compose kill web
docker-compose build web
docker-compose up -d web
django-exec-bash:
# execute bash in the currently running container
docker-compose exec web bash
django-run-bash:
# run new django container, with bash, and remove it after usage
docker-compose run --rm --no-deps web bash
django-shell:
docker-compose exec web ./manage.py shell
logs:
docker-compose logs -f --tail=500
pg-run-detached:
# start pg service
docker-compose up -d pg_database
pg-exec:
docker-compose exec pg_database bash
pg-dump:
docker-compose exec pg_database bash -c 'pg_dump -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -f ./dumps/latest.sql'
pg-restore:
docker-compose exec pg_database bash -c 'psql -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -f ./dumps/latest.sql'
pg-surefire-drop-restore-db:
# drop existing database, recreate it, and then restore its content from backup.
-docker-compose exec pg_database bash -c 'dropdb -h localhost -U "$$POSTGRES_USER" "$$POSTGRES_DB"'
docker-compose exec pg_database bash -c 'createdb -h localhost -U "$$POSTGRES_USER" "$$POSTGRES_DB"'
make pg-restore

View file

@ -60,14 +60,8 @@ Now access the admin panel with the user account you created earlier: http://loc
## Production notes
We suggest using Docker or [Dokku](http://dokku.viewdocs.io/) for automated deployment.
We suggest using Docker or [Dokku](http://dokku.viewdocs.io/) for automated deployment. There is a Makefile to help set up and manage the instance.
```
docker-compose run web python manage.py migrate
... createsuperuser
... compress
... collectstatic
docker-compose build web
docker-compose up -d
```
- Initial setup: `make setup`
- Startup: `make run-detached`
- Release: `make release`

View file

@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.6 on 2017-04-08 14:03
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import modelcluster.fields
import wagtail.wagtailcore.fields
class Migration(migrations.Migration):
dependencies = [
('home', '0008_auto_20170313_1755'),
]
operations = [
migrations.CreateModel(
name='Contact',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(default='', max_length=255)),
('title_fr', models.CharField(default='', max_length=255)),
('address', models.TextField(blank=True, default='')),
('phone', models.CharField(default='', max_length=40)),
('email', models.CharField(default='', max_length=40)),
('www', models.URLField(blank=True, null=True)),
],
),
migrations.CreateModel(
name='ContactForm',
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')),
('to_address', models.CharField(blank=True, help_text='Optional - form submissions will be emailed to these addresses. Separate multiple addresses by comma.', max_length=255, verbose_name='to address')),
('from_address', models.CharField(blank=True, max_length=255, verbose_name='from address')),
('subject', models.CharField(blank=True, max_length=255, verbose_name='subject')),
('title_fr', models.CharField(default=b'', max_length=255)),
('intro_de', wagtail.wagtailcore.fields.RichTextField(blank=True, default=b'')),
('intro_fr', wagtail.wagtailcore.fields.RichTextField(blank=True, default=b'')),
('thanks_de', wagtail.wagtailcore.fields.RichTextField(blank=True, default=b'')),
('thanks_fr', wagtail.wagtailcore.fields.RichTextField(blank=True, default=b'')),
],
options={
'verbose_name': 'Formular',
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='ContactFormField',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sort_order', models.IntegerField(blank=True, editable=False, null=True)),
('label', models.CharField(help_text='The label of the form field', max_length=255, verbose_name='label')),
('field_type', models.CharField(choices=[('singleline', 'Single line text'), ('multiline', 'Multi-line text'), ('email', 'Email'), ('number', 'Number'), ('url', 'URL'), ('checkbox', 'Checkbox'), ('checkboxes', 'Checkboxes'), ('dropdown', 'Drop down'), ('radio', 'Radio buttons'), ('date', 'Date'), ('datetime', 'Date/time')], max_length=16, verbose_name='field type')),
('required', models.BooleanField(default=True, verbose_name='required')),
('choices', models.TextField(blank=True, help_text='Comma separated list of choices. Only applicable in checkboxes, radio and dropdown.', verbose_name='choices')),
('default_value', models.CharField(blank=True, help_text='Default value. Comma separated values supported for checkboxes.', max_length=255, verbose_name='default value')),
('help_text', models.CharField(blank=True, max_length=255, verbose_name='help text')),
('page', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='form_fields', to='home.ContactForm')),
],
options={
'ordering': ['sort_order'],
'abstract': False,
},
),
]

View file

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.6 on 2017-04-06 12:49
# Generated by Django 1.10.6 on 2017-04-10 21:07
from __future__ import unicode_literals
from django.db import migrations
from django.db import migrations, models
import wagtail.wagtailcore.blocks
import wagtail.wagtailcore.fields
import wagtail.wagtailimages.blocks
@ -11,10 +11,40 @@ import wagtail.wagtailimages.blocks
class Migration(migrations.Migration):
dependencies = [
('home', '0008_auto_20170313_1755'),
('home', '0009_contact_contactform_contactformfield'),
]
operations = [
migrations.AddField(
model_name='articlepage',
name='on_homepage',
field=models.BooleanField(default=False, verbose_name='Auf der Frontpage anzeigen'),
),
migrations.AlterField(
model_name='contactform',
name='intro_de',
field=wagtail.wagtailcore.fields.RichTextField(blank=True, default=''),
),
migrations.AlterField(
model_name='contactform',
name='intro_fr',
field=wagtail.wagtailcore.fields.RichTextField(blank=True, default=''),
),
migrations.AlterField(
model_name='contactform',
name='thanks_de',
field=wagtail.wagtailcore.fields.RichTextField(blank=True, default=''),
),
migrations.AlterField(
model_name='contactform',
name='thanks_fr',
field=wagtail.wagtailcore.fields.RichTextField(blank=True, default=''),
),
migrations.AlterField(
model_name='contactform',
name='title_fr',
field=models.CharField(default='', max_length=255),
),
migrations.AlterField(
model_name='homepage',
name='infos_de',

View file

@ -0,0 +1,3 @@
from .forms import *
from .models import *
from .snippets import *

View file

@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
from modelcluster.fields import ParentalKey
from wagtail.wagtailadmin.edit_handlers import (
FieldPanel, FieldRowPanel,
InlinePanel, MultiFieldPanel
)
from django.db.models import CharField
from wagtail.wagtailcore.fields import RichTextField
from wagtail.wagtailforms.models import (
AbstractEmailForm, AbstractFormField
)
from ..util import TranslatedField
class ContactFormField(AbstractFormField):
page = ParentalKey('ContactForm', related_name='form_fields')
class ContactForm(AbstractEmailForm):
title_fr = CharField(max_length=255, default="")
trans_title = TranslatedField(
'title',
'title_fr',
)
intro_de = RichTextField(default='', blank=True)
intro_fr = RichTextField(default='', blank=True)
trans_intro = TranslatedField(
'intro_de',
'intro_fr',
)
thanks_de = RichTextField(default='', blank=True)
thanks_fr = RichTextField(default='', blank=True)
trans_thanks = TranslatedField(
'thanks_de',
'thanks_fr',
)
content_panels = AbstractEmailForm.content_panels + [
FieldPanel('intro_de', classname="full"),
FieldPanel('thanks_de', classname="full"),
FieldPanel('title_fr', classname="full"),
FieldPanel('intro_fr', classname="full"),
FieldPanel('thanks_fr', classname="full"),
InlinePanel('form_fields', label="Form fields"),
MultiFieldPanel([
FieldRowPanel([
FieldPanel('from_address', classname="col6"),
FieldPanel('to_address', classname="col6"),
]),
FieldPanel('subject'),
], "Email"),
]
class Meta:
verbose_name = "Formular"

View file

@ -15,7 +15,7 @@ from wagtail.wagtailsearch import index
from puput.models import EntryPage
from .util import TranslatedField
from ..util import TranslatedField
class ArticleIndexPage(Page):
title_fr = models.CharField(max_length=255, default="")
@ -77,6 +77,10 @@ class ArticlePage(Page):
)
date = models.DateField("Date", null=True, blank=True)
on_homepage = models.BooleanField(default=False, verbose_name="Featured",
help_text="Auf der Frontpage anzeigen")
feed_image = models.ForeignKey(
'wagtailimages.Image',
null=True,
@ -107,9 +111,12 @@ class ArticlePage(Page):
ImageChooserPanel('feed_image'),
]
promote_panels = [
FieldPanel('date'),
InlinePanel('related_links', label="Links"),
MultiFieldPanel(Page.promote_panels, "Common page configuration"),
MultiFieldPanel([
FieldPanel('date'),
FieldPanel('on_homepage'),
], heading="Veröffentlichung"),
MultiFieldPanel(Page.promote_panels, "Einstellungen"),
]
parent_page_types = ['home.ArticleIndexPage']
subpage_types = []
@ -175,6 +182,7 @@ class HomePage(Page):
def featured(self):
# Get list of live pages that are descendants of this page
articles = ArticlePage.objects.live() #.descendant_of(self)
articles = articles.filter(on_homepage=True)
# Order by most recent date first
#articles = articles.order_by('-date')
return articles[:4]

View file

@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from wagtail.wagtailsnippets.models import register_snippet
from wagtail.wagtailcore.models import Page
from wagtail.wagtailadmin.edit_handlers import FieldPanel
from ..util import TranslatedField
@register_snippet
class Contact(models.Model):
title = models.CharField(max_length=255, default="")
title_fr = models.CharField(max_length=255, default="")
trans_title = TranslatedField(
'title',
'title_fr',
)
address = models.TextField(default="", blank=True)
phone = models.CharField(max_length=40, default="")
email = models.CharField(max_length=40, default="")
www = models.URLField(null=True, blank=True)
panels = Page.content_panels + [
FieldPanel('title_fr'),
FieldPanel('address'),
FieldPanel('phone'),
FieldPanel('email'),
FieldPanel('www'),
]
def phone_link(self):
return 'tel:%s' % self.phone.replace(' ', '')
def email_link(self):
return 'mailto:%s' % self.email
def www_domain(self):
return self.www.replace('http://', '').replace('https://', '')
def trans_title_styled(self):
v = self.trans_title.split(' ')
if len(v) != 3: return v
return "<strong>%s %s</strong> %s" % tuple(v)
def __str__(self):
return self.trans_title

View file

@ -0,0 +1,24 @@
{% extends "base.html" %}
{% load wagtailcore_tags %}
{% block body_class %}template-{{ self.get_verbose_name|slugify }}{% endblock %}
{% block content %}
<section id="contact-page">
<div class="container">
<h2>{{ page.trans_title }}</h2>
<p class="lead">{{ page.trans_intro|richtext }}</p>
<!-- Main content -->
<div class="article-body" role="main">
<form action="{% pageurl page %}" method="POST">
{% csrf_token %}
{{ form.as_p }}
<button class="btn btn-primary" type="submit">Senden / Envoi</button>
</form>
</div>
</div>
</section>
{% endblock %}

View file

@ -0,0 +1,17 @@
{% extends "base.html" %}
{% load wagtailcore_tags %}
{% block body_class %}template-{{ self.get_verbose_name|slugify }}{% endblock %}
{% block content %}
<section id="contact-page">
<div class="container">
<h2>{{ page.trans_title }}</h2>
<center>
<p class="lead">{{ page.trans_thanks|richtext }}</p>
</center>
</div>
</section>
{% endblock %}

View file

@ -0,0 +1,59 @@
{% extends "base.html" %}
{% load static i18n wagtailcore_tags wagtailimages_tags puput_tags %}
{% block body_class %}template-{{ self.get_verbose_name|slugify }}{% endblock %}
{% block title %}{% if search_term %}{{ search_term }} | {{ blog_page.title }}{% else %}{{ block.super }}{% endif %}{% endblock title %}
{% block meta_title %}{% if search_term %}{% trans 'Entries for' %} {{ search_type }} {{ search_term }}{% else %}{{ block.super }}{% endif %}{% endblock meta_title %}
{% block meta_description %}{% if search_term %}{% trans 'Entries for' %} {{ search_type }} {{ search_term }}{% else %}{{ block.super }}{% endif %}{% endblock meta_description %}
{% block social_share %}
{% image blog_page.header_image fill-800x450 as share_image %}
<meta property="og:title" content="{{ blog_page.title }}" />
<meta property="og:description" content="{{ blog_page.description }}" />
<meta property="og:url" content="{% canonical_url %}" />
{% if blog_page.header_image %}
<meta property="og:image" content="{% image_url share_image.url %}" />
<meta property="og:image:width" content="800" />
<meta property="og:image:height" content="450" />
<meta name="twitter:image" content="{% image_url share_image.url %}" />
{% endif %}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{{ blog_page.title }}" />
<meta name="twitter:description" content="{{ blog_page.description }}" />
{% endblock social_share %}
{% block content %}
<section id="news-page">
{% with per_page=blog_page.num_entries_page %}
{# 'paginate' tag cannot render dotted variables, so we need to create a context var #}
{% paginate per_page entries %}
{% if search_term %}
<div class="searchTerm">{% trans 'Entries for' %} {{ search_type }} "{{ search_term }}"</div>
{% endif %}
{% for entry in entries %}
<article class="container page-content">
{% include 'puput/entry_page_header.html' %}
{% if entry.header_image %}
<span class="img-responsive">
{% image entry.header_image fill-800x240 as header_image %}
<img alt="{{ entry.header_image.title }}" src="{{ header_image.url }}">
</span>
{% endif %}
<div class="article">
{% if entry.excerpt %}
{{ entry.excerpt|richtext }}
{% else %}
{{ entry.body|richtext|truncatewords_html:70 }}
{% endif %}
<a class="blog_btn continue" href="{% pageurl entry %}">{% trans 'Continue reading' %} &raquo;</a>
</div>
</article>
{% empty %}
<span>{% trans 'No results found.' %}</span>
{% endfor %}
<div class="pagination">
{% show_paginator %}
</div>
{% endwith %}
</section>
{% endblock content %}

View file

@ -0,0 +1,36 @@
{% load wagtailcore_tags wagtailroutablepage_tags puput_tags %}
<header>
<h2 class="post_title">
<a href="{% pageurl entry %}">{{ entry.title }}</a>
</h2>
<ul class="links">
<li>
<i class="fa fa-user"></i>
<a href="{% routablepageurl blog_page "entries_by_author" entry.owner.username %}">
{{ entry.owner.username }}
</a>
</li>
<li>
<i class="fa fa-calendar"></i>
{{ entry.date|date:"DATE_FORMAT" }}
</li>
{% if entry.categories.count > 0 %}
<li>
<i class="fa fa-folder-open"></i>
{% categories_list entry.categories %}
</li>
{% endif %}
{% if entry.tags.count > 0 %}
<li>
<i class="fa fa-tag"></i>
{% tags_list blog_page.num_tags_entry_header entry.tags %}
</li>
{% endif %}
{% if blog_page.disqus_api_secret %}
<li>
<i class="fa fa-comments"></i>
{{ entry.num_comments }}
</li>
{% endif %}
</ul>
</header>

View file

@ -0,0 +1,12 @@
<form action="https://formspree.io/{{ contact.email }}" method="POST">
<div class="form-group">
<input name="name" id="name" type="text" placeholder="Name / Nom" class="form-control">
</div>
<div class="form-group">
<input name="_replyto" id="email" type="email" placeholder="E-Mail" class="form-control">
</div>
<div class="form-group">
<textarea name="message" id="message" rows="3" placeholder="" class="form-control"></textarea>
</div>
<button class="btn btn-primary" type="submit">Senden / Envoi</button>
</form>

View file

@ -0,0 +1,8 @@
<address>
<p>{{ contact.trans_title }}<br>
{{ contact.address }}
</p>
<p>Tel. <a href="{{ contact.phone_link }}">{{ contact.phone }}</a><br>
<a href="{{ contact.email_link }}">{{ contact.email }}</a><br>
<a href="{{ contact.www }}">{{ contact.www_domain }}</a></p>
</address>

View file

@ -0,0 +1,7 @@
<a href="{{ contact.phone_link }}">
<span class="glyphicon glyphicon-earphone" aria-hidden="true"></span>
<span class="hidden-xs">{{ contact.phone }}</span></a>
<a href="{{ contact.email_link }}">
<span class="glyphicon glyphicon-envelope" aria-hidden="true"></span>
<span class="hidden-xs">{{ contact.email }}</span></a>

View file

@ -0,0 +1 @@
{{ contact.trans_title_styled|safe }}

View file

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
from django import template
from django.utils import translation
from ..models.snippets import Contact
register = template.Library()
# Contact information (footer)
@register.inclusion_tag('tags/contact_info.html')
def contact_info():
return {
'contact': Contact.objects.last(),
}
# Contact form (footer)
@register.inclusion_tag('tags/contact_form.html')
def contact_form():
return {
'contact': Contact.objects.last(),
}
# Contact links (header)
@register.inclusion_tag('tags/contact_links.html')
def contact_links():
return {
'contact': Contact.objects.last(),
}
# Styled contact name (header)
@register.inclusion_tag('tags/contact_name.html')
def contact_name():
return {
'contact': Contact.objects.last(),
}

View file

@ -6,12 +6,16 @@
{% block title %}Search{% endblock %}
{% block content %}
<h1>Search</h1>
<section id="search-page">
<div class="container">
<center>
<form action="{% url 'search' %}" method="get">
<input type="text" name="query"{% if search_query %} value="{{ search_query }}{% endif %}">
<input type="submit" value="Search">
<button type="submit" title="Search">
<span class="glyphicon glyphicon-search" aria-hidden="false"></span>
</button>
</form>
</center>
{% get_search_promotions search_query as search_picks %}
{% if search_picks %}
@ -38,13 +42,20 @@
</ul>
{% if search_results.has_previous %}
<a href="{% url 'search' %}?query={{ search_query|urlencode }}&amp;page={{ search_results.previous_page_number }}">Previous</a>
<a href="{% url 'search' %}?query={{ search_query|urlencode }}&amp;page={{ search_results.previous_page_number }}">
{{ search_results.previous_page_number }}
&lt;&lt;</a>
{% endif %}
{% if search_results.has_next %}
<a href="{% url 'search' %}?query={{ search_query|urlencode }}&amp;page={{ search_results.next_page_number }}">Next</a>
<a href="{% url 'search' %}?query={{ search_query|urlencode }}&amp;page={{ search_results.next_page_number }}">
&gt;&gt;
{{ search_results.next_page_number }}</a>
{% endif %}
{% elif search_query %}
No results found
<b>Leider keine Ergebnisse / Désolé, aucun résultat n'a été trouvé</b>
{% endif %}
</div>
</section>
{% endblock %}

View file

@ -163,31 +163,6 @@ COMPRESS_PRECOMPILERS = [
('text/x-scss', 'django_libsass.SassCompiler'),
]
# Use Redis as the cache backend for extra performance
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': '127.0.0.1:6379',
'KEY_PREFIX': 'publichealth',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
# Use Elasticsearch as the search backend for extra performance and better search results
WAGTAILSEARCH_BACKENDS = {
'default': {
'BACKEND': 'wagtail.wagtailsearch.backends.db',
#'BACKEND': 'wagtail.wagtailsearch.backends.elasticsearch.ElasticSearch',
'INDEX': 'publichealth',
},
}
# Wagtail settings
WAGTAIL_SITE_NAME = "Public Health Schweiz"

View file

@ -97,7 +97,19 @@ if 'MAILGUN_KEY' in os.environ:
}
DEFAULT_FROM_EMAIL = env['MAILGUN_FROM']
# Redis
# Use Redis as the cache backend for extra performance
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': '127.0.0.1:6379',
'KEY_PREFIX': 'publichealth',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
# Redis location can either be passed through with REDIS_HOST or REDIS_SOCKET
if 'REDIS_URL' in env:
@ -128,8 +140,7 @@ if REDIS_LOCATION is not None:
}
}
# Elasticsearch
# Use Elasticsearch as the search backend for extra performance and better search results
if 'ELASTICSEARCH_URL' in env:
WAGTAILSEARCH_BACKENDS = {

View file

@ -0,0 +1,27 @@
// Contact page
#contact-page {
form {
label {
width: 15em;
border-bottom: 1px dashed #ccc;
line-height: 155%;
}
}
}
// Footer search form
#search-form {
input {
float: left;
width: auto;
color: white;
}
button {
background: none; border: none;
padding-top: 0.5em;
}
}

View file

@ -3,3 +3,4 @@
@import "banner";
@import "footer";
@import "news";
@import "forms";

View file

@ -8478,6 +8478,7 @@ footer#footer a {
#news-details {
background: white;
padding-top: 0;
}
#news-details .category {
margin-top: 2em;
@ -8508,6 +8509,36 @@ footer#footer a {
#news-details .backlink {
margin-top: 3em;
}
#news-details .img-responsive {
width: 100%;
}
#news-details .links {
display: inline-block;
border-bottom: 1px solid #999;
padding: 1em;
margin: 0em;
list-style-type: none;
}
#news-details .links li:first-child {
display: none;
}
#contact-page form label {
width: 15em;
border-bottom: 1px dashed #ccc;
line-height: 155%;
}
#search-form input {
float: left;
width: auto;
color: white;
}
#search-form button {
background: none;
border: none;
padding-top: 0.5em;
}
body {
margin-top: 104px;

View file

@ -1,41 +1,28 @@
{% load wagtailcore_tags navigation %}
{% load wagtailcore_tags navigation information %}
{% get_site_root as site_root %}
<!-- Footer -->
<footer id="footer">
<div class="container">
<div class="row">
<div class="col-md-4">
<!-- Bottom Menu -->
{% footer_menu parent=site_root calling_page=self %}
</div>
<div class="col-md-4" id="contact">
<address>
<p>Public Health Schweiz<br>
Effingerstrasse 54<br>
Postfach 3420<br>
3001 Bern</p>
<p>Tel. +41 31 389 92 86<br>
<a href="#">info@public-health.ch</a><br>
<a href="#">www.public-health.ch</a></p>
</address>
</div>
<div class="col-md-4">
<form action="https://formspree.io/info@datalets.ch" method="POST">
<div class="form-group">
<input name="name" id="name" type="text" placeholder="Name" class="form-control">
</div>
<div class="form-group">
<input name="_replyto" id="email" type="email" placeholder="E-Mail" class="form-control">
</div>
<div class="form-group">
<textarea name="message" id="message" rows="3" placeholder="Anfrage" class="form-control"></textarea>
</div>
<button class="btn btn-priamry" type="submit">Senden</button>
<!-- Search form -->
<form action="/search/" method="get" id="search-form">
<input type="text" name="query" value="" class="form-control">
<button type="submit" title="Search">
<span class="glyphicon glyphicon-search" aria-hidden="false"></span>
</button>
</form>
</div>
<div class="col-md-4" id="contact-info">
{% contact_info %}
</div>
<div class="col-md-4" id="contact-form">
{% contact_form %}
</div>
</div><!-- /row -->
</div><!-- /container -->
</footer>

View file

@ -1,4 +1,4 @@
{% load wagtailcore_tags navigation %}
{% load wagtailcore_tags navigation information %}
{% get_site_root as site_root %}
<nav class="navbar-pre navbar-fixed-top">
@ -6,12 +6,7 @@
<div class="nav">
<span class="contact-nav">
<a class="link" href="#contact">Kontakt</a>
<a href="tel:+41313899286">
<span class="glyphicon glyphicon-earphone" aria-hidden="true"></span>
<span class="hidden-xs">+41 31 389 92 86</span></a>
<a href="mailto:info@public-health.ch">
<span class="glyphicon glyphicon-envelope" aria-hidden="true"></span>
<span class="hidden-xs">info@public-health.ch</span></a>
{% contact_links %}
</span>
<span class="language-nav">
{% language_switcher %}
@ -29,8 +24,9 @@
<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"><strong>Public Health</strong> Schweiz</span></a>
<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 %}</span></a>
</div>
{% block menu %}