forked from rc/aircox
work on website
This commit is contained in:
parent
6ed33c34a9
commit
7c8814e164
|
@ -36,8 +36,8 @@ class PageDiffusionPlaylist(UnrelatedInlineMixin, TracksInline):
|
||||||
view_obj.save()
|
view_obj.save()
|
||||||
|
|
||||||
|
|
||||||
@admin.register(models.Article)
|
@admin.register(models.Page)
|
||||||
class ArticleAdmin(ContentEditor):
|
class PageAdmin(ContentEditor):
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(_('Main'), {
|
(_('Main'), {
|
||||||
'fields': ['title', 'slug', 'cover', 'headline'],
|
'fields': ['title', 'slug', 'cover', 'headline'],
|
||||||
|
@ -48,19 +48,19 @@ class ArticleAdmin(ContentEditor):
|
||||||
'classes': ('tabbed',)
|
'classes': ('tabbed',)
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
list_display = ["title", "parent", "status"]
|
list_display = ["title", "status", "slug"]
|
||||||
list_editable = ['status']
|
list_editable = ['status']
|
||||||
prepopulated_fields = {"slug": ("title",)}
|
prepopulated_fields = {"slug": ("title",)}
|
||||||
|
|
||||||
inlines = [
|
inlines = [
|
||||||
ContentEditorInline.create(models.ArticleRichText),
|
ContentEditorInline.create(models.PageRichText),
|
||||||
ContentEditorInline.create(models.ArticleImage),
|
ContentEditorInline.create(models.PageImage),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@admin.register(models.DiffusionPage)
|
@admin.register(models.DiffusionPage)
|
||||||
class DiffusionPageAdmin(ArticleAdmin):
|
class DiffusionPageAdmin(PageAdmin):
|
||||||
fieldsets = copy.deepcopy(ArticleAdmin.fieldsets)
|
fieldsets = copy.deepcopy(PageAdmin.fieldsets)
|
||||||
fieldsets[1][1]['fields'].insert(0, 'diffusion')
|
fieldsets[1][1]['fields'].insert(0, 'diffusion')
|
||||||
|
|
||||||
# TODO: permissions
|
# TODO: permissions
|
||||||
|
@ -72,8 +72,10 @@ class DiffusionPageAdmin(ArticleAdmin):
|
||||||
|
|
||||||
|
|
||||||
@admin.register(models.ProgramPage)
|
@admin.register(models.ProgramPage)
|
||||||
class ProgramPageAdmin(ArticleAdmin):
|
class ProgramPageAdmin(PageAdmin):
|
||||||
fieldsets = copy.deepcopy(ArticleAdmin.fieldsets)
|
fieldsets = copy.deepcopy(PageAdmin.fieldsets)
|
||||||
fieldsets[1][1]['fields'].insert(0, 'program')
|
fieldsets[1][1]['fields'].insert(0, 'program')
|
||||||
|
prepopulated_fields = {}
|
||||||
|
readonly_fields = ['slug']
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,16 +37,34 @@ $body-background-color: $light;
|
||||||
padding: 0.2em 0em;
|
padding: 0.2em 0em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cover {
|
|
||||||
float: right;
|
|
||||||
max-width: 40%;
|
|
||||||
margin: 1em;
|
|
||||||
border: 0.2em black solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
p {
|
||||||
padding: 0.4em 0em;
|
padding: 0.4em 0em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.cover {
|
||||||
|
margin: 1em 0em;
|
||||||
|
border: 0.2em black solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-cover {
|
||||||
|
width: 10em;
|
||||||
|
}
|
||||||
|
|
||||||
|
aside {
|
||||||
|
.small-cover {
|
||||||
|
width: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media .subtitle {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media .content {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -98,23 +98,43 @@ class Page(StatusModel):
|
||||||
Page parenting is based on foreignkey to parent and page path.
|
Page parenting is based on foreignkey to parent and page path.
|
||||||
"""
|
"""
|
||||||
STATUS = Choices('draft', 'published', 'trash')
|
STATUS = Choices('draft', 'published', 'trash')
|
||||||
|
regions = [
|
||||||
|
Region(key="content", title=_("Content")),
|
||||||
|
]
|
||||||
|
|
||||||
parent = models.ForeignKey(
|
|
||||||
'self', models.CASCADE,
|
|
||||||
verbose_name=_('parent page'),
|
|
||||||
blank=True, null=True,
|
|
||||||
)
|
|
||||||
title = models.CharField(max_length=128)
|
title = models.CharField(max_length=128)
|
||||||
slug = models.SlugField(_('slug'))
|
slug = models.SlugField(_('slug'), blank=True, unique=True)
|
||||||
headline = models.TextField(
|
headline = models.TextField(
|
||||||
_('headline'), max_length=128, blank=True, null=True,
|
_('headline'), max_length=128, blank=True, null=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# content
|
||||||
|
as_program = models.ForeignKey(
|
||||||
|
aircox.Program, models.SET_NULL, blank=True, null=True,
|
||||||
|
related_name='+',
|
||||||
|
# SO#51948640
|
||||||
|
# limit_choices_to={'schedule__isnull': False},
|
||||||
|
verbose_name=_('Show program as author'),
|
||||||
|
help_text=_("Show program as author"),
|
||||||
|
)
|
||||||
|
cover = FilerImageField(
|
||||||
|
on_delete=models.SET_NULL, null=True, blank=True,
|
||||||
|
verbose_name=_('Cover'),
|
||||||
|
)
|
||||||
|
|
||||||
|
# options
|
||||||
|
featured = models.BooleanField(
|
||||||
|
_('featured'), default=False,
|
||||||
|
)
|
||||||
|
allow_comments = models.BooleanField(
|
||||||
|
_('allow comments'), default=True,
|
||||||
|
)
|
||||||
|
|
||||||
objects = PageQueryset.as_manager()
|
objects = PageQueryset.as_manager()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def path(self):
|
def path(self):
|
||||||
return reverse('page', kwargs={'slug': self.slug})
|
return reverse(self.detail_url_name, kwargs={'slug': self.slug})
|
||||||
|
|
||||||
def get_view_class(self):
|
def get_view_class(self):
|
||||||
""" Page view class"""
|
""" Page view class"""
|
||||||
|
@ -130,39 +150,9 @@ class Page(StatusModel):
|
||||||
self.title or self.pk)
|
self.title or self.pk)
|
||||||
|
|
||||||
|
|
||||||
class Article(Page):
|
class DiffusionPage(Page):
|
||||||
""" User's pages """
|
detail_url_name = 'diffusion-page'
|
||||||
regions = [
|
|
||||||
Region(key="content", title=_("Content")),
|
|
||||||
]
|
|
||||||
|
|
||||||
# metadata
|
|
||||||
as_program = models.ForeignKey(
|
|
||||||
aircox.Program, models.SET_NULL, blank=True, null=True,
|
|
||||||
related_name='+',
|
|
||||||
# SO#51948640
|
|
||||||
# limit_choices_to={'schedule__isnull': False},
|
|
||||||
verbose_name=_('Show program as author'),
|
|
||||||
help_text=_("Show program as author"),
|
|
||||||
)
|
|
||||||
|
|
||||||
# options
|
|
||||||
featured = models.BooleanField(
|
|
||||||
_('featured'), default=False,
|
|
||||||
)
|
|
||||||
allow_comments = models.BooleanField(
|
|
||||||
_('allow comments'), default=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
# content
|
|
||||||
cover = FilerImageField(
|
|
||||||
on_delete=models.SET_NULL, null=True, blank=True,
|
|
||||||
verbose_name=_('Cover'),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class DiffusionPage(Article):
|
|
||||||
diffusion = models.OneToOneField(
|
diffusion = models.OneToOneField(
|
||||||
aircox.Diffusion, models.CASCADE,
|
aircox.Diffusion, models.CASCADE,
|
||||||
related_name='page',
|
related_name='page',
|
||||||
|
@ -173,8 +163,23 @@ class DiffusionPage(Article):
|
||||||
def path(self):
|
def path(self):
|
||||||
return reverse('diffusion-page', kwargs={'slug': self.slug})
|
return reverse('diffusion-page', kwargs={'slug': self.slug})
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
program = self.diffusion.program
|
||||||
|
self.as_program = self.diffusion.program
|
||||||
|
if not self.slug.startswith(program.slug + '-'):
|
||||||
|
self.slug = '{}-{}'.format(program.slug, self.slug)
|
||||||
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
class ProgramPage(Article):
|
|
||||||
|
def get_diffusions_with_page(queryset=aircox.Diffusion.objects,
|
||||||
|
status=Page.STATUS.published):
|
||||||
|
return queryset.filter(Q(page__isnull=True) |
|
||||||
|
Q(initial__page__isnull=True),
|
||||||
|
Q(page__status=status) |
|
||||||
|
Q(initial__page__status=status))
|
||||||
|
|
||||||
|
|
||||||
|
class ProgramPage(Page):
|
||||||
detail_url_name = 'program-page'
|
detail_url_name = 'program-page'
|
||||||
|
|
||||||
program = models.OneToOneField(
|
program = models.OneToOneField(
|
||||||
|
@ -186,14 +191,18 @@ class ProgramPage(Article):
|
||||||
def path(self):
|
def path(self):
|
||||||
return reverse('program-page', kwargs={'slug': self.slug})
|
return reverse('program-page', kwargs={'slug': self.slug})
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.slug = self.program.slug
|
||||||
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
#-----------------------------------------------------------------------
|
||||||
ArticlePlugin = create_plugin_base(Article)
|
PagePlugin = create_plugin_base(Page)
|
||||||
|
|
||||||
class ArticleRichText(plugins.RichText, ArticlePlugin):
|
class PageRichText(plugins.RichText, PagePlugin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class ArticleImage(plugins.Image, ArticlePlugin):
|
class PageImage(plugins.Image, PagePlugin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,6 @@ site_renderer.register(SiteLink, lambda plugin: plugin.render())
|
||||||
|
|
||||||
page_renderer = PluginRenderer()
|
page_renderer = PluginRenderer()
|
||||||
page_renderer._renderers.clear()
|
page_renderer._renderers.clear()
|
||||||
page_renderer.register(ArticleRichText, lambda plugin: mark_safe(plugin.text))
|
page_renderer.register(PageRichText, lambda plugin: mark_safe(plugin.text))
|
||||||
page_renderer.register(ArticleImage, lambda plugin: plugin.render())
|
page_renderer.register(PageImage, lambda plugin: plugin.render())
|
||||||
|
|
||||||
|
|
7197
aircox_web/static/aircox_web/assets/main.css
Normal file
7197
aircox_web/static/aircox_web/assets/main.css
Normal file
File diff suppressed because it is too large
Load Diff
347
aircox_web/static/aircox_web/assets/main.js
Normal file
347
aircox_web/static/aircox_web/assets/main.js
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
/******/ (function(modules) { // webpackBootstrap
|
||||||
|
/******/ // install a JSONP callback for chunk loading
|
||||||
|
/******/ function webpackJsonpCallback(data) {
|
||||||
|
/******/ var chunkIds = data[0];
|
||||||
|
/******/ var moreModules = data[1];
|
||||||
|
/******/ var executeModules = data[2];
|
||||||
|
/******/
|
||||||
|
/******/ // add "moreModules" to the modules object,
|
||||||
|
/******/ // then flag all "chunkIds" as loaded and fire callback
|
||||||
|
/******/ var moduleId, chunkId, i = 0, resolves = [];
|
||||||
|
/******/ for(;i < chunkIds.length; i++) {
|
||||||
|
/******/ chunkId = chunkIds[i];
|
||||||
|
/******/ if(installedChunks[chunkId]) {
|
||||||
|
/******/ resolves.push(installedChunks[chunkId][0]);
|
||||||
|
/******/ }
|
||||||
|
/******/ installedChunks[chunkId] = 0;
|
||||||
|
/******/ }
|
||||||
|
/******/ for(moduleId in moreModules) {
|
||||||
|
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
|
||||||
|
/******/ modules[moduleId] = moreModules[moduleId];
|
||||||
|
/******/ }
|
||||||
|
/******/ }
|
||||||
|
/******/ if(parentJsonpFunction) parentJsonpFunction(data);
|
||||||
|
/******/
|
||||||
|
/******/ while(resolves.length) {
|
||||||
|
/******/ resolves.shift()();
|
||||||
|
/******/ }
|
||||||
|
/******/
|
||||||
|
/******/ // add entry modules from loaded chunk to deferred list
|
||||||
|
/******/ deferredModules.push.apply(deferredModules, executeModules || []);
|
||||||
|
/******/
|
||||||
|
/******/ // run deferred modules when all chunks ready
|
||||||
|
/******/ return checkDeferredModules();
|
||||||
|
/******/ };
|
||||||
|
/******/ function checkDeferredModules() {
|
||||||
|
/******/ var result;
|
||||||
|
/******/ for(var i = 0; i < deferredModules.length; i++) {
|
||||||
|
/******/ var deferredModule = deferredModules[i];
|
||||||
|
/******/ var fulfilled = true;
|
||||||
|
/******/ for(var j = 1; j < deferredModule.length; j++) {
|
||||||
|
/******/ var depId = deferredModule[j];
|
||||||
|
/******/ if(installedChunks[depId] !== 0) fulfilled = false;
|
||||||
|
/******/ }
|
||||||
|
/******/ if(fulfilled) {
|
||||||
|
/******/ deferredModules.splice(i--, 1);
|
||||||
|
/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
|
||||||
|
/******/ }
|
||||||
|
/******/ }
|
||||||
|
/******/
|
||||||
|
/******/ return result;
|
||||||
|
/******/ }
|
||||||
|
/******/
|
||||||
|
/******/ // The module cache
|
||||||
|
/******/ var installedModules = {};
|
||||||
|
/******/
|
||||||
|
/******/ // object to store loaded and loading chunks
|
||||||
|
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
|
||||||
|
/******/ // Promise = chunk loading, 0 = chunk loaded
|
||||||
|
/******/ var installedChunks = {
|
||||||
|
/******/ "main": 0
|
||||||
|
/******/ };
|
||||||
|
/******/
|
||||||
|
/******/ var deferredModules = [];
|
||||||
|
/******/
|
||||||
|
/******/ // The require function
|
||||||
|
/******/ function __webpack_require__(moduleId) {
|
||||||
|
/******/
|
||||||
|
/******/ // Check if module is in cache
|
||||||
|
/******/ if(installedModules[moduleId]) {
|
||||||
|
/******/ return installedModules[moduleId].exports;
|
||||||
|
/******/ }
|
||||||
|
/******/ // Create a new module (and put it into the cache)
|
||||||
|
/******/ var module = installedModules[moduleId] = {
|
||||||
|
/******/ i: moduleId,
|
||||||
|
/******/ l: false,
|
||||||
|
/******/ exports: {}
|
||||||
|
/******/ };
|
||||||
|
/******/
|
||||||
|
/******/ // Execute the module function
|
||||||
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||||||
|
/******/
|
||||||
|
/******/ // Flag the module as loaded
|
||||||
|
/******/ module.l = true;
|
||||||
|
/******/
|
||||||
|
/******/ // Return the exports of the module
|
||||||
|
/******/ return module.exports;
|
||||||
|
/******/ }
|
||||||
|
/******/
|
||||||
|
/******/
|
||||||
|
/******/ // expose the modules object (__webpack_modules__)
|
||||||
|
/******/ __webpack_require__.m = modules;
|
||||||
|
/******/
|
||||||
|
/******/ // expose the module cache
|
||||||
|
/******/ __webpack_require__.c = installedModules;
|
||||||
|
/******/
|
||||||
|
/******/ // define getter function for harmony exports
|
||||||
|
/******/ __webpack_require__.d = function(exports, name, getter) {
|
||||||
|
/******/ if(!__webpack_require__.o(exports, name)) {
|
||||||
|
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
||||||
|
/******/ }
|
||||||
|
/******/ };
|
||||||
|
/******/
|
||||||
|
/******/ // define __esModule on exports
|
||||||
|
/******/ __webpack_require__.r = function(exports) {
|
||||||
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||||||
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||||||
|
/******/ }
|
||||||
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
/******/ };
|
||||||
|
/******/
|
||||||
|
/******/ // create a fake namespace object
|
||||||
|
/******/ // mode & 1: value is a module id, require it
|
||||||
|
/******/ // mode & 2: merge all properties of value into the ns
|
||||||
|
/******/ // mode & 4: return value when already ns object
|
||||||
|
/******/ // mode & 8|1: behave like require
|
||||||
|
/******/ __webpack_require__.t = function(value, mode) {
|
||||||
|
/******/ if(mode & 1) value = __webpack_require__(value);
|
||||||
|
/******/ if(mode & 8) return value;
|
||||||
|
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
||||||
|
/******/ var ns = Object.create(null);
|
||||||
|
/******/ __webpack_require__.r(ns);
|
||||||
|
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
||||||
|
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
||||||
|
/******/ return ns;
|
||||||
|
/******/ };
|
||||||
|
/******/
|
||||||
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||||||
|
/******/ __webpack_require__.n = function(module) {
|
||||||
|
/******/ var getter = module && module.__esModule ?
|
||||||
|
/******/ function getDefault() { return module['default']; } :
|
||||||
|
/******/ function getModuleExports() { return module; };
|
||||||
|
/******/ __webpack_require__.d(getter, 'a', getter);
|
||||||
|
/******/ return getter;
|
||||||
|
/******/ };
|
||||||
|
/******/
|
||||||
|
/******/ // Object.prototype.hasOwnProperty.call
|
||||||
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
||||||
|
/******/
|
||||||
|
/******/ // __webpack_public_path__
|
||||||
|
/******/ __webpack_require__.p = "";
|
||||||
|
/******/
|
||||||
|
/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
|
||||||
|
/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
|
||||||
|
/******/ jsonpArray.push = webpackJsonpCallback;
|
||||||
|
/******/ jsonpArray = jsonpArray.slice();
|
||||||
|
/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
|
||||||
|
/******/ var parentJsonpFunction = oldJsonpFunction;
|
||||||
|
/******/
|
||||||
|
/******/
|
||||||
|
/******/ // add entry module to deferred list
|
||||||
|
/******/ deferredModules.push(["./assets/index.js","vendor"]);
|
||||||
|
/******/ // run deferred modules when ready
|
||||||
|
/******/ return checkDeferredModules();
|
||||||
|
/******/ })
|
||||||
|
/************************************************************************/
|
||||||
|
/******/ ({
|
||||||
|
|
||||||
|
/***/ "./assets/index.js":
|
||||||
|
/*!*************************!*\
|
||||||
|
!*** ./assets/index.js ***!
|
||||||
|
\*************************/
|
||||||
|
/*! no exports provided */
|
||||||
|
/*! all exports used */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./js */ \"./assets/js/index.js\");\n/* harmony import */ var _styles_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./styles.scss */ \"./assets/styles.scss\");\n/* harmony import */ var _styles_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_styles_scss__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _noscript_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./noscript.scss */ \"./assets/noscript.scss\");\n/* harmony import */ var _noscript_scss__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_noscript_scss__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./vue */ \"./assets/vue/index.js\");\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./assets/index.js?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/js/index.js":
|
||||||
|
/*!****************************!*\
|
||||||
|
!*** ./assets/js/index.js ***!
|
||||||
|
\****************************/
|
||||||
|
/*! no exports provided */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.browser.js\");\n/* harmony import */ var buefy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! buefy */ \"./node_modules/buefy/dist/buefy.js\");\n/* harmony import */ var buefy__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(buefy__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(buefy__WEBPACK_IMPORTED_MODULE_1___default.a);\n\nwindow.addEventListener('load', () => {\n var app = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n el: '#app',\n delimiters: [ '[[', ']]' ],\n })\n});\n\n\n\n\n\n//# sourceURL=webpack:///./assets/js/index.js?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/noscript.scss":
|
||||||
|
/*!******************************!*\
|
||||||
|
!*** ./assets/noscript.scss ***!
|
||||||
|
\******************************/
|
||||||
|
/*! no static exports found */
|
||||||
|
/***/ (function(module, exports, __webpack_require__) {
|
||||||
|
|
||||||
|
eval("// extracted by mini-css-extract-plugin\n\n//# sourceURL=webpack:///./assets/noscript.scss?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/styles.scss":
|
||||||
|
/*!****************************!*\
|
||||||
|
!*** ./assets/styles.scss ***!
|
||||||
|
\****************************/
|
||||||
|
/*! no static exports found */
|
||||||
|
/***/ (function(module, exports, __webpack_require__) {
|
||||||
|
|
||||||
|
eval("// extracted by mini-css-extract-plugin\n\n//# sourceURL=webpack:///./assets/styles.scss?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/vue/index.js":
|
||||||
|
/*!*****************************!*\
|
||||||
|
!*** ./assets/vue/index.js ***!
|
||||||
|
\*****************************/
|
||||||
|
/*! exports provided: Tab, Tabs */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.browser.js\");\n/* harmony import */ var _tab_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tab.vue */ \"./assets/vue/tab.vue\");\n/* harmony import */ var _tabs_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tabs.vue */ \"./assets/vue/tabs.vue\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component('a-tab', _tab_vue__WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"]);\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component('a-tabs', _tabs_vue__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"]);\n\n\n\n\n\n\n//# sourceURL=webpack:///./assets/vue/index.js?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/vue/tab.vue":
|
||||||
|
/*!****************************!*\
|
||||||
|
!*** ./assets/vue/tab.vue ***!
|
||||||
|
\****************************/
|
||||||
|
/*! exports provided: default */
|
||||||
|
/*! exports used: default */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony import */ var _tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tab.vue?vue&type=template&id=65401e0e& */ \"./assets/vue/tab.vue?vue&type=template&id=65401e0e&\");\n/* harmony import */ var _tab_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tab.vue?vue&type=script&lang=js& */ \"./assets/vue/tab.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"])(\n _tab_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"],\n _tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__[/* render */ \"a\"],\n _tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__[/* staticRenderFns */ \"b\"],\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"assets/vue/tab.vue\"\n/* harmony default export */ __webpack_exports__[\"a\"] = (component.exports);\n\n//# sourceURL=webpack:///./assets/vue/tab.vue?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/vue/tab.vue?vue&type=script&lang=js&":
|
||||||
|
/*!*****************************************************!*\
|
||||||
|
!*** ./assets/vue/tab.vue?vue&type=script&lang=js& ***!
|
||||||
|
\*****************************************************/
|
||||||
|
/*! exports provided: default */
|
||||||
|
/*! exports used: default */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony import */ var _node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib??vue-loader-options!./tab.vue?vue&type=script&lang=js& */ \"./node_modules/vue-loader/lib/index.js?!./assets/vue/tab.vue?vue&type=script&lang=js&\");\n /* harmony default export */ __webpack_exports__[\"a\"] = (_node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]); \n\n//# sourceURL=webpack:///./assets/vue/tab.vue?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/vue/tab.vue?vue&type=template&id=65401e0e&":
|
||||||
|
/*!***********************************************************!*\
|
||||||
|
!*** ./assets/vue/tab.vue?vue&type=template&id=65401e0e& ***!
|
||||||
|
\***********************************************************/
|
||||||
|
/*! exports provided: render, staticRenderFns */
|
||||||
|
/*! exports used: render, staticRenderFns */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib??vue-loader-options!./tab.vue?vue&type=template&id=65401e0e& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/vue/tab.vue?vue&type=template&id=65401e0e&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__[\"a\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__[\"b\"]; });\n\n\n\n//# sourceURL=webpack:///./assets/vue/tab.vue?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/vue/tabs.vue":
|
||||||
|
/*!*****************************!*\
|
||||||
|
!*** ./assets/vue/tabs.vue ***!
|
||||||
|
\*****************************/
|
||||||
|
/*! exports provided: default */
|
||||||
|
/*! exports used: default */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony import */ var _tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tabs.vue?vue&type=template&id=466f44d5& */ \"./assets/vue/tabs.vue?vue&type=template&id=466f44d5&\");\n/* harmony import */ var _tabs_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabs.vue?vue&type=script&lang=js& */ \"./assets/vue/tabs.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"])(\n _tabs_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"],\n _tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__[/* render */ \"a\"],\n _tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__[/* staticRenderFns */ \"b\"],\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"assets/vue/tabs.vue\"\n/* harmony default export */ __webpack_exports__[\"a\"] = (component.exports);\n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/vue/tabs.vue?vue&type=script&lang=js&":
|
||||||
|
/*!******************************************************!*\
|
||||||
|
!*** ./assets/vue/tabs.vue?vue&type=script&lang=js& ***!
|
||||||
|
\******************************************************/
|
||||||
|
/*! exports provided: default */
|
||||||
|
/*! exports used: default */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony import */ var _node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib??vue-loader-options!./tabs.vue?vue&type=script&lang=js& */ \"./node_modules/vue-loader/lib/index.js?!./assets/vue/tabs.vue?vue&type=script&lang=js&\");\n /* harmony default export */ __webpack_exports__[\"a\"] = (_node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]); \n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./assets/vue/tabs.vue?vue&type=template&id=466f44d5&":
|
||||||
|
/*!************************************************************!*\
|
||||||
|
!*** ./assets/vue/tabs.vue?vue&type=template&id=466f44d5& ***!
|
||||||
|
\************************************************************/
|
||||||
|
/*! exports provided: render, staticRenderFns */
|
||||||
|
/*! exports used: render, staticRenderFns */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib??vue-loader-options!./tabs.vue?vue&type=template&id=466f44d5& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/vue/tabs.vue?vue&type=template&id=466f44d5&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__[\"a\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__[\"b\"]; });\n\n\n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./node_modules/vue-loader/lib/index.js?!./assets/vue/tab.vue?vue&type=script&lang=js&":
|
||||||
|
/*!*******************************************************************************************************!*\
|
||||||
|
!*** ./node_modules/vue-loader/lib??vue-loader-options!./assets/vue/tab.vue?vue&type=script&lang=js& ***!
|
||||||
|
\*******************************************************************************************************/
|
||||||
|
/*! exports provided: default */
|
||||||
|
/*! exports used: default */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n value: { default: undefined },\n },\n\n methods: {\n select() {\n this.$parent.selectTab(this);\n },\n\n onclick(event) {\n this.select();\n /*if(event.target.href != document.location)\n window.history.pushState(\n { url: event.target.href },\n event.target.innerText + ' - ' + document.title,\n event.target.href\n ) */\n }\n }\n});\n\n\n//# sourceURL=webpack:///./assets/vue/tab.vue?./node_modules/vue-loader/lib??vue-loader-options");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./node_modules/vue-loader/lib/index.js?!./assets/vue/tabs.vue?vue&type=script&lang=js&":
|
||||||
|
/*!********************************************************************************************************!*\
|
||||||
|
!*** ./node_modules/vue-loader/lib??vue-loader-options!./assets/vue/tabs.vue?vue&type=script&lang=js& ***!
|
||||||
|
\********************************************************************************************************/
|
||||||
|
/*! exports provided: default */
|
||||||
|
/*! exports used: default */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n default: { default: null },\n },\n\n data() {\n return {\n value: this.default,\n }\n },\n\n computed: {\n tab() {\n const vnode = this.$slots.default && this.$slots.default.find(\n elm => elm.child && elm.child.value == this.value\n );\n return vnode && vnode.child;\n }\n },\n\n methods: {\n selectTab(tab) {\n const value = tab.value;\n if(this.value === value)\n return;\n\n this.value = value;\n this.$emit('select', {target: this, value: value, tab: tab});\n },\n },\n});\n\n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?./node_modules/vue-loader/lib??vue-loader-options");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/vue/tab.vue?vue&type=template&id=65401e0e&":
|
||||||
|
/*!*****************************************************************************************************************************************************************************************!*\
|
||||||
|
!*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./assets/vue/tab.vue?vue&type=template&id=65401e0e& ***!
|
||||||
|
\*****************************************************************************************************************************************************************************************/
|
||||||
|
/*! exports provided: render, staticRenderFns */
|
||||||
|
/*! exports used: render, staticRenderFns */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"li\",\n {\n class: { \"is-active\": _vm.$parent.value == _vm.value },\n on: {\n click: function($event) {\n $event.preventDefault()\n return _vm.onclick($event)\n }\n }\n },\n [_vm._t(\"default\")],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./assets/vue/tab.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/vue/tabs.vue?vue&type=template&id=466f44d5&":
|
||||||
|
/*!******************************************************************************************************************************************************************************************!*\
|
||||||
|
!*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./assets/vue/tabs.vue?vue&type=template&id=466f44d5& ***!
|
||||||
|
\******************************************************************************************************************************************************************************************/
|
||||||
|
/*! exports provided: render, staticRenderFns */
|
||||||
|
/*! exports used: render, staticRenderFns */
|
||||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\"div\", { staticClass: \"tabs is-centered\" }, [\n _c(\"ul\", [_vm._t(\"tabs\", null, { value: _vm.value })], 2)\n ]),\n _vm._v(\" \"),\n _vm._t(\"default\", null, { value: _vm.value })\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
|
||||||
|
|
||||||
|
/***/ })
|
||||||
|
|
||||||
|
/******/ });
|
89
aircox_web/static/aircox_web/assets/vendor.js
Normal file
89
aircox_web/static/aircox_web/assets/vendor.js
Normal file
File diff suppressed because one or more lines are too long
69
aircox_web/templates/aircox_web/base.html
Normal file
69
aircox_web/templates/aircox_web/base.html
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
{% load static i18n thumbnail %}
|
||||||
|
{% comment %}
|
||||||
|
Context:
|
||||||
|
- site: current website
|
||||||
|
{% endcomment %}
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="application-name" content="aircox">
|
||||||
|
<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" %}"/>
|
||||||
|
<script src="{% static "aircox_web/assets/main.js" %}"></script>
|
||||||
|
<script src="{% static "aircox_web/assets/vendor.js" %}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<title>
|
||||||
|
{% block head_title %}{{ site.title }}{% endblock %}
|
||||||
|
</title>
|
||||||
|
|
||||||
|
{% block head_extra %}{% endblock %}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app">
|
||||||
|
<nav class="navbar has-shadow" role="navigation" aria-label="main navigation">
|
||||||
|
<div class="container">
|
||||||
|
<div class="navbar-brand">
|
||||||
|
<a href="/" title="{% trans "Home" %}" class="navbar-item">
|
||||||
|
<img src="{{ site.logo.url }}" class="logo"/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="navbar-menu">
|
||||||
|
<div class="navbar-start">
|
||||||
|
{{ site_regions.topnav }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="columns">
|
||||||
|
<main class="column page">
|
||||||
|
<header class="header">
|
||||||
|
{% block header %}
|
||||||
|
<h1 class="title is-1">{% block title %}{% endblock %}</h1>
|
||||||
|
{% endblock %}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{% block main %}{% endblock main %}
|
||||||
|
</main>
|
||||||
|
<aside class="column is-one-third">
|
||||||
|
{% block side_nav %}
|
||||||
|
{% block cover %}
|
||||||
|
{% if cover is not None %}
|
||||||
|
<img class="cover" src="{{ cover.url }}" class="cover"/>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
{% endblock %}
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -4,29 +4,36 @@ Context variables:
|
||||||
- object: the actual diffusion
|
- object: the actual diffusion
|
||||||
- page: current parent page in which item is rendered
|
- page: current parent page in which item is rendered
|
||||||
- hide_schedule: if True, do not display start time
|
- hide_schedule: if True, do not display start time
|
||||||
|
- hide_headline: if True, do not display headline
|
||||||
{% endcomment %}
|
{% endcomment %}
|
||||||
|
|
||||||
{% with page as context_page %}
|
{% with object.initial|default:object as initial %}
|
||||||
{% with object.program as program %}
|
{% with initial.program as program %}
|
||||||
{% diffusion_page object as page %}
|
{% with initial.page as d_page %}
|
||||||
|
{% with program.page as p_page %}
|
||||||
|
{% with d_page|default:p_page as c_page %}
|
||||||
<article class="media">
|
<article class="media">
|
||||||
<div class="media-left">
|
<div class="media-left">
|
||||||
<img src="{% thumbnail page.cover|default:site.logo 128x128 crop=scale %}">
|
<img src="{% thumbnail c_page.cover|default:site.logo 128x128 crop=scale %}"
|
||||||
|
class="small-cover">
|
||||||
</div>
|
</div>
|
||||||
<div class="media-content">
|
<div class="media-content">
|
||||||
<div>
|
<div>
|
||||||
<h4 class="subtitle is-size-4 is-inline-block">
|
<h5 class="subtitle is-size-5 is-inline-block">
|
||||||
{% if page and context_page != page %}
|
{% if d_page %}
|
||||||
<a href="{{ page.path }}">{{ page.title }}</a>
|
<a href="{{ d_page.path }}">{{ d_page.title }}</a>
|
||||||
{% else %}
|
{% endif %}
|
||||||
{{ page.title|default:program.name }}
|
|
||||||
{% endif %}
|
|
||||||
</h4>
|
|
||||||
|
|
||||||
<span class="has-text-weight-normal">
|
{% if not page or p_page != page %}
|
||||||
{% if object.page is page and context_page != program.page %}
|
{% if d_page %} — {% endif %}
|
||||||
— <a href="{% url "program-page" slug=program.page.slug %}">{{ program.page.title }}</a>
|
{% if p_page %}
|
||||||
{% endif %}
|
<a href="{{ p_page.path }}" class="has-text-grey-dark">
|
||||||
|
{{ p_page.title }}</a>
|
||||||
|
{% else %}
|
||||||
|
{{ program.name }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</h5>
|
||||||
|
|
||||||
{% if not hide_schedule %}
|
{% if not hide_schedule %}
|
||||||
<time datetime="{{ object.start|date:"c" }}" title="{{ object.start }}"
|
<time datetime="{{ object.start|date:"c" }}" title="{{ object.start }}"
|
||||||
|
@ -44,13 +51,16 @@ Context variables:
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
{% if not hide_headline %}
|
||||||
<div class="content">
|
<div class="content">
|
||||||
{{ page.headline|default:program.page.headline }}
|
{{ c_page.headline }}
|
||||||
</p>
|
</div>
|
||||||
</div>
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,8 @@
|
||||||
{{ block.super }}
|
{{ block.super }}
|
||||||
{% if program %}
|
{% if program %}
|
||||||
<h4 class="subtitle is-size-3">
|
<h4 class="subtitle is-size-3">
|
||||||
<a href="{% url "page" path=program.page.path %}">❬ {{ program.name }}</a></li>
|
<a href="{% url "program-page" slug=program.slug %}">❬ {{ program.name }}</a></li>
|
||||||
</h4>
|
</h4>
|
||||||
{% include "aircox_web/program_header.html" %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -26,9 +25,7 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<section class="section">
|
<section class="section">
|
||||||
{% for object in object_list %}
|
{% for object in object_list %}
|
||||||
{% with object.diffusion as object %}
|
|
||||||
{% include "aircox_web/diffusion_item.html" %}
|
{% include "aircox_web/diffusion_item.html" %}
|
||||||
{% endwith %}
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
{% extends "aircox_web/page.html" %}
|
|
||||||
|
|
||||||
{% block header %}
|
|
||||||
{{ block.super }}
|
|
||||||
{% include "aircox_web/program_header.html" %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
25
aircox_web/templates/aircox_web/program_header.html
Normal file
25
aircox_web/templates/aircox_web/program_header.html
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{% load i18n %}
|
||||||
|
<section class="is-size-5">
|
||||||
|
{% for schedule in program.schedule_set.all %}
|
||||||
|
<p>
|
||||||
|
{{ schedule.get_frequency_verbose }}
|
||||||
|
{% with schedule.start|date:"H:i" as start %}
|
||||||
|
{% with schedule.end|date:"H:i" as end %}
|
||||||
|
<time datetime="{{ start }}">{{ start }}</time>
|
||||||
|
—
|
||||||
|
<time datetime="{{ end }}">{{ end }}</time>
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
<small>
|
||||||
|
{% if schedule.initial %}
|
||||||
|
{% with schedule.initial.date as date %}
|
||||||
|
<span title="{% blocktrans %}Rerun of {{ date }}{% endblocktrans %}">
|
||||||
|
({% trans "rerun" %})
|
||||||
|
</span>
|
||||||
|
{% endwith %}
|
||||||
|
{% endif %}
|
||||||
|
</small>
|
||||||
|
</p>
|
||||||
|
{% endfor %}
|
||||||
|
</section>
|
||||||
|
|
38
aircox_web/templates/aircox_web/program_page.html
Normal file
38
aircox_web/templates/aircox_web/program_page.html
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
{% extends "aircox_web/page.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% with page.program as program %}
|
||||||
|
|
||||||
|
{% block header %}
|
||||||
|
{{ block.super }}
|
||||||
|
{% include "aircox_web/program_header.html" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block side_nav %}
|
||||||
|
{{ block.super }}
|
||||||
|
|
||||||
|
{% if diffusions %}
|
||||||
|
<section>
|
||||||
|
<h4 class="subtitle is-size-4">{% trans "Last shows" %}</h4>
|
||||||
|
|
||||||
|
{% for object in diffusions %}
|
||||||
|
{% include "aircox_web/diffusion_item.html" %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<nav class="pagination is-centered">
|
||||||
|
<ul class="pagination-list">
|
||||||
|
<li>
|
||||||
|
<a href="{% url "diffusion-list" program_slug=page.slug %}"
|
||||||
|
class="pagination-link"
|
||||||
|
aria-label="{% trans "Show all diffusions" %}">
|
||||||
|
{% trans "All diffusions" %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% endwith %}
|
||||||
|
|
|
@ -12,7 +12,8 @@ register = template.Library()
|
||||||
@register.simple_tag(name='diffusion_page')
|
@register.simple_tag(name='diffusion_page')
|
||||||
def do_diffusion_page(diffusion):
|
def do_diffusion_page(diffusion):
|
||||||
""" Return page for diffusion. """
|
""" Return page for diffusion. """
|
||||||
for obj in (diffusion, diffusion.program):
|
diff = diffusion.initial if diffusion.initial is not None else diffusion
|
||||||
|
for obj in (diff, diffusion.program):
|
||||||
page = getattr(obj, 'page', None)
|
page = getattr(obj, 'page', None)
|
||||||
if page is not None and page.status == Page.STATUS.published:
|
if page is not None and page.status == Page.STATUS.published:
|
||||||
return page
|
return page
|
||||||
|
|
|
@ -10,13 +10,12 @@ register_converter(WeekConverter, 'week')
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('programs/<slug:slug>/',
|
path('programs/<slug:slug>/',
|
||||||
views.ProgramPageView.as_view(), name='program-page'),
|
views.ProgramPageView.as_view(), name='program-page'),
|
||||||
|
path('diffusion/<slug:slug>/',
|
||||||
|
views.DiffusionPageView.as_view(), name='diffusion-page'),
|
||||||
path('programs/<slug:program_slug>/diffusions/',
|
path('programs/<slug:program_slug>/diffusions/',
|
||||||
views.DiffusionsView.as_view(), name='diffusion-list'),
|
views.DiffusionsView.as_view(), name='diffusion-list'),
|
||||||
|
|
||||||
path('diffusion/<slug:slug>/',
|
|
||||||
views.ProgramPageView.as_view(), name='diffusion-page'),
|
|
||||||
|
|
||||||
path('diffusions/',
|
path('diffusions/',
|
||||||
views.TimetableView.as_view(), name='timetable'),
|
views.TimetableView.as_view(), name='timetable'),
|
||||||
path('diffusions/<week:date>/',
|
path('diffusions/<week:date>/',
|
||||||
|
@ -25,6 +24,6 @@ urlpatterns = [
|
||||||
views.DiffusionsView.as_view(), name='diffusion-list'),
|
views.DiffusionsView.as_view(), name='diffusion-list'),
|
||||||
path('logs/', views.LogsView.as_view(), name='logs'),
|
path('logs/', views.LogsView.as_view(), name='logs'),
|
||||||
path('logs/<date:date>/', views.LogsView.as_view(), name='logs'),
|
path('logs/<date:date>/', views.LogsView.as_view(), name='logs'),
|
||||||
path('<page_path:path>', views.route_page, name='page'),
|
# path('<page_path:path>', views.route_page, name='page'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,8 @@ from django.views.generic.base import TemplateResponseMixin, ContextMixin
|
||||||
from content_editor.contents import contents_for_item
|
from content_editor.contents import contents_for_item
|
||||||
|
|
||||||
from aircox import models as aircox
|
from aircox import models as aircox
|
||||||
from .models import Site, Page, DiffusionPage, ProgramPage
|
from .models import Site, Page, DiffusionPage, ProgramPage, \
|
||||||
|
get_diffusions_with_page
|
||||||
from .renderer import site_renderer, page_renderer
|
from .renderer import site_renderer, page_renderer
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ def route_page(request, path=None, *args, model=None, site=None, **kwargs):
|
||||||
|
|
||||||
model = model if model is not None else Page
|
model = model if model is not None else Page
|
||||||
page = get_object_or_404(
|
page = get_object_or_404(
|
||||||
model.objects.select_subclasses().active(),
|
model.objects.select_subclasses().live(),
|
||||||
path=path
|
path=path
|
||||||
)
|
)
|
||||||
kwargs['page'] = page
|
kwargs['page'] = page
|
||||||
|
@ -46,7 +47,8 @@ class BaseView(TemplateResponseMixin, ContextMixin):
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
if kwargs.get('site_regions') is None:
|
if kwargs.get('site_regions') is None:
|
||||||
contents = contents_for_item(self.site, site_renderer._renderers.keys())
|
contents = contents_for_item(
|
||||||
|
self.site, site_renderer._renderers.keys())
|
||||||
kwargs['site_regions'] = contents.render_regions(site_renderer)
|
kwargs['site_regions'] = contents.render_regions(site_renderer)
|
||||||
|
|
||||||
kwargs.setdefault('site', self.site)
|
kwargs.setdefault('site', self.site)
|
||||||
|
@ -54,7 +56,7 @@ class BaseView(TemplateResponseMixin, ContextMixin):
|
||||||
return super().get_context_data(**kwargs)
|
return super().get_context_data(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
class PageView(BaseView):
|
class PageView(BaseView, DetailView):
|
||||||
""" Base view class for pages. """
|
""" Base view class for pages. """
|
||||||
template_name = 'aircox_web/page.html'
|
template_name = 'aircox_web/page.html'
|
||||||
context_object_name = 'page'
|
context_object_name = 'page'
|
||||||
|
@ -77,33 +79,39 @@ class PageView(BaseView):
|
||||||
return super().get_context_data(**kwargs)
|
return super().get_context_data(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
class ProgramPageView(PageView, DetailView):
|
class ProgramPageView(PageView):
|
||||||
""" Base view class for pages. """
|
""" Base view class for pages. """
|
||||||
template_name = 'aircox_web/program.html'
|
template_name = 'aircox_web/program_page.html'
|
||||||
model = ProgramPage
|
model = ProgramPage
|
||||||
|
|
||||||
|
list_count=10
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().select_related('program')
|
return super().get_queryset().select_related('program')
|
||||||
|
|
||||||
def get_context_data(self, program=None, **kwargs):
|
def get_context_data(self, program=None, diffusions=None, **kwargs):
|
||||||
kwargs.setdefault('program', self.object.program)
|
program = program or self.object.program
|
||||||
kwargs['diffusions'] = DiffusionPage.objects.filter(
|
diffusions = diffusions or \
|
||||||
diffusion__program=kwargs['program']
|
get_diffusions_with_page().filter(program=program)
|
||||||
|
return super().get_context_data(
|
||||||
|
program=program,
|
||||||
|
diffusions=diffusions.order_by('-start')[:self.list_count],
|
||||||
|
**kwargs
|
||||||
)
|
)
|
||||||
return super().get_context_data(**kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
class DiffusionView(PageView):
|
class DiffusionPageView(PageView):
|
||||||
template_name = 'aircox_web/diffusion.html'
|
# template_name = 'aircox_web/diffusion.html'
|
||||||
|
model = DiffusionPage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: pagination: in template, only a limited number of pages displayed
|
# TODO: pagination: in template, only a limited number of pages displayed
|
||||||
|
|
||||||
# DiffusionsView use diffusion instead of diffusion page for different reasons:
|
# DiffusionsView use diffusion instead of diffusion page for different reasons:
|
||||||
# more straightforward, it handles reruns
|
# more straightforward, it handles reruns
|
||||||
class DiffusionsView(BaseView, ListView):
|
class DiffusionsView(BaseView, ListView):
|
||||||
template_name = 'aircox_web/diffusions.html'
|
template_name = 'aircox_web/diffusions.html'
|
||||||
model = DiffusionPage
|
model = aircox.Diffusion
|
||||||
paginate_by = 30
|
paginate_by = 30
|
||||||
program = None
|
program = None
|
||||||
|
|
||||||
|
@ -115,13 +123,11 @@ class DiffusionsView(BaseView, ListView):
|
||||||
return super().get(request, *args, **kwargs)
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super().get_queryset().live() \
|
qs = get_diffusions_with_page(super().get_queryset()) \
|
||||||
.select_related('diffusion')
|
.select_related('page', 'program')
|
||||||
if self.program:
|
if self.program:
|
||||||
qs = qs.filter(diffusion__program=self.program)
|
qs = qs.filter(program=self.program)
|
||||||
else:
|
return qs.order_by('-start')
|
||||||
qs = qs.select_related('diffusion__program')
|
|
||||||
return qs.order_by('-diffusion__start')
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
program = kwargs.setdefault('program', self.program)
|
program = kwargs.setdefault('program', self.program)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user