Allow displaying more news

This commit is contained in:
Antoine Bartuccio 2025-02-17 01:34:10 +01:00
parent 88b3f7c322
commit a592a607c1
4 changed files with 147 additions and 107 deletions

View File

@ -1,24 +1,28 @@
{% extends "core/base.jinja" %}
{% from "com/macros.jinja" import news_moderation_alert %} {% from "com/macros.jinja" import news_moderation_alert %}
{% if not is_fragment %}
{% extends "core/base.jinja" %}
{% block title %} {% block title %}
{% trans %}News{% endtrans %} {% trans %}News{% endtrans %}
{% endblock %} {% endblock %}
{% block additional_css %} {% block additional_css %}
<link rel="stylesheet" href="{{ static('com/css/news-list.scss') }}"> <link rel="stylesheet" href="{{ static('com/css/news-list.scss') }}">
<link rel="stylesheet" href="{{ static('com/components/ics-calendar.scss') }}"> <link rel="stylesheet" href="{{ static('com/components/ics-calendar.scss') }}">
{# Atom feed discovery, not really css but also goes there #} {# 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") }}"> <link rel="alternate" type="application/rss+xml" title="{% trans %}News feed{% endtrans %}" href="{{ url("com:news_feed") }}">
{% endblock %} {% endblock %}
{% block additional_js %} {% block additional_js %}
<script type="module" src={{ static("bundled/com/components/ics-calendar-index.ts") }}></script> <script type="module" src={{ static("bundled/com/components/ics-calendar-index.ts") }}></script>
<script type="module" src={{ static("bundled/com/components/moderation-alert-index.ts") }}></script> <script type="module" src={{ static("bundled/com/components/moderation-alert-index.ts") }}></script>
{% endblock %} {% endblock %}
{% endif %}
{% block content %} {% block content %}
{% if not is_fragment %}
<div id="news"> <div id="news">
<div id="left_column" class="news_column"> <div id="left_column" class="news_column">
<h3> <h3>
@ -37,6 +41,8 @@
</a> </a>
<br> <br>
{% endif %} {% endif %}
{% endif %}
<div id="news_displayed">
{% for day, dates_group in news_dates %} {% for day, dates_group in news_dates %}
<div class="news_events_group"> <div class="news_events_group">
<div class="news_events_group_date"> <div class="news_events_group_date">
@ -100,6 +106,18 @@
<em>{% trans %}Nothing to come...{% endtrans %}</em> <em>{% trans %}Nothing to come...{% endtrans %}</em>
</div> </div>
{% endfor %} {% endfor %}
{% if max_weeks_displayed + 1 < 10 %}
<button
hx-get={{ url("core:index") }}?weeks={{ max_weeks_displayed + 1 }}
hx-target="#news_displayed"
hx-swap="outerHtml"
hx-push-url="true"
>
{% trans date=(timezone.now() + timedelta(days=6*(max_weeks_displayed+1))).strftime('%d/%m/%Y') %}Display until {{ date }}{% endtrans %}
</button>
{% endif %}
</div>
{% if not is_fragment %}
<h3> <h3>
{% trans %}All coming events{% endtrans %} {% trans %}All coming events{% endtrans %}
@ -185,4 +203,5 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
{% endblock %} {% endblock %}

View File

@ -33,7 +33,7 @@ from django.contrib.syndication.views import Feed
from django.core.exceptions import PermissionDenied, ValidationError from django.core.exceptions import PermissionDenied, ValidationError
from django.db.models import Max from django.db.models import Max
from django.forms.models import modelform_factory from django.forms.models import modelform_factory
from django.http import HttpResponseRedirect from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.utils import timezone from django.utils import timezone
@ -52,7 +52,7 @@ from core.auth.mixins import (
PermissionOrAuthorRequiredMixin, PermissionOrAuthorRequiredMixin,
) )
from core.models import User from core.models import User
from core.views.mixins import QuickNotifMixin, TabedViewMixin from core.views.mixins import AllowFragment, QuickNotifMixin, TabedViewMixin
from core.views.widgets.markdown import MarkdownInput from core.views.widgets.markdown import MarkdownInput
# Sith object # Sith object
@ -236,9 +236,18 @@ class NewsAdminListView(PermissionRequiredMixin, ListView):
permission_required = ["com.moderate_news", "com.delete_news"] permission_required = ["com.moderate_news", "com.delete_news"]
class NewsListView(TemplateView): class NewsListView(AllowFragment, TemplateView):
template_name = "com/news_list.jinja" template_name = "com/news_list.jinja"
def get_number_weeks_displayed(self) -> int:
try:
max_weeks = max(int(self.request.GET.get("weeks", 1)), 0)
except ValueError as e:
raise Http404 from e
if max_weeks < 1 or max_weeks > 10:
raise Http404
return max_weeks
def get_birthdays(self): def get_birthdays(self):
if not self.request.user.has_perm("core.view_user"): if not self.request.user.has_perm("core.view_user"):
return [] return []
@ -256,7 +265,11 @@ class NewsListView(TemplateView):
def get_news_dates(self): def get_news_dates(self):
return itertools.groupby( return itertools.groupby(
NewsDate.objects.viewable_by(self.request.user) NewsDate.objects.viewable_by(self.request.user)
.filter(end_date__gt=now(), start_date__lt=now() + timedelta(days=6)) .filter(
end_date__gt=now(),
start_date__lt=now()
+ timedelta(days=6 * self.get_number_weeks_displayed()),
)
.order_by("start_date") .order_by("start_date")
.select_related("news", "news__club"), .select_related("news", "news__club"),
key=lambda d: d.start_date.date(), key=lambda d: d.start_date.date(),
@ -266,6 +279,7 @@ class NewsListView(TemplateView):
return super().get_context_data(**kwargs) | { return super().get_context_data(**kwargs) | {
"news_dates": self.get_news_dates(), "news_dates": self.get_news_dates(),
"birthdays": self.get_birthdays(), "birthdays": self.get_birthdays(),
"max_weeks_displayed": self.get_number_weeks_displayed(),
} }

View File

@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-12 15:55+0100\n" "POT-Creation-Date: 2025-02-17 01:30+0100\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Maréchal <thomas.girod@utbm.fr\n" "Last-Translator: Maréchal <thomas.girod@utbm.fr\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@ -935,6 +935,10 @@ msgstr "rôle"
msgid "description" msgid "description"
msgstr "description" msgstr "description"
#: club/models.py
msgid "past member"
msgstr "ancien membre"
#: club/models.py #: club/models.py
msgid "Email address" msgid "Email address"
msgstr "Adresse email" msgstr "Adresse email"
@ -1425,8 +1429,9 @@ msgstr ""
#: com/templates/com/macros.jinja #: com/templates/com/macros.jinja
#, python-format #, python-format
msgid "" msgid ""
"This event will take place every week for %(nb)s weeks. If you moderate or delete " "This event will take place every week for %(nb)s weeks. If you moderate or "
"this event, it will also be moderated (or deleted) for the following weeks." "delete this event, it will also be moderated (or deleted) for the following "
"weeks."
msgstr "" msgstr ""
"Cet événement se déroulera chaque semaine pendant %(nb)s semaines. Si vous " "Cet événement se déroulera chaque semaine pendant %(nb)s semaines. Si vous "
"modérez ou supprimez cet événement, il sera également modéré (ou supprimé) " "modérez ou supprimez cet événement, il sera également modéré (ou supprimé) "
@ -1573,6 +1578,10 @@ msgstr "Administrer les news"
msgid "Nothing to come..." msgid "Nothing to come..."
msgstr "Rien à venir..." msgstr "Rien à venir..."
#: com/templates/com/news_list.jinja
msgid "Display until %(date)s"
msgstr "Afficher jusqu'au %(date)s"
#: com/templates/com/news_list.jinja #: com/templates/com/news_list.jinja
msgid "All coming events" msgid "All coming events"
msgstr "Tous les événements à venir" msgstr "Tous les événements à venir"
@ -3336,8 +3345,8 @@ msgstr "Nom d'utilisateur, email, ou numéro de compte AE"
#: core/views/forms.py #: core/views/forms.py
msgid "" msgid ""
"Profile: you need to be visible on the picture, in order to be recognized (e." "Profile: you need to be visible on the picture, in order to be recognized "
"g. by the barmen)" "(e.g. by the barmen)"
msgstr "" msgstr ""
"Photo de profil: vous devez être visible sur la photo afin d'être reconnu " "Photo de profil: vous devez être visible sur la photo afin d'être reconnu "
"(par exemple par les barmen)" "(par exemple par les barmen)"
@ -3947,8 +3956,8 @@ msgstr ""
#: counter/templates/counter/mails/account_dump.jinja #: counter/templates/counter/mails/account_dump.jinja
msgid "If you think this was a mistake, please mail us at ae@utbm.fr." msgid "If you think this was a mistake, please mail us at ae@utbm.fr."
msgstr "" msgstr ""
"Si vous pensez qu'il s'agit d'une erreur, veuillez envoyer un mail à ae@utbm." "Si vous pensez qu'il s'agit d'une erreur, veuillez envoyer un mail à "
"fr." "ae@utbm.fr."
#: counter/templates/counter/mails/account_dump.jinja #: counter/templates/counter/mails/account_dump.jinja
msgid "" msgid ""
@ -6022,6 +6031,3 @@ msgstr "Vous ne pouvez plus écrire de commentaires, la date est passée."
#, python-format #, python-format
msgid "Maximum characters: %(max_length)s" msgid "Maximum characters: %(max_length)s"
msgstr "Nombre de caractères max: %(max_length)s" msgstr "Nombre de caractères max: %(max_length)s"
#~ msgid "past member"
#~ msgstr "ancien membre"

View File

@ -162,6 +162,7 @@ TEMPLATES = [
"Launderette": "launderette.models.Launderette", "Launderette": "launderette.models.Launderette",
"Counter": "counter.models.Counter", "Counter": "counter.models.Counter",
"timezone": "django.utils.timezone", "timezone": "django.utils.timezone",
"timedelta": "datetime.timedelta",
"get_sith": "com.views.sith", "get_sith": "com.views.sith",
"get_language": "django.utils.translation.get_language", "get_language": "django.utils.translation.get_language",
}, },