Development #11057
csv datasource : supporter les operateurs <eq> <ne> <lt> <le> <gt> <ge>
100%
Description
Supporter ces différents opérateurs, permetrait de faire des requetes tels que :
data?street_name=charlemagne&street_side=I&street_start_number__lt=45&street_end_number__gt=45
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Josué Kouka il y a presque 8 ans
- Lié à Development #11023: connecteur csv (Nancy) ajouté
Mis à jour par Josué Kouka il y a presque 8 ans
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
ajout de csvoperators.py
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
- Patch proposed changé de Non à Oui
tous les tests passent
Mis à jour par Frédéric Péters il y a presque 8 ans
Ça serait plus clair si l'opérateur utilisé pour gt était > et non < :
def gt_operator(i, v, case_insensitive=False): return lambda x: int(v) < int(x[i])
Et peut-être ce serait plus clair si les deux opérandes étaient de même nature, et pas d'un côté l'index dans la ligne et de l'autre la valeur de comparaison ? La valeur tirée de la ligne étant alors tirée avant, dans le models.py.
~~~
Ajouter "icontains" ? Et "ieq" et "nieq" ? Comme ça il n'y aurait pas un "case_insensitive" trimballé partout mais juste la compat :
if query and filters: if case_insensitive: filters = {'text__icontains': query} else: filters = {'text__contains': query}
(à propos de ces lignes, dans le patch il y a un coup if query and not filters
et puis un coup if query and filters
qui fait proche la même chose)
~~~
Mais avant ça, plus généralement, je virerais query et case_insensitive de la signature du get_data(), je ferais plutôt que la vue crée les filtres adéquats.
~~~
import csvoperators
: le mettre en tête de module, pas de raison à l'importer seulement là. (et plutôt from . import csvoperators
).
~~~
Ce changement n'a pas de rapport, autre ticket autre commit :
- dialect = csv.Sniffer().sniff(content[:1024]) + dialect = csv.Sniffer().sniff(content)
~~~
Vraiment un truc qu'il est utile de logguer ? (on a déjà l'URL, qui nous permet de tout déduire, il me semble).
self.logger.info(filters)
~~~
Je reste vieux et peu à l'aise avec ces yield et itertools et générateurs, etc. Ça se ferait d'ajouter quelques commentaires, genre "# get matches applying all filters on rows" ?
~~~
Ça a déjà été bien pire mais il reste des endroits qui ne sont pas corrects par rapport à l'utilisation des espaces, genre for key,value in filters.items():
(et c'est peut-être le seul, je n'ai pas fait d'inspection détaillée)
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0004-csv-data-source-makes-view-generates-right-filters-1.patch 0004-csv-data-source-makes-view-generates-right-filters-1.patch ajouté
- Fichier 0003-csv-data-source-add-post-method-support-for-tests-11.patch 0003-csv-data-source-add-post-method-support-for-tests-11.patch ajouté
- Fichier 0002-csv-datasource-use-web-client-for-tests-11057.patch 0002-csv-datasource-use-web-client-for-tests-11057.patch ajouté
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
Ça serait plus clair si l'opérateur utilisé pour gt était > et non < :
> def gt_operator(i, v, case_insensitive=False): > return lambda x: int(v) < int(x[i]) >
yep
Je reste vieux et peu à l'aise avec ces yield et itertools et générateurs, etc. Ça se ferait d'ajouter quelques commentaires, genre "# get matches applying all filters on rows" ?
done
- J'ai migré la génération des bons filtres dans la vue
- J'ai ajouté les tests pour la méthode POST
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-makes-view-generates-right-filters-1.patch 0001-csv-data-source-makes-view-generates-right-filters-1.patch ajouté
mise à jour de la description des opérateurs
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0005-csv-data-source-makes-view-generates-right-filters-1.patch 0005-csv-data-source-makes-view-generates-right-filters-1.patch ajouté
- Fichier 0004-csv-data-source-add-post-method-support-for-tests-11.patch 0004-csv-data-source-add-post-method-support-for-tests-11.patch ajouté
- Fichier 0003-csv-datasource-use-web-client-for-tests-11057.patch 0003-csv-datasource-use-web-client-for-tests-11057.patch ajouté
- Fichier 0002-csv-data-source-add-advanced-filters-support-11057.patch 0002-csv-data-source-add-advanced-filters-support-11057.patch ajouté
- Fichier 0001-csv-datasource-add-POST-method-support.patch 0001-csv-datasource-add-POST-method-support.patch ajouté
patch à jour
Mis à jour par Frédéric Péters il y a presque 8 ans
0001-csv-datasource-add-POST-method-support.patch
0004-csv-data-source-add-post-method-support-for-tests-11.patch
→ #11059
0002-csv-data-source-add-advanced-filters-support-11057.patch
0005-csv-data-source-makes-view-generates-right-filters-1.patch
devraient être un seul patch, ça facilitera la relecture.
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
J'ai enlevé le support de POST et fait un seul patch sur les filtres avancés (logique + tests)
Mis à jour par Josué Kouka il y a presque 8 ans
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
suppréssion scorie
Mis à jour par Benjamin Dauvergne il y a presque 8 ans
Je pense que nie_operator devrait être ine_operator pour garder la logique de nommage (ne pourrait-on avoir igt, ilt, ige, ile au passage ?), à corriger aussi dans le template detail.
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
Benjamin Dauvergne a écrit :
Je pense que nie_operator devrait être ine_operator pour garder la logique de nommage (ne pourrait-on avoir igt, ilt, ige, ile au passage ?), à corriger aussi dans le template detail.
je ne trouve malheureusement pas de cas où l'on pourrait utiliser igt, ilt, ige, ile
Mis à jour par Benjamin Dauvergne il y a presque 8 ans
Je le proposais juste par cohérence, la source CSV étant destinée à un usage assez large (entendre par des fonctionnels en autonomie) je pense qu'il faut viser du générique un minimum (et c'est 8 lignes de code).
Mis à jour par Josué Kouka il y a presque 8 ans
Mis à jour par Benjamin Dauvergne il y a presque 8 ans
Et donc discussion par Jabber:
josue mar. 07 juin 2016, 14:04:10 par rapport a https://dev.entrouvert.org/issues/11057. L'idée de faire du igt, ige, ile, ilt pour des str me dérange un peu enfin, sauf si l'on veut faire de la comparaison de valeurs ASCII josue mar. 07 juin 2016, 14:09:49 s/str/char/ bdauvergne@im.libre-entreprise.com mar. 07 juin 2016, 14:10:50 ça de toute façon oui il faut gérer les règles de collation on s'en sort pas sinon josue mar. 07 juin 2016, 14:13:32 ok bdauvergne@im.libre-entreprise.com mar. 07 juin 2016, 14:15:44 In [9]: locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') Out[9]: 'fr_FR.UTF-8' In [10]: for x in sorted(l, cmp=locale.strcoll): print x ....: à ä e é è l = [u'é', u'à', u'è', u'e', u'ä'] le truc chiant c'est le setlocale Django a un traitement interne des locales et c'est une action globale
Mon avis c'est de ne pas gérer les règles de collation tout de suite mais dans les opérateurs de comparaison remplacer les < et > par une fonction compare_string(left, right)
définie par compare_string = cmp
, et donc on remplace left < right
par compare_string(left, right) < 0
et on pourra voir plus tard comment on veut traiter les locales (avec locale.setlocale() et locale.strcoll(), ou pyIcu ou je ne sais quoi).
Mis à jour par Josué Kouka il y a presque 8 ans
Mis à jour par Thomas Noël il y a presque 8 ans
En dehors de la lecture du patch, mon avis, parce que je comprends pas l'idée des "lt/gt" pour les strings. Pour moi ça lt/gt n'ont de sens que pour les nombres, et pour des filtres sur un CSV, ça ne sera disponible que pour des nombres. En effet, on ne connait pas le type des colonnes du CSV, et quand il y aura un filtre "foo_lt=4", on doit considèrer que le valeurs de foo sont entières (à la rigueur décimales si foo_lt=4.1). Voilà c'était mon avis du soir.
Mis à jour par Josué Kouka il y a presque 8 ans
- Lié à Bug #11258: csv datasource : augmenter la tailler du contenu passé au sniffer ajouté
Mis à jour par Thomas Noël il y a presque 8 ans
- Lié à Bug #11258: csv datasource : augmenter la tailler du contenu passé au sniffer supprimé
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
- ajout d'une classe Lookup
- modification du try/catch dans le generateur de filters
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
suppression scories
Mis à jour par Josué Kouka il y a presque 8 ans
Mis à jour par Serghei Mihai il y a presque 8 ans
Si la valeur est 0, la fonction is_int
va retourner False
dans le contexte booleen et la comparaison en tant qu'entiers ne se fera pas.
Je verrais plutôt:
def is_int(value): try: v = int(value) return True except(ValueError, TypeError): return False
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
merci Serghei
Mis à jour par Frédéric Péters il y a presque 8 ans
modulo l'espace manquant,
except (ValueError, TypeError) ^
Mis à jour par Frédéric Péters il y a presque 8 ans
Aussi,
def test_unknown_operator(client, setup): [...] assert result['err'] == 1 assert result['err_class'] == 'AttributeError'
Ce serait bien de fournir une info plus précise.
Mis à jour par Josué Kouka il y a presque 8 ans
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
fixe une indentation incoherente et des erreurs PEP8
Mis à jour par Josué Kouka il y a presque 8 ans
- Fichier 0001-csv-data-source-add-advanced-filters-support-11057.patch 0001-csv-data-source-add-advanced-filters-support-11057.patch ajouté
remplace '__'
par lookups.DELIMITER
Mis à jour par Josué Kouka il y a presque 8 ans
- Statut changé de En cours à Résolu (à déployer)
- % réalisé changé de 0 à 100
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Fermé
csv data source : add advanced filters support (#11057)