September website changes - Pre-registration (#66)

* Factors rendering of external links into its own template. Automagical!

* Adds wagtail templates for keynotes on the front page

* Migrates to Wagtail 1.6

* Migrates content pages to be a streamfield. Flexibility++.

* Fixes editing of ContentPage bodies

* Adds floating images to content pages

* Fixes the layout of floating images

* Adds anchor links to content pages.

* Adds presentation link to the keynote speaker block model

* LCA-ifies the schedule list

* Refactors cms_pages/content_page into a new base template

* cms_pages/content_page now derives from abstract_content_page

* news_index_page now derives from abstract_content_page

* news_page now derives from abstract_content_page.html

* utility_page now uses the content_page base template

* Factors out _right_floating_image.html

* Themes the presentation detail page

* Themes the speaker profile page.

* Themes the schedule list page.

* Minor work on schedule_conference.html

* Themes schedule_detail.html

* Replaces cradle.svg

* Adds a background image to the schedule pages

* Adds libravatar fallback for speaker profile images

* Adds new background images (must update colophon)

* Adds some magic so that we can have slightly different presentation backgrounds for different pages.

* Adds the sponsor block to the bottom of the page.

* Adds sponsor logos to footer.

* All migrations are now in this tree

* Fixes wagtail migrations

* Adjusts presentation_detail to allow for miniconfs (i.e. no target audience)

* Adds unpublishing to presentation detail

* Adds ScheduleHeaderParagraph, which allows us to add some text to the header of schedule pages.

* Adds NamedHeaderParagraph. It allows us to store header paragraphs in the CMS.

* Date formatting in the schedule

* First step for fixing images

* Allows us to automagically load the colophon

* Adds “publish changes” button.

* Can login with email address
This commit is contained in:
Christopher Neugebauer 2016-09-18 20:40:55 +10:00 committed by Scott Bragg
parent 7a001e6228
commit ff16f71df6
50 changed files with 1500 additions and 340 deletions

View file

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-16 03:17
from __future__ import unicode_literals
import cms_pages.models
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([(b'panel_type', wagtail.wagtailcore.blocks.ChoiceBlock(choices=[('blue_left', 'Left-aligned image, blue-filtered image BG'), ('white_right', 'Right-aligned image, white background')])), (b'heading', wagtail.wagtailcore.blocks.CharBlock(required=True)), (b'inset_illustration', wagtail.wagtailcore.blocks.ChoiceBlock(choices=[('antarctica.svg', 'Antarctica'), ('bridge.svg', 'Bridge'), ('casino.svg', 'Casino'), ('cradle.svg', 'Cradle Mountain'), ('devil.svg', 'Tasmanian Devil'), ('falls.svg', 'Waterfall'), ('hobart.svg', 'Hobart'), ('lavender.svg', 'Lavender'), ('tuz.svg', 'Tuz'), ('wineglass.svg', 'Wineglass')])), (b'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)), (b'body', wagtail.wagtailcore.blocks.RichTextBlock(required=True)), (b'link', wagtail.wagtailcore.blocks.StructBlock([('page', wagtail.wagtailcore.blocks.PageChooserBlock()), ('title', wagtail.wagtailcore.blocks.CharBlock(required=True))])), (b'external_links', wagtail.wagtailcore.blocks.ListBlock(cms_pages.models.ExternalLinksBlock))])), ('keynotes', wagtail.wagtailcore.blocks.StructBlock([(b'heading', wagtail.wagtailcore.blocks.CharBlock(required=True)), (b'speakers', wagtail.wagtailcore.blocks.ListBlock(cms_pages.models.KeynoteSpeakerBlock))]))]),
),
]

View file

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-16 04:17
from __future__ import unicode_literals
from django.db import migrations
import wagtail.wagtailcore.blocks
import wagtail.wagtailcore.fields
class Migration(migrations.Migration):
dependencies = [
('cms_pages', '0006_auto_20160916_0317'),
]
operations = [
migrations.AlterField(
model_name='contentpage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False))]),
),
migrations.AlterField(
model_name='newsindexpage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False))]),
),
migrations.AlterField(
model_name='newspage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False))]),
),
]

View file

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
from wagtail.wagtailcore.rich_text import RichText
models = ["ContentPage", "NewsIndexPage", "NewsPage", ]
def convert_to_streamfield(apps, schema_editor):
for model_name in models:
_convert_to_streamfield(apps, model_name)
def _convert_to_streamfield(apps, model_name):
Model = apps.get_model("cms_pages", model_name)
for page in Model.objects.all():
if page.body.raw_text and not page.body:
page.body = [('rich_text', RichText(page.body.raw_text))]
page.save()
def convert_to_richtext(apps, schema_editor):
for model_name in models:
_convert_to_richtext(apps, model_name)
def _convert_to_richtext(apps, model_name):
Model = apps.get_model("cms_pages", model_name)
for page in Model.objects.all():
if page.body.raw_text is None:
raw_text = ''.join([
child.value.source for child in page.body
if child.block_type == 'rich_text'
])
page.body = raw_text
page.save()
class Migration(migrations.Migration):
dependencies = [
('cms_pages', '0007_auto_20160916_0417'),
]
operations = [
migrations.RunPython(
convert_to_streamfield,
convert_to_richtext,
),
]

View file

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-16 05:03
from __future__ import unicode_literals
from django.db import migrations
import wagtail.wagtailcore.blocks
import wagtail.wagtailcore.fields
class Migration(migrations.Migration):
dependencies = [
('cms_pages', '0008_auto_20160916_0417'),
]
operations = [
migrations.AlterField(
model_name='contentpage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False))]),
),
migrations.AlterField(
model_name='newsindexpage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False))]),
),
migrations.AlterField(
model_name='newspage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False))]),
),
]

View file

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-16 07:29
from __future__ import unicode_literals
import cms_pages.models
from django.db import migrations
import wagtail.wagtailcore.blocks
import wagtail.wagtailcore.fields
class Migration(migrations.Migration):
dependencies = [
('cms_pages', '0009_auto_20160916_0503'),
]
operations = [
migrations.AlterField(
model_name='contentpage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False)), ('floating_image', cms_pages.models.FloatingImageBlock()), ('anchor', cms_pages.models.AnchorBlock(help_text='Add a named anchor to this point in the page'))]),
),
migrations.AlterField(
model_name='newsindexpage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False)), ('floating_image', cms_pages.models.FloatingImageBlock()), ('anchor', cms_pages.models.AnchorBlock(help_text='Add a named anchor to this point in the page'))]),
),
migrations.AlterField(
model_name='newspage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False)), ('floating_image', cms_pages.models.FloatingImageBlock()), ('anchor', cms_pages.models.AnchorBlock(help_text='Add a named anchor to this point in the page'))]),
),
]

View file

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-18 01:56
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
replaces = [(b'cms_pages', '0011_scheduleheaderparagraph'), (b'cms_pages', '0012_auto_20160918_0141')]
dependencies = [
('cms_pages', '0010_auto_20160916_0729'),
('symposion_schedule', '0002_presentation_unpublish'),
]
operations = [
migrations.CreateModel(
name='ScheduleHeaderParagraph',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField()),
('schedule', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='header_paragraph', to='symposion_schedule.Schedule')),
],
),
]

View file

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-18 02:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cms_pages', '0011_scheduleheaderparagraph_squashed_0012_auto_20160918_0141'),
]
operations = [
migrations.CreateModel(
name='NamedHeaderParagraph',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Pass this name to header_paragraph tag.', max_length=64)),
('text', models.TextField()),
],
),
]

View file

@ -0,0 +1,108 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-18 03:58
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import taggit.managers
import wagtail.wagtailcore.models
import wagtail.wagtailimages.models
import wagtail.wagtailsearch.index
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0029_unicode_slugfield_dj19'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('wagtailimages', '0013_make_rendition_upload_callable'),
('taggit', '0002_auto_20150616_2121'),
('cms_pages', '0012_namedheaderparagraph'),
]
operations = [
migrations.CreateModel(
name='CustomImage',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255, verbose_name='title')),
('file', models.ImageField(height_field='height', upload_to=wagtail.wagtailimages.models.get_upload_to, verbose_name='file', width_field='width')),
('width', models.IntegerField(editable=False, verbose_name='width')),
('height', models.IntegerField(editable=False, verbose_name='height')),
('created_at', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='created at')),
('focal_point_x', models.PositiveIntegerField(blank=True, null=True)),
('focal_point_y', models.PositiveIntegerField(blank=True, null=True)),
('focal_point_width', models.PositiveIntegerField(blank=True, null=True)),
('focal_point_height', models.PositiveIntegerField(blank=True, null=True)),
('file_size', models.PositiveIntegerField(editable=False, null=True)),
('collection', models.ForeignKey(default=wagtail.wagtailcore.models.get_root_collection_id, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='wagtailcore.Collection', verbose_name='collection')),
('tags', taggit.managers.TaggableManager(blank=True, help_text=None, through='taggit.TaggedItem', to='taggit.Tag', verbose_name='tags')),
('uploaded_by_user', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='uploaded by user')),
],
options={
'abstract': False,
},
bases=(wagtail.wagtailsearch.index.Indexed, models.Model),
),
migrations.AddField(
model_name='customimage',
name='author',
field=models.CharField(default='', help_text='The name of the author of the work', max_length=255),
preserve_default=False,
),
migrations.AddField(
model_name='customimage',
name='copyright_year',
field=models.CharField(default='', help_text='The year the image was taken', max_length=64),
preserve_default=False,
),
migrations.AddField(
model_name='customimage',
name='licence',
field=models.CharField(default='', help_text='The short-form code for the licence (e.g. CC-BY)', max_length=64),
preserve_default=False,
),
migrations.AddField(
model_name='customimage',
name='source_url',
field=models.URLField(default='', help_text='The URL where you can find the original of this image'),
preserve_default=False,
),
migrations.CreateModel(
name='CustomRendition',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('file', models.ImageField(height_field='height', upload_to=wagtail.wagtailimages.models.get_rendition_upload_to, width_field='width')),
('width', models.IntegerField(editable=False)),
('height', models.IntegerField(editable=False)),
('focal_point_key', models.CharField(blank=True, default='', editable=False, max_length=255)),
('filter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='wagtailimages.Filter')),
('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='renditions', to='cms_pages.CustomImage')),
],
),
migrations.AddField(
model_name='contentpage',
name='background_image_CUSTOM',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='cms_pages.CustomImage'),
),
migrations.AddField(
model_name='newsindexpage',
name='background_image_CUSTOM',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='cms_pages.CustomImage'),
),
migrations.AddField(
model_name='newspage',
name='background_image_CUSTOM',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='cms_pages.CustomImage'),
),
migrations.AddField(
model_name='newspage',
name='portrait_image_CUSTOM',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='cms_pages.CustomImage'),
),
migrations.AlterUniqueTogether(
name='customrendition',
unique_together=set([('image', 'filter', 'focal_point_key')]),
),
]

