Bug #13587
include all attributes in user export
100%
Description
From the page listing members of a role it is possible to ask for a CSV export but it doesn't include all the fields; it should.
Fichiers
Révisions associées
manager: allow overriding resource class in export views (#13587)
utils: add a batch_queryset method to load large prefetched queryset without exhausting memory (#13587)
manager: add a default implementation of ExportMixin.get_data() (#13587)
It takes the default queryset and batches it using the new function
batch_queryset().
tests: add test of CSV export of users (#13587)
manager: export all user attributes (fixes #13587)
custom_user: cache attribute list during a request (#13587)
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 7 ans
Would (reposted in #14070)authentic2.utils.login()
be a good placement for this callback ?
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
- Fichier 0001-manager-clean-resources-file-13587.patch 0001-manager-clean-resources-file-13587.patch ajouté
- Fichier 0002-manager-allow-overriding-resource-class-in-export-vi.patch 0002-manager-allow-overriding-resource-class-in-export-vi.patch ajouté
- Fichier 0003-manager-export-all-user-attributes-fixes-13587.patch 0003-manager-export-all-user-attributes-fixes-13587.patch ajouté
- Fichier 0004-custom_user-cache-attribute-list-during-a-request-13.patch 0004-custom_user-cache-attribute-list-during-a-request-13.patch ajouté
- Patch proposed changé de Non à Oui
- 0001: nettoyage
- 0002: permet de customiser l'objet Resource dans la vue d'export
- 0003: ajout de l'export des attributs supplémentaires des utilisateurs
- 0004: optimisation pour ne pas faire un SELECT * FROM authentic2_attribute pour chaque utilisateur
Mis à jour par Emmanuel Cazenave il y a environ 6 ans
Je peux pas acker si ya pas un test.
Deux import inutiles dans 0002-manager-allow-overriding-resource-class-in-export-vi.patch.
Et aussi, vieux débat, mais pas pour ma part pas fan de l'utilisation qui est faite de l'héritage : avec méthode 'finale' get_dataset
dans la classe mère, dont le comportement est modifié dans une classe fille parce qu'on y redéfinit get_resource
.
Je trouverais ça plus clair si c'était get_dataset
qui était redéfinie.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
Emmanuel Cazenave a écrit :
Je peux pas acker si ya pas un test.
Ok.
Deux import inutiles dans 0002-manager-allow-overriding-resource-class-in-export-vi.patch.
Ok.
Et aussi, vieux débat, mais pas pour ma part pas fan de l'utilisation qui est faite de l'héritage : avec méthode 'finale'
get_dataset
dans la classe mère, dont le comportement est modifié dans une classe fille parce qu'on y redéfinitget_resource
.
Je trouverais ça plus clair si c'étaitget_dataset
qui était redéfinie.
J'ai l'impression de suivre le modèle générale des vues générique que ce soit dans Django(get_form_class, get_form_kwargs, get_form) ou dans DRF (pareil avec get_serializer, etc...). Dès qu'un objet un peu utilisé partout dans la vue est construit on déplace le constructeur dans une méthode à part pour pouvoir le customiser. Là tout de suite je ne vois pas le besoin de changer quelque chose.
La surcharge actuelle de get_dataset() sert uniquement à contourner un problème avec django-import-export qui annule les effets du prefetching quand on passe un queryset (voir https://github.com/django-import-export/django-import-export/issues/774).
Je pense que je vais remonter ça au niveau de classe mère parce que ça n'a rien de spécifique.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
- Fichier 0005-tests-add-test-of-CSV-export-of-users-13587.patch 0005-tests-add-test-of-CSV-export-of-users-13587.patch ajouté
- Fichier 0001-manager-clean-resources-file-13587.patch 0001-manager-clean-resources-file-13587.patch ajouté
- Fichier 0002-manager-allow-overriding-resource-class-in-export-vi.patch 0002-manager-allow-overriding-resource-class-in-export-vi.patch ajouté
- Fichier 0007-custom_user-cache-attribute-list-during-a-request-13.patch 0007-custom_user-cache-attribute-list-during-a-request-13.patch ajouté
- Fichier 0003-utils-add-a-batch_queryset-method-to-load-large-pref.patch 0003-utils-add-a-batch_queryset-method-to-load-large-pref.patch ajouté
- Fichier 0004-manager-add-a-default-implementation-of-ExportMixin..patch 0004-manager-add-a-default-implementation-of-ExportMixin..patch ajouté
- Fichier 0006-manager-export-all-user-attributes-fixes-13587.patch 0006-manager-export-all-user-attributes-fixes-13587.patch ajouté
- 0003: ajout d'une fonction authentic2.utils.batch_queryset() pour aider à traverse un gros queryset avec du prefetch sans tout charger
- 0004: utilisation de cette nouvelle fonction pour donner une implémentation par défaut de get_data() à ExportMixin
- 0005: ajout d'un test avec mesure exacte du nombre de requêtes
- 0006: maintenant c'est bien séparé, dans get_ressource() on travaille sur la classe ressource dans get_queryset() on ajoute du préfetch, le get_data() entre les deux est invisible, c'est la tambouille de ExportMixin.
Mis à jour par Emmanuel Cazenave il y a environ 6 ans
Toujours les deux imports inutiles qui trainent.
J'essayais de comprendre à coup de pdb ce qui allait se passer sur qs = super(UsersExportView, self).get_queryset()
parce qu'avais l'impression
qu'aucune classe parente ne définit cette méthode, mais j'ai pas pu arriver jusque là, le test plante.
NameError: global name 'superuser' is not defined
Ma remarque sur l'héritage, de façon plus formelle c'est ça : https://codeburst.io/understanding-solid-principles-open-closed-principle-e2b588b6491f
Mais d'une part tout le monde est pas d'accord, d'autre part sur ton code c'était suffisamment petit pour que ce soit pas un gros problème.
Mais quand ça devient plus gros, genre un héritage à 3 niveaux et des redéfinition de certaines méthodes dans les classes filles qui seront appelées par les classe mères, ça peut vite devenir tout à fait incompréhensible.
Tout ça pour dire fais comme tu veux.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
Corrigé les deux soucis, je vais pousser quand mes tests ont fini de tourner.
Pour le reste, j'aime bien ces idées (préférer la composition à l'héritage, has-a plutôt que is-a), mais Django n'est pas du tout construit en suivant ce principe, c'est de l'héritage partout avec des bouts de composition (tous les systèmes avec des backends), je préfère la cohérence avec notre framework de base plutôt que d'avoir à empiler des styles de code différents (je pense que ce serait encore pire). Ça veut dire qu'un regarde extérieur habitué à du code Django (ou regardant des exemples dans les docs) ne sera pas trop perdu.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
- Statut changé de Nouveau à Résolu (à déployer)
- % réalisé changé de 0 à 100
Appliqué par commit authentic2|19b00d8ac55d070b84fbc81db5340944cac70d11.
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Fermé
manager: clean resources file (#13587)
Remove unused imports, remove commented code.