Wagtail integration (#17)

* Adds basic wagtail app to the website

* Renames lca_website to cms_pages for clarity; re-instates pinax-boxes until we remove them from the templates

* OOPS

* Just Enough Wagtail

* Removes the template view homepage from urls.py

* OOPS

* Makes the home page use a stream field

* Removes an irrelevant migration that I accidentally introduced.
This commit is contained in:
Christopher Neugebauer 2016-06-22 10:07:27 +10:00 committed by Scott Bragg
parent 4c458fd584
commit fdfe3c7045
17 changed files with 387 additions and 9 deletions

0
cms_pages/__init__.py Normal file
View file

3
cms_pages/admin.py Normal file
View file

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

7
cms_pages/apps.py Normal file
View file

@ -0,0 +1,7 @@
from __future__ import unicode_literals
from django.apps import AppConfig
class CmsPagesConfig(AppConfig):
name = 'cms_pages'

View file

@ -0,0 +1,70 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-06-21 08:02
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import wagtail.wagtailcore.fields
class Migration(migrations.Migration):
initial = True
dependencies = [
('wagtailcore', '0028_merge'),
('wagtailimages', '0013_make_rendition_upload_callable'),
]
operations = [
migrations.CreateModel(
name='ContentPage',
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')),
('intro', models.CharField(max_length=250)),
('body', wagtail.wagtailcore.fields.RichTextField(blank=True)),
('image_display', models.IntegerField(choices=[(1, 'Banner with background feature image'), (2, 'No banner, circular vignette')])),
('main_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.Image')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='HomePage',
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')),
('body', wagtail.wagtailcore.fields.RichTextField(blank=True)),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='NewsIndexPage',
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')),
('intro', wagtail.wagtailcore.fields.RichTextField(blank=True)),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='NewsPage',
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')),
('intro', models.CharField(max_length=250)),
('body', wagtail.wagtailcore.fields.RichTextField(blank=True)),
('date', models.DateField(verbose_name='Post date')),
('main_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.Image')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
]

View file

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-06-21 09:36
from __future__ import unicode_literals
from django.db import migrations
import wagtail.wagtailcore.blocks
import wagtail.wagtailcore.fields
import wagtail.wagtailimages.blocks
class Migration(migrations.Migration):
dependencies = [
('cms_pages', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='homepage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('basic_content', wagtail.wagtailcore.blocks.StructBlock([('type', wagtail.wagtailcore.blocks.ChoiceBlock(choices=[(1, 'Left-aligned image, blue-filtered image BG'), (2, 'Right-aligned image, white background')])), ('heading', wagtail.wagtailcore.blocks.CharBlock(required=True)), ('inset_image', wagtail.wagtailimages.blocks.ImageChooserBlock()), ('background_image', wagtail.wagtailimages.blocks.ImageChooserBlock(help_text="This is used as the background image of a blue-left block. It's not used for white-right.", required=False)), ('body', wagtail.wagtailcore.blocks.RichTextBlock(required=True)), ('link', wagtail.wagtailcore.blocks.StructBlock([('page', wagtail.wagtailcore.blocks.PageChooserBlock()), ('title', wagtail.wagtailcore.blocks.CharBlock(required=True))]))]))]),
),
]

View file

134
cms_pages/models.py Normal file
View file

@ -0,0 +1,134 @@
from __future__ import unicode_literals
from django.db import models
from modelcluster.fields import ParentalKey
from wagtail.wagtailcore import blocks
from wagtail.wagtailimages import blocks as imageblocks
from wagtail.wagtailcore.models import Page
from wagtail.wagtailcore.models import Orderable
from wagtail.wagtailcore.fields import RichTextField
from wagtail.wagtailcore.fields import StreamField
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
from wagtail.wagtailadmin.edit_handlers import InlinePanel
from wagtail.wagtailadmin.edit_handlers import FieldPanel
from wagtail.wagtailadmin.edit_handlers import PageChooserPanel
from wagtail.wagtailadmin.edit_handlers import StreamFieldPanel
from wagtail.wagtailsearch import index
class HomePage(Page):
BASIC_CONTENT_BLUE_LEFT = 1
BASIC_CONTENT_WHITE_RIGHT = 2
BASIC_CONTENT_TYPES = (
(BASIC_CONTENT_BLUE_LEFT, "Left-aligned image, blue-filtered image BG"),
(BASIC_CONTENT_WHITE_RIGHT, "Right-aligned image, white background"),
)
body = StreamField([
("basic_content", blocks.StructBlock([
("type", blocks.ChoiceBlock(
choices=BASIC_CONTENT_TYPES,
required=True,
)),
("heading", blocks.CharBlock(required=True)),
("inset_image", imageblocks.ImageChooserBlock()),
("background_image", imageblocks.ImageChooserBlock(
required=False,
help_text="This is used as the background image of a "
"blue-left block. It's not used for white-right."
)),
("body", blocks.RichTextBlock(required=True)),
("link", blocks.StructBlock([
("page", blocks.PageChooserBlock()),
("title", blocks.CharBlock(required=True)),
])),
])),
# TODO: keynotes
# TODO: other bits
])
content_panels = Page.content_panels + [
StreamFieldPanel('body')
]
# Content pages
class AbstractContentPage(Page):
class Meta:
abstract = True
intro = models.CharField(max_length=250)
body = RichTextField(blank=True)
main_image = models.ForeignKey(
'wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+'
)
search_fields = Page.search_fields + [
index.SearchField('intro'),
index.SearchField('body'),
]
content_panels = Page.content_panels + [
ImageChooserPanel('main_image'),
FieldPanel('intro'),
FieldPanel('body', classname="full")
]
class ContentPage(AbstractContentPage):
IMAGE_DISPLAY_FEATURE = 1
IMAGE_DISPLAY_VIGNETTE = 2
IMAGE_DISPLAY = (
(IMAGE_DISPLAY_FEATURE, "Banner with background feature image"),
(IMAGE_DISPLAY_VIGNETTE, "No banner, circular vignette"),
)
image_display = models.IntegerField(
choices=IMAGE_DISPLAY,
)
def image_display_feature(self):
return self.image_display == IMAGE_DISPLAY_FEATURE
def image_display_vignette(self):
return self.image_display == IMAGE_DISPLAY_VIGNETTE
content_panels = [
FieldPanel('image_display')
] + AbstractContentPage.content_panels
# News pages
class NewsIndexPage(Page):
intro = RichTextField(blank=True)
subpage_types = [
"NewsPage",
]
content_panels = Page.content_panels + [
FieldPanel('intro', classname="full"),
]
class NewsPage(AbstractContentPage):
date = models.DateField("Post date")
parent_page_types = [
NewsIndexPage,
]
content_panels = AbstractContentPage.content_panels + [
FieldPanel('date'),
]

3
cms_pages/tests.py Normal file
View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

3
cms_pages/views.py Normal file
View file

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

View file

@ -112,6 +112,8 @@ MIDDLEWARE_CLASSES = [
"django.contrib.messages.middleware.MessageMiddleware",
"reversion.middleware.RevisionMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
'wagtail.wagtailcore.middleware.SiteMiddleware',
'wagtail.wagtailredirects.middleware.RedirectMiddleware',
]
ROOT_URLCONF = "pinaxcon.urls"
@ -139,9 +141,23 @@ INSTALLED_APPS = [
"reversion",
"metron",
"sitetree",
"pinax.boxes",
"pinax.eventlog",
"pinax.pages",
# wagtail
'wagtail.wagtailforms',
'wagtail.wagtailredirects',
'wagtail.wagtailembeds',
'wagtail.wagtailsites',
'wagtail.wagtailusers',
'wagtail.wagtailsnippets',
'wagtail.wagtaildocs',
'wagtail.wagtailimages',
'wagtail.wagtailsearch',
'wagtail.wagtailadmin',
'wagtail.wagtailcore',
'modelcluster',
# symposion
"symposion",
@ -152,6 +168,7 @@ INSTALLED_APPS = [
"symposion.speakers",
"symposion.sponsorship",
"symposion.teams",
"pinax.boxes",
# Registrasion
#"registrasion",
@ -160,6 +177,7 @@ INSTALLED_APPS = [
#"nested_admin",
# project
"cms_pages",
"pinaxcon",
"pinaxcon.proposals",
#"pinaxcon.registrasion",
@ -222,8 +240,13 @@ PROPOSAL_FORMS = {
"tutorial": "pinaxcon.proposals.forms.TutorialProposalForm",
"miniconf": "pinaxcon.proposals.forms.MiniconfProposalForm",
}
PINAX_PAGES_HOOKSET = "pinaxcon.hooks.PinaxPagesHookSet"
PINAX_BOXES_HOOKSET = "pinaxcon.hooks.PinaxBoxesHookSet"
#PINAX_PAGES_HOOKSET = "pinaxcon.hooks.PinaxPagesHookSet"
#PINAX_BOXES_HOOKSET = "pinaxcon.hooks.PinaxBoxesHookSet"
# Wagtail config
WAGTAIL_SITE_NAME = 'linux.conf.au 2017'
WAGTAIL_APPEND_SLASH = True
ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"

View file

@ -0,0 +1,25 @@
{% extends "site_base.html" %}
{% load wagtailcore_tags %}
{% load wagtailimages_tags %}
{% load sitetree %}
{% load i18n %}
{% block body_class %}template-blogpage{% endblock %}
{% block head_title %}{{ page.title }}{% endblock %}
{% block body %}
{% block content %}
<h1>{{ page.title }}</h1>
{% if page.main_image %}
{% image page.main_image width-400 %}
{% endif %}
<div class="intro">{{ page.intro }}</div>
{{ page.body|richtext }}
{% endblock %}
{% endblock %}

View file

@ -0,0 +1,11 @@
{% extends "site_base.html" %}
{% load i18n %}
{% load wagtailcore_tags %}
{% block head_title %}{% trans "Welcome" %}{% endblock %}
{% block body %}
{{ page.body }}
{% endblock %}

View file

@ -0,0 +1,35 @@
{% extends "site_base.html" %}
{% load wagtailcore_tags %}
{% load wagtailimages_tags %}
{% load sitetree %}
{% load i18n %}
{% block body_class %}template-blogpage{% endblock %}
{% block head_title %}{{ page.title }}{% endblock %}
{% block body %}
{% block content %}
<h1>{{ page.title }}</h1>
{% if page.main_image %}
{% image page.main_image width-400 %}
{% endif %}
<p class="meta">{{ page.date }}</p>
<div class="intro">{{ page.intro }}</div>
{% if page.get_children.specific %}
<ul>
{% for item in page.get_children.specific %}
<li><a href="{{ item.url }}">{{ item.title }}</a></li>
{% endfor %}
</ul>
{% endif %}
{% endblock %}
{% endblock %}

View file

@ -0,0 +1,27 @@
{% extends "site_base.html" %}
{% load wagtailcore_tags %}
{% load wagtailimages_tags %}
{% load sitetree %}
{% load i18n %}
{% block body_class %}template-blogpage{% endblock %}
{% block head_title %}{{ page.title }}{% endblock %}
{% block body %}
{% block content %}
<h1>{{ page.title }}</h1>
{% if page.main_image %}
{% image page.main_image width-400 %}
{% endif %}
<p class="meta">{{ page.date }}</p>
<div class="intro">{{ page.intro }}</div>
{{ page.body|richtext }}
{% endblock %}
{% endblock %}

View file

@ -1,12 +1,13 @@
{% extends "site_base.html" %}
{% load i18n %}
{% load pinax_boxes_tags %}
{% load wagtailcore_tags %}
{% block head_title %}{% trans "Welcome" %}{% endblock %}
{% block body_class %}home{% endblock %}
{% block body %}
{% box "homepage" %}
{{ page.body|richtext }}
{% endblock %}

View file

@ -3,13 +3,16 @@ from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.views.generic import TemplateView
from wagtail.wagtailadmin import urls as wagtailadmin_urls
from wagtail.wagtailcore import urls as wagtail_urls
from django.contrib import admin
import symposion.views
urlpatterns = [
url(r"^$", TemplateView.as_view(template_name="homepage.html"), name="home"),
#url(r"^$", TemplateView.as_view(template_name="homepage.html"), name="home"),
url(r"^admin/", include(admin.site.urls)),
url(r"^account/", include("account.urls")),
@ -25,7 +28,16 @@ urlpatterns = [
url(r"^teams/", include("symposion.teams.urls")),
url(r"^boxes/", include("pinax.boxes.urls")),
url(r"^", include("pinax.pages.urls")),
url(r'^cms/', include(wagtailadmin_urls)),
# Default catch-all for wagtail pages.
url(r'^', include(wagtail_urls)),
# Matches *NOTHING* -- remove once site_tree is fixed
url(r"^$", TemplateView.as_view(template_name="homepage.html"), name="home"),
# Required by registrasion
# url(r'^register/', include('registrasion.urls')),

View file

@ -6,8 +6,9 @@ metron==1.3.7
pinax-eventlog==1.1.1
dj-static==0.0.6
dj-database-url==0.4.0
pinax-pages==0.4.2
#pinax-pages==0.4.2
pinax-boxes==2.1.2
wagtail==1.5.2
# For testing
django-nose==1.4.3