feat: Allow styling of RSS feed
This commit is contained in:
parent
a2058a4cfe
commit
c1b0a4195a
@ -1,10 +1,31 @@
|
|||||||
from django.contrib.syndication.views import Feed
|
from django.contrib.syndication.views import Feed
|
||||||
|
from django.utils.feedgenerator import Rss201rev2Feed
|
||||||
|
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
from django.utils.xmlutils import SimplerXMLGenerator
|
||||||
|
|
||||||
from .models import AdoptionNotice
|
from .models import AdoptionNotice
|
||||||
|
|
||||||
|
|
||||||
|
class FormattedFeed(Rss201rev2Feed):
|
||||||
|
"""
|
||||||
|
|
||||||
|
"""
|
||||||
|
content_type = "text/xml; charset=utf-8"
|
||||||
|
def write(self, outfile, encoding):
|
||||||
|
handler = SimplerXMLGenerator(outfile, encoding, short_empty_elements=True)
|
||||||
|
handler.startDocument()
|
||||||
|
handler._write('<?xml-stylesheet href="/static/rss.xsl" type="text/xsl"?>')
|
||||||
|
handler.startElement("rss", self.rss_attributes())
|
||||||
|
handler.startElement("channel", self.root_attributes())
|
||||||
|
self.add_root_elements(handler)
|
||||||
|
self.write_items(handler)
|
||||||
|
self.endChannelElement(handler)
|
||||||
|
handler.endElement("rss")
|
||||||
|
|
||||||
|
|
||||||
class LatestAdoptionNoticesFeed(Feed):
|
class LatestAdoptionNoticesFeed(Feed):
|
||||||
|
feed_type = FormattedFeed
|
||||||
title = "Notfellchen"
|
title = "Notfellchen"
|
||||||
link = "/rss/"
|
link = "/rss/"
|
||||||
description = "Updates zu neuen Vermittlungen."
|
description = "Updates zu neuen Vermittlungen."
|
||||||
@ -17,4 +38,3 @@ class LatestAdoptionNoticesFeed(Feed):
|
|||||||
|
|
||||||
def item_description(self, item):
|
def item_description(self, item):
|
||||||
return item.description
|
return item.description
|
||||||
|
|
||||||
|
222
src/fellchensammlung/static/rss.xsl
Normal file
222
src/fellchensammlung/static/rss.xsl
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||||
|
xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
|
||||||
|
<xsl:template match="/">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||||
|
<head>
|
||||||
|
<title>
|
||||||
|
RSS Feed |
|
||||||
|
<xsl:value-of select="/atom:feed/atom:title"/>
|
||||||
|
</title>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
|
<link rel="stylesheet" href="/css/rss-styles.css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<alert-box type="info">
|
||||||
|
<strong>This is an RSS feed</strong>. Subscribe by copying
|
||||||
|
the URL from the address bar into your newsreader. Visit <a
|
||||||
|
href="https://aboutfeeds.com">About Feeds
|
||||||
|
</a> to learn more and get started. It’s free.
|
||||||
|
</alert-box>
|
||||||
|
<div class="rss-summary">
|
||||||
|
<h1 class="flex items-start">
|
||||||
|
RSS Feed Preview
|
||||||
|
<svg
|
||||||
|
class="inline-icon"
|
||||||
|
version="1.1"
|
||||||
|
width="128px"
|
||||||
|
height="128px"
|
||||||
|
id="RSSicon"
|
||||||
|
viewBox="0 0 256 256"
|
||||||
|
sodipodi:docname="Feed-icon.svg"
|
||||||
|
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview32"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="2.9085291"
|
||||||
|
inkscape:cx="161.07798"
|
||||||
|
inkscape:cy="133.22886"
|
||||||
|
inkscape:window-width="2048"
|
||||||
|
inkscape:window-height="1252"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="RSSicon" />
|
||||||
|
<defs
|
||||||
|
id="defs17">
|
||||||
|
<linearGradient
|
||||||
|
x1="0.085"
|
||||||
|
y1="0.085"
|
||||||
|
x2="0.915"
|
||||||
|
y2="0.915"
|
||||||
|
id="RSSg">
|
||||||
|
<stop
|
||||||
|
offset="0.0"
|
||||||
|
stop-color="#E3702D"
|
||||||
|
id="stop2" />
|
||||||
|
<stop
|
||||||
|
offset="0.1071"
|
||||||
|
stop-color="#EA7D31"
|
||||||
|
id="stop4" />
|
||||||
|
<stop
|
||||||
|
offset="0.3503"
|
||||||
|
stop-color="#F69537"
|
||||||
|
id="stop6" />
|
||||||
|
<stop
|
||||||
|
offset="0.5"
|
||||||
|
stop-color="#FB9E3A"
|
||||||
|
id="stop8" />
|
||||||
|
<stop
|
||||||
|
offset="0.7016"
|
||||||
|
stop-color="#EA7C31"
|
||||||
|
id="stop10" />
|
||||||
|
<stop
|
||||||
|
offset="0.8866"
|
||||||
|
stop-color="#DE642B"
|
||||||
|
id="stop12" />
|
||||||
|
<stop
|
||||||
|
offset="1.0"
|
||||||
|
stop-color="#D95B29"
|
||||||
|
id="stop14" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<rect
|
||||||
|
width="256"
|
||||||
|
height="256"
|
||||||
|
rx="55"
|
||||||
|
ry="55"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
fill="#CC5D15"
|
||||||
|
id="rect19"
|
||||||
|
style="fill:#414141;fill-opacity:1" />
|
||||||
|
<rect
|
||||||
|
width="246"
|
||||||
|
height="246"
|
||||||
|
rx="50"
|
||||||
|
ry="50"
|
||||||
|
x="5"
|
||||||
|
y="5"
|
||||||
|
fill="#F49C52"
|
||||||
|
id="rect21"
|
||||||
|
style="fill:#414141;fill-opacity:1" />
|
||||||
|
<rect
|
||||||
|
width="236"
|
||||||
|
height="236"
|
||||||
|
rx="47"
|
||||||
|
ry="47"
|
||||||
|
x="10"
|
||||||
|
y="10"
|
||||||
|
fill="url(#RSSg)"
|
||||||
|
id="rect23"
|
||||||
|
style="fill:#414141;fill-opacity:1" />
|
||||||
|
<circle
|
||||||
|
cx="68"
|
||||||
|
cy="189"
|
||||||
|
r="24"
|
||||||
|
fill="#FFF"
|
||||||
|
id="circle25" />
|
||||||
|
<path
|
||||||
|
d="M160 213h-34a82 82 0 0 0 -82 -82v-34a116 116 0 0 1 116 116z"
|
||||||
|
fill="#FFF"
|
||||||
|
id="path27" />
|
||||||
|
<path
|
||||||
|
d="M184 213A140 140 0 0 0 44 73 V 38a175 175 0 0 1 175 175z"
|
||||||
|
fill="#FFF"
|
||||||
|
id="path29" />
|
||||||
|
<rect
|
||||||
|
width="256"
|
||||||
|
height="256"
|
||||||
|
rx="55"
|
||||||
|
ry="55"
|
||||||
|
x="299.70761"
|
||||||
|
y="188.99872"
|
||||||
|
fill="#CC5D15"
|
||||||
|
id="rect19-3"
|
||||||
|
style="fill:#414141;fill-opacity:1" />
|
||||||
|
<rect
|
||||||
|
width="246"
|
||||||
|
height="246"
|
||||||
|
rx="50"
|
||||||
|
ry="50"
|
||||||
|
x="304.70761"
|
||||||
|
y="193.99872"
|
||||||
|
fill="#F49C52"
|
||||||
|
id="rect21-6"
|
||||||
|
style="fill:#414141;fill-opacity:1" />
|
||||||
|
<rect
|
||||||
|
width="236"
|
||||||
|
height="236"
|
||||||
|
rx="47"
|
||||||
|
ry="47"
|
||||||
|
x="309.70761"
|
||||||
|
y="198.99872"
|
||||||
|
fill="url(#RSSg)"
|
||||||
|
id="rect23-7"
|
||||||
|
style="fill:#414141;fill-opacity:1" />
|
||||||
|
<circle
|
||||||
|
cx="367.70761"
|
||||||
|
cy="377.99872"
|
||||||
|
r="24"
|
||||||
|
fill="#ffffff"
|
||||||
|
id="circle25-5" />
|
||||||
|
<path
|
||||||
|
d="m 459.7076,401.99872 h -34 a 82,82 0 0 0 -82,-82 v -34 a 116,116 0 0 1 116,116 z"
|
||||||
|
fill="#ffffff"
|
||||||
|
id="path27-3" />
|
||||||
|
<path
|
||||||
|
d="m 483.7076,401.99872 a 140,140 0 0 0 -140,-140 v -35 a 175,175 0 0 1 175,175 z"
|
||||||
|
fill="#ffffff"
|
||||||
|
id="path29-5" />
|
||||||
|
</svg>
|
||||||
|
</h1>
|
||||||
|
<h2><xsl:value-of select="/atom:feed/atom:title"/></h2>
|
||||||
|
<p>
|
||||||
|
<xsl:value-of select="/atom:feed/atom:subtitle"/>
|
||||||
|
</p>
|
||||||
|
<a>
|
||||||
|
<xsl:attribute name="href">
|
||||||
|
<xsl:value-of select="/atom:feed/atom:link/@href"/>
|
||||||
|
</xsl:attribute>
|
||||||
|
Visit Website →
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<h2>Recent blog posts</h2>
|
||||||
|
<xsl:for-each select="/atom:feed/atom:entry">
|
||||||
|
<div class="post-summary">
|
||||||
|
<h1>
|
||||||
|
<a>
|
||||||
|
<xsl:attribute name="href">
|
||||||
|
<xsl:value-of select="atom:link/@href"/>
|
||||||
|
</xsl:attribute>
|
||||||
|
<xsl:value-of select="atom:title"/>
|
||||||
|
</a>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div class="text-2 text-offset">
|
||||||
|
Published on
|
||||||
|
<xsl:value-of select="substring(atom:updated, 0, 17)" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</xsl:for-each>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
</xsl:template>
|
||||||
|
</xsl:stylesheet>
|
Loading…
Reference in New Issue
Block a user