Skip to content

Commit 2a81966

Browse files
Merge pull request #735 from inventaire-des-orgues/filtres
2 parents d8b6f0c + 92f6d51 commit 2a81966

File tree

5 files changed

+46
-19
lines changed

5 files changed

+46
-19
lines changed

orgues/api/serializers.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ class Meta:
119119
"jeux_count",
120120
"construction",
121121
"resume_composition_clavier",
122-
"modified_date"
122+
"modified_date",
123+
"proprietaire"
123124
]
124125

125126
def get_etat(self, obj):

orgues/management/commands/build_meilisearch_index.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ def handle(self, *args, **options):
5151
'facet_facteurs',
5252
'jeux',
5353
'jeux_count',
54-
'monument_historique'
54+
'monument_historique',
55+
'proprietaire'
5556
])
5657

5758
index.update_displayed_attributes([

orgues/models.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from django.core.exceptions import ValidationError
88
from django.core.validators import RegexValidator
99
from django.db import models
10+
from django.db.models import Q
1011
from django.db.models.signals import post_save, post_delete
1112
from django.dispatch import receiver
1213
from django.urls import reverse
@@ -401,7 +402,7 @@ def jeux_count(self):
401402
"""
402403
Nombre de jeux de l'instrument
403404
"""
404-
return Jeu.objects.filter(clavier__orgue=self).count()
405+
return Jeu.objects.filter(Q(clavier__orgue=self)&~Q(type__nom="Tirasse permanente")).count()
405406

406407
@property
407408
def claviers_count(self):

orgues/templates/orgues/orgue_list.html

+13-9
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ <h3>((facet.label))</h3>
2424
<div :class="{'facet-open': facetOpen[facet.field], 'facet-list': facet.items.length > 6 }" class="facet-list">
2525
<ul>
2626
<li v-for="selected in filter[facet.field]" @click="unselectFacet(facet.field, selected)" class="facets selected">((selected))</li>
27-
<li v-for="item in facet.items" v-if="!filter[facet.field] || !filter[facet.field].includes(item.name)" @click="selectFacet(facet.field, item.name)" class="facets">((item.name)) [((item.count))]</li>
27+
<li v-for="item in facet.items" v-if="!filter[facet.field] || !filter[facet.field].includes(item.name)" @click="selectFacet(facet.field, item.name)" class="facets">((item.name))</li>
2828
</ul>
2929
<a @click="openFacet(facet.field)" v-if="facet.items.length > 6">Voir ((facetOpen[facet.field] ? "moins" : "plus"))</a>
3030
</div>
@@ -172,6 +172,7 @@ <h4 class="card-title mb-0">
172172
sort: 'completion:desc',
173173
pages: 0,
174174
loading: false,
175+
init: true,
175176
open: false,
176177
orgues: [],
177178
facets: {},
@@ -186,14 +187,15 @@ <h4 class="card-title mb-0">
186187
},
187188
watch: {
188189
debouncedInput: function () {
189-
this.page = 1
190+
this.page = 1
190191
this.filter = {}
191192
this.fetchData()
192193
},
193194
departement: function () {
194195
this.page = 1
195-
this.filter = {}
196-
this.fetchData()
196+
this.filter = {};
197+
this.init = true;
198+
this.fetchData();
197199
},
198200
},
199201
computed: {
@@ -213,14 +215,14 @@ <h4 class="card-title mb-0">
213215
openFacet: function(field) {
214216
this.$set(this.facetOpen, field, !this.facetOpen[field])
215217
},
216-
selectFacet: function(facet, value) {
218+
selectFacet: function(facet, value) {
217219
if (this.filter[facet]) {
218-
if (!this.filter[facet].includes(value))
220+
if (!this.filter[facet].includes(value))
219221
this.filter[facet].push(value)
220222
}
221223
else
222224
this.filter[facet] = [value]
223-
this.page = 1
225+
this.page = 1
224226
this.fetchData()
225227
},
226228
changeSort: function(sort) {
@@ -256,12 +258,12 @@ <h4 class="card-title mb-0">
256258
}
257259
if (sort) {
258260
pageUrl += '&sort=' + sort
259-
}
261+
}
260262
let filters = {}
261263
if (self.filter) {
262264
for (const [key, values] of Object.entries(self.filter)) {
263265
pageUrl += '&filter_' + key + '=' + values.join(',');
264-
filters['filter_' + key] = values.join(',');
266+
filters['filter_' + key] = values.join(';;');
265267
}
266268
}
267269

@@ -275,6 +277,7 @@ <h4 class="card-title mb-0">
275277
page: page,
276278
departement: departement,
277279
sort: sort,
280+
init: self.init,
278281
...filters,
279282
},
280283
error: function (resp) {
@@ -291,6 +294,7 @@ <h4 class="card-title mb-0">
291294
self.facetOpen = {}
292295
}
293296
self.filter = results.filter
297+
self.init = false;
294298
if (scrolltop) window.scrollTo(0, 0);
295299
window.history.pushState('', '', pageUrl);
296300
},

