From 1774e409d0ca88e9225c3f52952b4f34884a0237 Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Fri, 24 Jan 2025 19:35:49 +0100 Subject: [PATCH] =?UTF-8?q?D=C3=A9but=20du=20travail=20sur=20les=20urls=20?= =?UTF-8?q?explicites?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- experimentations/get_facebook_event.py | 2 +- src/agenda_culturel/filters.py | 101 ++++-------------- .../migrations/0137_category_slug.py | 32 ++++++ src/agenda_culturel/models.py | 4 +- .../templates/agenda_culturel/filter-inc.html | 4 +- .../templates/agenda_culturel/page-week.html | 4 +- src/agenda_culturel/templatetags/cat_extra.py | 24 +++-- src/agenda_culturel/urls.py | 13 +++ src/agenda_culturel/views.py | 16 ++- src/requirements.txt | 3 +- 10 files changed, 103 insertions(+), 100 deletions(-) create mode 100644 src/agenda_culturel/migrations/0137_category_slug.py diff --git a/experimentations/get_facebook_event.py b/experimentations/get_facebook_event.py index e90be7f..0f16c7e 100755 --- a/experimentations/get_facebook_event.py +++ b/experimentations/get_facebook_event.py @@ -30,7 +30,7 @@ from src.agenda_culturel.import_tasks.extractor_facebook import * if __name__ == "__main__": u2e = URL2Events(ChromiumHeadlessDownloader(), FacebookEventExtractor()) - url="https://www.facebook.com/events/s/tour-du-sud-invite-koum/430014373384441/" + url="https://www.facebook.com/events/3575802569389184/3575802576055850/?active_tab=about" events = u2e.process(url, cache = "fb.html", published = True) diff --git a/src/agenda_culturel/filters.py b/src/agenda_culturel/filters.py index 31ad8ba..a554975 100644 --- a/src/agenda_culturel/filters.py +++ b/src/agenda_culturel/filters.py @@ -98,15 +98,6 @@ class EventFilter(django_filters.FilterSet): method="filter_recurrences", ) - category = django_filters.ModelMultipleChoiceFilter( - label="Filtrer par catégories", - field_name="category__id", - to_field_name="id", - queryset=Category.objects.all(), - widget=MultipleHiddenInput, - ) - - status = django_filters.MultipleChoiceFilter( label="Filtrer par status", choices=Event.STATUS.choices, @@ -116,7 +107,7 @@ class EventFilter(django_filters.FilterSet): class Meta: model = Event - fields = ["category", "tags", "exclude_tags", "status", "recurrences"] + fields = ["tags", "exclude_tags", "status", "recurrences"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -162,43 +153,8 @@ class EventFilter(django_filters.FilterSet): def get_full_url(self): return self.request.get_full_path() - def get_url_remove_categories(self, catpks, full_path = None): - if full_path is None: - full_path = self.request.get_full_path() - - result = full_path - for catpk in catpks: - result = result.replace('category=' + str(catpk), '') - result = result.replace('?&', '?') - result = result.replace('&&', '&') - return result - - def get_url_add_categories(self, catpks, full_path = None): - if full_path is None: - full_path = self.request.get_full_path() - - result = full_path - for catpk in catpks: - result = result + ('&' if '?' in full_path else '?') + 'category=' + str(catpk) - return result - - def get_url_without_filters_only_cats(self): - return self.get_url_without_filters(True) - - - def get_url_without_filters(self, only_categories=False): - - if only_categories: - # on repart d'une url sans option - result = self.request.get_full_path().split("?")[0] - # on ajoute toutes les catégories - result = self.get_url_add_categories([c.pk for c in self.get_categories()], result) - else: - # on supprime toutes les catégories - result = self.get_url_remove_categories([c.pk for c in self.get_categories()]) - - return result - + def get_url_without_filters(self): + return self.request.get_full_path().split("?")[0] def get_cleaned_data(self, name): @@ -209,12 +165,6 @@ class EventFilter(django_filters.FilterSet): except KeyError: return {} - def get_categories(self): - return self.get_cleaned_data("category") - - def has_category(self): - return "category" in self.form.cleaned_data and len(self.get_cleaned_data("category")) > 0 - def get_tags(self): return self.get_cleaned_data("tags") @@ -232,7 +182,7 @@ class EventFilter(django_filters.FilterSet): def to_str(self, prefix=''): self.form.full_clean() - result = ' '.join([c.name for c in self.get_categories()] + [t for t in self.get_tags()] + ["~" + t for t in self.get_exclude_tags()] + [str(self.get_position()), str(self.get_radius())]) + result = ' '.join([t for t in self.get_tags()] + ["~" + t for t in self.get_exclude_tags()] + [str(self.get_position()), str(self.get_radius())]) if len(result) > 0: result = prefix + result return result @@ -256,29 +206,25 @@ class EventFilter(django_filters.FilterSet): else: return "" - - def is_resetable(self, only_categories=False): - if only_categories: - return len(self.get_cleaned_data("category")) != 0 + def is_resetable(self): + if self.request.user.is_authenticated: + if ( + len(self.get_cleaned_data("status")) != 1 + or + self.get_cleaned_data("status")[0] != Event.STATUS.PUBLISHED + ): + return True else: - if self.request.user.is_authenticated: - if ( - len(self.get_cleaned_data("status")) != 1 - or - self.get_cleaned_data("status")[0] != Event.STATUS.PUBLISHED - ): - return True - else: - if ( - len(self.get_cleaned_data("status")) != 0 - ): - return True - return ( - len(self.get_cleaned_data("tags")) != 0 - or len(self.get_cleaned_data("exclude_tags")) != 0 - or len(self.get_cleaned_data("recurrences")) != 0 - or ((not self.get_cleaned_data("position") is None) and (not self.get_cleaned_data("radius") is None)) - ) + if ( + len(self.get_cleaned_data("status")) != 0 + ): + return True + return ( + len(self.get_cleaned_data("tags")) != 0 + or len(self.get_cleaned_data("exclude_tags")) != 0 + or len(self.get_cleaned_data("recurrences")) != 0 + or ((not self.get_cleaned_data("position") is None) and (not self.get_cleaned_data("radius") is None)) + ) def is_active(self, only_categories=False): if only_categories: @@ -292,9 +238,6 @@ class EventFilter(django_filters.FilterSet): or ((not self.get_cleaned_data("position") is None) and (not self.get_cleaned_data("radius") is None)) ) - def is_selected(self, cat): - return "category" in self.form.cleaned_data and cat in self.form.cleaned_data["category"] - def is_selected_tag(self, tag): return "tags" in self.form.cleaned_data and tag in self.form.cleaned_data["tags"] diff --git a/src/agenda_culturel/migrations/0137_category_slug.py b/src/agenda_culturel/migrations/0137_category_slug.py new file mode 100644 index 0000000..46a2b55 --- /dev/null +++ b/src/agenda_culturel/migrations/0137_category_slug.py @@ -0,0 +1,32 @@ +# Generated by Django 4.2.9 on 2025-01-24 17:48 + +import autoslug.fields +from django.db import migrations + +def migrate_data_forward(apps, schema_editor): + Category = apps.get_model("agenda_culturel", "Category") + + for instance in Category.objects.all(): + print("Generating slug for %s"%instance) + instance.save() # Will trigger slug update + +def migrate_data_backward(apps, schema_editor): + pass + +class Migration(migrations.Migration): + + dependencies = [ + ('agenda_culturel', '0136_alter_recurrentimport_processor'), + ] + + operations = [ + migrations.AddField( + model_name='category', + name='slug', + field=autoslug.fields.AutoSlugField(default=None, editable=False, null=True, populate_from='name', unique=True), + ), + migrations.RunPython( + migrate_data_forward, + migrate_data_backward, + ), + ] diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index 8e9fa0c..ade56b7 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -17,7 +17,7 @@ from django.core.files.storage import default_storage from django.contrib.sites.models import Site from django.core.mail import send_mail from django.template.loader import render_to_string - +from autoslug import AutoSlugField import uuid @@ -114,6 +114,8 @@ class Category(models.Model): verbose_name=_("Name"), help_text=_("Category name"), max_length=512 ) + slug = AutoSlugField(null=True, default=None, unique=True, populate_from='name') + color = ColorField( verbose_name=_("Color"), help_text=_("Color used as background for the category"), diff --git a/src/agenda_culturel/templates/agenda_culturel/filter-inc.html b/src/agenda_culturel/templates/agenda_culturel/filter-inc.html index d6ca6a7..ccac552 100644 --- a/src/agenda_culturel/templates/agenda_culturel/filter-inc.html +++ b/src/agenda_culturel/templates/agenda_culturel/filter-inc.html @@ -9,7 +9,7 @@ {% endif %}
- {% show_legend filter=filter %} + {% show_legend category=category filter=filter %}
@@ -34,7 +34,7 @@ {% endif %} {% if filter.is_resetable %} - {% picto_from_name "x-circle" %} + {% picto_from_name "x-circle" %} {% endif %} diff --git a/src/agenda_culturel/templates/agenda_culturel/page-week.html b/src/agenda_culturel/templates/agenda_culturel/page-week.html index 83c13c7..5c64201 100644 --- a/src/agenda_culturel/templates/agenda_culturel/page-week.html +++ b/src/agenda_culturel/templates/agenda_culturel/page-week.html @@ -20,10 +20,10 @@ {% block content %} - {% include "agenda_culturel/filter-inc.html" with filter=filter noarticle=0 %} + {% include "agenda_culturel/filter-inc.html" with filter=filter noarticle=0 category=category %} {% with cache_timeout=user.is_authenticated|yesno:"30,600" %} - {% cache cache_timeout week user.is_authenticated calendar.firstdate filter.get_url %} + {% cache cache_timeout week user.is_authenticated calendar.firstdate category filter.get_url %}
diff --git a/src/agenda_culturel/templatetags/cat_extra.py b/src/agenda_culturel/templatetags/cat_extra.py index 3499738..4378cff 100644 --- a/src/agenda_culturel/templatetags/cat_extra.py +++ b/src/agenda_culturel/templatetags/cat_extra.py @@ -6,6 +6,11 @@ from agenda_culturel.models import Category import colorsys from .utils_extra import * +import logging + +logger = logging.getLogger(__name__) + + register = template.Library() @@ -236,28 +241,29 @@ def legend_cat(category, url, selected=True, first=False, with_title=False): @register.simple_tag -def show_legend(filter): - filter.form.full_clean() +def show_legend(filter, category): cats = Category.objects.all().order_by("position") - if filter.is_active(only_categories=True): + + if not category is None: + url_nocat = "/" + "/".join(filter.request.get_full_path().split("/")[2:]) return mark_safe('
' + " ".join( [ legend_cat( c, - filter.get_url_add_categories([c.pk]) - if not filter.is_selected(c) - else filter.get_url_remove_categories([c.pk]), - selected=filter.is_selected(c), + "/" + c.slug + url_nocat + if category != c + else url_nocat, + selected=category == c, with_title=True ) for c in cats ] - ) + ' ' + picto_from_name('x-circle') + '
' + ) + ' ' + picto_from_name('x-circle') + '
' ) else: return mark_safe("
" + " ".join( - [legend_cat(c, filter.get_url_add_categories([c.pk]), True, True) for c in cats] + [legend_cat(c, "/" + c.slug + filter.request.get_full_path()) for c in cats] ) + "
" ) diff --git a/src/agenda_culturel/urls.py b/src/agenda_culturel/urls.py index d1880b6..7820c16 100644 --- a/src/agenda_culturel/urls.py +++ b/src/agenda_culturel/urls.py @@ -32,6 +32,17 @@ sitemaps = { urlpatterns = [ path("", home, name="home"), + + path("/", home, name="home"), + path("/semaine///", week_view, name="week_view"), + #path("/mois///", month_view, name="month_vie"), + #path("/jour////", day_view, name="day_view"), + #path("/aujourdhui/", day_view, name="aujourdhui"), + #path("/a-venir/", upcoming_events, name="a_venir"), + #path("/a-venir////", upcoming_events, name="a_venir_jour"), + #path("/cette-semaine/", week_view, name="cette_semaine"), + #path("/ical", export_ical, name="export_ical"), + path("semaine///", week_view, name="week_view"), path("mois///", month_view, name="month_view"), path("jour////", day_view, name="day_view"), @@ -39,6 +50,8 @@ urlpatterns = [ path("a-venir/", upcoming_events, name="a_venir"), path("a-venir////", upcoming_events, name="a_venir_jour"), path("cette-semaine/", week_view, name="cette_semaine"), + + path("ce-mois-ci", month_view, name="ce_mois_ci"), path("tag//", view_tag, name="view_tag"), path("tag//past", view_tag_past, name="view_tag_past"), diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index cfd90f8..73e51dc 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -202,8 +202,8 @@ def about(request): return render(request, "agenda_culturel/page-rimports-list.html", context) -def home(request): - return week_view(request, home=True) +def home(request, cat=None): + return week_view(request, home=True, cat=cat) def month_view(request, year=None, month=None): @@ -226,7 +226,7 @@ def month_view(request, year=None, month=None): return render(request, "agenda_culturel/page-month.html", context) -def week_view(request, year=None, week=None, home=False): +def week_view(request, year=None, week=None, home=False, cat=False): now = date.today() if year is None: year = now.isocalendar()[0] @@ -235,10 +235,16 @@ def week_view(request, year=None, week=None, home=False): request = EventFilter.set_default_values(request) - filter = EventFilter(request.GET, get_event_qs(request), request=request) + qs = get_event_qs(request) + if cat is not None: + category = Category.objects.filter(slug=cat).first() + qs = qs.filter(category=category) + else: + category = None + filter = EventFilter(request.GET, qs, request=request) cweek = CalendarWeek(year, week, filter) - context = {"year": year, "week": week, "calendar": cweek, "filter": filter} + context = {"year": year, "week": week, "calendar": cweek, "filter": filter, "category": category} if home: context["home"] = 1 return render(request, "agenda_culturel/page-week.html", context) diff --git a/src/requirements.txt b/src/requirements.txt index a0989ee..ab25e54 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -43,4 +43,5 @@ django-robots==6.1 django-debug-toolbar==4.4.6 django-cache-cleaner==0.1.0 emoji==2.14.0 -django-honeypot==1.2.1 \ No newline at end of file +django-honeypot==1.2.1 +django-autoslug==1.9.9 \ No newline at end of file