View file

@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-18 03:58
from __future__ import unicode_literals
from django.db import migrations
def image_to_custom_image(apps, schema_editor):
Image = apps.get_model("wagtailimages","Image")
CustomImage = apps.get_model("cms_pages", "CustomImage")
HomePage = apps.get_model("cms_pages", "HomePage")
#tags = TaggableManager(help_text=None, blank=True, verbose_name=_('tags'))
keys = (
"title", "file", "width", "height", "created_at", "uploaded_by_user",
"focal_point_y", "focal_point_x", "focal_point_width",
"focal_point_height", "file_size",
)
customs = {}
for image in Image.objects.all():
kwargs = dict((key, getattr(image, key)) for key in keys)
custom_image = CustomImage(**kwargs)
# Does this actually work?!
custom_image.tags = image.tags
custom_image.save()
customs[image.id] = custom_image
def swap(customs, block, key):
im = (block.value[key])
if im is not None:
block.value[key] = customs[im.id]
# Go through the links.
for page in HomePage.objects.all():
for block in page.body:
if block.block_type == "basic_content":
swap(customs, block, "background_image")
elif block.block_type == "keynotes":
for keynote in block.value:
swap(customs, keynote, "profile_image")
page.save()
abstract_content_page_models = ["ContentPage", "NewsIndexPage", "NewsPage"]
for model in abstract_content_page_models:
Model = apps.get_model("cms_pages", model)
for page in Model.objects.all():
for block in page.body:
if block.block_type == "floating_image" and block.value:
block.value = customs[block.value.id]
if page.background_image:
page.background_image_CUSTOM = customs[page.background_image.id]
if model == "NewsPage" and page.portrait_image:
page.portrait_image_CUSTOM = customs[page.portrait_image.id]
page.save()
Image.objects.all().delete()
class Migration(migrations.Migration):
dependencies = [
('cms_pages', '0013_auto_20160918_0358'),
]
operations = [
migrations.RunPython(image_to_custom_image),
]

View file

@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-18 04:05
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
replaces = [(b'cms_pages', '0015_auto_20160918_0402'), (b'cms_pages', '0016_auto_20160918_0403')]
dependencies = [
('cms_pages', '0014_auto_20160918_0358'),
]
operations = [
migrations.RemoveField(
model_name='contentpage',
name='background_image',
),
migrations.RemoveField(
model_name='newsindexpage',
name='background_image',
),
migrations.RemoveField(
model_name='newspage',
name='background_image',
),
migrations.RemoveField(
model_name='newspage',
name='portrait_image',
),
migrations.RenameField(
model_name='contentpage',
old_name='background_image_CUSTOM',
new_name='background_image',
),
migrations.RenameField(
model_name='newsindexpage',
old_name='background_image_CUSTOM',
new_name='background_image',
),
migrations.RenameField(
model_name='newspage',
old_name='background_image_CUSTOM',
new_name='background_image',
),
migrations.RenameField(
model_name='newspage',
old_name='portrait_image_CUSTOM',
new_name='portrait_image',
),
]

View file

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-18 05:17
from __future__ import unicode_literals
import cms_pages.models
from django.db import migrations
import wagtail.wagtailcore.blocks
import wagtail.wagtailcore.fields
class Migration(migrations.Migration):
dependencies = [
('cms_pages', '0015_auto_20160918_0402_squashed_0016_auto_20160918_0403'),
]
operations = [
migrations.AlterField(
model_name='contentpage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False)), ('floating_image', cms_pages.models.FloatingImageBlock()), ('anchor', cms_pages.models.AnchorBlock(help_text='Add a named anchor to this point in the page')), ('colophon_image_list', wagtail.wagtailcore.blocks.StructBlock([(b'do_nothing', wagtail.wagtailcore.blocks.BooleanBlock())]))]),
),
migrations.AlterField(
model_name='newsindexpage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False)), ('floating_image', cms_pages.models.FloatingImageBlock()), ('anchor', cms_pages.models.AnchorBlock(help_text='Add a named anchor to this point in the page')), ('colophon_image_list', wagtail.wagtailcore.blocks.StructBlock([(b'do_nothing', wagtail.wagtailcore.blocks.BooleanBlock())]))]),
),
migrations.AlterField(
model_name='newspage',
name='body',
field=wagtail.wagtailcore.fields.StreamField([('rich_text', wagtail.wagtailcore.blocks.RichTextBlock(required=False)), ('raw_html', wagtail.wagtailcore.blocks.RawHTMLBlock(required=False)), ('floating_image', cms_pages.models.FloatingImageBlock()), ('anchor', cms_pages.models.AnchorBlock(help_text='Add a named anchor to this point in the page')), ('colophon_image_list', wagtail.wagtailcore.blocks.StructBlock([(b'do_nothing', wagtail.wagtailcore.blocks.BooleanBlock())]))]),
),
]

View file

