diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index e4f597a..27dd471 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -99,6 +99,14 @@ class Event(models.Model): verbose_name = _('Event') verbose_name_plural = _('Events') + def get_all_tags(): + tags = list(Event.objects.values_list('tags', flat = True)) + uniq_tags = set() + for t in tags: + uniq_tags = uniq_tags | set(t) + return list(uniq_tags) + + class EventSubmissionForm(models.Model): url = models.URLField(max_length=512, verbose_name=_('URL'), help_text=_("URL where this event can be found.")) diff --git a/src/agenda_culturel/templates/agenda_culturel/day-inc.html b/src/agenda_culturel/templates/agenda_culturel/day-inc.html index 129483f..e58e345 100644 --- a/src/agenda_culturel/templates/agenda_culturel/day-inc.html +++ b/src/agenda_culturel/templates/agenda_culturel/day-inc.html @@ -8,7 +8,7 @@
-

{{ day.date | date:"l j" }}

+

{{ day.date | date:"l j" }}

{% if day.events %} {% if resume %} @@ -38,7 +38,7 @@
{% endif %} {% if display == "in list" %} - {% include "agenda_culturel/ephemeris-inc.html" with event=event %} + {% include "agenda_culturel/ephemeris-inc.html" with event=event filter=filter %} {% endif %} {{ event.category | small_cat }} {% if event.location %}
{% endif %} @@ -67,7 +67,7 @@ {% else %}
- {% include "agenda_culturel/ephemeris-inc.html" with event=event %} + {% include "agenda_culturel/ephemeris-inc.html" with event=event filter=filter %} {{ event.category | small_cat }}

{{ event.title }}

diff --git a/src/agenda_culturel/templates/agenda_culturel/filter-inc.html b/src/agenda_culturel/templates/agenda_culturel/filter-inc.html new file mode 100644 index 0000000..6fb05a4 --- /dev/null +++ b/src/agenda_culturel/templates/agenda_culturel/filter-inc.html @@ -0,0 +1,12 @@ +
+
+Filtres +
+
+ {% csrf_token %}

+ {{ filter.form }}
+
+ + + + diff --git a/src/agenda_culturel/templates/agenda_culturel/page-day.html b/src/agenda_culturel/templates/agenda_culturel/page-day.html index db27a0e..97ec381 100644 --- a/src/agenda_culturel/templates/agenda_culturel/page-day.html +++ b/src/agenda_culturel/templates/agenda_culturel/page-day.html @@ -24,7 +24,8 @@

Les événements du {{ day | date:"l j F" }}

