Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add local image upload into flat pages content (ref #3552) #4024

Merged
merged 2 commits into from
Apr 2, 2024

Conversation

marcantoinedupre
Copy link
Contributor

@marcantoinedupre marcantoinedupre commented Apr 1, 2024

Cette PR ajoute la possibilité d'uploader des images locales pour les insérer dans le contenu des pages statiques.

Description

La fonctionnalité se base sur l'option image_upload_url du plugin image de TinyMCE et l'ajout de la View correspondante côté Django.

Reprend l'implémentation de @babastienne pour django-mapentity. Dans l'attente d'une solution pour gérer le cycle de vie des images (suivi du lien entre image uploadée et page statique, suppression quand plus utilisée) la feature est ajoutée spécifiquement pour les pages statiques où le volume d'image uploadée sera peu important.

Liens :

PR django-mapentity

Related Issue

Attach files on flatpages #3552

Checklist

  • I have followed the guidelines in our Contributing document
  • My code respects the Definition of done available in the Development section of the documentation
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • I have added tests that prove my fix is effective or that my feature works.
  • New and existing unit tests pass locally with my changes
  • I added an entry in the changelog file
  • My commits are all using prefix convention (emoji + tag name) and references associated issues
  • I added a label to the PR corresponding to the perimeter of my contribution
  • The title of my PR mentionned the issue associated

Copy link

cypress bot commented Apr 1, 2024

Passing run #8590 ↗︎

0 24 0 0 Flakiness 0

Details:

Merge a4b03d4 into a66550d...
Project: Geotrek-admin Commit: d23ba60e90 ℹ️
Status: Passed Duration: 02:11 💡
Started: Apr 2, 2024 4:00 PM Ended: Apr 2, 2024 4:02 PM

Review all test suite changes for PR #4024 ↗︎

Copy link

codecov bot commented Apr 1, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 98.41%. Comparing base (a66550d) to head (a4b03d4).

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #4024   +/-   ##
=======================================
  Coverage   98.41%   98.41%           
=======================================
  Files         282      284    +2     
  Lines       20757    20777   +20     
=======================================
+ Hits        20427    20447   +20     
  Misses        330      330           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@marcantoinedupre marcantoinedupre force-pushed the feat_add_tools_for_flatpages_content branch from 20ab020 to f4bb7fc Compare April 1, 2024 22:45
@marcantoinedupre marcantoinedupre force-pushed the feat_add_tinymce_upload_image branch from dadeeeb to bef7eec Compare April 1, 2024 22:49
@marcantoinedupre marcantoinedupre force-pushed the feat_add_tools_for_flatpages_content branch from f4bb7fc to 05b5d1d Compare April 1, 2024 22:58
@marcantoinedupre marcantoinedupre force-pushed the feat_add_tinymce_upload_image branch from bef7eec to c2aa804 Compare April 1, 2024 22:59
@marcantoinedupre marcantoinedupre changed the title [FEAT] Add local image upload into flat pages content (ref #3552) Add local image upload into flat pages content (ref #3552) Apr 1, 2024
@marcantoinedupre marcantoinedupre marked this pull request as ready for review April 1, 2024 23:31
os.makedirs(os.path.dirname(location), exist_ok=True)
with open(location, "wb+") as destination:
destination.write(file.read())
return JsonResponse({"location": request.build_absolute_uri(path)})
Copy link
Member

@submarcos submarcos Apr 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pour la partie technique,

çà serait mieux d'utiliser une CBV.

Pour la partie fonctionnelle, çà serait mieux d'utiliser les storage django plutot que de tout faire à la main.
De plus, le contenu de /media/ doit être lié à une entrée BDD, sinon la commande clean_attachments suppriemra le fichier. Il faut donc utiliser un Attachment sur les flatpage

Du genre: j'upload un fichier, çà créé automatiquement un attachment de type photo exploitable.
La difficulté, c'est qu'il est impossible d'enregistrer un attacmet avant d'avoir enregistré une premiere fois la page statique

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fait pour la remarque sur utiliser l'interface du storage django plutôt que les fichiers directement.

@camillemonchicourt
Copy link
Member

Comme indiqué dans la PR côté Mapentity (makinacorpus/django-mapentity#277), je trouve dommage de bloquer cette évolution globale du WYSIWYG côté Mapentity pour un mécanisme de suppression des images orphelines très secondaire.
En effet, il n'y aura que quelques dizaines de photos ajoutées par le WYSIWYG et peu ou pas d'images orphelins.
L'enjeu est bien plus fort au niveau des attachments sur les différents objets des modules où là on a beaucoup beaucoup d'images et pas mal d'orphelins, notamment quand on importe des données depuis des plateformes tiers, et là une commande de nettoyage existe.
Et même dans les CMS où on a des centaines d'articles et des centaines de photos, il n'y a pas forcément de mécanisme de suppression automatique des médias orphelins.
C'est donc dommage que cette PR globale côté Mapentity se perde, pour un sujet secondaire selon moi.


A noter aussi : il me semble dommage de mettre /tinymce/ dans l'URL des médias uploadées car le chemin pourra être visible par les utilisateurs dans les catalogues d'images des moteurs de recherche et autres.


A noter aussi : On pourrait avoir besoin de ce WYSIWYG dans d'autres objets de l'AdminSite (recommandation des étiquettes, description des lieux de renseignement...) donc ce développement ne doit pas forcément être spécifiques aux pages statiques.

@submarcos
Copy link
Member

submarcos commented Apr 2, 2024

Comme indiqué dans la PR côté Mapentity (makinacorpus/django-mapentity#277), je trouve dommage de bloquer cette évolution globale du WYSIWYG côté Mapentity pour un mécanisme de suppression des images orphelines très secondaire. En effet, il n'y aura que quelques dizaines de photos ajoutées par le WYSIWYG et peu ou pas d'images orphelins. L'enjeu est bien plus fort au niveau des attachments sur les différents objets des modules où là on a beaucoup beaucoup d'images et pas mal d'orphelins, notamment quand on importe des données depuis des plateformes tiers, et là une commande de nettoyage existe. Et même dans les CMS où on a des centaines d'articles et des centaines de photos, il n'y a pas forcément de mécanisme de suppression automatique des médias orphelins. C'est donc dommage que cette PR globale côté Mapentity se perde, pour un sujet secondaire selon moi.

A noter aussi : il me semble dommage de mettre /tinymce/ dans l'URL des médias uploadées car le chemin pourra être visible par les utilisateurs dans les catalogues d'images des moteurs de recherche et autres.

A noter aussi : On pourrait avoir besoin de ce WYSIWYG dans d'autres objets de l'AdminSite (recommandation des étiquettes, description des lieux de renseignement...) donc ce développement ne doit pas forcément être spécifiques aux pages statiques.

Côté django, les conventions de dev exigent que tout ce qui est dans /media/ soit reférencé en BDD. C'est pas vraiment difficile et peut être totalement transparent pour l'utilisateur, quitte à utiliser un autre modèle qu'attachment.

De plus, utiliser un modele ety un ImageField permetrait d'exploiter la possibilité de création des thumbnails, là on ouvre la porte aux utilisateurs uploadant des fichiers gigantesques, ou utiliser le mecanisme de nettoyage de fichier vérolé mis en place avec les signalements

Voyant ce que donne des instances apres 10ans d'utilisations, je suis pour que dans tous les cas on puisse nettoyer les fichiers inutilisés. Ca prend de la place dans les backups etc.

Outre ce point à discuter, l'utilisation des storage django est primordiale, ne serait-ce que pour pouvoir utiliser d'autres backends, ou pour s'assurer que le nom de fichier n'est pas déjà utilisé https://docs.djangoproject.com/en/5.0/topics/files/#storage-objects

@camillemonchicourt
Copy link
Member

Oui c'est intéressant si c'est géré comme des attachments comme les autres médias.
Cela permet de regrouper toutes les images au même endroit, de ne pas avoir à modifier les stratégies de sauvegardes, de pouvoir gérer les médias orphelins, d'envisager des vignettes, mais aussi potentiellement du redimensionnement automatique comme on peut déjà le faire au niveau des attachments existants sur les objets.

@marcantoinedupre marcantoinedupre force-pushed the feat_add_tools_for_flatpages_content branch from aabfa7a to 15e1368 Compare April 2, 2024 14:38
@marcantoinedupre marcantoinedupre force-pushed the feat_add_tinymce_upload_image branch from 86c7a0d to 3bedabc Compare April 2, 2024 14:39
@marcantoinedupre
Copy link
Contributor Author

Je suis d'accord avec vos remarques concernant l'utilisation des Attachments pour les images uploadées pour bénéficier des checks de sécurité, du redimensionnement automatique, du suivi et du nettoyage des fichiers uploadés.

Comme il s'agit d'un développement non-trivial (dû au fait que l'Attachement ne peut pas être créé directement dans le endpoint appelé par TinyMCE images_upload car il manque l'ID de la page ou de l'objet) la team @GeotrekCE/makina-admin propose de merger cette PR apportant la fonctionnalité pour les pages statiques et de revenir à la PR mapentity -- pour ajouter l'upload de manière carrée pour toutes les entités mapentity -- dans un second temps. On parle d'une échéance courte, de quelques mois.

La mise à jour pour les utilisateurs ayant déjà commencé à uploader des images sera invisible, les fichiers déjà uploadés seront toujours disponibles. Il manquera juste les Attachments correspondants.

@marcantoinedupre marcantoinedupre force-pushed the feat_add_tools_for_flatpages_content branch from 15e1368 to fbfd825 Compare April 2, 2024 15:15
Base automatically changed from feat_add_tools_for_flatpages_content to master April 2, 2024 15:32
@marcantoinedupre marcantoinedupre force-pushed the feat_add_tinymce_upload_image branch from 3bedabc to a4b03d4 Compare April 2, 2024 15:48
@marcantoinedupre marcantoinedupre merged commit 6175d94 into master Apr 2, 2024
16 checks passed
@marcantoinedupre marcantoinedupre deleted the feat_add_tinymce_upload_image branch April 2, 2024 16:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants