https://dev.entrouvert.org/https://dev.entrouvert.org/favicon.ico?15861920342020-01-30T10:44:25ZRedmine Entr’ouvertAuthentic 2 - Bug #38877: api: lorsque l'on ne spécifie pas de valeur à un opérateur de recherche, alors l'évaluation est toujours vraiehttps://dev.entrouvert.org/issues/38877?journal_id=2128322020-01-30T10:44:25ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <a href="/attachments/40957">0001-api-search-on-empty-string-should-not-return-all-obj.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/40957/0001-api-search-on-empty-string-should-not-return-all-obj.patch">0001-api-search-on-empty-string-should-not-return-all-obj.patch</a> ajouté</li><li><strong>Tracker</strong> changé de <i>Support</i> à <i>Bug</i></li><li><strong>Patch proposed</strong> changé de <i>Non</i> à <i>Oui</i></li></ul><p>Cela me semble compliqué à corriger.<br />L'API utilise django-filter, or d'après <a class="external" href="https://django-filter.readthedocs.io/en/master/guide/tips.html#filtering-by-an-empty-string">https://django-filter.readthedocs.io/en/master/guide/tips.html#filtering-by-an-empty-string</a></p>
<blockquote>
<p>It’s not currently possible to filter by an empty string, since empty values are interpreted as a skipped filter.</p>
</blockquote>
<p>C'est à dire :<br />On passe systématiquement sur tous le filtres,<br /><code>django_filters/filterset.py::BaseFilterSet::qs</code><br /><pre>
# start with all the results and filter from there
qs = self.queryset.all()
for name, filter_ in six.iteritems(self.filters):
value = self.form.cleaned_data.get(name)
if value is not None: # valid & clean data ## <= '' is not None
qs = filter_.filter(qs, value)
</pre></p>
<p>puis on n'applique que les fitres pour lesquels une valeur de recherche est fournie.<br /><code>django_filters/filters.py::Filter::filter</code><br /><pre>
EMPTY_VALUES = ([], (), {}, '', None)
if value in EMPTY_VALUES:
return qs
qs = ...
</pre><br />La première solution donnée par le lien ci-dessus, est incompatible avec une chaîne vide comme valeur sentinelle (<code>empty_value</code>) : le patch proposé casse les autres tests.</p>