diff --git a/aircox/models/diffusion.py b/aircox/models/diffusion.py index fbbe652..2bb7948 100644 --- a/aircox/models/diffusion.py +++ b/aircox/models/diffusion.py @@ -89,6 +89,8 @@ class Diffusion(Rerun): - stop: the diffusion has been manually stopped """ + list_url_name = "timetable-list" + objects = DiffusionQuerySet.as_manager() TYPE_ON_AIR = 0x00 diff --git a/aircox/static/aircox/css/admin.css b/aircox/static/aircox/css/admin.css index ebed324..db0fcfb 100644 --- a/aircox/static/aircox/css/admin.css +++ b/aircox/static/aircox/css/admin.css @@ -14,7 +14,7 @@ --preview-cover-tiny-size: 4rem; --preview-wide-content-sz: 1.6rem; --header-height: var(--preview-cover-size); - --a-carousel-pb: 1.4rem; + --a-carousel-p: 1.4rem; --a-carousel-gap: 1.2rem; --a-carousel-nav-x: -0.6em; --a-progress-bg: transparent; @@ -95,7 +95,6 @@ .preview { position: relative; background-size: cover; - margin-bottom: 2rem !important; } .preview.preview-item { width: 100%; @@ -187,7 +186,7 @@ display: flex; flex-direction: row; padding-top: 0em; - margin-bottom: 1.2rem !important; + margin-bottom: 0.4rem !important; } .list-item .headings .title { flex-grow: 1; @@ -276,8 +275,8 @@ preview-header:not(.no-cover) .card-headings .heading, preview-header:not(.no-co gap: 1.2rem; } -.a-carousel { - padding-bottom: var(--a-carousel-pb); +.a-carousel .a-carousel-viewport { + padding: var(--a-carousel-p) 0; } .a-carousel-container { diff --git a/aircox/static/aircox/css/chunk-common.css b/aircox/static/aircox/css/chunk-common.css index 8c86ed9..ac3d3f2 100644 --- a/aircox/static/aircox/css/chunk-common.css +++ b/aircox/static/aircox/css/chunk-common.css @@ -7098,3 +7098,7 @@ section > .toolbar { h1, h2, h3, h4, h5, h6, .heading, .title, .subtitle { font-family: var(--heading-font-family); } + +.container:empty { + display: none; +} diff --git a/aircox/static/aircox/css/public.css b/aircox/static/aircox/css/public.css index 1cd2570..0782576 100644 --- a/aircox/static/aircox/css/public.css +++ b/aircox/static/aircox/css/public.css @@ -14,7 +14,7 @@ --preview-cover-tiny-size: 4rem; --preview-wide-content-sz: 1.6rem; --header-height: var(--preview-cover-size); - --a-carousel-pb: 1.4rem; + --a-carousel-p: 1.4rem; --a-carousel-gap: 1.2rem; --a-carousel-nav-x: -0.6em; --a-progress-bg: transparent; @@ -95,7 +95,6 @@ .preview { position: relative; background-size: cover; - margin-bottom: 2rem !important; } .preview.preview-item { width: 100%; @@ -187,7 +186,7 @@ display: flex; flex-direction: row; padding-top: 0em; - margin-bottom: 1.2rem !important; + margin-bottom: 0.4rem !important; } .list-item .headings .title { flex-grow: 1; @@ -276,8 +275,8 @@ preview-header:not(.no-cover) .card-headings .heading, preview-header:not(.no-co gap: 1.2rem; } -.a-carousel { - padding-bottom: var(--a-carousel-pb); +.a-carousel .a-carousel-viewport { + padding: var(--a-carousel-p) 0; } .a-carousel-container { @@ -7358,7 +7357,7 @@ a.tag:hover { color: var(--text-color); } .page section.container { - padding-top: 2rem; + margin-top: 0.6rem; } .page section.container > .title { margin-top: unset; @@ -7366,8 +7365,8 @@ a.tag:hover { margin-bottom: 1.2rem; border-bottom: 1px solid black; } -.page section.container:not(:first-child) { - margin-top: 2rem; +.page section.container:not(:last-child) { + margin-bottom: 0.6rem; } .dropdown-item { diff --git a/aircox/static/aircox/js/chunk-common.js b/aircox/static/aircox/js/chunk-common.js index ce81b99..c5f970b 100644 --- a/aircox/static/aircox/js/chunk-common.js +++ b/aircox/static/aircox/js/chunk-common.js @@ -375,7 +375,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \**********************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _fortawesome_fontawesome_free_css_all_min_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @fortawesome/fontawesome-free/css/all.min.css */ \"./node_modules/@fortawesome/fontawesome-free/css/all.min.css\");\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app */ \"./src/app.js\");\n/* harmony import */ var _vueLoader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vueLoader */ \"./src/vueLoader.js\");\n/* harmony import */ var _sound__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sound */ \"./src/sound.js\");\n/* harmony import */ var _model__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model */ \"./src/model.js\");\n/* harmony import */ var _assets_common_scss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./assets/common.scss */ \"./src/assets/common.scss\");\n/**\n * This module includes code available for both the public website and\n * administration interface)\n */\n//-- vendor\n\n\n//-- aircox\n\n\n\n\n\nwindow.aircox = {\n // main application\n loader: null,\n get app() {\n return this.loader.app;\n },\n // player application\n playerLoader: null,\n get playerApp() {\n return this.playerLoader && this.playerLoader.app;\n },\n get player() {\n return this.playerLoader.vm && this.playerLoader.vm.$refs.player;\n },\n Set: _model__WEBPACK_IMPORTED_MODULE_4__.Set,\n Sound: _sound__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n /**\n * Initialize main application and player.\n */\n init(props = null, {\n hotReload = false,\n el = null,\n config = null,\n playerConfig = null,\n initApp = true,\n initPlayer = true,\n loader = null,\n playerLoader = null\n } = {}) {\n if (initPlayer) {\n playerConfig = playerConfig || _app__WEBPACK_IMPORTED_MODULE_1__.PlayerApp;\n playerLoader = playerLoader || new _vueLoader__WEBPACK_IMPORTED_MODULE_2__[\"default\"](playerConfig);\n playerLoader.enable(false);\n this.playerLoader = playerLoader;\n document.addEventListener(\"keypress\", e => this.onKeyPress(e), false);\n }\n if (initApp) {\n config = config || window.App || _app__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n config.el = el || config.el;\n loader = loader || new _vueLoader__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n el,\n props,\n ...config\n });\n loader.enable(hotReload);\n this.loader = loader;\n }\n },\n onKeyPress(event) {\n if (event.key == \" \") this.player.togglePlay();\n },\n /**\n * Filter navbar dropdown menu items\n */\n filter_menu(event) {\n var filter = new RegExp(event.target.value, 'gi');\n var container = event.target.closest('.navbar-dropdown');\n if (event.target.value) for (let item of container.querySelectorAll('a.navbar-item')) item.style.display = item.innerHTML.search(filter) == -1 ? 'none' : null;else for (let item of container.querySelectorAll('a.navbar-item')) item.style.display = null;\n },\n pickDate(url, date) {\n url = `${url}?date=${date.id}`;\n this.loader.pageLoad.load(url);\n }\n};\n\n//# sourceURL=webpack://aircox-assets/./src/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _fortawesome_fontawesome_free_css_all_min_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @fortawesome/fontawesome-free/css/all.min.css */ \"./node_modules/@fortawesome/fontawesome-free/css/all.min.css\");\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app */ \"./src/app.js\");\n/* harmony import */ var _vueLoader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vueLoader */ \"./src/vueLoader.js\");\n/* harmony import */ var _sound__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sound */ \"./src/sound.js\");\n/* harmony import */ var _model__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./model */ \"./src/model.js\");\n/* harmony import */ var _assets_common_scss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./assets/common.scss */ \"./src/assets/common.scss\");\n/**\n * This module includes code available for both the public website and\n * administration interface)\n */\n//-- vendor\n\n\n//-- aircox\n\n\n\n\n\nwindow.aircox = {\n // main application\n loader: null,\n get app() {\n return this.loader.app;\n },\n // player application\n playerLoader: null,\n get playerApp() {\n return this.playerLoader && this.playerLoader.app;\n },\n get player() {\n return this.playerLoader.vm && this.playerLoader.vm.$refs.player;\n },\n Set: _model__WEBPACK_IMPORTED_MODULE_4__.Set,\n Sound: _sound__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n /**\n * Initialize main application and player.\n */\n init(props = null, {\n hotReload = false,\n el = null,\n config = null,\n playerConfig = null,\n initApp = true,\n initPlayer = true,\n loader = null,\n playerLoader = null\n } = {}) {\n if (initPlayer) {\n playerConfig = playerConfig || _app__WEBPACK_IMPORTED_MODULE_1__.PlayerApp;\n playerLoader = playerLoader || new _vueLoader__WEBPACK_IMPORTED_MODULE_2__[\"default\"](playerConfig);\n playerLoader.enable(false);\n this.playerLoader = playerLoader;\n document.addEventListener(\"keyup\", e => this.onKeyPress(e), false);\n }\n if (initApp) {\n config = config || window.App || _app__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n config.el = el || config.el;\n loader = loader || new _vueLoader__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n el,\n props,\n ...config\n });\n loader.enable(hotReload);\n this.loader = loader;\n }\n },\n onKeyPress(event) {\n if (event.key == \" \") {\n this.player.togglePlay();\n event.stopPropagation();\n }\n },\n /**\n * Filter navbar dropdown menu items\n */\n filter_menu(event) {\n var filter = new RegExp(event.target.value, 'gi');\n var container = event.target.closest('.navbar-dropdown');\n if (event.target.value) for (let item of container.querySelectorAll('a.navbar-item')) item.style.display = item.innerHTML.search(filter) == -1 ? 'none' : null;else for (let item of container.querySelectorAll('a.navbar-item')) item.style.display = null;\n },\n pickDate(url, date) {\n url = `${url}?date=${date.id}`;\n this.loader.pageLoad.load(url);\n }\n};\n\n//# sourceURL=webpack://aircox-assets/./src/index.js?"); /***/ }), diff --git a/aircox/templates/aircox/base.html b/aircox/templates/aircox/base.html index bb2353f..d21f8ac 100644 --- a/aircox/templates/aircox/base.html +++ b/aircox/templates/aircox/base.html @@ -91,6 +91,7 @@ Usefull context: {% endspaceless %} {% block header-container %} + {% if page or cover or title %}
{% block header %} {% if cover %} @@ -117,16 +118,17 @@ Usefull context: {% endblock %}
+ {% endif %} {% endblock %} {% block content-container %} -
- {% block content %} - {% if page and page.content %} -
{{ page.content|safe }}
- {% endif %} - {% endblock %} + {% if page and page.content %} +
+ {% block content %} + {{ page.content|safe }} + {% endblock %}
+ {% endif %} {% endblock %} {% endblock %} diff --git a/aircox/templates/aircox/basepage_detail.html b/aircox/templates/aircox/basepage_detail.html index bc4c4a6..12d350e 100644 --- a/aircox/templates/aircox/basepage_detail.html +++ b/aircox/templates/aircox/basepage_detail.html @@ -6,3 +6,5 @@ — {{ station.name }} {% endblock %} + +{% block header %}{% if page %}{{ block.super }}{% endif %}{% endblock %} diff --git a/aircox/templates/aircox/basepage_list.html b/aircox/templates/aircox/basepage_list.html index 1d9f28b..c521218 100644 --- a/aircox/templates/aircox/basepage_list.html +++ b/aircox/templates/aircox/basepage_list.html @@ -5,33 +5,18 @@ {% block head_title %} {% block title %} - {% if not page or not page.title %} - {% if not parent %}{{ view.model|verbose_name:True|title }} - {% else %} - {% with parent.title as title %} - {% with model|default:"Publications"|verbose_name:True|capfirst as model %} - {% comment %}Translators: title when pages are filtered for a specific parent page, e.g.: Articles of My Incredible Show{% endcomment %} - {% blocktranslate %}All {{ model }}{% endblocktranslate %} - {% endwith %} - {% endwith %} - {% endif %} - {% else %}{{ block.super }} - {% endif %} + {{ block.super }} {% endblock %} — {{ station.name }} {% endblock %} - -{% block content-container %} +{% block main %} {{ block.super }} -
- -{% block before_list %}{% endblock %} - -
-{% block pages_list %} +{% block list-container %} +
+{% block list %} {% with has_headline=True %} {% for object in object_list %} {% block list_object %} @@ -44,37 +29,40 @@ {% endblock %}
+ +{% block list-pagination %} {% if is_paginated %}
{% update_query request.GET.copy page=None as GET %} {% with GET.urlencode as GET %} {% endwith %} {% endif %} +{% endblock %} + +{% endblock %} +
{% endblock %} diff --git a/aircox/templates/aircox/home.html b/aircox/templates/aircox/home.html index 0330e80..948f5ec 100644 --- a/aircox/templates/aircox/home.html +++ b/aircox/templates/aircox/home.html @@ -1,8 +1,11 @@ -{% extends "aircox/page_list.html" %} +{% extends "aircox/base.html" %} {% load i18n aircox %} {% block head_title %}{{ station.name }}{% endblock %} +{% block title %}{% if page %}{{ block.super }}{% endif %}{% endblock %} + + {% block breadcrumbs-container %}{% endblock %} {% block content-container %} diff --git a/aircox/templates/aircox/page_list.html b/aircox/templates/aircox/page_list.html index 164c66e..d34f4cf 100644 --- a/aircox/templates/aircox/page_list.html +++ b/aircox/templates/aircox/page_list.html @@ -27,12 +27,6 @@ {% endif %} {% endblock %} -{% block content %} - {% if parent %}{{ parent.content|safe }} - {% else %}{{ block.super }} - {% endif %} -{% endblock %} - {% block header %} {% if page and not object %} {% with page as object %} @@ -44,11 +38,11 @@ {% endblock %} {% block breadcrumbs %} -{% if parent %} +{% if parent and model.list_url_name %} {% include "./widgets/breadcrumbs.html" with page=parent %} - {{ model|verbose_name:True }} -{% elif page %} - {{ page.title }} + {{ model|verbose_name:True }} +{% elif page and model.list_url_name %} + {{ page.title }} {% if category %} {{ category.title }} @@ -63,3 +57,13 @@ {% endif %} {% endif %} {% endblock %} + +{% block content-container %} + {% if page and page.content %} + {{ block.super }} + {% elif parent and parent.content %} + {% with parent as page %} + {{ block.super }} + {% endwith %} + {% endif %} +{% endblock %} diff --git a/aircox/templates/aircox/program_sidebar.html b/aircox/templates/aircox/program_sidebar.html deleted file mode 100644 index fe7ea6c..0000000 --- a/aircox/templates/aircox/program_sidebar.html +++ /dev/null @@ -1,6 +0,0 @@ - -{% block sidebar_title %} -{% with program.title as program %} -{% blocktranslate %}Recently on {{ program }}{% endblocktranslate %} -{% endwith %} -{% endblock %} diff --git a/aircox/templates/aircox/timetable_list.html b/aircox/templates/aircox/timetable_list.html index f1ec1f1..32e1fe0 100644 --- a/aircox/templates/aircox/timetable_list.html +++ b/aircox/templates/aircox/timetable_list.html @@ -16,16 +16,12 @@ {{ date|date:"l d F Y" }} {% endblock %} -{% block pages_list %} -{% with hide_schedule=True %} -
- {% for object in object_list %} - {% if object.episode %} - {% page_widget "item" object.episode diffusion=object timetable=True %} - {% else %} - {% page_widget "item" object timetable=True %} - {% endif %} - {% endfor %} -
-{% endwith %} +{% block list %} +{% for object in object_list %} +{% if object.episode %} + {% page_widget "item" object.episode diffusion=object timetable=True %} +{% else %} + {% page_widget "item" object timetable=True %} +{% endif %} +{% endfor %} {% endblock %} diff --git a/aircox/templates/aircox/widgets/player.html b/aircox/templates/aircox/widgets/player.html index 4cf093a..b0a80b9 100644 --- a/aircox/templates/aircox/widgets/player.html +++ b/aircox/templates/aircox/widgets/player.html @@ -30,7 +30,7 @@ The audio player

- + [[ current.data.title ]] — [[ current.data.artist ]] diff --git a/aircox/views/home.py b/aircox/views/home.py index c76e0f9..ab13707 100644 --- a/aircox/views/home.py +++ b/aircox/views/home.py @@ -18,18 +18,21 @@ class HomeView(AttachedToMixin, BaseView, ListView): podcasts_queryset = Episode.objects.published().with_podcasts().order_by("-pub_date") def get_queryset(self): - return super().get_queryset().before(datetime.now() - timedelta(hours=12)) + now = datetime.now() + return super().get_queryset().after(now - timedelta(hours=24)).before(now).order_by("-start") def get_logs(self, diffusions): today = date.today() # diffs = Diffusion.objects.on_air().date(today) object_list = self.object_list diffs = list(object_list[: self.related_count]) - logs = Log.objects.on_air().date(today).filter(track__isnull=False) + logs = Log.objects.on_air().filter(track__isnull=False) if diffs: min_date = diffs[-1].start - timedelta(hours=1) logs = logs.after(min_date) - return Log.merge_diffusions(logs, object_list, diff_count=self.related_count, log_slice=10) + else: + logs = logs.date(today) + return Log.merge_diffusions(logs, object_list, diff_count=self.related_count) def get_next_diffs(self): now = tz.now() diff --git a/assets/src/assets/common.scss b/assets/src/assets/common.scss index fc26ac8..17b10ed 100644 --- a/assets/src/assets/common.scss +++ b/assets/src/assets/common.scss @@ -65,3 +65,8 @@ section > .toolbar { h1, h2, h3, h4, h5, h6, .heading, .title, .subtitle { font-family: var(--heading-font-family); } + + +.container:empty { + display: none; +} diff --git a/assets/src/assets/components.scss b/assets/src/assets/components.scss index 35553a0..f9ae0ea 100644 --- a/assets/src/assets/components.scss +++ b/assets/src/assets/components.scss @@ -15,7 +15,7 @@ --preview-wide-content-sz: #{v.$text-size-bigger}; --header-height: var(--preview-cover-size); - --a-carousel-pb: #{v.$text-size-medium}; + --a-carousel-p: #{v.$text-size-medium}; --a-carousel-gap: #{v.$mp-4}; --a-carousel-nav-x: -#{v.$mp-3e}; @@ -179,7 +179,6 @@ .preview { position: relative; background-size: cover; - margin-bottom: v.$mp-6 !important; &.preview-item { width: 100%; @@ -293,7 +292,7 @@ display: flex; flex-direction: row; padding-top: 0em; - margin-bottom: v.$mp-4 !important; + margin-bottom: v.$mp-2 !important; .title { flex-grow: 1; @@ -414,7 +413,10 @@ // ---- ---- Carousel .a-carousel { - padding-bottom: var(--a-carousel-pb); + + .a-carousel-viewport { + padding: var(--a-carousel-p) 0; + } } .a-carousel-container { diff --git a/assets/src/assets/public.scss b/assets/src/assets/public.scss index 02beec1..00b692e 100644 --- a/assets/src/assets/public.scss +++ b/assets/src/assets/public.scss @@ -21,7 +21,7 @@ section.container { - padding-top: v.$mp-6; + margin-top: v.$mp-3; > .title { margin-top: unset; @@ -30,8 +30,8 @@ border-bottom: 1px solid black; } - &:not(:first-child) { - margin-top: v.$mp-6; + &:not(:last-child) { + margin-bottom: v.$mp-3; } } } diff --git a/assets/src/index.js b/assets/src/index.js index f6b74d8..b7f6cf5 100644 --- a/assets/src/index.js +++ b/assets/src/index.js @@ -42,7 +42,7 @@ window.aircox = { playerLoader.enable(false) this.playerLoader = playerLoader - document.addEventListener("keypress", e => this.onKeyPress(e), false) + document.addEventListener("keyup", e => this.onKeyPress(e), false) } if(initApp) { @@ -55,8 +55,10 @@ window.aircox = { }, onKeyPress(event) { - if(event.key == " ") + if(event.key == " ") { this.player.togglePlay() + event.stopPropagation() + } }, /**