From ce7576e9ae5ba63fb7eeff7537896d7da759880f Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Fri, 7 Feb 2025 16:03:04 +0100 Subject: [PATCH] =?UTF-8?q?On=20visualise=20les=20=C3=A9v=C3=A9nements=20i?= =?UTF-8?q?mport=C3=A9s=20mais=20hors=20imports=20r=C3=A9currents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/agenda_culturel/filters.py | 42 ++++++++++++++++++- .../locale/fr/LC_MESSAGES/django.po | 34 +++++++++------ src/agenda_culturel/static/style.scss | 11 ++++- 3 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/agenda_culturel/filters.py b/src/agenda_culturel/filters.py index b7d139c..712dcfe 100644 --- a/src/agenda_culturel/filters.py +++ b/src/agenda_culturel/filters.py @@ -2,7 +2,7 @@ import django_filters from django.utils.translation import gettext_lazy as _ from django import forms from django.contrib.postgres.search import SearchQuery, SearchHeadline -from django.db.models import Count, Q +from django.db.models import Count, Q, F from datetime import date, timedelta from urllib.parse import urlparse, parse_qs, urlencode @@ -326,6 +326,18 @@ class EventFilterAdmin(django_filters.FilterSet): method="filter_by_representative", widget=forms.CheckboxSelectMultiple) + pure_import = django_filters.MultipleChoiceFilter( + label=_("Pure import"), + choices=[(True, _("Yes")), (False, _("No"))], + method="filter_by_pure_import", + widget=forms.CheckboxSelectMultiple) + + in_recurrent_import = django_filters.MultipleChoiceFilter( + label=_("In recurrent import"), + choices=[(True, _("Yes")), (False, _("No"))], + method="filter_by_in_recurrent_import", + widget=forms.CheckboxSelectMultiple) + import_sources = django_filters.ModelChoiceFilter( label=_("Imported from"), method="filter_by_source", @@ -336,6 +348,32 @@ class EventFilterAdmin(django_filters.FilterSet): src = RecurrentImport.objects.get(pk=value.pk).source return queryset.filter(import_sources__contains=[src]) + def filter_by_in_recurrent_import(self, queryset, name, value): + if value is None or len(value) != 1: + return queryset + else: + srcs = RecurrentImport.objects.all().values_list("source") + q = Q(import_sources__overlap=srcs) + if value[0] == 'True': + print(q) + return queryset.filter(q) + else: + return queryset.exclude(q) + + def filter_by_pure_import(self, queryset, name, value): + if value is None or len(value) != 1: + return queryset + else: + q = (Q(import_sources__isnull=False) & + (Q(modified_date__isnull=True) | + Q(modified_date__lte=F('imported_date')))) + if value[0] == 'True': + print(q) + return queryset.filter(q) + else: + return queryset.exclude(q) + + def filter_by_representative(self, queryset, name, value): if value is None or len(value) != 1: return queryset @@ -343,7 +381,7 @@ class EventFilterAdmin(django_filters.FilterSet): q = (Q(other_versions__isnull=True) | Q(other_versions__representative=F('pk')) | Q(other_versions__representative__isnull=True)) - if value[0] == True: + if value[0] == 'True': return queryset.filter(q) else: return queryset.exclude(q) diff --git a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po index 415d93f..2812590 100644 --- a/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po +++ b/src/agenda_culturel/locale/fr/LC_MESSAGES/django.po @@ -2,13 +2,13 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Jean-Marie Favreau , 2023. -# +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: agenda_culturel\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-07 11:55+0100\n" +"POT-Creation-Date: 2025-02-07 16:00+0100\n" "PO-Revision-Date: 2023-10-29 14:16+0000\n" "Last-Translator: Jean-Marie Favreau \n" "Language-Team: Jean-Marie Favreau \n" @@ -98,49 +98,59 @@ msgstr "Choisir une localité" msgid "Representative version" msgstr "Version représentative" -#: agenda_culturel/filters.py:325 agenda_culturel/filters.py:395 +#: agenda_culturel/filters.py:325 agenda_culturel/filters.py:331 +#: agenda_culturel/filters.py:337 agenda_culturel/filters.py:433 msgid "Yes" msgstr "Oui" -#: agenda_culturel/filters.py:325 agenda_culturel/filters.py:395 +#: agenda_culturel/filters.py:325 agenda_culturel/filters.py:331 +#: agenda_culturel/filters.py:337 agenda_culturel/filters.py:433 msgid "No" msgstr "Non" #: agenda_culturel/filters.py:330 +msgid "Pure import" +msgstr "Événement importé" + +#: agenda_culturel/filters.py:336 +msgid "In recurrent import" +msgstr "Inclut dans un import récurrent" + +#: agenda_culturel/filters.py:342 msgid "Imported from" msgstr "Importé depuis" -#: agenda_culturel/filters.py:359 agenda_culturel/models.py:648 +#: agenda_culturel/filters.py:397 agenda_culturel/models.py:648 #: agenda_culturel/models.py:2272 msgid "Status" msgstr "Status" -#: agenda_culturel/filters.py:360 agenda_culturel/models.py:2058 +#: agenda_culturel/filters.py:398 agenda_culturel/models.py:2058 msgid "Closed" msgstr "Fermé" -#: agenda_culturel/filters.py:360 +#: agenda_culturel/filters.py:398 msgid "Open" msgstr "Ouvert" -#: agenda_culturel/filters.py:364 agenda_culturel/filters.py:365 +#: agenda_culturel/filters.py:402 agenda_culturel/filters.py:403 #: agenda_culturel/models.py:2052 msgid "Spam" msgstr "Spam" -#: agenda_culturel/filters.py:365 +#: agenda_culturel/filters.py:403 msgid "Non spam" msgstr "Non spam" -#: agenda_culturel/filters.py:370 agenda_culturel/models.py:2073 +#: agenda_culturel/filters.py:408 agenda_culturel/models.py:2073 msgid "Type" msgstr "Type" -#: agenda_culturel/filters.py:382 +#: agenda_culturel/filters.py:420 msgid "Search" msgstr "Rechercher" -#: agenda_culturel/filters.py:394 +#: agenda_culturel/filters.py:432 msgid "In the past" msgstr "Dans le passé" diff --git a/src/agenda_culturel/static/style.scss b/src/agenda_culturel/static/style.scss index b589711..aa1d8ca 100644 --- a/src/agenda_culturel/static/style.scss +++ b/src/agenda_culturel/static/style.scss @@ -620,11 +620,20 @@ header .remarque { } .form.recent, .form.main-filter, .search .form { - #id_status>div, #id_representative>div { + #id_status>div, #id_representative>div, #id_pure_import>div, #id_in_recurrent_import>div { display: inline-block; margin-right: 2em; } } +.form.recent { + display: grid; + grid-template-columns: repeat(2, 1fr); + column-gap: .5em; + :last-child, :nth-last-child(4), + button { + grid-column: 1/3; + } +} #search { form {