Aller au contenu

Fichiers

Introduction

https://roadmap.osuny.org/fonctionnalites/2026-espace-de-gestion-des-fichiers/

Le gestionnaire de fichiers a pour but de faciliter la gestion de l’ensemble des fichiers envoyés dans une instance. La plupart des fichiers viennent des blocs, mais il y a aussi les fichiers liés directement aux formations.

L’intérêt est multiple :

  • éviter les doublons
  • permettre la mise à jour centralisée
  • fournir une base propre de fichiers aux équipes qui les utilisent
  • faciliter la recherche dans cette base avec des critères multiples

Principes

Glossaire

NomDéfinition
fichier physiquel’ensemble de données binaires que l’on upload ou download
blobl’enregistrement dans la table active_storage_blobs
fichier logiquel’enregistrement dans la table communication_files
localisationl’enregistrement dans la table communication_file_localizations
contextesles cas d’usage d’une localisation

Ergonomie

L’envoi d’un fichier physique à la place d’un autre dans un bloc pose un problème ergonomique.

Il y a 2 possibilités :

  • soit la personne veut mettre à jour le fichier physique précédent, donc le remplacer
  • soit la personne envoie un nouveau fichier, qui n’a pas de rapport avec le précédent

Pour résoudre simplement les choses, on ne peut mettre à jour que via la bibliothèque de fichiers. Dans les blocs, tout ce qu’on envoie est considéré comme nouveau.

Envoi direct de fichier

Upload

    graph TD;
  Envoi-->CreationBlob-->Checksum-->Fichier
  Fichier-->FichierOui-->EnvoiInfos
  Fichier-->FichierNon-->CreationFichier-->EnvoiInfos

  Envoi["Envoi du fichier physique"]
  CreationBlob["Création du blob"]
  Checksum["Calcul du checksum"]
  Fichier{"Le checksum existe-t-il dans cette langue ?"}
  FichierOui["Si le checksum existe déjà"]
  FichierNon["Si le checksum n'existe pas"]
  CreationFichier["Création du fichier logique et de sa localisation"]
  EnvoiInfos["Envoi de l'identifiant du fichier logique et du nom du fichier physique"]
  

À cette étape :

  1. le fichier physique existe sur Scaleway
  2. le fichier logique existe dans la base de données avec sa localisation
  3. mais le bloc n’a pas été enregistré

Enregistrement

Lors de l’enregistrement du bloc (ou de la formation), on entre dans un autre flux.

    graph TD;
  Enregistrement-->Fichiers-->Fichier-->Localisation;
  Localisation-->LocaNecessaire-->CreationLoca-->CreationContexte;
  Localisation-->LocaExiste;
  LocaExiste-->Contexte
  Contexte-->ContexteNecessaire-->CreationContexte;
  Contexte-->ContexteExiste-->Rien-->TraitementFini;
  CreationContexte-->TraitementFini-->ListeContextesObsoletes-->SuppressionContextesObsoletes;

  Enregistrement["Enregistrement de l'objet about (block ou program_localization)"]
  Fichiers["On liste les fichiers logiques dont les identifiants sont envoyés"]
  Fichier(["Pour chaque fichier, on récupère sa localisation"])
  Localisation{"La localisation du fichier existe-t-elle ?"}
  LocaExiste["La localisation existe"]
  LocaNecessaire["La localisation n'existe pas encore (cf traduction ci-dessous)"]
  CreationLoca["Création de la localisation en dupliquant la localisation originale du fichier"]
  Contexte{"Le contexte existe-t-il ?"}
  ContexteNecessaire["Le contexte n'existe pas encore"]
  ContexteExiste["Le contexte existe déjà"]
  CreationContexte["Création du contexte"]
  Rien["Aucune action"]
  TraitementFini(["Une fois le traitement de tous les fichiers terminé"])
  ListeContextesObsoletes["On liste les contextes de l'objet mentionnant d'autres fichiers"]
  SuppressionContextesObsoletes["Suppression des contextes obsolètes"]
  

Traduction

Option absence (non)

    graph TD;
  Traduction-->Loca
  Loca-->LocaExiste-->EnregistrementAvec
  Loca-->LocaManquante-->GarderOuSupprimer
  GarderOuSupprimer-->Supprimer-->MauvaisChoix
  GarderOuSupprimer-->Garder-->EnregistrementSansLoca-->UtilisationSansLoca
  UtilisationSansLoca-->Rien-->MauvaisChoix
  UtilisationSansLoca-->Substitution-->MauvaisChoix
  
  Traduction["Traduction du bloc"]
  Loca{"La localisation existe-t-elle ?"}
  LocaExiste["La localisation existe pour la nouvelle langue"]
  LocaManquante["La localisation n'existe pour la nouvelle langue"]
  GarderOuSupprimer{"Faut-il garder le lien ou le supprimer ?"}
  Supprimer["Supprimer l'identifiant du fichier, tout a disparu"]
  EnregistrementAvec["Enregistrement normal"]
  EnregistrementSansLoca["Enregistrement de l'identifiant du fichier qui n'a pas sa localisation"]
  UtilisationSansLoca{"Que faire en affichage dans l'admin ou en export statique ?"}
  MauvaisChoix["Mauvais choix architectural"]
  Rien["Ne rien afficher ? Cela revient à supprimer, sauf qu'on peut éventuellement crééer la localisation via le gestionnaire de fichiers."]
  Substitution["Utiliser la localisationn originale ? C'est exactement comme l'option duplication, mais en plus compliqué."]
  
Cette option créée des complications architecturales et ergonomiques.

Option duplication (oui)

    graph TD;
  Traduction-->Loca
  Loca-->LocaExiste-->Enregistrement
  Loca-->LocaManquante-->CreationLoca-->Enregistrement

  Traduction["Traduction du bloc"]
  Loca{"La localisation existe-t-elle ?"}
  LocaExiste["La localisation existe pour la nouvelle langue"]
  LocaManquante["La localisation n'existe pas pour la nouvelle langue"]
  CreationLoca["Création de la localisation avec le blob de la localisation originale"]
  Enregistrement["Enregistrement avec l'identifiant du fichier (donc non linguistique)"]
  

Suppression

Lors de la suppression d’un bloc ou d’une formation, il faut détruire les contextes dont l’objet est l’about. Comme c’est une propriété polymorphe, il faut passer par un before_destroy.