Début du travail sur les urls explicites
This commit is contained in:
parent
defe0b1792
commit
1774e409d0
@ -30,7 +30,7 @@ from src.agenda_culturel.import_tasks.extractor_facebook import *
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
u2e = URL2Events(ChromiumHeadlessDownloader(), FacebookEventExtractor())
|
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)
|
events = u2e.process(url, cache = "fb.html", published = True)
|
||||||
|
|
||||||
|
@ -98,15 +98,6 @@ class EventFilter(django_filters.FilterSet):
|
|||||||
method="filter_recurrences",
|
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(
|
status = django_filters.MultipleChoiceFilter(
|
||||||
label="Filtrer par status",
|
label="Filtrer par status",
|
||||||
choices=Event.STATUS.choices,
|
choices=Event.STATUS.choices,
|
||||||
@ -116,7 +107,7 @@ class EventFilter(django_filters.FilterSet):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Event
|
model = Event
|
||||||
fields = ["category", "tags", "exclude_tags", "status", "recurrences"]
|
fields = ["tags", "exclude_tags", "status", "recurrences"]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@ -162,43 +153,8 @@ class EventFilter(django_filters.FilterSet):
|
|||||||
def get_full_url(self):
|
def get_full_url(self):
|
||||||
return self.request.get_full_path()
|
return self.request.get_full_path()
|
||||||
|
|
||||||
def get_url_remove_categories(self, catpks, full_path = None):
|
def get_url_without_filters(self):
|
||||||
if full_path is None:
|
return self.request.get_full_path().split("?")[0]
|
||||||
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_cleaned_data(self, name):
|
def get_cleaned_data(self, name):
|
||||||
|
|
||||||
@ -209,12 +165,6 @@ class EventFilter(django_filters.FilterSet):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
return {}
|
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):
|
def get_tags(self):
|
||||||
return self.get_cleaned_data("tags")
|
return self.get_cleaned_data("tags")
|
||||||
|
|
||||||
@ -232,7 +182,7 @@ class EventFilter(django_filters.FilterSet):
|
|||||||
|
|
||||||
def to_str(self, prefix=''):
|
def to_str(self, prefix=''):
|
||||||
self.form.full_clean()
|
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:
|
if len(result) > 0:
|
||||||
result = prefix + result
|
result = prefix + result
|
||||||
return result
|
return result
|
||||||
@ -256,11 +206,7 @@ class EventFilter(django_filters.FilterSet):
|
|||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
def is_resetable(self):
|
||||||
def is_resetable(self, only_categories=False):
|
|
||||||
if only_categories:
|
|
||||||
return len(self.get_cleaned_data("category")) != 0
|
|
||||||
else:
|
|
||||||
if self.request.user.is_authenticated:
|
if self.request.user.is_authenticated:
|
||||||
if (
|
if (
|
||||||
len(self.get_cleaned_data("status")) != 1
|
len(self.get_cleaned_data("status")) != 1
|
||||||
@ -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))
|
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):
|
def is_selected_tag(self, tag):
|
||||||
return "tags" in self.form.cleaned_data and tag in self.form.cleaned_data["tags"]
|
return "tags" in self.form.cleaned_data and tag in self.form.cleaned_data["tags"]
|
||||||
|
|
||||||
|
32
src/agenda_culturel/migrations/0137_category_slug.py
Normal file
32
src/agenda_culturel/migrations/0137_category_slug.py
Normal file
@ -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,
|
||||||
|
),
|
||||||
|
]
|
@ -17,7 +17,7 @@ from django.core.files.storage import default_storage
|
|||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import send_mail
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
|
from autoslug import AutoSlugField
|
||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
@ -114,6 +114,8 @@ class Category(models.Model):
|
|||||||
verbose_name=_("Name"), help_text=_("Category name"), max_length=512
|
verbose_name=_("Name"), help_text=_("Category name"), max_length=512
|
||||||
)
|
)
|
||||||
|
|
||||||
|
slug = AutoSlugField(null=True, default=None, unique=True, populate_from='name')
|
||||||
|
|
||||||
color = ColorField(
|
color = ColorField(
|
||||||
verbose_name=_("Color"),
|
verbose_name=_("Color"),
|
||||||
help_text=_("Color used as background for the category"),
|
help_text=_("Color used as background for the category"),
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<div>
|
<div>
|
||||||
<div class="categories">
|
<div class="categories">
|
||||||
{% show_legend filter=filter %}
|
{% show_legend category=category filter=filter %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="filtres">
|
<div class="filtres">
|
||||||
@ -34,7 +34,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if filter.is_resetable %}
|
{% if filter.is_resetable %}
|
||||||
<a class="contrast simple-button" href="{{ filter.get_url_without_filters_only_cats }}" data-tooltip="Supprimer les filtres">{% picto_from_name "x-circle" %}</a>
|
<a class="contrast simple-button" href="{{ filter.get_url_without_filters }}" data-tooltip="Supprimer les filtres">{% picto_from_name "x-circle" %}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</summary>
|
</summary>
|
||||||
|
@ -20,10 +20,10 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% 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" %}
|
{% 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 %}
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
<header>
|
<header>
|
||||||
|
@ -6,6 +6,11 @@ from agenda_culturel.models import Category
|
|||||||
import colorsys
|
import colorsys
|
||||||
from .utils_extra import *
|
from .utils_extra import *
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
|
|
||||||
@ -236,28 +241,29 @@ def legend_cat(category, url, selected=True, first=False, with_title=False):
|
|||||||
|
|
||||||
|
|
||||||
@register.simple_tag
|
@register.simple_tag
|
||||||
def show_legend(filter):
|
def show_legend(filter, category):
|
||||||
filter.form.full_clean()
|
|
||||||
cats = Category.objects.all().order_by("position")
|
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('<div class="button-bar">' +
|
return mark_safe('<div class="button-bar">' +
|
||||||
" ".join(
|
" ".join(
|
||||||
[
|
[
|
||||||
legend_cat(
|
legend_cat(
|
||||||
c,
|
c,
|
||||||
filter.get_url_add_categories([c.pk])
|
"/" + c.slug + url_nocat
|
||||||
if not filter.is_selected(c)
|
if category != c
|
||||||
else filter.get_url_remove_categories([c.pk]),
|
else url_nocat,
|
||||||
selected=filter.is_selected(c),
|
selected=category == c,
|
||||||
with_title=True
|
with_title=True
|
||||||
)
|
)
|
||||||
for c in cats
|
for c in cats
|
||||||
]
|
]
|
||||||
) + ' <a class="contrast simple-button" href="' + filter.get_url_without_filters() + '">' + picto_from_name('x-circle') + '</a></div>'
|
) + ' <a class="contrast simple-button" href="' + url_nocat + '">' + picto_from_name('x-circle') + '</a></div>'
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return mark_safe("<div>" +
|
return mark_safe("<div>" +
|
||||||
" ".join(
|
" ".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]
|
||||||
) + "</div>"
|
) + "</div>"
|
||||||
)
|
)
|
||||||
|
@ -32,6 +32,17 @@ sitemaps = {
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", home, name="home"),
|
path("", home, name="home"),
|
||||||
|
|
||||||
|
path("<cat>/", home, name="home"),
|
||||||
|
path("<cat>/semaine/<int:year>/<int:week>/", week_view, name="week_view"),
|
||||||
|
#path("<cat>/mois/<int:year>/<int:month>/", month_view, name="month_vie"),
|
||||||
|
#path("<cat>/jour/<int:year>/<int:month>/<int:day>/", day_view, name="day_view"),
|
||||||
|
#path("<cat>/aujourdhui/", day_view, name="aujourdhui"),
|
||||||
|
#path("<cat>/a-venir/", upcoming_events, name="a_venir"),
|
||||||
|
#path("<cat>/a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour"),
|
||||||
|
#path("<cat>/cette-semaine/", week_view, name="cette_semaine"),
|
||||||
|
#path("<cat>/ical", export_ical, name="export_ical"),
|
||||||
|
|
||||||
path("semaine/<int:year>/<int:week>/", week_view, name="week_view"),
|
path("semaine/<int:year>/<int:week>/", week_view, name="week_view"),
|
||||||
path("mois/<int:year>/<int:month>/", month_view, name="month_view"),
|
path("mois/<int:year>/<int:month>/", month_view, name="month_view"),
|
||||||
path("jour/<int:year>/<int:month>/<int:day>/", day_view, name="day_view"),
|
path("jour/<int:year>/<int:month>/<int:day>/", 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"),
|
||||||
path("a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour"),
|
path("a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour"),
|
||||||
path("cette-semaine/", week_view, name="cette_semaine"),
|
path("cette-semaine/", week_view, name="cette_semaine"),
|
||||||
|
|
||||||
|
|
||||||
path("ce-mois-ci", month_view, name="ce_mois_ci"),
|
path("ce-mois-ci", month_view, name="ce_mois_ci"),
|
||||||
path("tag/<t>/", view_tag, name="view_tag"),
|
path("tag/<t>/", view_tag, name="view_tag"),
|
||||||
path("tag/<t>/past", view_tag_past, name="view_tag_past"),
|
path("tag/<t>/past", view_tag_past, name="view_tag_past"),
|
||||||
|
@ -202,8 +202,8 @@ def about(request):
|
|||||||
return render(request, "agenda_culturel/page-rimports-list.html", context)
|
return render(request, "agenda_culturel/page-rimports-list.html", context)
|
||||||
|
|
||||||
|
|
||||||
def home(request):
|
def home(request, cat=None):
|
||||||
return week_view(request, home=True)
|
return week_view(request, home=True, cat=cat)
|
||||||
|
|
||||||
|
|
||||||
def month_view(request, year=None, month=None):
|
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)
|
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()
|
now = date.today()
|
||||||
if year is None:
|
if year is None:
|
||||||
year = now.isocalendar()[0]
|
year = now.isocalendar()[0]
|
||||||
@ -235,10 +235,16 @@ def week_view(request, year=None, week=None, home=False):
|
|||||||
|
|
||||||
|
|
||||||
request = EventFilter.set_default_values(request)
|
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)
|
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:
|
if home:
|
||||||
context["home"] = 1
|
context["home"] = 1
|
||||||
return render(request, "agenda_culturel/page-week.html", context)
|
return render(request, "agenda_culturel/page-week.html", context)
|
||||||
|
@ -44,3 +44,4 @@ django-debug-toolbar==4.4.6
|
|||||||
django-cache-cleaner==0.1.0
|
django-cache-cleaner==0.1.0
|
||||||
emoji==2.14.0
|
emoji==2.14.0
|
||||||
django-honeypot==1.2.1
|
django-honeypot==1.2.1
|
||||||
|
django-autoslug==1.9.9
|
Loading…
x
Reference in New Issue
Block a user