orgues/views.py

+27-7
Original file line numberDiff line numberDiff line change
@@ -123,19 +123,34 @@ def search_meilisearch(page, departement, region, query, request):
123123
except:
124124
return JsonResponse({'message': 'Le moteur de recherche est mal configuré'}, status=500)
125125

126-
facets = ['departement', 'region', 'resume_composition_clavier', 'facet_facteurs', 'jeux']
126+
facets = ['departement', 'region', 'resume_composition_clavier', 'facet_facteurs', 'jeux', 'proprietaire', 'etat']
127127
options = {'attributesToHighlight': ['*'], 'hitsPerPage': OrgueSearch.paginate_by, 'page': int(page)}
128128

129+
# Première requête qui permet de récupérer toutes les possibilités dans chaque facet
130+
options["facets"] = facets
131+
filter_init = []
132+
if departement:
133+
filter_init.append('departement="{}"'.format(departement))
134+
if region:
135+
filter_init.append('region="{}"'.format(region))
136+
if len(filter_init) > 0:
137+
options['filter'] = filter_init
138+
results_init = index.search(query, options)
139+
140+
# Deuxième requête pour récupérer les orgues correspondant aux filtres
129141
filter = []
130142
filterResult = {}
131143
for facet in facets:
132144
arg = request.POST.get('filter_' + facet)
133145
if arg:
134-
values = arg.split(',')
146+
values = arg.split(';;')
135147
filter.append(['{}="{}"'.format(facet, value) for value in values])
136148
filterResult[facet] = values
137-
if not filterResult and page == '1' and (query or departement or region):
138-
options['facets'] = facets
149+
init = request.POST.get('init')
150+
151+
# Si c'est l'initialisation de la page ou d'un département, alors par défaut, on n'affiche pas les orgues disparus
152+
if init=="true":
153+
filter.append(['etat="{}"'.format(value[1]) for value in Orgue.CHOIX_ETAT if value[1] != "Disparu"])
139154
if departement:
140155
filter.append('departement="{}"'.format(departement))
141156
if region:
@@ -149,16 +164,21 @@ def search_meilisearch(page, departement, region, query, request):
149164
options['sort'] = [sort]
150165
results = index.search(query, options)
151166
if 'facetDistribution' in results:
152-
results['facets'] = OrgueSearch.convertFacets(results['facetDistribution'])
167+
results['facets'] = OrgueSearch.convertFacets(results_init['facetDistribution'])
153168
del results['facetDistribution']
169+
170+
# Si c'est l'initialisation de la page ou d'un département,
171+
# alors par défaut, on ne surligne pas "Disparu" dans la colonne des filtres
172+
if init=="true":
173+
filterResult['etat'] = ['Très bon, tout à fait jouable', 'Bon : jouable, défauts mineurs', 'Altéré : difficilement jouable', 'Dégradé ou en ruine : injouable', 'En restauration (ou projet initié)']
154174
results['filter'] = filterResult
155175
return results
156176

157177
@staticmethod
158178
def convertFacets(facetDistribution):
159-
labels = {'departement': 'Département', 'region': 'Régions', 'resume_composition_clavier': 'Nombres de claviers', 'facet_facteurs': 'Facteurs', 'jeux': 'Jeux'}
179+
labels = {'departement': 'Département', 'region': 'Régions', 'resume_composition_clavier': 'Nombres de claviers', 'facet_facteurs': 'Facteurs', 'jeux': 'Jeux', 'proprietaire': 'Propriétaire', 'etat':'Etat'}
160180
return [{'label': labels[name], 'field': name,
161-
'items': sorted([{'name': item, 'count': count} for item, count in values.items()], key=lambda k: k['count'], reverse=True)} for name, values in
181+
'items': sorted([{'name': item, 'count': count} for item, count in values.items()], key=lambda k: k['name'])} for name, values in
162182
facetDistribution.items()]
163183

164184

0 commit comments

Comments
 (0)