Skip to content
Snippets Groups Projects
Commit 34b03eb3 authored by Tomáš Valenta's avatar Tomáš Valenta
Browse files

add RSS feed, update edit interface

parent 3ab72e9a
Branches
No related tags found
No related merge requests found
Showing
with 266 additions and 52 deletions
......@@ -3,3 +3,4 @@ __pycache__/
institut/static/css/style.css
static/*
media/*
node_modules/
......@@ -20,6 +20,7 @@ help:
@echo "Application:"
@echo " run Run the application on port ${PORT}"
@echo " shell Access the Django shell"
@echo " superuser Create superuser
@echo ""
@echo "Database:"
@echo " migrations Generate migrations"
......@@ -52,11 +53,14 @@ build: venv
${VENV}/bin/python manage.py collectstatic --noinput --settings=${SETTINGS}
run: venv
${VENV}/bin/python manage.py runserver ${PORT} --settings=${SETTINGS}
${VENV}/bin/python manage.py runserver z1.local:${PORT} --settings=${SETTINGS}
shell: venv
${VENV}/bin/python manage.py shell --settings=${SETTINGS}
superuser: venv
${VENV}/bin/python manage.py createsuperuser --settings=${SETTINGS}
migrations: venv
${VENV}/bin/python manage.py makemigrations --settings=${SETTINGS}
......
import typing
from datetime import datetime
from django.contrib.syndication.views import Feed
from django.template.loader import render_to_string
from django.urls import reverse
from .models import HomeArticlePage, HomeArticlesPage
class LatestArticlesFeed(Feed):
def get_object(self, request, id: int) -> HomeArticlesPage:
return HomeArticlesPage.objects.get(id=id)
def title(self, obj: HomeArticlesPage) -> str:
return obj.title
def link(self, obj: HomeArticlesPage) -> str:
return obj.get_full_url()
def items(self, obj: HomeArticlesPage) -> list:
return HomeArticlePage.objects.live().child_of(obj).order_by("-date")[:32]
def item_title(self, item: HomeArticlePage) -> str:
return item.title
def item_description(self, item: HomeArticlePage) -> str:
return render_to_string(
"home/feed_item_description.html",
{"item": item},
)
def item_pubdate(self, item: HomeArticlePage) -> datetime:
return datetime(
item.date.year,
item.date.month,
item.date.day,
12,
0,
)
def item_author_name(self, item: HomeArticlePage) -> str:
if item.author:
return item.author
return ""
def item_categories(self, item: HomeArticlePage) -> list:
return item.tags.all()
def item_link(self, item: HomeArticlePage) -> str:
return item.get_full_url()
# Generated by Django 4.2.4 on 2023-08-12 15:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0012_remove_homepage_documents_remove_homepage_events'),
]
operations = [
migrations.AlterModelOptions(
name='homearticlepage',
options={'verbose_name': 'Článek'},
),
migrations.AlterModelOptions(
name='homedocumentpage',
options={'verbose_name': 'Dokument'},
),
migrations.AlterModelOptions(
name='homeeventpage',
options={'verbose_name': 'Akce'},
),
migrations.AddField(
model_name='homepage',
name='academic_council_description',
field=models.CharField(default='Akademická rada je poradním orgánem ústavu a v rámci své činnosti zejména poskytuje správní radě stanoviska k ideovému směřování, strategickým materiálům, rozpočtu a plánu činností ústavu. Dále vykonává akademická rada dohled nad ideovou a odbornou kvalitou výstupů ústavu.', verbose_name='Akademická rada - popis'),
preserve_default=False,
),
migrations.AddField(
model_name='homepage',
name='controller_description',
field=models.CharField(default='Kontrolor je kontrolním orgánem ústavu.', verbose_name='Kontrolor - popis'),
preserve_default=False,
),
migrations.AddField(
model_name='homepage',
name='council_members_description',
field=models.CharField(default='Správní rada dbá o zachování účelu, pro nějž byl ústav založen, a dohlíží na řádné hospodaření s jeho majetkem.', verbose_name='Správní rada - popis'),
preserve_default=False,
),
migrations.AddField(
model_name='homepage',
name='director_description',
field=models.CharField(default='Ředitel je statutárním orgánem ústavu, řídí jeho činnost, jedná jeho jménem a rozhoduje ve všech záležitostech, které nespadají do pravomoci jiných orgánů.', verbose_name='Ředitel - popis'),
preserve_default=False,
),
migrations.AddField(
model_name='homepage',
name='employees_description',
field=models.CharField(default='Zaměstnanci poskytují administrativní, organizační a expertní podporu pro vykonávání činností ústavu.', verbose_name='Zaměstnanci - popis'),
preserve_default=False,
),
migrations.AddField(
model_name='homepage',
name='volunteers_description',
field=models.CharField(default='Dobrovolnický kruh je participační orgán ústavu. Účelem dobrovolnického kruhu je sdružovat osoby, které se chtějí dobrovolně podílet na činnostech ústavu, a navrhovat správní radě projekty pro realizaci ústavem v souladu s účelem ústavu.', verbose_name='Dobrovolníci - popis'),
preserve_default=False,
),
]
# Generated by Django 4.2.4 on 2023-08-12 15:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0013_alter_homearticlepage_options_and_more'),
]
operations = [
migrations.AlterField(
model_name='homepage',
name='academic_council_description',
field=models.TextField(verbose_name='Akademická rada - popis'),
),
migrations.AlterField(
model_name='homepage',
name='controller_description',
field=models.TextField(verbose_name='Kontrolor - popis'),
),
migrations.AlterField(
model_name='homepage',
name='council_members_description',
field=models.TextField(verbose_name='Správní rada - popis'),
),
migrations.AlterField(
model_name='homepage',
name='director_description',
field=models.TextField(verbose_name='Ředitel - popis'),
),
migrations.AlterField(
model_name='homepage',
name='employees_description',
field=models.TextField(verbose_name='Zaměstnanci - popis'),
),
migrations.AlterField(
model_name='homepage',
name='volunteers_description',
field=models.TextField(verbose_name='Dobrovolníci - popis'),
),
]
# Generated by Django 4.2.4 on 2023-08-12 15:36
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('home', '0014_alter_homepage_academic_council_description_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='homepage',
options={'verbose_name': 'Domovská stránka'},
),
]
from django.db import models
from django.utils import timezone
from wagtail.admin.panels import FieldPanel, MultiFieldPanel
from wagtail.admin.panels import FieldPanel, MultiFieldPanel, TabbedInterface, ObjectList
from wagtail.contrib.routable_page.models import RoutablePageMixin, path
from wagtail.documents import get_document_model
from wagtail.fields import RichTextField, StreamField
from wagtail.models import Page
......@@ -8,7 +9,7 @@ from wagtail.models import Page
from .blocks import PersonBlock
class HomePage(Page):
class HomePage(RoutablePageMixin, Page):
heading_text = RichTextField(verbose_name="Hlavní text stránky")
# --- Donations ---
......@@ -31,6 +32,13 @@ class HomePage(Page):
blank=True,
null=True,
)
director_description = models.TextField(
verbose_name="Ředitel - popis"
)
academic_council_description = models.TextField(
verbose_name="Akademická rada - popis"
)
controller = StreamField(
[("person", PersonBlock())],
......@@ -39,6 +47,9 @@ class HomePage(Page):
blank=True,
null=True,
)
controller_description = models.TextField(
verbose_name="Kontrolor - popis"
)
council_members = StreamField(
[("person", PersonBlock())],
......@@ -47,6 +58,9 @@ class HomePage(Page):
blank=True,
null=True,
)
council_members_description = models.TextField(
verbose_name="Správní rada - popis"
)
volunteers = StreamField(
[("person", PersonBlock())],
......@@ -55,6 +69,9 @@ class HomePage(Page):
blank=True,
null=True,
)
volunteers_description = models.TextField(
verbose_name="Dobrovolníci - popis"
)
employees = StreamField(
[("person", PersonBlock())],
......@@ -63,6 +80,9 @@ class HomePage(Page):
blank=True,
null=True,
)
employees_description = models.TextField(
verbose_name="Zaměstnanci - popis"
)
subpage_types = [
"home.HomeArticlesPage",
......@@ -70,7 +90,7 @@ class HomePage(Page):
"home.HomeDocumentsPage",
]
content_panels = Page.content_panels + [
intro_panels = Page.content_panels + [
FieldPanel("heading_text", icon="pilcrow"),
FieldPanel("donation_text", icon="pilcrow"),
MultiFieldPanel(
......@@ -81,19 +101,34 @@ class HomePage(Page):
FieldPanel("ds_id", icon="mail"),
],
heading="Kontaktní údaje",
),
MultiFieldPanel(
[
)
]
people_panels = [
FieldPanel("director_description", icon="pilcrow"),
FieldPanel("director", icon="user"),
FieldPanel("academic_council_description"),
FieldPanel("controller_description", icon="pilcrow"),
FieldPanel("controller", icon="user"),
FieldPanel("council_members_description", icon="pilcrow"),
FieldPanel("council_members", icon="group"),
FieldPanel("volunteers_description", icon="pilcrow"),
FieldPanel("volunteers", icon="group"),
FieldPanel("employees_description", icon="pilcrow"),
FieldPanel("employees", icon="group"),
],
heading="Lidé",
),
]
edit_handler = TabbedInterface([
ObjectList(intro_panels, heading="Základy"),
ObjectList(people_panels, heading="Lidé"),
ObjectList(Page.promote_panels, heading="Propagace"),
])
# Articles
@property
......@@ -102,7 +137,7 @@ class HomePage(Page):
@property
def latest_articles(self) -> "QuerySet":
return HomeArticlePage.objects.live().all()[:3]
return HomeArticlePage.objects.order_by("-date").live().all()[:3]
# Events
......@@ -112,7 +147,7 @@ class HomePage(Page):
@property
def latest_events(self) -> "QuerySet":
return HomeEventPage.objects.live().all()[:8]
return HomeEventPage.objects.order_by("-date").live().all()[:8]
# Documents
......@@ -122,13 +157,22 @@ class HomePage(Page):
@property
def latest_documents(self) -> "QuerySet":
return HomeDocumentPage.objects.live().all()[:4]
return HomeDocumentPage.objects.order_by("-date").live().all()[:4]
# Feed
@path("feeds/atom/")
def view_feed(self, request):
# Avoid circular import
from .feeds import LatestArticlesFeed # noqa
return LatestArticlesFeed()(request, self.articles_page.id)
class Meta:
verbose_name = "Domovká stránka"
verbose_name = "Domovská stránka"
class HomeArticlesPage(Page):
class HomeArticlesPage(RoutablePageMixin, Page):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
parent_page_type = ["home.HomePage"]
......@@ -146,7 +190,7 @@ class HomeArticlesPage(Page):
verbose_name = "Rozcestník článků"
class HomeEventsPage(Page):
class HomeEventsPage(RoutablePageMixin, Page):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
parent_page_type = ["home.HomePage"]
......@@ -164,7 +208,7 @@ class HomeEventsPage(Page):
verbose_name = "Rozcestník akcí"
class HomeDocumentsPage(Page):
class HomeDocumentsPage(RoutablePageMixin, Page):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
parent_page_type = ["home.HomePage"]
......@@ -182,7 +226,7 @@ class HomeDocumentsPage(Page):
verbose_name = "Rozcestník dokumentů"
class HomeContentPageMixin(Page):
class HomeContentPageMixin(RoutablePageMixin, Page):
tags = models.ManyToManyField("Tag", verbose_name="Štítky")
author = models.CharField(
......@@ -213,7 +257,6 @@ class HomeContentPageMixin(Page):
class Meta:
abstract = True
ordering = ["-date"]
class HomeArticlePage(HomeContentPageMixin):
......@@ -227,7 +270,6 @@ class HomeArticlePage(HomeContentPageMixin):
]
class Meta:
ordering = ["-date"]
verbose_name = "Článek"
......@@ -247,7 +289,6 @@ class HomeEventPage(HomeContentPageMixin):
]
class Meta:
ordering = ["-date"]
verbose_name = "Akce"
......@@ -258,6 +299,8 @@ class HomeDocumentPage(HomeContentPageMixin):
content = RichTextField(verbose_name="Obsah", blank=True, null=True)
subpage_types = ["home.HomeDocumentPage"]
content_panels = Page.content_panels + [
FieldPanel("document", icon="doc-full"),
FieldPanel("author", icon="user"),
......@@ -266,7 +309,6 @@ class HomeDocumentPage(HomeContentPageMixin):
]
class Meta:
ordering = ["-date"]
verbose_name = "Dokument"
......
{% load wagtailcore_tags %}
<p>{{ item.perex }}</p>
{{ item.content|richtext }}
......@@ -218,10 +218,7 @@
<section class="flex flex-col gap-4">
<h3 class="text-2xl font-bold">Ředitel</h3>
<p>
Ředitel je statutárním orgánem ústavu,
řídí jeho činnost, jedná jeho jménem
a rozhoduje ve všech záležitostech, které
nespadají do pravomoci jiných orgánů.
{{ page.director_description }}
</p>
<ul>
......@@ -234,21 +231,14 @@
<section class="flex flex-col gap-4">
<h3 class="text-2xl font-bold">Akademická rada</h3>
<p>
Akademická rada je poradním orgánem
ústavu a v rámci své činnosti zejména
poskytuje správní radě stanoviska
k ideovému směřování, strategickým
materiálům, rozpočtu a plánu činností
ústavu. Dále vykonává akademická rada
dohled nad ideovou a odbornou kvalitou
výstupů ústavu.
{{ page.academic_council_description }}
</p>
</section>
<section class="flex flex-col gap-4">
<h3 class="text-2xl font-bold">Kontrolor</h3>
<p>
Kontrolor je kontrolním orgánem ústavu.
{{ page.controller_description }}
</p>
<ul>
......@@ -263,9 +253,7 @@
<h3 class="text-2xl font-bold">Správní rada</h3>
<p>
Správní rada dbá o zachování účelu, pro
nějž byl ústav založen, a dohlíží na řádné
hospodaření s jeho majetkem.
{{ page.council_members_description }}
</p>
<ul class="flex flex-col gap-3">
......
......@@ -38,6 +38,7 @@ INSTALLED_APPS = [
"home",
"wagtail.contrib.forms",
"wagtail.contrib.redirects",
"wagtail.contrib.routable_page",
"wagtail.embeds",
"wagtail.sites",
"wagtail.users",
......
......@@ -77,6 +77,15 @@
{% block content %}{% endblock %}
</div>
<div class="flex justify-center bg-gray-100">
<footer class="container text-gray-500 py-8">
<a href="/feeds/atom" class="flex gap-2 items-center">
<i class="ico--feed"></i>
<div>RSS</div>
</a>
</footer>
</div>
{% block extra_js %}{% endblock %}
</body>
</html>
../acorn/bin/acorn
\ No newline at end of file
../browserslist/cli.js
\ No newline at end of file
../cssesc/bin/cssesc
\ No newline at end of file
../envinfo/dist/cli.js
\ No newline at end of file
../import-local/fixtures/cli.js
\ No newline at end of file
../jiti/bin/jiti.js
\ No newline at end of file
../nanoid/bin/nanoid.cjs
\ No newline at end of file
../which/bin/node-which
\ No newline at end of file
../resolve/bin/resolve
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment