site nav
This commit is contained in:
		@ -13,9 +13,12 @@ from aircox.admin.playlist import TracksInline
 | 
			
		||||
from aircox.admin.mixins import UnrelatedInlineMixin
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@admin.register(models.SiteSettings)
 | 
			
		||||
class SettingsAdmin(admin.ModelAdmin):
 | 
			
		||||
    pass
 | 
			
		||||
@admin.register(models.Site)
 | 
			
		||||
class SiteAdmin(ContentEditor):
 | 
			
		||||
    inlines = [
 | 
			
		||||
        plugins.richtext.RichTextInline.create(models.SiteRichText),
 | 
			
		||||
        plugins.image.ImageInline.create(models.SiteImage),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PageDiffusionPlaylist(UnrelatedInlineMixin, TracksInline):
 | 
			
		||||
@ -55,8 +58,8 @@ class PageAdmin(ContentEditor, TreeAdmin):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    inlines = [
 | 
			
		||||
        plugins.richtext.RichTextInline.create(models.RichText),
 | 
			
		||||
        plugins.image.ImageInline.create(models.Image),
 | 
			
		||||
        plugins.richtext.RichTextInline.create(models.PageRichText),
 | 
			
		||||
        plugins.image.ImageInline.create(models.PageImage),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    def get_inline_instances(self, request, obj=None):
 | 
			
		||||
 | 
			
		||||
@ -1 +1,2 @@
 | 
			
		||||
import './js';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,11 +10,10 @@ from model_utils.models import TimeStampedModel, StatusModel
 | 
			
		||||
from model_utils import Choices
 | 
			
		||||
from filer.fields.image import FilerImageField
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from aircox import models as aircox
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SiteSettings(models.Model):
 | 
			
		||||
class Site(models.Model):
 | 
			
		||||
    station = models.ForeignKey(
 | 
			
		||||
        aircox.Station, on_delete=models.SET_NULL, null=True,
 | 
			
		||||
    )
 | 
			
		||||
@ -45,16 +44,29 @@ class SiteSettings(models.Model):
 | 
			
		||||
        blank=True, null=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    regions = [
 | 
			
		||||
        Region(key='topnav', title=_('Navigation'), inherited=True),
 | 
			
		||||
        Region(key='sidenav', title=_('Side Navigation'), inherited=True),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SitePlugin = create_plugin_base(Site)
 | 
			
		||||
 | 
			
		||||
class SiteRichText(plugins.richtext.RichText, SitePlugin):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SiteImage(plugins.image.Image, SitePlugin):
 | 
			
		||||
    caption = models.CharField(_("caption"), max_length=200, blank=True)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Page(AbstractPage, TimeStampedModel, StatusModel):
 | 
			
		||||
    STATUS = Choices('draft', 'published')
 | 
			
		||||
    regions = [
 | 
			
		||||
        Region(key="main", title=_("Content")),
 | 
			
		||||
        Region(key="sidebar", title=_("Sidebar")),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    # metadata
 | 
			
		||||
    by = models.ForeignKey(
 | 
			
		||||
        auth.User, models.SET_NULL, blank=True, null=True,
 | 
			
		||||
@ -96,22 +108,20 @@ class Page(AbstractPage, TimeStampedModel, StatusModel):
 | 
			
		||||
        aircox.Diffusion, models.CASCADE,
 | 
			
		||||
        blank=True, null=True,
 | 
			
		||||
    )
 | 
			
		||||
    program = models.OneToOneField(
 | 
			
		||||
        aircox.Program, models.CASCADE,
 | 
			
		||||
        blank=True, null=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PagePlugin = create_plugin_base(Page)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RichText(plugins.richtext.RichText, PagePlugin):
 | 
			
		||||
class PageRichText(plugins.richtext.RichText, PagePlugin):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Image(plugins.image.Image, PagePlugin):
 | 
			
		||||
class PageImage(plugins.image.Image, PagePlugin):
 | 
			
		||||
    caption = models.CharField(_("caption"), max_length=200, blank=True)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ProgramPage(Page):
 | 
			
		||||
    program = models.OneToOneField(
 | 
			
		||||
        aircox.Program, models.CASCADE,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,16 +1,31 @@
 | 
			
		||||
from django.utils.html import format_html, mark_safe
 | 
			
		||||
from feincms3.renderer import TemplatePluginRenderer
 | 
			
		||||
 | 
			
		||||
from .models import Page, RichText, Image
 | 
			
		||||
from .models import *
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
renderer = TemplatePluginRenderer()
 | 
			
		||||
renderer.register_string_renderer(
 | 
			
		||||
    RichText,
 | 
			
		||||
site_renderer = TemplatePluginRenderer()
 | 
			
		||||
site_renderer.register_string_renderer(
 | 
			
		||||
    SiteRichText,
 | 
			
		||||
    lambda plugin: mark_safe(plugin.text),
 | 
			
		||||
)
 | 
			
		||||
renderer.register_string_renderer(
 | 
			
		||||
    Image,
 | 
			
		||||
site_renderer.register_string_renderer(
 | 
			
		||||
    SiteImage,
 | 
			
		||||
    lambda plugin: format_html(
 | 
			
		||||
        '<figure><img src="{}" alt=""/><figcaption>{}</figcaption></figure>',
 | 
			
		||||
        plugin.image.url,
 | 
			
		||||
        plugin.caption,
 | 
			
		||||
    ),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
page_renderer = TemplatePluginRenderer()
 | 
			
		||||
page_renderer.register_string_renderer(
 | 
			
		||||
    PageRichText,
 | 
			
		||||
    lambda plugin: mark_safe(plugin.text),
 | 
			
		||||
)
 | 
			
		||||
page_renderer.register_string_renderer(
 | 
			
		||||
    PageImage,
 | 
			
		||||
    lambda plugin: format_html(
 | 
			
		||||
        '<figure><img src="{}" alt=""/><figcaption>{}</figcaption></figure>',
 | 
			
		||||
        plugin.image.url,
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,11 @@
 | 
			
		||||
{% load static thumbnail %}
 | 
			
		||||
{% load static thumbnail feincms3 %}
 | 
			
		||||
<html>
 | 
			
		||||
    <head>
 | 
			
		||||
        <meta charset="utf-8">
 | 
			
		||||
        <meta name="application-name" content="aircox">
 | 
			
		||||
        <meta name="description" content="{{ site_settings.description }}">
 | 
			
		||||
        <meta name="keywords" content="{{ site_settings.tags }}">
 | 
			
		||||
        <link rel="icon" href="{% thumbnail site_settings.favicon 32x32 crop %}" />
 | 
			
		||||
        <meta name="description" content="{{ site.description }}">
 | 
			
		||||
        <meta name="keywords" content="{{ site.tags }}">
 | 
			
		||||
        <link rel="icon" href="{% thumbnail site.favicon 32x32 crop %}" />
 | 
			
		||||
 | 
			
		||||
        {% block assets %}
 | 
			
		||||
        <link rel="stylesheet" type="text/css" href="{% static "aircox_web/assets/main.css" %}"/>
 | 
			
		||||
@ -15,19 +15,26 @@
 | 
			
		||||
        <script src="{% static "aircox_web/assets/vendor.js" %}"></script>
 | 
			
		||||
        {% endblock %}
 | 
			
		||||
 | 
			
		||||
        <title>{% block title %}{{ site_settings.title }}{% endblock %}</title>
 | 
			
		||||
        <title>{% block title %}{{ site.title }}{% endblock %}</title>
 | 
			
		||||
 | 
			
		||||
        {% block extra_head %}{% endblock %}
 | 
			
		||||
    </head>
 | 
			
		||||
    <body id="app">
 | 
			
		||||
        <nav class="navbar" role="navigation" aria-label="main navigation">
 | 
			
		||||
            {% render_region regions "topnav" %}
 | 
			
		||||
        </nav>
 | 
			
		||||
 | 
			
		||||
        <main>
 | 
			
		||||
            {% block main %}
 | 
			
		||||
 | 
			
		||||
            {% endblock main %}
 | 
			
		||||
        </main>
 | 
			
		||||
        <div class="columns">
 | 
			
		||||
            <aside class="column">
 | 
			
		||||
                {% render_region regions "sidenav" %}
 | 
			
		||||
            </aside>
 | 
			
		||||
            <main class="column is-three-quarters">
 | 
			
		||||
                {% block main %}
 | 
			
		||||
                <h1>{{ page.title }}</h1>
 | 
			
		||||
                {% render_region page_regions "main" %}
 | 
			
		||||
                {% endblock main %}
 | 
			
		||||
            </main>
 | 
			
		||||
        </div>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,8 @@ from django.shortcuts import get_object_or_404, render
 | 
			
		||||
 | 
			
		||||
from feincms3.regions import Regions
 | 
			
		||||
 | 
			
		||||
from .models import SiteSettings, Page
 | 
			
		||||
from .renderer import renderer
 | 
			
		||||
from .models import Site, Page
 | 
			
		||||
from .renderer import site_renderer, page_renderer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def page_detail(request, path=None):
 | 
			
		||||
@ -12,11 +12,11 @@ def page_detail(request, path=None):
 | 
			
		||||
        Page.objects.all(),
 | 
			
		||||
        path="/{}/".format(path) if path else "/",
 | 
			
		||||
    )
 | 
			
		||||
    site = Site.objects.all().first()
 | 
			
		||||
    return render(request, "aircox_web/page.html", {
 | 
			
		||||
        'site_settings': SiteSettings.objects.all().first(),
 | 
			
		||||
        'site': site,
 | 
			
		||||
        "regions": Regions.from_item(site, renderer=site_renderer, timeout=60),
 | 
			
		||||
        "page": page,
 | 
			
		||||
        "regions": Regions.from_item(
 | 
			
		||||
            page, renderer=renderer, timeout=60
 | 
			
		||||
        ),
 | 
			
		||||
        "page_regions": Regions.from_item(page, renderer=page_renderer, timeout=60),
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user