@ -1,24 +1,40 @@
from __future__ import unicode_literals
from django import forms
from django.http import Http404
from django.db import models
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from django.shortcuts import render
from django.utils.encoding import python_2_unicode_compatible
from modelcluster.fields import ParentalKey
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.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.wagtailcore.url_routing import RouteResult
from wagtail.wagtailimages import blocks as imageblocks
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.wagtailimages.models import AbstractImage
from wagtail.wagtailimages.models import AbstractRendition
from wagtail.wagtailimages.models import Image
from wagtail.wagtailsearch import index
from wagtail.wagtailsnippets.models import register_snippet
from symposion import schedule
ILLUSTRATION_ANTARCTICA = "antarctica.svg"
ILLUSTRATION_BRIDGE = "bridge.svg"
@ -45,6 +61,29 @@ ILLUSTRATION_TYPES = (
)
class ExternalLinksBlock(blocks.StructBlock):
class Meta:
template = "cms_pages/home_page_blocks/external_link.html"
EXTERNAL_LINK_TWITTER = "twitter"
EXTERNAL_LINK_FACEBOOK = "facebook"
EXTERNAL_LINK_GENERIC = "generic"
EXTERNAL_LINK_TYPES = (
(EXTERNAL_LINK_TWITTER, "Twitter"),
(EXTERNAL_LINK_FACEBOOK, "Facebook"),
(EXTERNAL_LINK_GENERIC, "Generic URL"),
)
alt = blocks.CharBlock(required=True)
icon = blocks.ChoiceBlock(
choices=EXTERNAL_LINK_TYPES,
required=True,
)
url = blocks.URLBlock(required=True)
class BasicContentBlock(blocks.StructBlock):
class Meta:
@ -57,16 +96,6 @@ class BasicContentBlock(blocks.StructBlock):
(PANEL_WHITE_RIGHT, "Right-aligned image, white background"),
)
EXTERNAL_LINK_TWITTER = "twitter"
EXTERNAL_LINK_FACEBOOK = "facebook"
EXTERNAL_LINK_GENERIC = "generic"
EXTERNAL_LINK_TYPES = (
(EXTERNAL_LINK_TWITTER, "Twitter"),
(EXTERNAL_LINK_FACEBOOK, "Facebook"),
(EXTERNAL_LINK_GENERIC, "Generic URL"),
)
panel_type = blocks.ChoiceBlock(
choices=PANEL_TYPES,
required=True,
@ -86,22 +115,45 @@ class BasicContentBlock(blocks.StructBlock):
("page", blocks.PageChooserBlock()),
("title", blocks.CharBlock(required=True)),
])
external_links = blocks.ListBlock(
blocks.StructBlock([
("alt", blocks.CharBlock(required=True)),
("icon", blocks.ChoiceBlock(
choices=EXTERNAL_LINK_TYPES,
required=True,
)),
("url", blocks.URLBlock(required=True)
)])
external_links = blocks.ListBlock(ExternalLinksBlock)
class PresentationChooserBlock(blocks.ChooserBlock):
target_model = schedule.models.Presentation
widget = forms.Select
class KeynoteSpeakerBlock(blocks.StructBlock):
class Meta:
template = "cms_pages/home_page_blocks/keynote_speaker.html"
name = blocks.CharBlock(required=True)
body = blocks.RichTextBlock(required=True)
links = blocks.ListBlock(ExternalLinksBlock)
profile_image = imageblocks.ImageChooserBlock(
required=False,
help_text="Profile image for the speaker",
)
presentation = PresentationChooserBlock(
help_text="This speaker's presentation",
)
class KeynotesBlock(blocks.StructBlock):
class Meta:
template = "cms_pages/home_page_blocks/keynotes.html"
heading = blocks.CharBlock(required=True)
speakers = blocks.ListBlock(KeynoteSpeakerBlock)
class HomePage(Page):
body = StreamField([
("basic_content", BasicContentBlock()),
# TODO: keynotes
("keynotes", KeynotesBlock()),
# TODO: other bits
])
@ -111,15 +163,46 @@ class HomePage(Page):
# Content pages
class FloatingImageBlock(imageblocks.ImageChooserBlock):
class Meta:
template = "cms_pages/content_page_blocks/floating_image.html"
class AnchorBlock(blocks.CharBlock):
class Meta:
template = "cms_pages/content_page_blocks/anchor.html"
class ColophonImageListBlock(blocks.StructBlock):
class Meta:
template = "cms_pages/content_page_blocks/colophon.html"
do_nothing = blocks.BooleanBlock(required=False)
class AbstractContentPage(Page):
class Meta:
abstract = True
intro = models.CharField(max_length=250)
body = RichTextField(blank=True)
body = StreamField([
("rich_text", blocks.RichTextBlock(required=False)),
("raw_html", blocks.RawHTMLBlock(required=False)),
("floating_image", FloatingImageBlock()),
("anchor", AnchorBlock(
help_text="Add a named anchor to this point in the page"
)),
("colophon_image_list", ColophonImageListBlock()),
])
background_image = models.ForeignKey(
'wagtailimages.Image',
'CustomImage',
null=True,
blank=True,
on_delete=models.SET_NULL,
@ -134,7 +217,7 @@ class AbstractContentPage(Page):
content_panels = Page.content_panels + [
ImageChooserPanel('background_image'),
FieldPanel('intro'),
FieldPanel('body', classname="full")
StreamFieldPanel('body')
]
@ -195,7 +278,7 @@ class NewsPage(AbstractContentPage):
date = models.DateField("Post date")
portrait_image = models.ForeignKey(
'wagtailimages.Image',
'CustomImage',
null=True,
blank=True,
on_delete=models.SET_NULL,
@ -210,3 +293,93 @@ class NewsPage(AbstractContentPage):
FieldPanel('date'),
ImageChooserPanel('portrait_image'),
]
@register_snippet
@python_2_unicode_compatible
class ScheduleHeaderParagraph(models.Model):
''' Used to show the paragraph in the header for a schedule page. '''
schedule = models.OneToOneField(
schedule.models.Schedule,
related_name="header_paragraph",
)
text = models.TextField()
panels = [
FieldPanel('schedule'),
FieldPanel('text'),
]
def __str__(self):
return str(self.schedule)
@register_snippet
@python_2_unicode_compatible
class NamedHeaderParagraph(models.Model):
''' Used to show the paragraph in the header for a schedule page. '''
name = models.CharField(
max_length=64,
help_text="Pass this name to header_paragraph tag.",
)
text = models.TextField()
panels = [
FieldPanel('name'),
FieldPanel('text'),
]
def __str__(self):
return str(self.name)
# Image models -- copied from wagtail docs
class CustomImage(AbstractImage):
# Add any extra fields to image here
# eg. To add a caption field:
copyright_year = models.CharField(
max_length=64,
help_text="The year the image was taken",
)
licence = models.CharField(
max_length=64,
help_text="The short-form code for the licence (e.g. CC-BY)",
)
author = models.CharField(
max_length=255,
help_text="The name of the author of the work",
)
source_url = models.URLField(
help_text="The URL where you can find the original of this image",
)
admin_form_fields = Image.admin_form_fields + (
"copyright_year",
"licence",
"author",
"source_url",
)
class CustomRendition(AbstractRendition):
image = models.ForeignKey(CustomImage, related_name='renditions')
class Meta:
unique_together = (
('image', 'filter', 'focal_point_key'),
)
# Delete the source image file when an image is deleted
@receiver(pre_delete, sender=CustomImage)
def image_delete(sender, instance, **kwargs):
instance.file.delete(False)
# Delete the rendition image file when a rendition is deleted
@receiver(pre_delete, sender=CustomRendition)
def rendition_delete(sender, instance, **kwargs):
instance.file.delete(False)

View file

@ -15,6 +15,13 @@ DATABASES = {
}
}
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
ALLOWED_HOSTS = []
# Local time zone for this installation. Choices can be found here:
@ -26,9 +33,12 @@ ALLOWED_HOSTS = []
# system time zone.
TIME_ZONE = "UTC"
# The date format for this installation
DATE_FORMAT = "j F Y"
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = "en-us"
LANGUAGE_CODE = "en-au"
SITE_ID = int(os.environ.get("SITE_ID", 1))
@ -235,6 +245,7 @@ THEME_CONTACT_EMAIL = "team@hobart.lca2017.org"
AUTHENTICATION_BACKENDS = [
"symposion.teams.backends.TeamPermissionsBackend",
"account.auth_backends.UsernameAuthenticationBackend",
"account.auth_backends.EmailAuthenticationBackend",
]
CONFERENCE_ID = 1
@ -249,6 +260,7 @@ PROPOSAL_FORMS = {
# Wagtail config
WAGTAIL_SITE_NAME = 'linux.conf.au 2017'
WAGTAIL_APPEND_SLASH = True
WAGTAILIMAGES_IMAGE_MODEL = 'cms_pages.CustomImage'
ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"

View file

@ -0,0 +1,23 @@
{% extends "lca2017/content_page.html" %}
{% load staticfiles %}
{% load wagtailcore_tags %}
{% load wagtailimages_tags %}
{% load lca2017_tags %}
{% load sitetree %}
{% load i18n %}
{% block body_class %}template-content-page{% endblock %}
{% block head_title %}{{ page.title }}{% endblock %}
{% if page.background_image %}
{% block header_background_image %}{% image page.background_image width-2000 as background_image %}{{ background_image.url }}{% endblock %}
{% endif %}
{% block header_title %}{{ page.title }}{% endblock %}
{% block header_paragraph %}{{ page.intro }}{% endblock %}
{% block header_inset_image %}{% endblock %}
{% block content %}
{{ page.body }}
{% endblock %}

View file

@ -1,21 +1,9 @@
{% extends "site_base_wagtail.html" %}
{% load staticfiles %}
{% load wagtailcore_tags %}
{% extends "cms_pages/abstract_content_page.html" %}
{% load lca2017_tags %}
{% load sitetree %}
{% load i18n %}
{% block body_class %}template-blogpage{% endblock %}
{% block body_class %}template-content-page{% endblock %}
{% block head_title %}{{ page.title }}{% endblock %}
{% block body %}
{% block content %}
{% include "cms_pages/content_page_header_panel.html" %}
<div class="l-content-page">
<div class="l-content-page--richtext">
{{ page.body|richtext }}
</div>
</div>
{% endblock %}
{% endblock %}
{% block header_inset_image %}{% illustration page.inset_illustration %}{% endblock %}

View file

@ -0,0 +1 @@
<a name="{{ value }}"></a>

View file

@ -0,0 +1,10 @@
{% load lca2017_tags %}
<ul>
{% all_images as images %}
{% for image in images %}
<li>
<a href="{{ image.source_url }}">{{ image.title }}</a> &ndash; &copy;{{ image.copyright_year }} {{ image.licence }} by {{ image.author }}
</li>
{% endfor %}
</ul>

View file

@ -0,0 +1,4 @@
{% load wagtailimages_tags %}
{% image value width-800 as img %}
{% include "lca2017/_right_floating_image.html" with image_url=img.url %}

View file

@ -1,33 +0,0 @@
{% load staticfiles %}
{% load wagtailimages_tags %}
<div class="panel panel__compact panel__bg">
{% if page.background_image %}
{% image page.background_image width-2000 as background_image %}
<div style="background-image: url('{{ background_image.url }}');" class="panel--bg"></div>
{% else %}
<div class="panel--bg"></div>
{% endif %}
<div class="panel--content">
<div class="panel--2-3">
<h2>{{ page.title }}</h2>
<p class="lede">{{ page.intro }}</p>
</div>
{% if page.inset_illustration or page.portrait_image %}
<div class="panel--1-3">
{% if page.inset_illustration %}
<div class="illustration">
<img
src="{% static 'lca2017/images/svgs/illustrations/' %}{{ page.inset_illustration }}"
/>
</div>
{% elif page.portrait_image %}
<div class="portrait">
{% image page.portrait_image width-640 as portrait_image %}
<div style="background-image: url('{{ portrait_image.url }}');" class="portrait--img"></div>
</div>
{% endif %}
</div>
{% endif %}
</div>
</div>

View file

@ -8,9 +8,7 @@
<a href="{{ value.link.page.url }}" class="btn">{{ value.link.title }}</a>
{% endif %}
{% for link in value.external_links %}
<a href="{{ link.url }}" title="{{ link.alt }}" class="btn-svg">
{% include "cms_pages/home_page_blocks/btn_svg.html" %}
</a>
{{ link }}
{% endfor %}
</div>
</div>

View file

@ -0,0 +1,3 @@
<a href="{{ value.url }}" title="{{ value.alt }}" class="btn-svg">
{% include "cms_pages/home_page_blocks/btn_svg.html" with link=value %}
</a>

View file

@ -0,0 +1,25 @@
{% load wagtailcore_tags %}
{% load wagtailimages_tags %}
{% image value.profile_image width-800 as profile_image %}
<div class="panel panel__compact">
<div class="panel--content">
<div class="panel--1-3">
<div class="portrait">
<div style="background-image: url('{{ profile_image.url }}');" class="portrait--img"></div>
</div>
</div>
<div class="panel--2-3">
<h3>{{ value.name }}</h3>
{{ value.body }}
<div class="btn-group">
<a href="{% url "schedule_presentation_detail" value.presentation.id %}" class="btn">Read more</a>
{% for link in value.links %}
{{ link }}
{% endfor %}
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,12 @@
<div class="panel panel__compact">
<div class="panel--content">
<div class="panel--1-3"></div>
<div class="panel--2-3">
<h2 class="panel--section-title">{{ value.heading }}</h2>
</div>
</div>
</div>
{% for speaker in value.speakers %}
{{ speaker }}
{% endfor %}

View file

@ -1,47 +1,45 @@
{% extends "site_base_wagtail.html" %}
{% extends "cms_pages/abstract_content_page.html" %}
{% load staticfiles %}
{% load wagtailcore_tags %}
{% load wagtailimages_tags %}
{% load lca2017_tags %}
{% load sitetree %}
{% load i18n %}
{% block body_class %}template-blogpage{% endblock %}
{% block head_title %}{{ page.title }}{% endblock %}
{% block body_class %}template-news-index{% endblock %}
{% block body %}
{% block content %}
{% include "cms_pages/content_page_header_panel.html" %}
{% block inset_image_base %}{% endblock %}
{% if page.child_pages %}
{% for item in page.child_pages %}
<div class="panel panel__compact">
<div class="panel--content">
<div class="panel--1-3">
<div class="portrait">
{% image item.portrait_image width-640 as portrait_image %}
<div style="background-image: url('{{ portrait_image.url }}');" class="portrait--img"></div>
</div>
</div>
<div class="panel--2-3">
<h2>{{ item.title }}</h2>
<p class="lede"><em>{{ item.date|date:"j F Y" }}</em> {{ item.intro }}</p>
<a href="{{ item.url }}" class="btn">Read more</a>
{% comment %}We use panels here, so don't need to wrap in a text block{% endcomment %}
{% block content_base %}
{% if page.child_pages %}
{% for item in page.child_pages %}
<div class="panel panel__compact">
<div class="panel--content">
<div class="panel--1-3">
<div class="portrait">
{% image item.portrait_image width-640 as portrait_image %}
<div style="background-image: url('{{ portrait_image.url }}');" class="portrait--img"></div>
</div>
</div>
<div class="panel--2-3">
<h2>{{ item.title }}</h2>
<p class="lede"><em>{{ item.date|date:"j F Y" }}</em> {{ item.intro }}</p>
<a href="{{ item.url }}" class="btn">Read more</a>
</div>
</div>
{% endfor %}
<div class="panel panel__compact"></div>
{% endif %}
<div class="panel panel__compact">
<div class="panel--content">
<h3>Subscribe</h3>
<p><a class="btn" href="rss">View as RSS</a></p>
</div>
</div>
{% endfor %}
<div class="panel panel__compact"></div>
{% endif %}
{% endblock %}
<div class="panel panel__compact">
<div class="panel--content">
<h3>Subscribe</h3>
<p><a class="btn" href="rss">View as RSS</a></p>
</div>
</div>
{% endblock %}

View file

@ -24,7 +24,7 @@
{{ item.intro|richtext|force_escape }}
&lt;/p&gt;
&lt;p&gt;
{{ item.body|richtext|force_escape }}
{{ item.body|force_escape }}
&lt;/p&gt;
</description>

View file

@ -1,4 +1,4 @@
{% extends "site_base_wagtail.html" %}
{% extends "cms_pages/abstract_content_page.html" %}
{% load wagtailcore_tags %}
{% load wagtailimages_tags %}
@ -6,18 +6,15 @@
{% load sitetree %}
{% load i18n %}
{% block body_class %}template-blogpage{% endblock %}
{% block body_class %}template-newspage{% endblock %}
{% block head_title %}{{ page.title }}{% endblock %}
{% block body %}
{% block content %}
{% include "cms_pages/content_page_header_panel.html" %}
<div class="l-content-page">
<div class="l-content-page--richtext">
<p><em>{{ page.date|date:"j F Y" }}</em></p>
{{ page.body|richtext }}
</div>
</div>
{% endblock %}
{% if page.portrait_image %}
{% block header_inset_image %}{% image page.portrait_image width-640 as portrait_image %}{{ portrait_image.url }}{% endblock %}
{% endif %}
{% block content %}
<p><em>{{ page.date|date:"j F Y" }}</em></p>
{{ page.body }}
{% endblock %}

View file

@ -0,0 +1,5 @@
<div class="right-floating-image" >
<div class="portrait">
<div style="background-image: url('{{ image_url }}');" class="portrait--img"></div>
</div>
</div>

View file

@ -0,0 +1,50 @@
{% extends "site_base_wagtail.html" %}
{% load staticfiles %}
{% load wagtailcore_tags %}
{% load lca2017_tags %}
{% load sitetree %}
{% load i18n %}
{% block body_class %}template-content-page{% endblock %}
{% block head_title %}{% endblock %}
{% block body %}
{% block heading_panel %}
<div class="panel panel__compact panel__bg">
<div style="background-image: url('{% block header_background_image %}{% endblock %}');" class="panel--bg"></div>
<div class="panel--content">
<div class="panel--2-3">
<h2>{% block header_title %}{% endblock %}</h2>
<p class="lede">{% block header_paragraph %}{% endblock %}</p>
</div>
{% block header_inset_image_base %}
<div class="panel--1-3">
<div class="portrait">
<div style="background-image: url('{% block header_inset_image %}{% endblock %}');" class="portrait--img"></div>
</div>
</div>
{% endblock %}
</div>
</div>
{% endblock %}
{% block content_base %}
<div class="l-content-page">
<div class="l-content-page--richtext">
{% block content %}
{% endblock %}
</div>
</div>
{% endblock %}
{% endblock %}
{% block extra_script %}
<script src="{% static 'js/site-92ae8d0d6c.js' %}" type="text/javascript"></script>
{% endblock %}

View file

@ -92,25 +92,26 @@
{% endblock %}
{% block footer_base %}
<!-- https://gist.github.com/geedmo/5682742-->
<footer class="l-footer l-footer__alt">
{% block footer %}
{% comment %}
<div class="l-footer--text">
<h3>Sponsors</h3>
<p class="lede">Magna morbi aliquet commodo arcu odio dui imperdiet blandit est.
</p><a href="#" class="btn">See sponsors</a>
</div>
<div class="l-footer--logos">
<img src="{% static 'lca2017/images/HPE.jpg' %}" role="presentation">
<img src="{% static 'lca2017/images/IBM.jpg' %}" role="presentation">
</div>
{% endcomment %}
<!-- https://gist.github.com/geedmo/5682742-->
<footer class="l-footer l-footer__alt">
{% block footer %}
<div class="l-footer--text">
<h3>Sponsors</h3>
<p class="lede">We thank our Emperor Penguin sponsors for their
generous contribution to linux.conf.au 2017.</p>
<a href="#" class="btn btn__white">Other Sponsors</a>
</div>
<div class="l-footer--logos">
<img src="{% static 'lca2017/images/HPE.svg' %}" class="sponsor-logo" role="presentation">
<br />
<img src="{% static 'lca2017/images/IBM.svg' %}" class="sponsor-logo" role="presentation">
<br />
</div>
<p class="lede">©2016 Linux Australia and linux.conf.au 2017. Linux is a registered trademark of Linus Torvalds. Site design by <a href="http://takeflight.com.au" >Takeflight</a>. Image credits can be found on our <a href="/about/colophon">Colophon</a>.</p>
<p class="lede">©2016 Linux Australia and linux.conf.au 2017. Linux is a registered trademark of Linus Torvalds. Site design by <a href="http://takeflight.com.au" >Takeflight</a>. Image credits can be found on our <a href="/about/colophon">Colophon</a>.</p>
{% endblock %}
</footer>
{% endblock %}
</footer>
{% endblock %}
</main>
{% block scripts %}

View file

@ -27,6 +27,7 @@
<input type="submit" name="result_submit" value="undecide" class="btn btn-default btn-xs" />
</div>
</div>
<input type="submit" name="publish_changes" value="Publish Changes" class="btn btn-success" />
{% else %}
{% if proposal.result.status == "rejected" %}
<a class="btn dropdown-toggle btn-danger" data-toggle="dropdown" href="#">Rejected <span class="caret"></span></a>

View file

@ -1,41 +1,41 @@
<table class="calendar table table-bordered">
<thead>
<tr>
<th class="time">&nbsp;</th>
{% for room in timetable.rooms %}
<th>{{ room.name }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in timetable %}
<tr>
<td class="time">{{ row.time|date:"h:iA" }}</td>
{% for slot in row.slots %}
<td class="slot slot-{{ slot.kind.label }}" colspan="{{ slot.colspan }}" rowspan="{{ slot.rowspan }}">
{% if slot.kind.label == "talk" or slot.kind.label == "tutorial" %}
{% if not slot.content %}
{% else %}
<span class="title">
<a href="{% url "schedule_presentation_detail" slot.content.pk %}">{{ slot.content.title }}</a>
</span>
<span class="speaker">
{{ slot.content.speakers|join:", " }}
</span>
{% endif %}
{% else %}
{% if slot.content_override.raw %}
{{ slot.content_override.rendered|safe }}
{% else %}
{{ slot.kind.label }}
{% endif %}
{% endif %}
</td>
{% endfor %}
{% if forloop.last %}
<td colspan="{{ timetable.rooms|length }}"></td>
{% endif %}
</tr>
<thead>
<tr>
<th class="time">&nbsp;</th>
{% for room in timetable.rooms %}
<th>{{ room.name }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in timetable %}
<tr>
<td class="time">{{ row.time|date:"h:iA" }}</td>
{% for slot in row.slots %}
<td class="slot slot-{{ slot.kind.label }}" colspan="{{ slot.colspan }}" rowspan="{{ slot.rowspan }}">
{% if slot.kind.label == "talk" or slot.kind.label == "tutorial" %}
{% if not slot.content %}
{% else %}
<span class="title">
<a href="{% url "schedule_presentation_detail" slot.content.pk %}">{{ slot.content.title }}</a>
</span>
<span class="speaker">
{{ slot.content.speakers|join:", " }}
</span>
{% endif %}
{% else %}
{% if slot.content_override.raw %}
{{ slot.content_override.rendered|safe }}
{% else %}
{{ slot.kind.label }}
{% endif %}
{% endif %}
</td>
{% endfor %}
</tbody>
{% if forloop.last %}
<td colspan="{{ timetable.rooms|length }}"></td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>

View file

@ -1,31 +1,56 @@
{% extends "site_base.html" %}
{% extends "symposion/schedule/public_base.html" %}
{% load lca2017_tags %}
{% load sitetree %}
{% load staticfiles %}
{% load thumbnail %}
{% block head_title %}Presentation: {{ presentation.title }}{% endblock %}
{% block breadcrumbs %}{% sitetree_breadcrumbs from "main" %}{% endblock %}
{% block body %}
{% if presentation.slot %}
<h4>
{{ presentation.slot.day.date|date:"l" }}
{{ presentation.slot.start}}&ndash;{{ presentation.slot.end }}
</h4>
{% endif %}
<h2>{{ presentation.title }}</h2>
{% block header_inset_image %}{% with audience=presentation.proposal.get_target_audience_display %}{% if audience == "Business" %}{% illustration "falls.svg" %}{% elif audience == "Community" %}{% illustration "bridge.svg" %}{% elif audience == "Developer"%}{% illustration "hobart.svg" %}{% elif audience == "User" %}{% illustration "antarctica.svg" %}{% else %}{% illustration "casino.svg" %}{% endif %}{% endwith %}{% endblock %}
<h4>
{% for speaker in presentation.speakers %}
<a href="{% url "speaker_profile" speaker.pk %}">{{ speaker }}</a>{% if not forloop.last %}, {% endif %}{% endfor %}
</h4>
{% block header_background_image %}{% presentation_bg_number presentation 4 as bg_number %}{% if bg_number == 0 %}{% static "lca2017/images/mt_anne_bg_optimised.jpg" %}{% elif bg_number == 1 %}{% static "lca2017/images/the_neck_bg_optimised.jpg" %}{% elif bg_number == 2 %}{% static "lca2017/images/snug_falls_bg_optimised.jpg" %}{% elif bg_number == 3 %}{% static "lca2017/images/sleepy_bay_bg_optimised.jpg" %}{% endif %}{% endblock %}
<dl class="dl-horizontal">
<dt>Audience level:</dt>
<dd style="margin-bottom: 0;">{{ presentation.proposal.get_audience_level_display }}</dd>
</dl>
{% block header_title %}{{ presentation.title }}{% endblock %}
{% block header_paragraph %}
<p>
Presented by
{% for speaker in presentation.speakers %}
<a href="{% url "speaker_profile" speaker.pk %}">{{ speaker }}</a>{% if not forloop.last %}, {% endif %}
{% endfor %}
<br />
{% if presentation.slot %}
{{ presentation.slot.day.date|date:"l" }}
{{ presentation.slot.start}}&ndash;{{ presentation.slot.end }}
<br />
{% endif %}
{% if presentation.proposal.get_target_audience_display %}
<strong>Target audience:</strong>
{{ presentation.proposal.get_target_audience_display }}
{% endif %}
{% endblock %}
{% block content %}
{% if presentation.unpublish %}
<p><strong>Presentation not published.</strong></p>
{% endif %}
<h2>Abstract</h2>
<div class="abstract">{{ presentation.abstract_html|safe }}</div>
<h2>Presented by</h2>
{% for speaker in presentation.speakers %}
{% speaker_photo speaker 512 as speaker_photo_url %}
{% include "lca2017/_right_floating_image.html" with image_url=speaker_photo_url %}
<h3><a href="{% url "speaker_profile" speaker.pk %}">{{ speaker }}</a></h3>
{{ speaker.biography_html|safe}}
{% endfor %}
<h3>Abstract</h3>
<div class="abstract">{{ presentation.abstract_html|safe }}</div>
{% endblock %}

View file

@ -0,0 +1,5 @@
{% extends "lca2017/content_page.html" %}
{% load staticfiles %}
{% block header_background_image %}{% static "lca2017/images/hobart_bg_optimised.jpg" %}{% endblock %}

View file

@ -1,34 +1,35 @@
{% extends "site_base_wagtail.html" %}
{% extends "symposion/schedule/public_base.html" %}
{% load i18n %}
{% load pinax_boxes_tags %}
{% load cache %}
{% load lca2017_tags %}
{% block head_title %}Conference Schedule{% endblock %}
{% block header_title %}Conference Schedule{% endblock %}
{% block header_paragraph %}{% header_paragraph "conference_schedule" %}{% endblock %}
{% block header_inset_image %}{% illustration "cradle.svg" %}{% endblock %}
{% block body_class %}full{% endblock %}
{% block right %}
{% endblock %}
{% block body %}
<div class="l-content-page">
<div class="l-content-page--richtext">
<div class="rich-text">
{% block content %}
<div class="page-head">
<h1>Conference Schedule</h1>
{% block breadcrumbs %}{% endblock %}
</div>
<div class="page-head">
{% block breadcrumbs %}{% endblock %}
</div>
{% for section in sections %}
{% cache 600 "schedule-table" section.schedule.section %}
{% for timetable in section.days %}
<h3>{{ section.schedule.section.name }} — {{ timetable.day.date }}</h3>
{% include "symposion/schedule/_grid.html" %}
{% endfor %}
{% endcache %}
{% endfor %}
{% for section in sections %}
{% cache 600 "schedule-table" section.schedule.section %}
{% for timetable in section.days %}
<h3>{{ section.schedule.section.name }} — {{ timetable.day.date|date:"l" }}, {{ timetable.day.date }}</h3>
<br />
{% include "symposion/schedule/_grid.html" %}
<br />
{% endfor %}
{% endcache %}
{% endfor %}
</div></div></div>
{% endblock %}

View file

@ -1,35 +1,29 @@
{% extends "symposion/schedule/base.html" %}
{% extends "symposion/schedule/public_base.html" %}
{% load i18n %}
{% load pinax_boxes_tags %}
{% load cache %}
{% load lca2017_tags %}
{% load sitetree %}
{% block head_title %}Conference Schedule{% endblock %}
{% block head_title %}{{ schedule.section }} Schedule{% endblock %}
{% block header_title %}{{ schedule.section }} Schedule{% endblock%}
{% block header_paragraph %}{{ schedule.header_paragraph.text }}{% endblock%}
{% block header_inset_image %}{% illustration "devil.svg" %}{% endblock %}
{% block body_class %}full{% endblock %}
{% block right %}
{% endblock %}
{% block content %}
<div class="l-content-page">
<div class="l-content-page--richtext">
<div class="rich-text">
<div class="page-head">
{% block breadcrumbs %}{% sitetree_breadcrumbs from "main" %}{% endblock %}
</div>
<div class="page-head">
<h1>{{ schedule.section }} Schedule</h1>
{% block breadcrumbs %}{% sitetree_breadcrumbs from "main" %}{% endblock %}
</div>
{% box "schedule_top_"|add:schedule.section.name|slugify %}
{% cache 600 "schedule-table" schedule.section %}
{% for timetable in days %}
<h3>{{ timetable.day.date }}</h3>
{% include "symposion/schedule/_grid.html" %}
{% endfor %}
{% endcache %}
{% box "schedule_bottom" %}
</div></div></div>
{% cache 600 "schedule-table" schedule.section %}
{% for timetable in days %}
<h3>{{ timetable.day.date|date:"l" }}, {{ timetable.day.date }}</h3>
<br />
{% include "symposion/schedule/_grid.html" %}
<br />
{% endfor %}
{% endcache %}
{% endblock %}

View file

@ -1,56 +1,33 @@
{% extends "site_base_wagtail.html" %}
{% extends "symposion/schedule/public_base.html" %}
{% load i18n %}
{% load cache %}
{% load lca2017_tags %}
{% load sitetree %}
{% block head_title %}Presentation Listing{% endblock %}
{% block extra_head %}
<style>
.presentation {
}
.presentation h3 {
line-height: 1.1em;
font-weight: bold;
}
.presentation h4 {
}
.presentation p {
margin-bottom: 0.5em;
line-height: 1.2em;
}
</style>
{% endblock %}
{% block header_title %}{{ schedule.section.name }} List{% endblock %}
{% block header_paragraph %}{{ schedule.header_paragraph.text }}{% endblock%}
{% block header_inset_image %}{% illustration "lavender.svg" %}{% endblock %}
{% block breadcrumbs %}{% sitetree_breadcrumbs from "main" %}{% endblock %}
{% block body %}
<div class="l-content-page">
<div class="l-content-page--richtext">
<div class="rich-text">
<h2>Accepted {{ schedule.section.name }}</h2>
{% cache 600 "schedule-list" schedule.section.name %}
{% for presentation in presentations %}
<div class="row">
<div class="col-md-8 presentation well">
<h3><a href="{% url "schedule_presentation_detail" presentation.pk %}">{{ presentation.title }}</a></h3>
<h4>{{ presentation.speakers|join:", " }}</h4>
{{ presentation.description }}
{% if presentation.slot %}
<h4>
{{ presentation.slot.day.date|date:"l" }}
{{ presentation.slot.start}}&ndash;{{ presentation.slot.end }}
in
{{ presentation.slot.rooms|join:", " }}
</h4>
{% endif %}
</div>
</div>
{% endfor %}
{% endcache %}
</div></div></div>
{% block content %}
{% cache 600 "schedule-list" schedule.section.name %}
<ul>
{% for presentation in presentations %}
<li>
<a href="{% url "schedule_presentation_detail" presentation.pk %}">{{ presentation.title }}</a> {{ presentation.proposal.kind }} <em>by</em>
{{ presentation.speakers|join:", " }}
{% if presentation.slot %}
({{ presentation.slot.day.date|date:"l" }}
{{ presentation.slot.start}}&ndash;{{ presentation.slot.end }}
in
{{ presentation.slot.rooms|join:", " }})
{% endif %}
</li>
{% endfor %}
</ul>
{% endcache %}
{% endblock %}

View file

@ -1,41 +1,47 @@
{% extends "site_base.html" %}
{% extends "symposion/schedule/public_base.html" %}
{% load i18n %}
{% load lca2017_tags %}
{% load thumbnail %}
{% if speaker.photo %}
{% block header_inset_image %}{% speaker_photo speaker 512 as speaker_photo %}{{ speaker_photo }}{% endblock %}
{% endif %}
{% block header_title %}{{ speaker.name }}{% endblock %}
{% block header_paragraph %}
{% endblock %}
{% block head_title %}{{ speaker.name }}{% endblock %}
{% block body %}
<div class="row">
<div class="col-md-2">
{% if speaker.photo %}
<img src="{% thumbnail speaker.photo '128x128' %}" alt="{{ speaker.name }}" />
{% else %}
&nbsp;
{% endif %}
</div>
<div class="col-md-6">
{% if speaker.user == request.user or request.user.is_staff %}
<a class="btn btn-default pull-right" href="{% url "speaker_edit" speaker.pk %}">Edit</a>
{% endif %}
<h1>{{ speaker.name }}</h1>
<div class="bio">{{ speaker.biography|safe }}</div>
{% block content %}
{% if speaker.user == request.user or request.user.is_staff %}
<p>
<a class="btn btn-default pull-right" href="{% url "speaker_edit" speaker.pk %}">Edit</a>
</p>
{% endif %}
<h2>Presentations</h2>
{% for presentation in presentations %}
<h3><a href="{% url "schedule_presentation_detail" presentation.pk %}">{{ presentation.title }}</a></h3>
{% if presentation.slot %}
<p>
{{ presentation.slot.day.date|date:"l" }}
{{ presentation.slot.start}}&ndash;{{ presentation.slot.end }}
in
{{ presentation.slot.rooms|join:", " }}
</p>
{% endif %}
{% empty %}
<p>No presentations. This page is only visible to staff until there is a presentation.<p>
{% endfor %}
</div>
</div>
<h3>Biography</h3>
<div class="bio">{{ speaker.biography_html|safe }}</div>
<h3>Presentations</h3>
<ul>
{% for presentation in presentations %}
<li>
<a href="{% url "schedule_presentation_detail" presentation.pk %}">{{ presentation.title }}</a>
{% if presentation.slot %}
&ndash;
{{ presentation.slot.day.date|date:"l" }}
{{ presentation.slot.start}}&ndash;{{ presentation.slot.end }}
in
{{ presentation.slot.rooms|join:", " }}
{% endif %}
</li>
{% empty %}
<p>No presentations. This page is only visible to staff until there is a presentation.</p>
{% endfor %}
</ul>
{% endblock %}

View file

@ -1,26 +1,19 @@
{% extends "site_base_wagtail.html" %}
{% extends "lca2017/content_page.html" %}
{% load staticfiles %}
{% block body %}
<div class="panel panel__compact panel__bg">
<div style="background-image: url('{% static 'lca2017/images/wineglass_bg_optimised.jpg' %}');" class="panel--bg"></div>
<div class="panel--content">
<h2>{% block page_title %}{% endblock %}</h2>
<br />
<br />
</div>
</div>
{% block header_background_image %}{% static 'lca2017/images/wineglass_bg_optimised.jpg' %}{% endblock %}
{% block header_title %}{% block page_title %}{% endblock %}{% endblock %}
{% block header_inset_image_base %}{% endblock %}
{% block content_base %}
{% block utility_body_outer %}
<div class="l-content-page">
<div class="l-content-page--richtext">
{% block utility_body %}
{% endblock %}
{% block content %}
{% block utility_body %}
{% endblock %}
{% endblock content %}
</div>
</div>
{% endblock %}
{% endblock %}
{% block extra_script %}
<script src="{% static 'js/site-92ae8d0d6c.js' %}" type="text/javascript"></script>
{% endblock %}

View file

@ -1,19 +1,74 @@
import cms_pages
import hashlib
import urllib
from django import template
from django.contrib.staticfiles.templatetags import staticfiles
from easy_thumbnails.files import get_thumbnailer
register = template.Library()
@register.assignment_tag()
def classname(ob):
return ob.__class__.__name__
@register.simple_tag(takes_context=True)
def can_manage(context, proposal):
return proposal_permission(context, "manage", proposal)
@register.simple_tag(takes_context=True)
def can_review(context, proposal):
return proposal_permission(context, "review", proposal)
def proposal_permission(context, permname, proposal):
slug = proposal.kind.section.slug
perm = "reviews.can_%s_%s" % (permname, slug)
return context.request.user.has_perm(perm)
# {% load statictags %}{% static 'lca2017/images/svgs/illustrations/' %}{{ illustration }}
@register.simple_tag(takes_context=False)
def illustration(name):
return staticfiles.static('lca2017/images/svgs/illustrations/') + name
@register.simple_tag(takes_context=True)
def speaker_photo(context, speaker, size):
''' Provides the speaker profile, or else fall back to libravatar or gravatar. '''
if speaker.photo:
thumbnailer = get_thumbnailer(speaker.photo)
thumbnail_options = {'crop': True, 'size': (size, size)}
thumbnail = thumbnailer.get_thumbnail(thumbnail_options)
return thumbnail.url
else:
email = speaker.user.email.encode("utf-8")
md5sum = hashlib.md5(email.strip().lower()).hexdigest()
url = "https://secure.gravatar.com/avatar/%s?s=%d&d=%s" % (md5sum, size, "https://linux.conf.au/site_media/static/lca2017/images/speaker-fallback-devil.jpg")
return url
@register.simple_tag()
def presentation_bg_number(presentation, count):
return sum(ord(i) for i in presentation.title) % count
@register.simple_tag()
def header_paragraph(name):
model = cms_pages.models.NamedHeaderParagraph
try:
return model.objects.get(name=name).text
except model.DoesNotExist:
return ""
@register.simple_tag()
def all_images():
return cms_pages.models.CustomImage.objects.all().order_by("title")

View file

@ -8,7 +8,7 @@ dj-static==0.0.6
dj-database-url==0.4.0
#pinax-pages==0.4.2
pinax-boxes==2.1.2
wagtail==1.5.2
wagtail==1.6.2
pylibmc==1.5.1
raven==5.27.0

View file

@ -117,14 +117,14 @@
}
}
.panel--1-3, .l-speaker-page--portrait, .l-footer--text {
.panel--1-3, .l-speaker-page--portrait, .l-footer--logos {
-ms-flex-order: 1;
order: 1;
width: 100%;
}
@media (min-width: 48em) {
.panel--1-3, .l-speaker-page--portrait, .l-footer--text {
.panel--1-3, .l-speaker-page--portrait, .l-footer--logos {
-ms-flex-order: 0;
order: 0;
width: auto;
@ -133,14 +133,14 @@
}
}
.panel--2-3, .l-speaker-page--content, .l-footer--logos {
.panel--2-3, .l-speaker-page--content, .l-footer--text {
-ms-flex-order: 2;
order: 2;
width: 100%;
}
@media (min-width: 48em) {
.panel--2-3, .l-speaker-page--content, .l-footer--logos {
.panel--2-3, .l-speaker-page--content, .l-footer--text {
-ms-flex-order: 0;
order: 0;
width: auto;
@ -1127,6 +1127,19 @@ table.alt tr:not(:last-of-type) {
}
}
.right-floating-image {
width: 30%;
float: right;
margin: 4rem;
margin-right: 0;
}
.sponsor-logo {
width: 8em;
height: 4em;
margin: 0.5em;
}
.portrait {
position: relative;
overflow: hidden;

View file

@ -0,0 +1,276 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg3538"
viewBox="0 0 1372.9464 573.37965"
height="161.82048mm"
width="387.47598mm"
inkscape:version="0.48.5 r10040"
sodipodi:docname="Hewlett_Packard_Enterprise_logo.svg">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview5372"
showgrid="false"
inkscape:zoom="0.23890226"
inkscape:cx="686.47321"
inkscape:cy="286.68982"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg3538" />
<defs
id="defs3540" />
<metadata
id="metadata3543">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(435.04467,-285.29078)"
id="layer1"
style="fill:#ffffff">
<g
transform="matrix(7.4464891,0,0,7.4464891,2804.5105,-1839.1239)"
id="g3646"
style="fill:#ffffff">
<path
d="m -375.89589,299.46828 -55.205,0 0,-10.23425 55.205,0 0,10.23425 z m 3.94375,-14.1775 -63.0925,0 0,18.11875 63.0925,0 0,-18.11875 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3346" />
<g
id="g3348"
transform="matrix(1.25,0,0,-1.25,-431.10089,333.35578)"
style="fill:#ffffff">
<path
d="m 0,0 -3.155,0 0,14.495 3.155,0 0,-5.728 5.637,0 0,5.728 3.155,0 0,-14.495 -3.155,0 0,6.007 L 0,6.007 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3350" />
</g>
<g
id="g3352"
transform="matrix(1.25,0,0,-1.25,-414.13839,325.41203)"
style="fill:#ffffff">
<path
d="M 0,0 3.758,0 C 3.688,1.066 3.248,1.809 2.018,1.809 1.09,1.809 0.278,1.414 0,0 Z m 2.389,-6.587 c -3.201,0 -5.381,2.018 -5.381,5.333 0,3.225 2.134,5.451 4.964,5.451 3.085,0 4.616,-2.064 4.616,-5.149 l 0,-1.16 -6.588,0 c 0.372,-1.599 1.624,-2.016 2.877,-2.016 1.09,0 1.878,0.231 2.852,0.835 l 0.117,0 0,-2.389 C 5.011,-6.286 3.827,-6.587 2.389,-6.587"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3354" />
</g>
<g
id="g3356"
transform="matrix(1.25,0,0,-1.25,-395.61089,325.76078)"
style="fill:#ffffff">
<path
d="m 0,0 -1.624,-6.076 -2.76,0 -3.155,10.205 0,0.116 3.016,0 1.716,-6.1 1.624,6.1 2.459,0 1.647,-6.1 1.74,6.1 2.9,0 0,-0.116 -3.155,-10.205 -2.761,0 L 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3358" />
</g>
<g
id="g3360"
transform="matrix(1.25,0,0,-1.25,-379.75089,333.64578)"
style="fill:#ffffff">
<path
d="m 0,0 c -2.505,0 -3.526,0.997 -3.526,3.339 l 0,11.387 3.062,0 0,-11.178 c 0,-0.719 0.278,-0.974 0.881,-0.974 0.209,0 0.511,0.069 0.696,0.139 l 0.047,0 0,-2.528 C 0.905,0.093 0.464,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3362" />
</g>
<g
id="g3364"
transform="matrix(1.25,0,0,-1.25,-373.48714,325.41203)"
style="fill:#ffffff">
<path
d="M 0,0 3.758,0 C 3.688,1.066 3.248,1.809 2.018,1.809 1.091,1.809 0.278,1.414 0,0 Z m 2.389,-6.587 c -3.201,0 -5.381,2.018 -5.381,5.333 0,3.225 2.134,5.451 4.964,5.451 3.085,0 4.616,-2.064 4.616,-5.149 l 0,-1.16 -6.588,0 c 0.371,-1.599 1.624,-2.016 2.876,-2.016 1.091,0 1.879,0.231 2.854,0.835 l 0.116,0 0,-2.389 C 5.011,-6.286 3.828,-6.587 2.389,-6.587"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3366" />
</g>
<g
id="g3368"
transform="matrix(1.25,0,0,-1.25,-349.53714,320.45453)"
style="fill:#ffffff">
<path
d="m 0,0 2.273,0 0,-2.458 -2.273,0 0,-4.198 c 0,-0.905 0.348,-1.323 1.276,-1.323 0.255,0 0.58,0.024 0.928,0.14 l 0.069,0 0,-2.412 c -0.394,-0.14 -0.997,-0.301 -1.878,-0.301 -2.483,0 -3.457,1.136 -3.457,3.757 l 0,4.337 -3.92,0 0,-4.198 c 0,-0.905 0.348,-1.323 1.275,-1.323 0.256,0 0.581,0.024 0.929,0.14 l 0.069,0 0,-2.412 c -0.394,-0.14 -0.998,-0.301 -1.878,-0.301 -2.483,0 -3.457,1.136 -3.457,3.757 l 0,4.337 -1.578,0 0,2.458 1.578,0 0,2.829 3.062,0 0,-2.829 3.92,0 0,2.829 L 0,2.829 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3370" />
</g>
<g
id="g3372"
transform="matrix(1.25,0,0,-1.25,-333.79964,324.13703)"
style="fill:#ffffff">
<path
d="m 0,0 c 1.602,0 2.366,0.904 2.366,2.203 0,1.346 -0.764,2.25 -2.366,2.25 l -1.995,0 L -1.995,0 0,0 Z m 5.568,2.203 c 0,-3.155 -2.111,-4.87 -5.313,-4.87 l -2.25,0 0,-4.708 -3.153,0 0,14.495 5.403,0 c 3.202,0 5.313,-1.716 5.313,-4.917"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3374" />
</g>
<g
id="g3376"
transform="matrix(1.25,0,0,-1.25,-318.43214,329.29703)"
style="fill:#ffffff">
<path
d="m 0,0 0,0.881 c -0.464,0.254 -1.066,0.347 -1.693,0.347 -0.997,0 -1.6,-0.37 -1.6,-1.205 0,-0.859 0.603,-1.23 1.507,-1.23 0.858,0 1.508,0.441 1.786,1.207 z m 0.093,-2.227 c -0.673,-0.812 -1.669,-1.206 -2.738,-1.206 -2.017,0 -3.665,1.228 -3.665,3.41 0,2.017 1.648,3.362 4.013,3.362 0.742,0 1.509,-0.116 2.297,-0.347 l 0,0.184 c 0,1.114 -0.626,1.6 -2.272,1.6 -1.045,0 -2.042,-0.3 -2.901,-0.788 l -0.115,0 0,2.459 c 0.788,0.463 2.181,0.858 3.548,0.858 3.109,0 4.802,-1.484 4.802,-4.082 l 0,-6.47 -2.969,0 0,1.02"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3378" />
</g>
<g
id="g3380"
transform="matrix(1.25,0,0,-1.25,-312.66214,326.92078)"
style="fill:#ffffff">
<path
d="m 0,0 c 0,3.317 2.344,5.404 5.406,5.404 1.09,0 2.11,-0.232 2.876,-0.788 l 0,-2.621 -0.117,0 C 7.492,2.505 6.704,2.807 5.8,2.807 4.269,2.807 3.109,1.762 3.109,0 c 0,-1.762 1.16,-2.783 2.691,-2.783 0.904,0 1.692,0.302 2.365,0.813 l 0.117,0 0,-2.621 C 7.516,-5.148 6.496,-5.38 5.406,-5.38 2.344,-5.38 0,-3.317 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3382" />
</g>
<g
id="g3384"
transform="matrix(1.25,0,0,-1.25,-296.07714,327.50078)"
style="fill:#ffffff">
<path
d="m 0,0 0,-4.684 -3.061,0 0,14.495 3.061,0 0,-8.256 3.086,4.082 3.479,0 0,-0.116 -3.711,-4.685 3.711,-5.404 0,-0.116 -3.503,0 L 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3386" />
</g>
<g
id="g3388"
transform="matrix(1.25,0,0,-1.25,-279.28839,329.29703)"
style="fill:#ffffff">
<path
d="m 0,0 0,0.881 c -0.463,0.254 -1.067,0.347 -1.693,0.347 -0.997,0 -1.6,-0.37 -1.6,-1.205 0,-0.859 0.603,-1.23 1.506,-1.23 0.86,0 1.509,0.441 1.787,1.207 z m 0.093,-2.227 c -0.673,-0.812 -1.671,-1.206 -2.737,-1.206 -2.019,0 -3.665,1.228 -3.665,3.41 0,2.017 1.646,3.362 4.014,3.362 0.742,0 1.506,-0.116 2.295,-0.347 l 0,0.184 c 0,1.114 -0.626,1.6 -2.273,1.6 -1.043,0 -2.042,-0.3 -2.9,-0.788 l -0.116,0 0,2.459 c 0.789,0.463 2.181,0.858 3.549,0.858 3.11,0 4.803,-1.484 4.803,-4.082 l 0,-6.47 -2.97,0 0,1.02"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3390" />
</g>
<g
id="g3392"
transform="matrix(1.25,0,0,-1.25,-269.02339,322.54203)"
style="fill:#ffffff">
<path
d="M 0,0 C 0.556,1.137 1.369,1.786 2.506,1.786 2.923,1.786 3.34,1.693 3.501,1.6 l 0,-2.922 -0.115,0 C 3.038,-1.182 2.621,-1.09 2.041,-1.09 1.09,-1.09 0.348,-1.647 0.092,-2.713 l 0,-5.938 -3.061,0 0,10.321 L 0,1.67 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3394" />
</g>
<g
id="g3396"
transform="matrix(1.25,0,0,-1.25,-254.49714,328.97828)"
style="fill:#ffffff">
<path
d="m 0,0 0,3.317 c -0.51,0.742 -1.182,1.066 -1.949,1.066 -1.344,0 -2.249,-0.975 -2.249,-2.737 0,-1.762 0.905,-2.713 2.249,-2.713 0.767,0 1.439,0.325 1.949,1.067 z m 0.092,-2.436 c -0.649,-0.835 -1.67,-1.298 -3.061,-1.298 -2.645,0 -4.338,2.411 -4.338,5.38 0,2.969 1.693,5.404 4.338,5.404 1.345,0 2.319,-0.418 2.969,-1.183 l 0,5.125 3.062,0 0,-14.494 -2.97,0 0,1.066"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3398" />
</g>
<g
id="g3400"
transform="matrix(1.25,0,0,-1.25,-435.04464,339.27328)"
style="fill:#ffffff">
<path
d="m 0,0 8.954,0 0,-1.762 -6.936,0 0,-4.429 6.286,0 0,-1.717 -6.286,0 0,-4.824 6.936,0 0,-1.762 -8.954,0 L 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3402" />
</g>
<g
id="g3404"
transform="matrix(1.25,0,0,-1.25,-414.60339,344.37453)"
style="fill:#ffffff">
<path
d="m 0,0 c 2.296,0 3.572,-1.508 3.572,-3.988 l 0,-6.425 -1.925,0 0,6.378 c 0,1.322 -0.673,2.273 -2.134,2.273 -1.206,0 -2.227,-0.766 -2.575,-1.855 l 0,-6.796 -1.925,0 0,10.204 1.925,0 0,-1.484 C -2.459,-0.742 -1.438,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3406" />
</g>
<g
id="g3408"
transform="matrix(1.25,0,0,-1.25,-403.67089,344.63578)"
style="fill:#ffffff">
<path
d="m 0,0 2.621,0 0,-1.647 -2.621,0 0,-5.496 c 0,-1.159 0.603,-1.554 1.693,-1.554 0.301,0 0.626,0.046 0.858,0.139 l 0.07,0 0,-1.646 c -0.278,-0.116 -0.673,-0.209 -1.206,-0.209 -2.39,0 -3.34,1.091 -3.34,3.084 l 0,5.682 -1.763,0 0,1.647 1.763,0 0,2.712 L 0,2.712 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3410" />
</g>
<g
id="g3412"
transform="matrix(1.25,0,0,-1.25,-396.36464,349.76578)"
style="fill:#ffffff">
<path
d="M 0,0 5.08,0 C 5.011,1.507 4.268,2.666 2.691,2.666 1.23,2.666 0.278,1.576 0,0 Z m 3.039,-6.309 c -2.993,0 -5.034,1.995 -5.034,5.195 0,3.201 1.902,5.427 4.663,5.427 2.807,0 4.268,-2.018 4.268,-5.009 l 0,-0.882 -7.006,0 c 0.209,-2.064 1.532,-3.061 3.364,-3.061 1.137,0 1.948,0.255 2.853,0.928 l 0.07,0 0,-1.694 C 5.382,-6.054 4.291,-6.309 3.039,-6.309"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3414" />
</g>
<g
id="g3416"
transform="matrix(1.25,0,0,-1.25,-382.44714,346.60703)"
style="fill:#ffffff">
<path
d="m 0,0 c 0.441,1.09 1.416,1.739 2.528,1.739 0.442,0 0.836,-0.069 0.998,-0.162 l 0,-1.901 -0.069,0 C 3.178,-0.186 2.714,-0.116 2.25,-0.116 1.207,-0.116 0.325,-0.811 0,-1.971 l 0,-6.656 -1.925,0 0,10.204 L 0,1.577 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3418" />
</g>
<g
id="g3420"
transform="matrix(1.25,0,0,-1.25,-370.26964,355.47703)"
style="fill:#ffffff">
<path
d="m 0,0 c 1.902,0 3.016,1.507 3.016,3.572 0,2.04 -1.114,3.57 -3.016,3.57 -1.044,0 -2.018,-0.626 -2.528,-1.622 l 0,-3.921 C -2.018,0.603 -1.044,0 0,0 Z m 0.325,8.882 c 3.038,0 4.662,-2.482 4.662,-5.31 0,-2.831 -1.624,-5.312 -4.662,-5.312 -1.253,0 -2.32,0.649 -2.853,1.346 l 0,-5.057 -1.926,0 0,14.124 1.926,0 0,-1.159 c 0.533,0.719 1.6,1.368 2.853,1.368"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3422" />
</g>
<g
id="g3424"
transform="matrix(1.25,0,0,-1.25,-358.78714,346.60703)"
style="fill:#ffffff">
<path
d="m 0,0 c 0.44,1.09 1.415,1.739 2.528,1.739 0.441,0 0.835,-0.069 0.997,-0.162 l 0,-1.901 -0.069,0 C 3.178,-0.186 2.714,-0.116 2.25,-0.116 1.206,-0.116 0.325,-0.811 0,-1.971 l 0,-6.656 -1.925,0 0,10.204 L 0,1.577 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3426" />
</g>
<g
id="g3428"
transform="matrix(1.25,0,0,-1.25,-350.90089,339.47578)"
style="fill:#ffffff">
<path
d="m 0,0 c 0.673,0 1.229,-0.533 1.229,-1.206 0,-0.673 -0.556,-1.206 -1.229,-1.206 -0.649,0 -1.23,0.533 -1.23,1.206 C -1.23,-0.533 -0.649,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3430" />
</g>
<path
d="m -352.08964,357.39078 2.4075,0 0,-12.755 -2.4075,0 0,12.755 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3432" />
<g
id="g3434"
transform="matrix(1.25,0,0,-1.25,-341.09964,349.94078)"
style="fill:#ffffff">
<path
d="m 0,0 c 1.461,-0.463 3.084,-1.066 3.084,-3.014 0,-2.088 -1.716,-3.155 -3.919,-3.155 -1.346,0 -2.691,0.325 -3.457,0.928 l 0,1.832 0.093,0 c 0.859,-0.788 2.134,-1.136 3.34,-1.136 1.09,0 2.065,0.418 2.065,1.299 0,0.904 -0.811,1.113 -2.413,1.646 -1.438,0.464 -3.038,0.998 -3.038,2.922 0,1.972 1.623,3.131 3.688,3.131 1.206,0 2.273,-0.255 3.131,-0.835 l 0,-1.856 -0.069,0 C 1.671,2.435 0.695,2.83 -0.511,2.83 -1.717,2.83 -2.39,2.296 -2.39,1.577 -2.39,0.765 -1.648,0.534 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3436" />
</g>
<g
id="g3438"
transform="matrix(1.25,0,0,-1.25,-332.66214,349.76578)"
style="fill:#ffffff">
<path
d="M 0,0 5.079,0 C 5.01,1.507 4.268,2.666 2.69,2.666 1.229,2.666 0.278,1.576 0,0 Z m 3.038,-6.309 c -2.992,0 -5.033,1.995 -5.033,5.195 0,3.201 1.902,5.427 4.662,5.427 2.808,0 4.268,-2.018 4.268,-5.009 l 0,-0.882 -7.005,0 c 0.209,-2.064 1.531,-3.061 3.363,-3.061 1.138,0 1.949,0.255 2.853,0.928 l 0.07,0 0,-1.694 C 5.382,-6.054 4.291,-6.309 3.038,-6.309"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3440" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
width="1000"
height="400"
id="svg4448"
inkscape:version="0.48.5 r10040"
sodipodi:docname="IBM_logo.svg">
<metadata
id="metadata4456">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs4454" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1126"
inkscape:window-height="635"
id="namedview4452"
showgrid="false"
inkscape:zoom="0.328"
inkscape:cx="-39.634146"
inkscape:cy="200"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg4448" />
<path
d="M 0,0 0,27.367 194.64844,27.367 194.64844,0 0,0 z M 222.22657,0 222.22657,27.367 499.60937,27.367 C 499.60936,27.367 471.27625,0 433.75,0 L 222.22657,0 z M 554.02344,0 554.02344,27.367 721.83594,27.367 711.875,0 554.02344,0 z M 842.14844,0 832.1875,27.367 998.47656,27.367 998.47656,0 842.14844,0 z M 0,53.22221 0,80.589202 194.64844,80.589202 194.64844,53.22221 0,53.22221 z M 222.22657,53.260975 222.22657,80.589202 531.79688,80.589202 C 531.79688,80.589214 528.18125,59.526386 521.875,53.260975 L 222.22657,53.260975 z M 554.02344,53.260975 554.02344,80.589202 740.23438,80.589202 731.01562,53.260975 554.02344,53.260975 z M 822.22656,53.260975 813.00781,80.589202 998.47656,80.589202 998.47656,53.260975 822.22656,53.260975 z M 55.937496,106.44442 55.937496,133.85017 140.23437,133.85017 140.23437,106.44442 55.937496,106.44442 z M 278.16407,106.44442 278.16407,133.85017 362.46093,133.85017 362.46093,106.44442 278.16407,106.44442 z M 444.45313,106.44442 444.45313,133.85017 528.75,133.85017 C 528.75001,133.85017 534.10156,119.37715 534.10156,106.44442 L 444.45313,106.44442 z M 609.96094,106.44442 609.96094,133.85017 759.41407,133.85017 749.45313,106.44442 609.96094,106.44442 z M 803.86719,106.44442 793.86719,133.85017 944.0625,133.85017 944.0625,106.44442 803.86719,106.44442 z M 55.937496,159.7054 55.937496,187.07238 140.23437,187.07238 140.23437,159.7054 55.937496,159.7054 z M 278.16407,159.7054 278.16407,187.07238 493.47657,187.07238 C 493.47658,187.07237 511.48781,173.0301 517.22656,159.7054 L 278.16407,159.7054 z M 609.96094,159.7054 609.96094,187.07238 694.25781,187.07238 694.25781,171.83835 699.60937,187.07238 854.02344,187.07238 859.76563,171.83835 859.76563,187.07238 944.0625,187.07238 944.0625,159.7054 785.82031,159.7054 777.42187,182.88593 768.98438,159.7054 609.96094,159.7054 z M 55.937496,212.92761 55.937496,240.29459 140.23437,240.29459 140.23437,212.92761 55.937496,212.92761 z M 278.16407,212.92761 278.16407,240.29459 517.22656,240.29459 C 511.48657,227.01331 493.47657,212.92761 493.47657,212.92761 L 278.16407,212.92761 z M 609.96094,212.92761 609.96094,240.29459 694.25781,240.29459 694.25781,212.92761 609.96094,212.92761 z M 709.57031,212.92761 719.76563,240.29459 835.54688,240.29459 845.23438,212.92761 709.57031,212.92761 z M 859.76563,212.92761 859.76563,240.29459 944.0625,240.29459 944.0625,212.92761 859.76563,212.92761 z M 55.937496,266.14982 55.937496,293.5168 140.23437,293.5168 140.23437,266.14982 55.937496,266.14982 z M 278.16407,266.14982 278.16407,293.5168 362.46093,293.5168 362.46093,266.14982 278.16407,266.14982 z M 444.45313,266.14982 444.45313,293.5168 534.10156,293.5168 C 534.10158,280.60147 528.75,266.14982 528.75,266.14982 L 444.45313,266.14982 z M 609.96094,266.14982 609.96094,293.5168 694.25781,293.5168 694.25781,266.14982 609.96094,266.14982 z M 728.71093,266.14982 738.59375,293.5168 816.21093,293.5168 826.17187,266.14982 728.71093,266.14982 z M 859.76563,266.14982 859.76563,293.5168 944.0625,293.5168 944.0625,266.14982 859.76563,266.14982 z M 1.52343,319.37203 1.52343,346.77778 196.17187,346.77778 196.17187,319.37203 1.52343,319.37203 z M 222.22657,319.37203 222.22657,346.77778 521.875,346.77778 C 528.18125,340.50245 531.79688,319.37203 531.79688,319.37203 L 222.22657,319.37203 z M 555.54687,319.37203 555.54687,346.77778 694.25781,346.77778 694.25781,319.37203 555.54687,319.37203 z M 747.89062,319.37203 758.04687,346.77778 797.53906,346.77778 807.07031,319.37203 747.89062,319.37203 z M 859.76563,319.37203 859.76563,346.77778 1000,346.77778 1000,319.37203 859.76563,319.37203 z M 1.52343,372.633 1.52343,400 196.17187,400 196.17187,372.633 1.52343,372.633 z M 222.22657,372.633 222.22657,399.96124 433.75,399.96124 C 471.27624,399.96122 499.60937,372.633 499.60937,372.633 L 222.22657,372.633 z M 555.54687,372.633 555.54687,400 694.25781,400 694.25781,372.633 555.54687,372.633 z M 767.14844,372.633 776.91407,399.92246 778.59375,399.96124 788.51563,372.633 767.14844,372.633 z M 859.76563,372.633 859.76563,400 1000,400 1000,372.633 859.76563,372.633 z"
fill="#1f70c1"
id="path4450"
style="fill:#ffffff;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
static/src/lca2017/images/hobart_bg_optimised.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB