feat(associations): apporte le filtrage des assos dans la liste

pull/106/head
François Poulain 2019-09-12 17:06:37 +02:00 commité par François Poulain
Parent cfb7edd4a5
révision 76a150a3da
10 fichiers modifiés avec 85 ajouts et 10 suppressions

Voir le fichier

@ -55,3 +55,11 @@
margin-top: .5rem;
}
}
// Visible placeholder for search form
.search-input{
border-color: $white;
&::placeholder{
color: $gray-200;
}
}

Voir le fichier

@ -0,0 +1,13 @@
from cruditor.filters import MultiCharFilter
from django_filters import FilterSet
from . import forms, models
class AssociationIndexFilter(FilterSet):
search = MultiCharFilter(['name', 'description'], label="Filtrer")
class Meta:
model = models.Association
form = forms.FilterForm
fields = ['search']

Voir le fichier

@ -80,3 +80,14 @@ class EngagementUpdateForm(CustomTapeformMixin, forms.ModelForm):
class Meta:
model = models.Engagement
fields = ('role',)
class FilterForm(CustomTapeformMixin, forms.Form):
field_template = 'association/forms/fields/search.html'
field_label_css_class = 'sr-only'
widget_css_class = CustomTapeformMixin.widget_css_class + ' search-input'
def apply_widget_options(self, field_name):
field = self.fields[field_name]
# utilise l'attribut placeholder au lieu du label
field.widget.attrs['placeholder'] = field.label

Voir le fichier

@ -117,6 +117,25 @@ class TestAssociationIndex:
assert len(response.context['object_list']) == 3
assert count_text_in_content(response, "En modération")
def test_search(self, client):
Association.objects.create(name="Asso 4"),
response = client.get(self.url, {'search': 'Asso'})
assert response.status_code == 200
assert len(response.context['object_list']) == 2
assert count_text_in_content(response, "Asso 1")
assert count_text_in_content(response, "Asso 4")
response = client.get(self.url, {'search': 'Asso 1'})
assert response.status_code == 200
assert len(response.context['object_list']) == 1
assert count_text_in_content(response, "Asso 1")
assert not count_text_in_content(response, "Asso 4")
response = client.get(self.url, {'search': 'Asso 6'})
assert response.status_code == 200
assert len(response.context['object_list']) == 0
@pytest.mark.django_db
class TestAssociationDetail:

Voir le fichier

@ -4,7 +4,7 @@ from django.contrib.auth.mixins import UserPassesTestMixin
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.views.generic import DetailView, ListView
from django.views.generic import DetailView
from cruditor.views import (
CruditorAddView,
@ -12,12 +12,13 @@ from cruditor.views import (
CruditorDeleteView,
CruditorListView,
)
from django_filters.views import FilterView
from benevalibre.base.tables import EngagementIndexTable
from benevalibre.utils.html import fa_icon
from benevalibre.utils.views import CruditorPageMixin, PageMixin
from . import forms, models, tables
from . import filters, forms, models, tables
def get_management_buttons(association, user):
@ -129,8 +130,7 @@ class AssociationRelatedFormMixin:
# ASSOCIATIONS
# ------------------------------------------------------------------------------
class AssociationIndex(PageMixin, ListView):
class AssociationIndex(PageMixin, FilterView):
"""
La page « Liste des associations » vous permet de voir les associations
enregistrées et visibles publiquement au sein de l'application. En cliquant
@ -143,8 +143,9 @@ class AssociationIndex(PageMixin, ListView):
page d'accueil si vous n'êtes pas connectée.
"""
template_name = 'associations/association_list.html'
template_name = 'association/association_list.html'
title = "Liste des associations"
filterset_class = filters.AssociationIndexFilter
def get_queryset(self):
return (

Voir le fichier

@ -83,6 +83,7 @@ THIRD_PARTY_APPS = [
# crud & forms
'tapeforms',
'django_tables2',
'django_filters',
'cruditor',
'docs',
]

Voir le fichier

@ -1,4 +1,11 @@
{% extends "base.html" %}
{% load tapeforms %}
{% block titlebuttons %}
<div class="title-buttons ml-3 mt-2">
{% form filter.form %}
</div>
{% endblock %}
{% block content %}
{% if not object_list and not can_add_association %}

Voir le fichier

@ -0,0 +1,12 @@
{% extends "tapeforms/fields/bootstrap.html" %}
{% block widget %}
<div class="input-group">
{{ field }}
<div class="input-group-append mr-3">
<button class="btn btn-outline-primary fa fa-search" type="button" id="button-addon"></button>
</div>
</div>
{% endblock %}
{% block errors %}{% endblock %}

Voir le fichier

@ -50,11 +50,13 @@
{% endif %}
</div>
<div class="col-sm-auto text-right">
{% if page.titlebuttons %}
<div class="title-buttons ml-3 mt-2">
{% include "includes/buttons.html" with buttons=page.titlebuttons %}
</div>
{% endif %}
{% block titlebuttons %}
{% if page.titlebuttons %}
<div class="title-buttons ml-3 mt-2">
{% include "includes/buttons.html" with buttons=page.titlebuttons %}
</div>
{% endif %}
{% endblock %}
</div>
</div>
</div>

Voir le fichier

@ -16,6 +16,7 @@ django-stdimage >=4.1,<4.2 # https://github.com/codingjoe/django-stdimage
django-tables2 # https://github.com/jieter/django-tables2
django-tapeforms >=0.2,<0.3 # https://github.com/stephrdev/django-tapeforms
django-cruditor >=1.3,<1.4 # https://github.com/moccu/django-cruditor
django-filter >=2.2,<2.3 # https://github.com/carltongibson/django-filter
# Documentation
# ------------------------------------------------------------------------------