add rss feed for reviews

This commit is contained in:
Te Llamas 2022-11-08 02:32:35 +00:00
parent 52b720cb73
commit 204569ade5
5 changed files with 58 additions and 0 deletions

49
users/feeds.py Normal file
View file

@ -0,0 +1,49 @@
from django.contrib.syndication.views import Feed
from django.urls import reverse
from books.models import BookReview
from .models import User
from markdown import markdown
import operator
MAX_ITEM_PER_TYPE = 10
class ReviewFeed(Feed):
def get_object(self, request, id):
return User.get(id)
def title(self, user):
return "%s 的评论" % user.display_name
def link(self, user):
return user.url
def description(self, user):
return "%s 的评论合集 - NeoDB" % user.display_name
def items(self, user):
if user is None:
return None
book_reviews = list(user.user_bookreviews.filter(visibility=0)[:MAX_ITEM_PER_TYPE])
movie_reviews = list(user.user_moviereviews.filter(visibility=0)[:MAX_ITEM_PER_TYPE])
album_reviews = list(user.user_albumreviews.filter(visibility=0)[:MAX_ITEM_PER_TYPE])
game_reviews = list(user.user_gamereviews.filter(visibility=0)[:MAX_ITEM_PER_TYPE])
all_reviews = sorted(
book_reviews + movie_reviews + album_reviews + game_reviews,
key=operator.attrgetter('created_time'),
reverse=True
)
return all_reviews
def item_title(self, item):
return f"{item.title} - 评论《{item.item.title}"
def item_description(self, item):
target_html = f'<p><a href="{item.item.url}">{item.item.title}</a></p>\n'
html = markdown(item.content)
return target_html + html
# item_link is only needed if NewsItem has no get_absolute_url method.
def item_link(self, item):
return item.url

View file

@ -8,6 +8,7 @@ from django.utils.translation import gettext_lazy as _
from common.utils import GenerateDateUUIDMediaFilePath
from django.conf import settings
from mastodon.api import *
from django.shortcuts import reverse
def report_image_path(instance, filename):
@ -59,6 +60,10 @@ class User(AbstractUser):
def display_name(self):
return self.mastodon_account['display_name'] if self.mastodon_account and 'display_name' in self.mastodon_account and self.mastodon_account['display_name'] else self.mastodon_username
@property
def url(self):
return reverse("users:home", args=[self.mastodon_username])
def __str__(self):
return self.mastodon_username

View file

@ -16,6 +16,7 @@
{% else %}
<title>{{ site_name }} - {{user.display_name}}</title>
{% endif %}
<link rel="alternate" type="application/rss+xml" title="{{ site_name }} - {{ username }}@{{ site }}的评论" href="{{ request.build_absolute_uri }}feed/reviews/">
{% include "partial/_common_libs.html" with jquery=1 %}

View file

@ -6,6 +6,7 @@
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0;URL={{ login_url }}" />
<title>{{ site_name }} - {{ username }}@{{ site }}</title>
<link rel="alternate" type="application/rss+xml" title="{{ site_name }} - {{ username }}@{{ site }}的评论" href="{{ request.build_absolute_uri }}feed/reviews/">
<meta property="og:title" content="{{ site_name }} - {{ username }}@{{ site }}的书影音">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ request.build_absolute_uri }}">

View file

@ -1,5 +1,6 @@
from django.urls import path
from .views import *
from .feeds import ReviewFeed
app_name = 'users'
urlpatterns = [
@ -37,6 +38,7 @@ urlpatterns = [
path('<str:id>/movie/<str:status>/', movie_list, name='movie_list'),
path('<str:id>/music/<str:status>/', music_list, name='music_list'),
path('<str:id>/game/<str:status>/', game_list, name='game_list'),
path('<str:id>/feed/reviews/', ReviewFeed(), name='review_feed'),
path('report/', report, name='report'),
path('manage_report/', manage_report, name='manage_report'),
]