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