NextcloudSNT/distribution_modeles.sh
2025-08-20 08:33:14 +00:00

151 lines
No EOL
5.4 KiB
Bash

#!/bin/bash
# distribution_modeles_v2.sh - Distribution intelligente avec gestion des versions
NEXTCLOUD_DATA="/var/www/html/nextcloud/data"
PROF_USERNAME="profsnt"
MODELES_DIR="$NEXTCLOUD_DATA/$PROF_USERNAME/files/Modeles_SNT"
# Paramètres
CLASSE_CIBLE="$1" # Optionnel : numéro de classe (ex: 2nde1)
CSV_FILE="${2:-eleves_test.csv}"
echo "📤 Distribution intelligente des modèles SNT"
echo "============================================"
# Vérifier que le dossier modèles existe
if [[ ! -d "$MODELES_DIR" ]]; then
echo "❌ Erreur: Dossier modèles non trouvé: $MODELES_DIR"
echo "💡 Créez le dossier et organisez vos modèles par Sequence/Activite"
exit 1
fi
echo "📁 Dossier modèles : $MODELES_DIR"
# Afficher les classes disponibles
if [[ -z "$CLASSE_CIBLE" ]]; then
echo "🎯 Distribution vers TOUTES les classes"
else
echo "🎯 Distribution vers la classe : $CLASSE_CIBLE"
fi
echo ""
# Lister les modèles disponibles
echo "📚 Modèles disponibles :"
find "$MODELES_DIR" -name "*.docx" -o -name "*.txt" | while read modele; do
modele_relatif=$(echo "$modele" | sed "s|$MODELES_DIR/||")
echo " 📄 $modele_relatif"
done
echo ""
# Distribution par élève
nb_distributions=0
nb_ignores=0
while IFS=',' read -r classe nom prenom email motdepasse; do
[[ "$classe" = "Classe" ]] && continue
# Filtrer par classe si spécifiée
if [[ -n "$CLASSE_CIBLE" && "$classe" != "$CLASSE_CIBLE" ]]; then
continue
fi
username="${prenom,,}.${nom,,}"
eleve_snt_dir="$NEXTCLOUD_DATA/$username/files/SNT"
echo "👤 Distribution pour : $username ($classe)"
# Parcourir tous les modèles
find "$MODELES_DIR" \( -name "*.docx" -o -name "*.txt" \) | while read modele; do
# Extraire la structure Sequence/Activite
modele_relatif=$(echo "$modele" | sed "s|$MODELES_DIR/||")
sequence=$(echo "$modele_relatif" | cut -d'/' -f1)
activite=$(echo "$modele_relatif" | cut -d'/' -f2)
nom_fichier=$(basename "$modele")
# Vérifier que c'est bien une structure Sequence/Activite
if [[ "$sequence" == "$nom_fichier" || "$activite" == "$nom_fichier" ]]; then
echo " ⚠️ Fichier mal placé ignoré : $modele_relatif"
continue
fi
# Dossier de destination chez l'élève
dest_dir="$eleve_snt_dir/$sequence/$activite"
# NOUVELLE LOGIQUE : Distribuer avec _v0 seulement si AUCUNE version n'existe
nom_base=$(echo "$nom_fichier" | sed 's/\.[^.]*$//') # Sans extension
extension=$(echo "$nom_fichier" | sed 's/.*\.//') # Extension seule
dest_file="$dest_dir/${nom_base}_v0.${extension}"
# RÈGLE : Vérifier qu'AUCUNE version n'existe (v0, v1, v2, etc.) ET pas le fichier original
# 1. Fichier original sans version
fichier_original="$dest_dir/$nom_fichier"
# 2. Patterns de versions flexibles : _v1, v1, -v1, v1 (avec ou sans séparateur)
versions_existantes=$(find "$dest_dir" -name "${nom_base}*v[0-9]*.$extension" 2>/dev/null)
if [[ -f "$fichier_original" ]] || [[ -n "$versions_existantes" ]]; then
echo " 🔢 Fichier(s) existant(s) pour : $sequence/$activite/$nom_fichier"
# Afficher ce qui existe
if [[ -f "$fichier_original" ]]; then
echo " 📄 $(basename "$fichier_original") (sans version)"
fi
if [[ -n "$versions_existantes" ]]; then
nb_versions=$(echo "$versions_existantes" | wc -l)
echo " 🔢 $nb_versions version(s) :"
echo "$versions_existantes" | while read version; do
echo " 📄 $(basename "$version")"
done
fi
continue
fi
# Distribution du fichier avec v0 (aucune version n'existe)
mkdir -p "$dest_dir"
if cp "$modele" "$dest_file" 2>/dev/null; then
echo " ✅ Distribué : $sequence/$activite/${nom_base}_v0.${extension}"
chown www-data:www-data "$dest_file"
((nb_distributions++))
else
echo " ❌ Erreur copie : $sequence/$activite/${nom_base}_v0.${extension}"
fi
done
# Rescan de l'élève pour qu'il voit les nouveaux fichiers
echo " 🔄 Rescan pour $username..."
sudo -u www-data php /var/www/html/nextcloud/occ files:scan "$username" > /dev/null 2>&1
# Petit délai pour s'assurer que le rescan est terminé
sleep 1
done < "$CSV_FILE"
echo ""
echo "✅ Distribution terminée"
echo "📊 Statistiques :"
echo " - $nb_distributions fichiers distribués"
# Rescan final pour s'assurer que tout est visible
echo ""
echo "🔄 Rescan final de tous les élèves concernés..."
while IFS=',' read -r classe nom prenom email motdepasse; do
[[ "$classe" = "Classe" ]] && continue
# Filtrer par classe si spécifiée
if [[ -n "$CLASSE_CIBLE" && "$classe" != "$CLASSE_CIBLE" ]]; then
continue
fi
username="${prenom,,}.${nom,,}"
sudo -u www-data php /var/www/html/nextcloud/occ files:scan "$username" > /dev/null 2>&1
done < "$CSV_FILE"
echo ""
echo "💡 Usage :"
echo " $0 # Toutes les classes"
echo " $0 2nde1 # Classe spécifique"
echo " $0 2nde3 eleves.csv # Classe + CSV custom"