base menu, about page, atom feed

This commit is contained in:
j 2023-07-25 20:03:54 +01:00
commit 0b64fd58a1
21 changed files with 284 additions and 47 deletions

View file

@ -1,3 +1,5 @@
import xml.etree.ElementTree as ET
from datetime import date, datetime, timedelta
import json
@ -6,6 +8,7 @@ from django.shortcuts import render
from django.db.models import Q
from django.utils.html import mark_safe
from django.conf import settings
from django.http import HttpResponse
from . import models
from . import tasks
@ -14,7 +17,7 @@ from .utils import render_to_json
def index(request):
context = {}
context = {"settings": settings}
week, archive = models.Item.public()
context['items'] = week
context['archive'] = archive.exists()
@ -22,7 +25,7 @@ def index(request):
def archive(request):
context = {}
context = {"settings": settings}
qs = models.Item.public()
week, archive = models.Item.public()
context['items'] = archive
@ -30,7 +33,7 @@ def archive(request):
def item(request, id):
context = {}
context = {"settings": settings}
item = models.Item.objects.get(id=id)
context['item'] = item
qs = item.comments.order_by('created')
@ -71,9 +74,8 @@ def comment(request):
comment.session_key = request.session.session_key
comment.text = data['text']
comment.save()
if not comment.published:
link = request.build_absolute_uri(comment.item.get_absolute_url())
tasks.notify_moderators.delay(comment.id, link)
link = request.build_absolute_uri(comment.item.get_absolute_url())
tasks.notify_moderators.delay(comment.id, link)
response = comment.json()
return render_to_json(response)
@ -88,8 +90,61 @@ def publish_comment(request):
if comment.data.get("moderator_ts"):
account = settings.SIGNAL_ACCOUNT
group = settings.SIGNAL_MODERATORS_GROUP
send_reaction(account, comment.data["moderator_ts"], "🎉", group=group)
send_reaction(
account, comment.data["moderator_ts"], "🎉", group=group
)
response['status'] = 'ok'
else:
response['error'] = 'permission denied'
return render_to_json(response)
def atom_xml(request):
feed = ET.Element("feed")
feed.attrib['xmlns'] = 'http://www.w3.org/2005/Atom'
feed.attrib['xmlns:media'] = 'http://search.yahoo.com/mrss/'
feed.attrib['xml:lang'] = 'en'
title = ET.SubElement(feed, "title")
title.text = settings.SITENAME
title.attrib['type'] = 'text'
link = ET.SubElement(feed, "link")
link.attrib['rel'] = 'self'
link.attrib['type'] = 'application/atom+xml'
atom_link = request.build_absolute_uri('/atom.xml')
link.attrib['href'] = atom_link
el = ET.SubElement(feed, 'id')
el.text = atom_link
week, archive = models.Item.public()
for item in week:
page_link = request.build_absolute_uri(item.get_absolute_url())
entry = ET.Element("entry")
title = ET.SubElement(entry, "title")
title.text = item.title
link = ET.SubElement(entry, "link")
link.attrib['rel'] = 'alternate'
link.attrib['href'] = page_link
updated = ET.SubElement(entry, "updated")
updated.text = item.modified.strftime("%Y-%m-%dT%H:%M:%SZ")
published = ET.SubElement(entry, "published")
published.text = item.created.strftime("%Y-%m-%dT%H:%M:%SZ")
el = ET.SubElement(entry, "id")
el.text = page_link
print(item.data)
if 'title' in item.data and 'thumbnail' in item.data:
html = f'''
<p>
{item.data['title']}
</p>
<img src={ item.data['thumbnail'] }>
'''.strip()
content = ET.SubElement(entry, "content")
content.attrib['type'] = 'html'
content.text = html
feed.append(entry)
return HttpResponse(
'<?xml version="1.0" encoding="utf-8" ?>\n' + ET.tostring(feed).decode(),
'application/atom+xml'
)