} // //////////////////////////////////////////////////////////////////////////////////////////////////// // Supprimer des comptes // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'supprimer') { // Récupérer le profil des utilisateurs indiqués, vérifier qu'ils sont déjà sortis et qu'on y a pas glissé l'id d'un administrateur $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_users_cibles(implode(',', $tab_user_id), 'user_id,user_nom,user_prenom,user_profil_sigle,user_sortie_date', ''); $tab_user_id = array(); $notification_contenu = ''; $notification_intro = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM']; foreach ($DB_TAB as $DB_ROW) { if ($DB_ROW['user_sortie_date'] <= TODAY_MYSQL && $DB_ROW['user_profil_sigle'] != 'ADM') { DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_utilisateur($DB_ROW['user_id'], $DB_ROW['user_profil_sigle']); $tab_user_id[] = $DB_ROW['user_id']; // Log de l'action SACocheLog::ajouter('Suppression de l\'utilisateur ' . $DB_ROW['user_nom'] . ' ' . $DB_ROW['user_prenom'] . ' (' . $DB_ROW['user_profil_sigle'] . ' ' . $DB_ROW['user_id'] . ').'); $notification_contenu .= $notification_intro . ' a supprimé l\'utilisateur ' . $DB_ROW['user_nom'] . ' ' . $DB_ROW['user_prenom'] . ' (' . $DB_ROW['user_profil_sigle'] . ' ' . $DB_ROW['user_id'] . ').' . "\r\n"; } } // Notifications (rendues visibles ultérieurement) if ($notification_contenu) { DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']); } // Retour $retour = count($tab_user_id) ? 'ok,' . implode(',', $tab_user_id) : 'Aucun compte coché n\'est supprimable ! Il faut d\'abord les retirer pour leur affecter une date de sortie...'; exit($retour); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On ne devrait pas en arriver là... // //////////////////////////////////////////////////////////////////////////////////////////////////// exit('Erreur avec les données transmises !');
$nb_add++; $tab_i_classe_TO_id_base[$i] = (int) $classe_id; } } } // Supprimer des classes éventuelles $nb_del = 0; $notification_contenu = ''; if (count($tab_del)) { $notification_intro = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM']; foreach ($tab_del as $groupe_id) { if ($groupe_id) { DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_groupe_par_admin($groupe_id, 'classe', TRUE); $nb_del++; // Log de l'action SACocheLog::ajouter('Suppression d\'une classe (n°' . $groupe_id . ') lors d\'un import de fichier, et donc des devoirs associés.'); $notification_contenu .= $notification_intro . ' a supprimé une classe (n°' . $groupe_id . ') lors d\'un import de fichier, et donc les devoirs associés.' . "\r\n"; } } } // Notifications (rendues visibles ultérieurement) if ($notification_contenu) { DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']); } // On enregistre (tableau mis à jour) $tab_liens_id_base = array('classes' => $tab_i_classe_TO_id_base, 'groupes' => $tab_i_groupe_TO_id_base, 'users' => $tab_i_fichier_TO_id_base); FileSystem::ecrire_fichier(CHEMIN_DOSSIER_IMPORT . 'import_' . $import_origine . '_' . $import_profil . '_' . $_SESSION['BASE'] . '_' . session_id() . '_liens_id_base.txt', serialize($tab_liens_id_base)); // Afficher le bilan $lignes = ''; $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_classes_avec_niveaux(); if ($mode == 'complet') {
DB::query(SACOCHE_STRUCTURE_BD_NAME, 'ALTER TABLE sacoche_matiere_famille CHANGE matiere_famille_nom matiere_famille_nom VARCHAR(55) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT "" '); DB::query(SACOCHE_STRUCTURE_BD_NAME, 'INSERT INTO sacoche_matiere_famille VALUES ( 46, 3, "Métiers d\'art (suite)") '); DB::query(SACOCHE_STRUCTURE_BD_NAME, 'INSERT INTO sacoche_matiere_famille VALUES ( 65, 3, "Disciplines professionnelles de l\'enseignement agricole") '); // réordonner la table sacoche_matiere_famille (ligne à déplacer vers la dernière MAJ lors d'ajouts dans sacoche_matiere_famille) DB::query(SACOCHE_STRUCTURE_BD_NAME, 'ALTER TABLE sacoche_matiere_famille ORDER BY matiere_famille_id'); } // Intégration de nouvelles matières 2013 / 2014 / 2015. if (empty($reload_sacoche_matiere)) { // Problème de la matière 601, EIST ("Enseignement intégré de science et technologie"), // qui en juillet 2012 avait été créée en attendant (en vain) que la matière apparaisse officiellement, // et maintenant on a besoin de son id (alors on lui attribue l'id 600). $id_avant = 601; $id_apres = 600; DB::query(SACOCHE_STRUCTURE_BD_NAME, 'UPDATE sacoche_matiere SET matiere_id = ' . $id_apres . ' WHERE matiere_id = ' . $id_avant . ' '); DB_STRUCTURE_ADMINISTRATEUR::DB_deplacer_referentiel_matiere($id_avant, $id_apres); SACocheLog::ajouter('Déplacement des référentiels d\'une matière (' . $id_avant . ' to ' . $id_apres . ').'); // nouvelles matières $insert = ' ( 75, 0, 0, 100, 0, 255, "ACIND", "Activités inter-disciplinaires"), ( 76, 0, 0, 100, 0, 255, "ACTPR", "Activités de projet"), ( 77, 0, 0, 100, 0, 255, "CERPR", "Certification professionnelle"), ( 78, 0, 0, 100, 0, 255, "AAEPR", "Accès autonomie équipements professionnels"), ( 79, 0, 0, 100, 0, 255, "APDPR", "Approche pluridisciplinaire & dimension professionnelle"), ( 96, 0, 0, 100, 0, 255, "COMPR", "Connaissance des milieux professionnels"), ( 97, 0, 0, 100, 0, 255, "PROPR", "Projet professionnel"), ( 203, 0, 0, 2, 0, 255, "LCALA", "Langues et cultures de l\'antiquité latine"), ( 204, 0, 0, 2, 0, 255, "LCAGR", "Langues et cultures de l\'antiquité grecque"), ( 436, 0, 0, 4, 0, 255, "HGGMC", "Histoire, géographie & géopolitique du monde contemporain"), ( 437, 0, 0, 4, 0, 255, "HI-GE", "Histoire-géographie"), ( 438, 0, 1, 4, 0, 255, "EMC" , "Enseignement moral et civique"), ( 523, 0, 0, 5, 0, 255, "ESHMC", "Économie, sociologie & histoire du monde contemporain"),
SACocheLog::ajouter('Suppression de tous les groupes, hors classes, sans les devoirs associés.'); // Supprimer les jointures classes/périodes, et donc les états des bilans officiels DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_liaison_groupe_periode( TRUE /*groupe_id*/ , TRUE /*periode_id*/ , FALSE /*etat*/ , '' /*date_debut_mysql*/ ,'' /*date_fin_mysql*/ ); // Supprimer les saisies & les archives des bilans officiels DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_bilans_officiels(); // Supprimer les saisies brevet & les archives (Notanet & fiches brevet) DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_bilans_brevet(); // Supprimer les comptes utilisateurs désactivés depuis plus de 3 ans $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_users_desactives_obsoletes(); if(!empty($DB_TAB)) { foreach($DB_TAB as $DB_ROW) { DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_utilisateur($DB_ROW['user_id'],$DB_ROW['user_profil_sigle']); // Log de l'action SACocheLog::ajouter('Suppression d\'un utilisateur au compte désactivé depuis plus de 3 ans ('.$DB_ROW['user_profil_sigle'].' '.$DB_ROW['user_id'].').'); } } // Retirer, dans les liaisons entre comptes, ceux qui sont désactivés ou supprimés DB_STRUCTURE_SWITCH::DB_supprimer_liaisons_obsoletes(); // Retirer, dans les sélections d'items, les items supprimés DB_STRUCTURE_SELECTION_ITEM::DB_supprimer_jointures_items_obsoletes(); // Retirer les sélections d'items sans item DB_STRUCTURE_SELECTION_ITEM::DB_supprimer_selections_items_obsoletes(); // Supprimer les demandes d'évaluations, ainsi que les reliquats de notes 'REQ' DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_demandes_evaluation(); DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_saisies_REQ(); // En profiter pour optimiser les tables (une fois par an, ça ne peut pas faire de mal) DB_STRUCTURE_ADMINISTRATEUR::DB_optimiser_tables_structure(); // Débloquer l'application LockAcces::debloquer_application('automate',$_SESSION['BASE']);
/** * Supprimer une structure (mode multi-structures) * * @param int $BASE * @return void */ public static function supprimer_multi_structure($BASE) { // Paramètres de connexion à la base de données $BD_name = 'sac_base_' . $BASE; $BD_user = '******' . $BASE; // Limité à 16 caractères // Supprimer la base de données d'une structure, et son utilisateur MySQL une fois défait de ses droits. DB_WEBMESTRE_WEBMESTRE::DB_supprimer_base_structure_et_user_mysql($BD_name, $BD_user); // Supprimer le fichier de connexion FileSystem::supprimer_fichier(CHEMIN_DOSSIER_MYSQL . 'serveur_sacoche_structure_' . $BASE . '.php'); // Retirer l'enregistrement d'une structure dans la base du webmestre DB_WEBMESTRE_WEBMESTRE::DB_supprimer_structure($BASE); // Supprimer les dossiers de fichiers temporaires par établissement foreach (FileSystem::$tab_dossier_tmp_structure as $dossier) { FileSystem::supprimer_dossier($dossier . $BASE); } // Supprimer les éventuels fichiers de blocage LockAcces::supprimer_fichiers_blocage($BASE); // Log de l'action SACocheLog::ajouter('Suppression de la structure n°' . $BASE . '.'); }
echo'<td>{{NIVEAU_NOM}}</td>'; echo'<td>'.html($ref).'</td>'; echo'<td>'.html($nom).'</td>'; echo'<td class="nu">'; echo '<q class="modifier" title="Modifier cette classe."></q>'; echo '<q class="supprimer" title="Supprimer cette classe."></q>'; echo'</td>'; } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Supprimer une classe existante // //////////////////////////////////////////////////////////////////////////////////////////////////// else if( ($action=='supprimer') && $id && $nom ) { // Effacer l'enregistrement DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_groupe_par_admin( $id , 'classe' , TRUE /*with_devoir*/ ); // Log de l'action SACocheLog::ajouter('Suppression de la classe "'.$nom.'" (n°'.$id.'), et donc des devoirs associés.'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s').' '.$_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM'].' a supprimé la classe "'.$nom.'" (n°'.$id.'), et donc les devoirs associés.'."\r\n"; DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin( $notification_contenu , $_SESSION['USER_ID'] ); // Afficher le retour echo'<td>ok</td>'; } else { echo'Erreur avec les données transmises !'; } ?>
// Supprimer un référentiel // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'supprimer' && $matiere_id && $niveau_id && $partage && $matiere_nom && $niveau_nom) { // S'il était partagé, il faut le retirer du serveur communautaire if ($partage == 'oui') { if (!$_SESSION['SESAMATH_ID'] || !$_SESSION['SESAMATH_KEY']) { exit('Pour échanger avec le serveur communautaire, un administrateur doit identifier l\'établissement dans la base Sésamath.'); } $reponse = ServeurCommunautaire::envoyer_arborescence_XML($_SESSION['SESAMATH_ID'], $_SESSION['SESAMATH_KEY'], $matiere_id, $niveau_id, '', $information); if ($reponse != 'ok') { exit($reponse); } } DB_STRUCTURE_REFERENTIEL::DB_supprimer_referentiel_matiere_niveau($matiere_id, $niveau_id); // Log de l'action SACocheLog::ajouter('Suppression du référentiel [' . $matiere_nom . '] [' . $niveau_nom . '].'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a supprimé le référentiel [' . $matiere_nom . '] [' . $niveau_nom . '].' . "\r\n"; notifications_referentiel_edition($matiere_id, $notification_contenu); DB_STRUCTURE_NOTIFICATION::enregistrer_action_sensible($notification_contenu); // Retour exit('ok'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Modifier le mode de calcul d'un référentiel // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'calculer' && $matiere_id && $niveau_id && $matiere_nom && $niveau_nom) { if (is_null($methode) || is_null($limite) || is_null($retroactif)) { exit('Erreur avec les données transmises !'); } $is_modif = DB_STRUCTURE_REFERENTIEL::DB_modifier_referentiel($matiere_id, $niveau_id, array(':calcul_methode' => $methode, ':calcul_limite' => $limite, ':calcul_retroactif' => $retroactif));
echo '<td>{{NIVEAU_NOM}}</td>'; echo '<td>' . html($groupe_nom) . '</td>'; echo '<td>' . $eleves_texte . '</td>'; echo '<td>' . $profs_texte . '</td>'; echo '<td class="nu">'; echo '<q class="modifier" title="Modifier ce groupe de besoin."></q>'; echo '<q class="supprimer" title="Supprimer ce groupe de besoin."></q>'; echo '</td>'; echo '<SCRIPT>'; echo 'tab_eleves["' . $groupe_id . '"]="' . implode('_', $tab_eleves) . '";'; echo 'tab_profs["' . $groupe_id . '"]="' . implode('_', $tab_profs) . '";'; exit; } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Supprimer un groupe de besoin existant // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'supprimer' && $groupe_id && $groupe_nom) { // Effacer l'enregistrement DB_STRUCTURE_PROFESSEUR::DB_supprimer_groupe_par_prof($groupe_id, 'besoin', TRUE); // Log de l'action SACocheLog::ajouter('Suppression du regroupement "' . $groupe_nom . '" (besoin n°' . $groupe_id . '), et donc des devoirs associés.'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a supprimé son regroupement "' . $groupe_nom . '" (besoin n°' . $groupe_id . '), et donc les devoirs associés.' . "\r\n"; DB_STRUCTURE_NOTIFICATION::enregistrer_action_sensible($notification_contenu); // Afficher le retour exit('<td>ok</td>'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On ne devrait pas en arriver là ! // //////////////////////////////////////////////////////////////////////////////////////////////////// exit('Erreur avec les données transmises !');
echo '<td>' . html($prenom) . '</td>'; echo '<td>' . html($login) . '</td>'; echo $box_password ? '<td class="i">champ crypté</td>' : '<td class="new">' . $password . ' <img alt="" src="./_img/bulle_aide.png" width="16" height="16" title="Pensez à noter le mot de passe !" /></td>'; echo '<td>' . html($courriel) . '</td>'; echo '<td class="nu">'; echo '<q class="modifier" title="Modifier ce administrateur."></q>'; echo $id != $_SESSION['USER_ID'] ? '<q class="supprimer" title="Retirer cet administrateur."></q>' : '<q class="supprimer_non" title="Un administrateur ne peut pas supprimer son propre compte."></q>'; echo '</td>'; exit; } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Retirer un administrateur existant // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'supprimer' && $id && $nom && $prenom) { if ($id == $_SESSION['USER_ID']) { exit('Erreur : un administrateur ne peut pas supprimer son propre compte !'); } // Supprimer l'enregistrement DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_utilisateur($id, $profil); // Log de l'action SACocheLog::ajouter('Suppression de l\'utilisateur ' . $nom . ' ' . $prenom . ' (' . $profil . ' ' . $id . ').'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a supprimé l\'utilisateur ' . $nom . ' ' . $prenom . ' (' . $profil . ' ' . $id . ').' . "\r\n"; DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']); // Afficher le retour exit('<td>ok</td>'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On ne devrait pas en arriver là ! // //////////////////////////////////////////////////////////////////////////////////////////////////// exit('Erreur avec les données transmises !');
{ $tab_convert[$id1] = $id2 ; } } } // On lance la conversion if(!empty($tab_convert)) { foreach($tab_convert as $id_avant => $id_apres) { DB::query(SACOCHE_STRUCTURE_BD_NAME , 'UPDATE sacoche_matiere SET matiere_active=1 WHERE matiere_id='.$id_apres ); DB_STRUCTURE_ADMINISTRATEUR::DB_deplacer_referentiel_matiere($id_avant,$id_apres); SACocheLog::ajouter('Déplacement des référentiels d\'une matière ('.$id_avant.' to '.$id_apres.').'); DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_matiere_specifique($id_avant); SACocheLog::ajouter('Suppression d\'une matière spécifique (n°'.$id_avant.').'); SACocheLog::ajouter('Suppression des référentiels associés (matière '.$id_avant.').'); } } } } // //////////////////////////////////////////////////////////////////////////////////////////////////// // MAJ 2014-11-29 => 2014-12-12 // //////////////////////////////////////////////////////////////////////////////////////////////////// if($version_base_structure_actuelle=='2014-11-29') { if($version_base_structure_actuelle==DB_STRUCTURE_MAJ_BASE::DB_version_base()) { $version_base_structure_actuelle = '2014-12-12'; DB::query(SACOCHE_STRUCTURE_BD_NAME , 'UPDATE sacoche_parametre SET parametre_valeur="'.$version_base_structure_actuelle.'" WHERE parametre_nom="version_base"' );
// Vérification des droits $proprio_id = DB_STRUCTURE_PROFESSEUR::DB_recuperer_devoir_prorietaire_id( $devoir_id ); if($proprio_id!=$_SESSION['USER_ID']) { exit('Erreur : vous n\'êtes pas propriétaire du devoir n°'.$devoir_id.' !'); } // On y va if($type=='selection') { // supprimer le groupe spécialement associé (invisible à l'utilisateur) et les entrées dans sacoche_jointure_user_groupe pour une évaluation avec des élèves piochés en dehors de tout groupe prédéfini DB_STRUCTURE_PROFESSEUR::DB_supprimer_groupe_par_prof( $groupe_id , $groupe_type , FALSE /*with_devoir*/ ); SACocheLog::ajouter('Suppression d\'un regroupement ('.$groupe_type.' '.$groupe_id.'), sans les devoirs associés.'); } // on supprime l'évaluation avec ses saisies DB_STRUCTURE_PROFESSEUR::DB_supprimer_devoir_et_saisies( $devoir_id ); SACocheLog::ajouter('Suppression du devoir "'.$description.'" (n°'.$devoir_id.'), et donc aussi des saisies associées.'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s').' '.$_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM'].' a supprimé son devoir "'.$description.'" (n°'.$devoir_id.'), et donc aussi les saisies associées.'."\r\n"; DB_STRUCTURE_NOTIFICATION::enregistrer_action_sensible($notification_contenu); DB_STRUCTURE_NOTIFICATION::DB_supprimer_log_attente( $abonnement_ref_edition , $devoir_id ); // Afficher le retour exit('<td>ok</td>'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Afficher le formulaire pour réordonner les items d'une évaluation // La vérification de droits suffisants s'effectuera lors de la soumission. // //////////////////////////////////////////////////////////////////////////////////////////////////// if( ($action=='ordonner') && $devoir_id ) {
// Afficher le retour echo'<td>'.$id.'</td>'; echo'<td>'.$ordre.'</td>'; echo'<td>'.html($nom).'</td>'; echo'<td class="nu">'; echo '<q class="modifier" title="Modifier cette zone."></q>'; echo '<q class="dupliquer" title="Dupliquer cette zone."></q>'; // La zone d'id 1 ne peut être supprimée, c'est la zone par défaut. echo ($id!=1) ? '<q class="supprimer" title="Supprimer cette zone."></q>' : '<q class="supprimer_non" title="La zone par défaut ne peut pas être supprimée."></q>' ; echo'</td>'; } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Supprimer une zone existante // //////////////////////////////////////////////////////////////////////////////////////////////////// else if( ($action=='supprimer') && ($id>1) && $nom ) { // Effacer l'enregistrement DB_WEBMESTRE_WEBMESTRE::DB_supprimer_zone($id); // Log de l'action SACocheLog::ajouter('Suppression de la zone géographique "'.$nom.'" (n°'.$id.').'); // Afficher le retour echo'<td>ok</td>'; } else { echo'Erreur avec les données transmises !'; } ?>
if ($action == 'modifier' && $id && $ordre && $nom) { // Vérifier que le nom de la période est disponible if (DB_STRUCTURE_ADMINISTRATEUR::DB_tester_periode_nom($nom, $id)) { exit('Erreur : nom de période déjà existant !'); } // Mettre à jour l'enregistrement DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_periode($id, $ordre, $nom); // Afficher le retour echo '<td>' . $ordre . '</td>'; echo '<td>' . html($nom) . '</td>'; echo '<td class="nu">'; echo '<q class="modifier" title="Modifier cette période."></q>'; echo '<q class="dupliquer" title="Dupliquer cette période."></q>'; echo '<q class="supprimer" title="Supprimer cette période."></q>'; echo '</td>'; } else { if ($action == 'supprimer' && $id && $nom) { // Effacer l'enregistrement DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_periode($id); // Log de l'action SACocheLog::ajouter('Suppression de la période "' . $nom . '" (n°' . $id . '), et donc des bilans officiels associés.'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a supprimé la période "' . $nom . '" (n°' . $id . '), et donc les bilans officiels associés.' . "\r\n"; DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']); // Afficher le retour echo '<td>ok</td>'; } else { echo 'Erreur avec les données transmises !'; } } }
/** * Mettre à jour automatiquement la base si besoin ; à effectuer avant toute récupération des données sinon ça peut poser pb... * * @param int $BASE * @return void */ function maj_base_structure_si_besoin($BASE) { $version_base_structure = DB_STRUCTURE_PUBLIC::DB_version_base(); if($version_base_structure != VERSION_BASE_STRUCTURE) { // On ne met pas à jour la base tant que le webmestre bloque l'accès à l'application, car sinon cela pourrait se produire avant le transfert de tous les fichiers. if(LockAcces::tester_blocage('webmestre',0)===NULL) { // Bloquer l'application LockAcces::bloquer_application('automate',$BASE,'Mise à jour de la base en cours.'); // Lancer une mise à jour de la base DB_STRUCTURE_MAJ_BASE::DB_maj_base($version_base_structure); // Log de l'action SACocheLog::ajouter('Mise à jour automatique de la base '.SACOCHE_STRUCTURE_BD_NAME.'.'); // Débloquer l'application LockAcces::debloquer_application('automate',$BASE); } } }
/** * Débloquer l'accès à SACoche. * * @param string $profil_demandeur (webmestre|administrateur|automate) * @param int $base_id (0 si demande mono-structure ou du webmestre multi-structures de débloquer tous les établissements) * @return void */ public static function debloquer_application($profil_demandeur, $base_id) { FileSystem::supprimer_fichier(LockAcces::chemin_fichier_blocage($profil_demandeur, $base_id), TRUE); // Log de l'action SACocheLog::ajouter('Déblocage de l\'accès à l\'application.'); }
exit(']¤[' . $id); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Déplacer les référentiels d'une matière vers une autre // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'deplacer_referentiels' && $id_avant && $id_apres && $id_avant != $id_apres && $nom_avant && $nom_apres) { // Déplacement après vérification que c'est possible (matière de destination vierge de données) // $is_ok = DB_STRUCTURE_ADMINISTRATEUR::DB_deplacer_referentiel_matiere($id_avant, $id_apres); if (!$is_ok) { exit('Erreur : la nouvelle matière contient déjà des données !'); } // Retirer l'ancienne matière partagée || Supprimer l'ancienne matière spécifique existante if ($id_avant > ID_MATIERE_PARTAGEE_MAX) { DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_matiere_specifique($id_avant); $log_fin = 'avec suppression de la matière spécifique "' . $nom_avant . '"'; } else { DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_matiere_partagee($id_avant, 0); $log_fin = 'avec retrait de la matière partagée "' . $nom_avant . '"'; } // Log de l'action SACocheLog::ajouter('Déplacement des référentiels de "' . $nom_avant . '" (' . $id_avant . ') vers "' . $nom_apres . '" (' . $id_apres . '), ' . $log_fin . '.'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a déplacé des référentiels de "' . $nom_avant . '" (' . $id_avant . ') vers "' . $nom_apres . '" (' . $id_apres . '), ' . $log_fin . '.' . "\r\n"; DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']); exit('ok'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On ne devrait pas en arriver là... // //////////////////////////////////////////////////////////////////////////////////////////////////// exit('Erreur avec les données transmises !');
SACocheLog::ajouter('Retrait du niveau partagé "'.$nom.'" (n°'.$id.').'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s').' '.$_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM'].' a retiré le niveau partagé "'.$nom.'" (n°'.$id.').'."\r\n"; DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin( $notification_contenu , $_SESSION['USER_ID'] ); // Afficher le retour exit(']¤['.$id); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Supprimer un niveau spécifique existant // //////////////////////////////////////////////////////////////////////////////////////////////////// if( ($action=='supprimer') && $id && $nom && ($id>ID_NIVEAU_PARTAGE_MAX) ) { DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_niveau_specifique($id); // Log de l'action SACocheLog::ajouter('Suppression du niveau spécifique "'.$nom.'" (n°'.$id.') et donc des référentiels associés.'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s').' '.$_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM'].' a supprimé le niveau spécifique "'.$nom.'" (n°'.$id.') et donc les référentiels associés.'."\r\n"; DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin( $notification_contenu , $_SESSION['USER_ID'] ); // Afficher le retour exit(']¤['.$id); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On ne devrait pas en arriver là... // //////////////////////////////////////////////////////////////////////////////////////////////////// exit('Erreur avec les données transmises !'); ?>
/** * restaurer_tables_base_etablissement * Restaurer des fichiers de svg et mettre la base à jour si besoin. * Pour une restauration individuelle, scindé en plusieurs étapes pour éviter un dépassement du max_execution_time sur de grosses bases. * Par contre pour une restauration par un webmestre d'un ensemble de structures, c'était trop compliqué à découper, on fait tout d'un coup. * * @param string $dossier_temp * @param int $etape (0 si tout d'un coup) * @return string */ function restaurer_tables_base_etablissement($dossier_temp, $etape) { // Pour chaque fichier... $tab_fichier = FileSystem::lister_contenu_dossier($dossier_temp); natsort($tab_fichier); // Si plusieurs fichiers correspondent à une table, il faut que la requête de création soit lancée avant les requêtes d'insertion $tab_fichier = array_values($tab_fichier); // Pour réindexer dans l'ordre et à partir de 0 $nb_fichiers = count($tab_fichier); if ($etape) { $nb_par_etape = 10; $i_min = ($etape - 1) * $nb_par_etape; $i_max = $etape * $nb_par_etape; $i_stop = min($i_max, $nb_fichiers); } else { $i_min = 0; $i_stop = $nb_fichiers; } for ($i = $i_min; $i < $i_stop; $i++) { $fichier_nom = $tab_fichier[$i]; // ... lancer les requêtes $requetes = file_get_contents($dossier_temp . $fichier_nom); DB_STRUCTURE_COMMUN::DB_executer_requetes_MySQL($requetes); // Attention, sur certains LCS ça bloque au dela de 40 instructions MySQL (mais un INSERT multiple avec des milliers de lignes ne pose pas de pb). /* La classe PDO a un bug. Si on envoie plusieurs requêtes d'un coup ça passe, mais si on recommence juste après alors on récolte : "Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute." La seule issue est de fermer la connexion après chaque requête multiple en utilisant exceptionnellement la méthode ajouté par SebR suite à mon signalement : DB::close(nom_de_la_connexion); */ DB::close(SACOCHE_STRUCTURE_BD_NAME); } if ($i_stop < $nb_fichiers) { // Ce n'est pas la dernière étape return 'Restauration de la base en cours ; étape n°' . sprintf("%02u", $etape) . ' réalisée'; } else { // Toutes les étapes sont terminées ; tester si la base nécessite une mise à jour, et si oui alors la lancer $version_base_restauree = version_base_fichier_svg($dossier_temp); if ($version_base_restauree < VERSION_BASE_STRUCTURE) { DB_STRUCTURE_MAJ_BASE::DB_maj_base($version_base_restauree); // Log de l'action SACocheLog::ajouter('Mise à jour automatique de la base ' . SACOCHE_STRUCTURE_BD_NAME . '.'); return 'Restauration de la base terminée et base mise à jour'; } return 'Restauration de la base terminée'; } }
* * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ; * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>. * */ if(!defined('SACoche')) {exit('Ce fichier ne peut être appelé directement !');} $TITRE = html(Lang::_("Log des actions sensibles")); ?> <p class="astuce">Les actions sensibles sont enregistrées, ce qui permet aux administrateurs de rechercher quel compte est fautif en cas de problème...</p> <p class="astuce">Ces logs sont enregistrés dans un fichier (pas dans la base) ; ils sont donc propres à un serveur et ne sont pas transférés lors d'une sauvegarde / restauration de base.</p> <p class="astuce">Concernant la suppression d'un référentiel, suivez ces liens pour savoir à quoi correspondent les identifiants <a target="_blank" href="http://redmine.sesamath.net/projects/sacoche/repository/entry/_sql/structure/sacoche_matiere.sql">de matières</a> et <a target="_blank" href="http://redmine.sesamath.net/projects/sacoche/repository/entry/_sql/structure/sacoche_niveau.sql">de niveaux</a>.</p> <?php $fichier_log_contenu = SACocheLog::lire(); if($fichier_log_contenu===NULL) { echo'<p class="danger">Le fichier n\'existe pas : probablement qu\'aucune action sensible n\'a encore été effectuée !</p>'.NL; } else { // 1 En extraire le plus récent (les 100 derniers enregistrements) $table_log_extrait = '<table class="p"><thead><tr><th>Date & Heure</th><th>Utilisateur</th><th>Action</th></tr></thead><tbody>'; $tab_lignes = extraire_lignes($fichier_log_contenu); $indice_ligne_debut = count($tab_lignes)-1 ; $indice_ligne_fin = max(-1 , $indice_ligne_debut-100) ; $nb_lignes = $indice_ligne_debut - $indice_ligne_fin ; $s = ($nb_lignes>1) ? 's' : '' ; for( $indice_ligne=$indice_ligne_debut ; $indice_ligne>$indice_ligne_fin ; $indice_ligne-- )
} // //////////////////////////////////////////////////////////////////////////////////////////////////// // Fusionner un item en l'absorbant par un 2nd item // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'fus' && $element_id && $element2_id && $matiere_id && $matiere_nom && $nom && $nom2) { $test_delete = DB_STRUCTURE_REFERENTIEL::DB_supprimer_referentiel_item($element_id, FALSE); if (!$test_delete) { exit('Élément non trouvé !'); } if (count($tab_id)) { DB_STRUCTURE_REFERENTIEL::DB_renumeroter_referentiel_liste_elements('item', $tab_id, '-1'); } // Mettre à jour les références vers l'item absorbant DB_STRUCTURE_REFERENTIEL::DB_fusionner_referentiel_items($element_id, $element2_id); // Log de l'action SACocheLog::ajouter('Fusion d\'éléments de référentiel (item / ' . $element_id . ' / ' . $element2_id . ').'); // Notifications (rendues visibles ultérieurement) $notification_contenu = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM'] . ' a fusionné dans le référentiel [' . $matiere_nom . '] :' . "\r\n" . $nom . ' -> ' . $nom2 . "\r\n"; notifications_referentiel_edition($matiere_id, $notification_contenu); DB_STRUCTURE_NOTIFICATION::enregistrer_action_sensible($notification_contenu); // Retour exit('ok'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Actions complémentaires // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'action_complementaire') { // Récupération des données $action_groupe = isset($_POST['select_action_groupe']) ? Clean::texte($_POST['select_action_groupe']) : ''; $granulosite = isset($_POST['select_action_groupe_modifier_objet']) ? Clean::texte($_POST['select_action_groupe_modifier_objet']) : ''; $modifier_id = isset($_POST['select_action_groupe_modifier_id']) ? Clean::texte($_POST['select_action_groupe_modifier_id']) : '';
/** * Renvoie le contenu d'un fichier de log si existant, et sinon NULL. * Nécessite que la session soit ouverte. * * @return string|NULL */ public static function lire() { return (is_file( SACocheLog::chemin_fichier_log($_SESSION['BASE']) )) ? file_get_contents(SACocheLog::chemin_fichier_log($_SESSION['BASE'])) : NULL ; }
if ($date_debut_mysql > $date_fin_mysql) { exit('Erreur : la date de début est postérieure à la date de fin !'); } foreach ($tab_select_periodes as $periode_id) { foreach ($tab_select_classes_groupes as $groupe_id) { DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_liaison_groupe_periode($groupe_id, $periode_id, TRUE, $date_debut_mysql, $date_fin_mysql); } } } elseif ($action == 'retirer') { $notification_contenu = ''; $notification_intro = date('d-m-Y H:i:s') . ' ' . $_SESSION['USER_PRENOM'] . ' ' . $_SESSION['USER_NOM']; foreach ($tab_select_periodes as $periode_id) { foreach ($tab_select_classes_groupes as $groupe_id) { DB_STRUCTURE_ADMINISTRATEUR::DB_modifier_liaison_groupe_periode($groupe_id, $periode_id, FALSE); // Log de l'action SACocheLog::ajouter('Suppression de l\'association période "' . $tab_periode[$periode_id] . '" (n°' . $periode_id . ') / regroupement "' . $tab_groupe[$groupe_id] . '" (n°' . $groupe_id . '), et donc des bilans officiels associés.'); $notification_contenu .= $notification_intro . ' a supprimé l\'association période "' . $tab_periode[$periode_id] . '" (n°' . $periode_id . ') / regroupement "' . $tab_groupe[$groupe_id] . '" (n°' . $groupe_id . '), et donc les bilans officiels associés.' . "\r\n"; } } // Notifications (rendues visibles ultérieurement) if ($notification_contenu) { DB_STRUCTURE_NOTIFICATION::enregistrer_action_admin($notification_contenu, $_SESSION['USER_ID']); } } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Bilan des affectations des périodes aux classes & groupes ; en plusieurs requêtes pour récupérer les périodes sans classes-groupes et les classes-groupes sans périodes. // 2/2 - On poursuit avec les requêtes suivantes (associations) et l'affichage. // //////////////////////////////////////////////////////////////////////////////////////////////////// echo '<hr />' . NL; // Récupérer l'amplitude complète sur l'ensemble des périodes $DB_ROW = DB_STRUCTURE_ADMINISTRATEUR::DB_recuperer_amplitude_periodes();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Supprimer des comptes // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if($action=='supprimer') { // Récupérer le profil des utilisateurs indiqués, vérifier qu'ils sont déjà sortis et qu'on y a pas glissé l'id d'un administrateur $DB_TAB = DB_STRUCTURE_ADMINISTRATEUR::DB_lister_users_cibles( implode(',',$tab_user_id) , 'user_id,user_profil,user_sortie_date' , '' /*avec_info*/ ); $tab_user_id = array(); foreach($DB_TAB as $DB_ROW) { if( ($DB_ROW['user_sortie_date']<=TODAY_MYSQL) && ($DB_ROW['user_profil']!='administrateur') ) { DB_STRUCTURE_ADMINISTRATEUR::DB_supprimer_utilisateur( $DB_ROW['user_id'] , $DB_ROW['user_profil'] ); $tab_user_id[] = $DB_ROW['user_id']; // Log de l'action SACocheLog::ajouter('Suppression d\'un utilisateur ('.$DB_ROW['user_profil'].' '.$DB_ROW['user_id'].').'); } } $retour = (count($tab_user_id)) ? 'ok,'.implode(',',$tab_user_id) : 'Aucun compte indiqué n\'est supprimable !' ; exit($retour); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // On ne devrait pas en arriver là... // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - exit('Erreur avec les données transmises !'); ?>