- + {% include "agenda_culturel/filter-inc.html" with filter=filter %} + @@ -32,14 +33,14 @@
- + + +{% include "agenda_culturel/filter-inc.html" with filter=filter %}
{% for d in calendar.calendar_days_list %} - {% include "agenda_culturel/day-inc.html" with day=d fixed_style=calendar.all_in_past %} + {% include "agenda_culturel/day-inc.html" with day=d fixed_style=calendar.all_in_past filter=filter %} {% endfor %}
diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index e879ff3..e917432 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -59,10 +59,11 @@ class CalendarDay: class CalendarList: - def __init__(self, firstdate, lastdate): + def __init__(self, firstdate, lastdate, filter): self.firstdate = firstdate self.lastdate = lastdate self.now = date.today() + self.filter = filter # start the first day of the first week self.c_firstdate = firstdate + timedelta(days=-firstdate.weekday()) @@ -84,7 +85,11 @@ class CalendarList: return self.lastdate < self.now def fill_calendar_days(self): - self.events = Event.objects.filter(start_day__lte=self.c_lastdate, start_day__gte=self.c_firstdate).order_by("start_day", "start_time") + if self.filter is None: + qs = Event.objects() + else: + qs = self.filter.qs + self.events = qs.filter(start_day__lte=self.c_lastdate, start_day__gte=self.c_firstdate).order_by("start_day", "start_time") for e in self.events: for d in daterange(e.start_day, e.end_day): @@ -112,7 +117,7 @@ class CalendarList: class CalendarMonth(CalendarList): - def __init__(self, year, month): + def __init__(self, year, month, filter): self.year = year self.month = month r = calendar.monthrange(year, month) @@ -120,7 +125,7 @@ class CalendarMonth(CalendarList): first = date(year, month, r[0]) last = date(year, month, r[1]) - super().__init__(first, last) + super().__init__(first, last, filter) def get_month_name(self): return self.firstdate.strftime("%B") @@ -134,14 +139,14 @@ class CalendarMonth(CalendarList): class CalendarWeek(CalendarList): - def __init__(self, year, week): + def __init__(self, year, week, filter): self.year = year self.week = week first = date.fromisocalendar(self.year, self.week, 1) last = date.fromisocalendar(self.year, self.week, 7) - super().__init__(first, last) + super().__init__(first, last, filter) def next_week(self): return self.firstdate + timedelta(days=7) @@ -150,6 +155,36 @@ class CalendarWeek(CalendarList): return self.firstdate + timedelta(days=-7) +class EventFilter(django_filters.FilterSet): + tags = django_filters.MultipleChoiceFilter(choices=[(t, t) for t in Event.get_all_tags()], lookup_expr='in') + category = django_filters.ModelMultipleChoiceFilter(field_name="category__id", to_field_name='id', queryset=Category.objects.all()) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if len(args) > 0: + self.url = EventFilter.build_get_url(args[0]) + else: + self.url = "" + + + class Meta: + model = Event + fields = ["category", "tags"] + field_labels = { 'category': "Catégories", "tags": "Étiquettes" } + + def get_url(self): + return self.url + + def build_get_url(get, first = "?"): + result = "" + for p in get: + if p in ["category", "tags"]: + for v in get.getlist(p): + result += first if len(result) == 0 else "&" + result += str(p) + "=" + str(v) + return result + + def home(request): return week_view(request) @@ -160,9 +195,13 @@ def month_view(request, year = None, month = None): year = now.year if month is None: month = now.month - cmonth = CalendarMonth(year, month) - context = {"year": year, "month": cmonth.get_month_name(), "calendar": cmonth} + filtering_url = EventFilter.build_get_url(request.GET) + filter = EventFilter(request.GET, queryset=Event.objects.all()) + cmonth = CalendarMonth(year, month, filter) + + + context = {"year": year, "month": cmonth.get_month_name(), "calendar": cmonth, "filter": filter } return render(request, 'agenda_culturel/page-month.html', context) @@ -173,9 +212,11 @@ def week_view(request, year = None, week = None): if week is None: week = now.isocalendar()[1] - cweek = CalendarWeek(year, week) + filtering_url = EventFilter.build_get_url(request.GET) + filter = EventFilter(request.GET, queryset=Event.objects.all()) + cweek = CalendarWeek(year, week, filter) - context = {"year": year, "week": week, "calendar": cweek} + context = {"year": year, "week": week, "calendar": cweek, "filter": filter } return render(request, 'agenda_culturel/page-week.html', context) @@ -190,9 +231,12 @@ def day_view(request, year = None, month = None, day = None): day = date(year, month, day) - events = Event.objects.filter(start_day__lte=day, start_day__gte=day).order_by("start_day", "start_time") - # TODO - context = {"day": day, "events": events} + filtering_url = EventFilter.build_get_url(request.GET) + + filter = EventFilter(request.GET, Event.objects.all()) + events = filter.qs.filter(start_day__lte=day, start_day__gte=day).order_by("start_day", "start_time") + + context = {"day": day, "events": events, "filter": filter} return render(request, 'agenda_culturel/page-day.html', context) @@ -206,12 +250,8 @@ def tag_list(request): nfkd_form = unicodedata.normalize('NFKD', input_str) return u"".join([c for c in nfkd_form if not unicodedata.combining(c)]) - - tags = list(Event.objects.values_list('tags', flat = True)) - uniq_tags = set() - for t in tags: - uniq_tags = uniq_tags | set(t) - context = {"tags": sorted(list(uniq_tags), key=lambda x: remove_accents(x).lower())} + tags = Event.get_all_tags() + context = {"tags": sorted(tags, key=lambda x: remove_accents(x).lower())} return render(request, 'agenda_culturel/tags.html', context) @@ -258,7 +298,8 @@ class EventSubmissionFormView(FormView): -class EventFilter(django_filters.FilterSet): + +class EventFilterAdmin(django_filters.FilterSet): tags = django_filters.CharFilter(lookup_expr='icontains') @@ -280,7 +321,7 @@ class EventFilter(django_filters.FilterSet): @login_required(login_url="/accounts/login/") def event_list(request): - filter = EventFilter(request.GET, queryset=Event.objects.all()) + filter = EventFilterAdmin(request.GET, queryset=Event.objects.all()) paginator = Paginator(filter.qs, 10) page = request.GET.get('page')