feat: Allow styling of RSS feed

This commit is contained in:
moanos [he/him] 2024-04-15 23:08:39 +02:00
parent a2058a4cfe
commit c1b0a4195a
2 changed files with 243 additions and 1 deletions

View File

@ -1,10 +1,31 @@
from django.contrib.syndication.views import Feed
from django.utils.feedgenerator import Rss201rev2Feed
from django.urls import reverse
from django.utils.xmlutils import SimplerXMLGenerator
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):
feed_type = FormattedFeed
title = "Notfellchen"
link = "/rss/"
description = "Updates zu neuen Vermittlungen."
@ -17,4 +38,3 @@ class LatestAdoptionNoticesFeed(Feed):
def item_description(self, item):
return item.description

View 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. Its 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 &#x2192;
</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>