mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-10 03:49:24 +00:00
Add atom/rss news feed
This commit is contained in:
@ -36,6 +36,11 @@
|
||||
&:not(:first-of-type) {
|
||||
margin: 2em 0 1em 0;
|
||||
}
|
||||
|
||||
.feed {
|
||||
float: right;
|
||||
color: #f26522;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: $small-devices) {
|
||||
|
@ -8,6 +8,9 @@
|
||||
{% block additional_css %}
|
||||
<link rel="stylesheet" href="{{ static('com/css/news-list.scss') }}">
|
||||
<link rel="stylesheet" href="{{ static('com/components/ics-calendar.scss') }}">
|
||||
|
||||
{# Atom feed discovery, not really css but also goes there #}
|
||||
<link rel="alternate" type="application/rss+xml" title="{% trans %}News feed{% endtrans %}" href="{{ url("com:news_feed") }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block additional_js %}
|
||||
@ -19,7 +22,10 @@
|
||||
<div id="news">
|
||||
<div id="left_column" class="news_column">
|
||||
{% set events_dates = NewsDate.objects.filter(end_date__gte=timezone.now(), start_date__lte=timezone.now()+timedelta(days=5), news__is_moderated=True).datetimes('start_date', 'day') %}
|
||||
<h3>{% trans %}Events today and the next few days{% endtrans %}</h3>
|
||||
<h3>
|
||||
{% trans %}Events today and the next few days{% endtrans %}
|
||||
<a target="#" href="{{ url("com:news_feed") }}"><i class="fa fa-rss feed"></i></a>
|
||||
</h3>
|
||||
{% if user.is_authenticated and (user.is_com_admin or user.memberships.board().ongoing().exists()) %}
|
||||
<a class="btn btn-blue margin-bottom" href="{{ url("com:news_new") }}">
|
||||
<i class="fa fa-plus"></i>
|
||||
@ -73,7 +79,10 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<h3>{% trans %}All coming events{% endtrans %}</h3>
|
||||
<h3>
|
||||
{% trans %}All coming events{% endtrans %}
|
||||
<a target="#" href="{{ url("com:news_feed") }}"><i class="fa fa-rss feed"></i></a>
|
||||
</h3>
|
||||
<ics-calendar locale="{{ get_language() }}"></ics-calendar>
|
||||
</div>
|
||||
|
||||
|
@ -319,3 +319,11 @@ class TestNewsCreation(TestCase):
|
||||
self.valid_payload,
|
||||
)
|
||||
mocked.assert_called()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_feed(client):
|
||||
"""Smoke test that checks that the atom feed is working"""
|
||||
resp = client.get(reverse("com:news_feed"))
|
||||
assert resp.status_code == 200
|
||||
assert resp.headers["Content-Type"] == "application/rss+xml; charset=utf-8"
|
||||
|
@ -25,6 +25,7 @@ from com.views import (
|
||||
NewsCreateView,
|
||||
NewsDeleteView,
|
||||
NewsDetailView,
|
||||
NewsFeed,
|
||||
NewsListView,
|
||||
NewsModerateView,
|
||||
NewsUpdateView,
|
||||
@ -73,6 +74,7 @@ urlpatterns = [
|
||||
name="weekmail_article_edit",
|
||||
),
|
||||
path("news/", NewsListView.as_view(), name="news_list"),
|
||||
path("news/feed/", NewsFeed(), name="news_feed"),
|
||||
path("news/admin/", NewsAdminListView.as_view(), name="news_admin_list"),
|
||||
path("news/create/", NewsCreateView.as_view(), name="news_new"),
|
||||
path("news/<int:news_id>/edit/", NewsUpdateView.as_view(), name="news_edit"),
|
||||
|
30
com/views.py
30
com/views.py
@ -26,8 +26,10 @@ from datetime import timedelta
|
||||
from smtplib import SMTPRecipientsRefused
|
||||
from typing import Any
|
||||
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.mixins import AccessMixin, PermissionRequiredMixin
|
||||
from django.contrib.syndication.views import Feed
|
||||
from django.core.exceptions import PermissionDenied, ValidationError
|
||||
from django.db.models import Max
|
||||
from django.forms.models import modelform_factory
|
||||
@ -268,6 +270,34 @@ class NewsDetailView(CanViewMixin, DetailView):
|
||||
return super().get_context_data(**kwargs) | {"date": self.object.dates.first()}
|
||||
|
||||
|
||||
class NewsFeed(Feed):
|
||||
title = _("News")
|
||||
link = reverse_lazy("com:news_list")
|
||||
description = _("All incoming events")
|
||||
|
||||
def items(self):
|
||||
return (
|
||||
NewsDate.objects.filter(
|
||||
news__is_moderated=True,
|
||||
end_date__gte=timezone.now() - (relativedelta(months=6)),
|
||||
)
|
||||
.prefetch_related("news")
|
||||
.order_by("-start_date")
|
||||
)
|
||||
|
||||
def item_title(self, item: NewsDate):
|
||||
return item.news.title
|
||||
|
||||
def item_description(self, item: NewsDate):
|
||||
return item.news.summary
|
||||
|
||||
def item_link(self, item: NewsDate):
|
||||
return item.news.get_absolute_url()
|
||||
|
||||
def item_author_name(self, item: NewsDate):
|
||||
return item.news.author.get_display_name()
|
||||
|
||||
|
||||
# Weekmail
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user