From 9808e19b3946d40243c5e0c45f46e3ce4c5b4b6f Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Mon, 13 Nov 2006 22:49:56 +0000
Subject: [PATCH] API pour modifier les forums, et autorisation par defaut =
 non

---
 ecrire/action/editer_article.php | 11 ++++--
 ecrire/inc/autoriser.php         | 13 +++++--
 ecrire/inc/modifier.php          | 58 ++++++++++++++++++++++++++++----
 3 files changed, 71 insertions(+), 11 deletions(-)

diff --git a/ecrire/action/editer_article.php b/ecrire/action/editer_article.php
index 078375a202..dcbaf410d7 100644
--- a/ecrire/action/editer_article.php
+++ b/ecrire/action/editer_article.php
@@ -125,7 +125,7 @@ function revisions_articles ($id_article, $c=false) {
 		$indexation = true;
 	}
 
-	return modifier_contenu('article', $id_article,
+	$r = modifier_contenu('article', $id_article,
 		array(
 			'champs' => array(
 				'surtitre', 'titre', 'soustitre', 'descriptif',
@@ -133,10 +133,15 @@ function revisions_articles ($id_article, $c=false) {
 			),
 			'nonvide' => array('titre' => _T('info_sans_titre')),
 			'invalideur' => $invalideur,
-			'indexation' => $indexation,
-			'supplement_sql' => 'date_modif=NOW()'
+			'indexation' => $indexation
 		),
 		$c);
+
+	if ($r) {
+		spip_query("UPDATE spip_articles SET date_modif=NOW() WHERE id_article="._q($id_article));
+	}
+	
+	return $r;
 }
 
 
diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php
index 71109e31e6..6f5d12a352 100644
--- a/ecrire/inc/autoriser.php
+++ b/ecrire/inc/autoriser.php
@@ -29,7 +29,7 @@ if (!function_exists('autoriser')) {
 // API pour une fonction generique d'autorisation :
 // $qui est : vide (on prend alors auteur_session)
 //            un id_auteur (on regarde dans la base)
-//            un tableau auteur complet
+//            un tableau auteur complet, y compris [restreint]
 // $faire est une action ('modifier', 'publier'...)
 // $type est un type d'objet ou nom de table ('article')
 // $id est l'id de l'objet sur lequel on veut agir
@@ -57,7 +57,7 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
 	// (y compris leurs sous-rubriques), ou 0 si admin complet
 	if (is_array($qui)
 	AND $qui['statut'] == '0minirezo'
-	AND !isset($qui['rubriques'])) {
+	AND !isset($qui['restreint'])) {
 		if (!isset($restreint[$qui['id_auteur']])) {
 			include_spip('inc/auth'); # pour auth_rubrique
 			$restreint[$qui['id_auteur']] = auth_rubrique($qui['id_auteur'], $qui['statut']);
@@ -206,6 +206,15 @@ function autoriser_moderer_forum_dist($faire, $type, $id, $qui, $opt) {
 		autoriser('modifier', $type, $id, $qui, $opt);
 }
 
+// Modifier un forum ?
+// = jamais !
+// http://doc.spip.org/@autoriser_moderer_forum_dist
+function autoriser_modifier_forum_dist($faire, $type, $id, $qui, $opt) {
+	return
+		false;
+}
+
+
 // Moderer la petition ?
 // = modifier l'article correspondant
 // = droits par defaut sinon (admin complet pour moderation de tout)
diff --git a/ecrire/inc/modifier.php b/ecrire/inc/modifier.php
index 5bb31f6a51..233e4bb6ea 100644
--- a/ecrire/inc/modifier.php
+++ b/ecrire/inc/modifier.php
@@ -17,7 +17,8 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // $options est un array() avec toutes les options
 //
 // Pour l'instant fonctionne pour les types :
-//   article, document
+//   article, auteur, document, forum
+// renvoie false si rien n'a ete modifie, true sinon
 //
 // http://doc.spip.org/@modifier_contenu
 function modifier_contenu($type, $id, $options, $c=false) {
@@ -64,10 +65,8 @@ function modifier_contenu($type, $id, $options, $c=false) {
 	foreach ($champs as $champ => $val)
 		$update[] = $champ . '=' . _q($val);
 
-	if (!count($update)) return;
-
-	if ($options['supplement_sql'])
-		$update[] = $options['supplement_sql'];
+	if (!count($update))
+		return false;
 
 	spip_query($q = "UPDATE spip_$table_objet SET ".join(', ',$update)." WHERE $id_table_objet=$id");
 
@@ -101,6 +100,7 @@ function modifier_contenu($type, $id, $options, $c=false) {
 		)
 	);
 
+	return true;
 }
 
 // http://doc.spip.org/@revision_document
@@ -118,7 +118,6 @@ function revision_document($id_document, $c=false) {
 
 // http://doc.spip.org/@revision_auteur
 function revision_auteur($id_auteur, $c=false) {
-	include_spip('inc/modifier');
 
 	return modifier_contenu('auteur', $id_auteur,
 		array(
@@ -129,5 +128,52 @@ function revision_auteur($id_auteur, $c=false) {
 
 }
 
+// Quand on edite un forum, on tient a conserver l'original
+// sous forme d'un forum en reponse, de statut 'original'
+function conserver_original($id_forum) {
+	$s = spip_query("SELECT id_forum FROM spip_forum WHERE id_parent="._q($id_forum)." AND statut='original'");
+
+	if (spip_num_rows($s))
+		return true;
+
+	// recopier le forum
+	$t = spip_fetch_array(
+		spip_query("SELECT date_heure,titre,texte,auteur,email_auteur,nom_site,url_site,ip,id_auteur,idx,id_thread FROM spip_forum WHERE id_forum="._q($id_forum))
+	);
+
+	if ($t
+	AND spip_query("INSERT spip_forum (date_heure,titre,texte,auteur,email_auteur,nom_site,url_site,ip,id_auteur,idx,id_thread) VALUES (".join(',',array_map('_q', $t)).")")) {
+		$id_copie = spip_insert_id();
+		spip_query("UPDATE spip_forum SET id_parent="._q($id_forum).", statut='original' WHERE id_forum=$id_copie");
+		return true;
+	}
+
+	return false;
+}
+
+// http://doc.spip.org/@revision_auteur
+function revision_forum($id_forum, $c=false) {
+
+	if (!conserver_original($id_forum)) {
+		spip_log("erreur de sauvegarde de l'original");
+		return;
+	}
+
+	$r = modifier_contenu('forum', $id_forum,
+		array(
+			'champs' => array('titre', 'texte', 'auteur', 'email_auteur', 'nom_site', 'url_site', 'ip'),
+			'nonvide' => array('titre' => _T('info_sans_titre'))
+		),
+		$c);
+
+	// s'il y a vraiment eu une modif, on stocke le numero IP courant
+	// ainsi que le nouvel id_auteur dans le message modifie
+	if ($r) {
+		spip_query("UPDATE spip_forum SET ip="._q($GLOBALS['ip']).", id_auteur="._q($GLOBALS['auteur_session']['id_auteur'])." WHERE id_forum="._q($id_forum));
+	}
+
+	return $r;
+}
+
 
 ?>
-- 
GitLab