Development #47946
mise à jour d'un CSV : ne pas conserver l'ancienne version
0%
Description
Quand on met à jour un connecteur CSV, il a y création d'un nouveau fichier sur le filesystem (/media/csv/xxxx).
Si un CSV existait déjà, il devient juste orphelin et reste en place indéfiniment.
On pourrait faire un nettoyage régulier : supprimer tous les fichiers de /media/csv/ qui ne sont pas référencés par un CsvDataSource (et, par sécurité, qui ont plus d'une semaine)
Fichiers
Demandes liées
Révisions associées
nancypoll: change upload_to and move files (#47946)
csvdatasource: clean old files (#47946)
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
On peut aussi s'arranger pour ne pas conserver l'ancien fichier sur une mise à jour, ça évitera dans un premier temps de créer tant de fichiers orphelins.
Mis à jour par Thomas Noël il y a plus de 3 ans
Benjamin Dauvergne a écrit :
On peut aussi s'arranger pour ne pas conserver l'ancien fichier sur une mise à jour, ça évitera dans un premier temps de créer tant de fichiers orphelins.
Yep, j'ai pensé à ça (à faire lors du save()) mais je me disais que c'était assez "agréable" de conserver les quelques dernières versions... une sorte de backup du pauvre. Et comme de toute façon il va falloir écrire le code pour nettoyer les /media/csv actuels...
Mis à jour par Lauréline Guérin il y a plus de 3 ans
- Fichier 0003-csvdatasource-clean-old-files-47946.patch 0003-csvdatasource-clean-old-files-47946.patch ajouté
- Fichier 0002-nancypoll-change-upload_to-and-move-files-47946.patch 0002-nancypoll-change-upload_to-and-move-files-47946.patch ajouté
- Fichier 0001-csvdatasource-change-upload_to-and-move-files-47946.patch 0001-csvdatasource-change-upload_to-and-move-files-47946.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Vu avec Thomas: nancypoll aussi stocke ses csv dans media/csv
0001 et 0002: on déplace les fichiers csv des connecteurs csvdatasource et nancypoll, pour ranger un peu
0003: pour chaque connecteur csvdatasource, on nettoie les vieux fichiers inutilisés du même répertoire, avec un setting pour juste les déplacer (default), ou les supprimer pour de bon
Mis à jour par Lauréline Guérin il y a plus de 3 ans
- Fichier 0003-csvdatasource-clean-old-files-47946.patch 0003-csvdatasource-clean-old-files-47946.patch ajouté
- Fichier 0002-nancypoll-change-upload_to-and-move-files-47946.patch 0002-nancypoll-change-upload_to-and-move-files-47946.patch ajouté
- Fichier 0001-csvdatasource-change-upload_to-and-move-files-47946.patch 0001-csvdatasource-change-upload_to-and-move-files-47946.patch ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
C'est bizarre je ne vois pas de migration AlterField pour la modification à upload_to.
--
Le tenant s'obtient via tenant = getattr(django.db.connection, 'tenant', None)
mais en fait ça ne me parait pas nécessaire, le storage attaché au field devrait tout seul trouver le bon répertoire (ils sont tenant "aware") donc un simple accès à instance.csv_file.path
donnera le bon chemin, et pour trouver le répertoire de base model._meta.get_field('csv_file').storage.path('')
.
- modifier tous les upload_to sans réfléchir (1 migration)
- repasser sur tous les champs csv_file et faire
old_name = instance.csv_file.name old_path = instance.csv_file.path if not old_name.startswith('csv/'): continue filename = os.path.basename(old_name) instance.csv_file.save(filename, instance.csv_file) unlink(old_path)
car upload_to n'est utilisé qu'à la première sauvegarde pour générer name, ensuite il respectename
absolument.
PS: édité.
Mis à jour par Lauréline Guérin il y a plus de 3 ans
Non, lors d'une migration on a un FakeTenant sur connection.tenant, qui ne contient que schema_name, et ne nous permet pas de retrouver le path jusqu'au dossier media, d'où ma tambouille.
Si on essaie d'accéder à csv_file.path lors d'une migration, on a une erreur ici:
class TenantFileSystemStorage(FileSystemStorage, TenantStorageMixin): '''Lookup files first in $TENANT_BASE/<tenant.schema>/media/ then in default location''' def path(self, name): if connection.tenant: location = safe_join(settings.TENANT_BASE, connection.tenant.domain_url, 'media') # <= ici else: location = self.location try: path = safe_join(location, name) except ValueError: raise SuspiciousOperation("Attempted access to '%s' denied." % name) return os.path.normpath(path)
Car sur un FakeTenant il n'y a pas de domain_url
Le storage fonctionne mal sur une migration
Les AlterField sont dans les migrations 0019 (csvdatasource) et 0004 (nancypoll)
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
Lauréline Guerin a écrit :
Non, lors d'une migration on a un FakeTenant sur connection.tenant, qui ne contient que schema_name, et ne nous permet pas de retrouver le path jusqu'au dossier media, d'où ma tambouille.
Mouais c'est tout pourri, il faudrait d'abord corriger ça.
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
- Lié à Development #48071: Le tenant n'est pas disponible dans les migrations ajouté
Mis à jour par Lauréline Guérin il y a plus de 3 ans
- Fichier 0003-csvdatasource-clean-old-files-47946.patch 0003-csvdatasource-clean-old-files-47946.patch ajouté
- Fichier 0002-nancypoll-change-upload_to-and-move-files-47946.patch 0002-nancypoll-change-upload_to-and-move-files-47946.patch ajouté
- Fichier 0001-csvdatasource-change-upload_to-and-move-files-47946.patch 0001-csvdatasource-change-upload_to-and-move-files-47946.patch ajouté
(ne fonctionnera qu'avec la modif de #48071)
J'ai un doute: st_ctime ou st_mtime ?
On utilise déjà st_ctime dans le code pour afficher la date d'ajout du fichier, mais en local la commande de nettoyage fonctionne mieux (avec les fichiers que j'avais déjà dans mon rep media) avec st_mtime (st_mtime semble donner la même date qu'un ls -l en shell)
Mis à jour par Lauréline Guérin il y a plus de 3 ans
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
Lauréline Guerin a écrit :
(ne fonctionnera qu'avec la modif de #48071)
J'ai un doute: st_ctime ou st_mtime ?
On utilise déjà st_ctime dans le code pour afficher la date d'ajout du fichier, mais en local la commande de nettoyage fonctionne mieux (avec les fichiers que j'avais déjà dans mon rep media) avec st_mtime (st_mtime semble donner la même date qu'un ls -l en shell)
Je dirai mtime, c'est ce que touch
modifie si jamais on veut conserver un fichier plus longtemps (dans les faits ça n'a pas beaucoup d'importance, juste que sur un unlink/link/chmod/chown ça va faire ctime <- now()
, est-ce qu'on veut vraiment que ça prolonge la vie du fichier ?).
Mis à jour par Lauréline Guérin il y a plus de 3 ans
- Fichier 0003-csvdatasource-clean-old-files-47946.patch 0003-csvdatasource-clean-old-files-47946.patch ajouté
- Fichier 0002-nancypoll-change-upload_to-and-move-files-47946.patch 0002-nancypoll-change-upload_to-and-move-files-47946.patch ajouté
- Fichier 0001-csvdatasource-change-upload_to-and-move-files-47946.patch 0001-csvdatasource-change-upload_to-and-move-files-47946.patch ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Lauréline Guérin il y a plus de 3 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 2d9bbb54ff09e615b8bb4047de5c22ee31fe9f33 Author: Lauréline Guérin <zebuline@entrouvert.com> Date: Tue Oct 27 15:31:19 2020 +0100 csvdatasource: clean old files (#47946) commit 08370b3fef92624fa0963953b7a932ec3655f47b Author: Lauréline Guérin <zebuline@entrouvert.com> Date: Tue Oct 27 10:36:10 2020 +0100 nancypoll: change upload_to and move files (#47946) commit 9cd83a93977b5a2730d46cfea83024ee9d9d37a7 Author: Lauréline Guérin <zebuline@entrouvert.com> Date: Tue Oct 27 10:35:38 2020 +0100 csvdatasource: change upload_to and move files (#47946)
Mis à jour par Frédéric Péters il y a plus de 3 ans
- Statut changé de Résolu (à déployer) à Solution déployée
csvdatasource: change upload_to and move files (#47946)