[Devel] r344 - trunk

svn at agendadulibre.org svn at agendadulibre.org
Mer 9 Juil 21:16:16 CEST 2008


Author: thomas
Date: Wed Jul  9 21:15:18 2008
New Revision: 344

Log:
Ajout pour le soumetteur d'un évènement de la possibilité de l'éditer
et de l'annuler après validation. Les modifications sont faites
directement, sans modération a priori. La liste des modérateurs est
néanmoins notifiée de toute modification, ce qui permet une modération
a posterio.

En revanche, l'annulation d'un évènement n'est pour le moment pas
réversible: elle consiste à supprimer l'évènement de la base. Il est
prévu d'améliorer ce point prochainement.

 * schema.sql

   Ajout d'un champ 'secret' dans la table 'events' pour stocker un
   hash aléatoire permettant au soumetteur d'un évènement de
   s'identifier.

 * submit.php

   Lors de l'ajout d'un évènement, génération d'un hash
   aléatoire. L'appel md5(uniqid(rand(), true)) vient de la
   documentation de PHP sur la fonction uniqid().

 * validateevent.php

   Dans le mail reçu par le soumetteur lors de la validation de
   l'évènement par l'équipe de modération, ajout des URLs permettant
   l'édition et l'annulation d'un évènement.

 * showevent.php

   Ajout d'un lien «Annuler évènement» accessible aux modérateurs
   connectés. Tant qu'à offrir la fonctionnalité d'annulation au
   soumetteur d'un évènement, autant la mettre aussi à disposition des
   modérateurs :-)

 * funcs.inc.php

   Ajout d'une fonction get_safe_hash(), dans l'esprit de
   get_safe_integer().

 * editevent.php

   Changement de la fonction save_event() pour tenir compte du cas où
   $user est faux (i.e quand c'est le soumetteur qui a édité
   l'évènement et non un modérateur).

   Changement du coeur du script pour supporter un paramètre GET
   'secret' contenant le hash secret. Deux modes sont donc disponibles
   pour ce script: soit un utilisateur (modérateur) est connecté, et
   la présence du champ 'secret' n'est pas requise, soit l'utilisateur
   n'est pas connecté, et la présence d'un champ 'secret' avec une
   valeur correspondant à celle de la base de données est requise.

   Le script est assez moche, avec pas mal de if($user) {} else {},
   mais je ne voulais pas dupliquer les scripts.

 * cancelevent.php

   Nouveau script permettant l'annulation d'un évènement après sa
   validation.



Added:
   trunk/cancelevent.php
Modified:
   trunk/editevent.php
   trunk/funcs.inc.php
   trunk/schema.sql
   trunk/showevent.php
   trunk/submit.php
   trunk/validateevent.php

Added: trunk/cancelevent.php
==============================================================================
--- (empty file)
+++ trunk/cancelevent.php	Wed Jul  9 21:15:18 2008
@@ -0,0 +1,194 @@
+<?php
+
+/* Copyright 2008
+ * - Thomas Petazzoni <thomas POINT petazzoni CHEZ enix POINT org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+include("bd.inc.php");
+include("funcs.inc.php");
+include("session.inc.php");
+include("user.inc.php");
+include("diff.inc.php");
+
+function cancel_event ($db, $user, $id)
+{
+  global $moderatorlist;
+
+  $sql = "select * from events where id=" . $db->quote_smart($id);
+  $ret = $db->query($sql);
+  if ($ret == FALSE)
+    {
+      error ("La requête <i>" . $sql . "</i> a échoué");
+      return -1;
+    }
+
+  $oldevent = mysql_fetch_object ($ret);
+  if (! $oldevent->moderated)
+    {
+      error ("Évènement non modéré, annulation impossible.");
+      return -1;
+    }
+
+  $sql = "delete from events where id=" . $id;
+  $ret = $db->query ($sql);
+  if ($ret == FALSE)
+    {
+      error ("La requête <i>" . $sql . "</i> a échoué");
+      return -1;
+    }
+
+  $oldevent_str =
+    format_ascii_event ($db, $oldevent->title, date_mysql2timestamp($oldevent->start_time),
+			date_mysql2timestamp($oldevent->end_time),
+			$oldevent->description, $oldevent->city, $oldevent->region, $oldevent->locality,
+			$oldevent->url, $oldevent->contact, $oldevent->submitter, $oldevent->tags);
+
+  if ($user)
+    $modifier = $user->get_login();
+  else
+    $modifier = "le soumetteur de l'évènement";
+
+  calendar_mail ($moderatorlist, "",
+		 "Annulation de l'évènement validé '" . $title . "'",
+		 "Bonjour,\n\n" .
+		 wordwrap("L'évènement validé '" . stripslashes($title) . "' a été annulé par " . $modifier . ".\n") .
+		 "Détail de l'évènement annulé:\n\n" .
+		 "=======================================================\n" .
+		 $oldevent_str . "\n".
+		 "=======================================================\n\n" .
+		 "Bonne journée\n\n".
+		 "-- L'équipe de modération");
+}
+
+$db = new db();
+
+$id = get_safe_integer('id', 0);
+$secret = get_safe_hash('secret', false);
+
+if ($secret == FALSE)
+{
+  $user = new user($db);
+}
+else
+{
+  $sql = "select id from events where id='" . $id . "' and secret='" . $secret . "'";
+  $ret = $db->query($sql);
+  if ($ret == FALSE)
+    {
+      put_header("Annulation d'un évènement");
+      error ("La requête <i>" . $sql . "</i> a échoué");
+      put_footer();
+      exit;
+    }
+
+  if (mysql_num_rows($ret) != 1)
+    {
+      put_header("Annulation d'un évènement");
+      error("Hash d'identification non reconnu");
+      put_footer();
+      exit;
+    }
+
+  $user = false;
+}
+
+if ($_POST['__event_cancelation_confirm'])
+{
+  put_header("Annulation d'un évènement");
+  $ret = cancel_event ($db, $user, $id);
+  if ($ret == 0)
+    {
+      echo "<p>L'évènement a bien été annulé. Il n'apparaît plus dans l'Agenda du Libre.</p>";
+    }
+  put_footer();
+  exit;
+}
+else if ($_POST['__event_cancelation_cancel'])
+{
+  put_header("Annulation d'un évènement");
+  echo "<p>Vous n'avez pas souhaité annuler cet évènement.</p>";
+  put_footer();
+  exit;
+}
+
+put_header("Annulation d'un évènement");
+
+$event = fetch_event($db, $id);
+if (! $event)
+{
+  error("Pas d'évènement avec cet ID");
+  put_footer();
+  exit;
+}
+
+if (! $event->moderated)
+{
+  error("L'annulation d'un évènement non validé n'est pas possible.");
+  put_footer();
+  exit;
+}
+
+if ($user)
+{
+  echo '<p class="moderationheader">';
+  echo "<a href=\"moderation.php\">Modération</a>&nbsp;&gt;&gt;&gt;&nbsp;Annulation de l'évènement";
+  echo "</p>";
+}
+else
+{
+  echo '<p class="moderationheader">';
+  echo "&gt;&gt;&gt;&nbsp;Annulation de l'évènement";
+  echo "</p>";
+}
+
+if ($user)
+  $posturl = "?id=" . $id;
+else
+  $posturl = "?id=" . $id . "&secret=" . $secret;
+
+echo '<div class="moderationbox">';
+echo '<p style="font-weight: bold;">Attention, cet évènement est déjà modéré. Cette annulation le fera disparaître de l\'Agenda du Libre.</p>';
+echo '<form action="' . $posturl . '" method="post">';
+echo '<p style="text-align: center;">Confirmez-vous l\'annulation de cet évènement&nbsp;?</p>';
+echo '<input name="__event_cancelation_confirm" type="submit" value="Oui"/>&nbsp;';
+echo '<input name="__event_cancelation_cancel" type="submit" value="Non"/>';
+echo '</form>';
+echo '</div>';
+
+if ($user)
+{
+  echo '<p class="moderationheader">';
+  echo "<a href=\"moderation.php\">Modération</a>&nbsp;&gt;&gt;&gt;&nbsp;Visualisation de l'évènement";
+  echo "</p>";
+}
+else
+{
+  echo '<p class="moderationheader">';
+  echo "&gt;&gt;&gt;&nbsp;Visualisation de l'évènement";
+  echo "</p>";
+}
+
+echo '<div class="moderationbox">';
+echo format_event ($db, $event->title, strtotime($event->start_time), strtotime($event->end_time),
+		   $event->description, $event->city, $event->region, $event->locality, $event->url,
+		   $event->contact, $event->submitter, $event->tags);
+echo '</div>';
+
+put_footer();
+
+?>

Modified: trunk/editevent.php
==============================================================================
--- trunk/editevent.php	(original)
+++ trunk/editevent.php	Wed Jul  9 21:15:18 2008
@@ -74,12 +74,17 @@
 
   $diff = arr_diff (split ("\n", $oldevent_str), split ("\n", $newevent_str), 1);
 
+  if ($user)
+    $modifier = $user->get_login();
+  else
+    $modifier = "le soumetteur de l'évènement";
+
   if ($oldevent->moderated)
     {
       calendar_mail ($moderatorlist, "",
 		     "Édition de l'évènement validé '" . $title . "'",
 		     "Bonjour,\n\n" .
-		     wordwrap("L'évènement validé '" . stripslashes($title) . "' a été modifié par " . $user->get_login() . ".\n") .
+		     wordwrap("L'évènement validé '" . stripslashes($title) . "' a été modifié par " . $modifier . ".\n") .
 		     "Modifications apportées:\n\n" .
 		     $diff . "\n\n".
 		     "Bonne journée\n\n".
@@ -92,7 +97,7 @@
       calendar_mail ($moderatorlist, "",
 		     "Édition de l'évènement '" . $title . "'",
 		     "Bonjour,\n\n" .
-		     wordwrap("L'évènement '" . stripslashes($title) . "' a été modifié par " . $user->get_login() . ".\n") .
+		     wordwrap("L'évènement '" . stripslashes($title) . "' a été modifié par " . $modifier . ".\n") .
 		     "Modifications apportées:\n\n" .
 		     $diff . "\n\n".
 		     "Bonne journée\n\n".
@@ -102,9 +107,36 @@
 }
 
 $db = new db();
-$user = new user($db);
 
 $id = get_safe_integer('id', 0);
+$secret = get_safe_hash('secret', false);
+
+if ($secret == FALSE)
+{
+  $user = new user($db);
+}
+else
+{
+  $sql = "select id from events where id='" . $id . "' and secret='" . $secret . "'";
+  $ret = $db->query($sql);
+  if ($ret == FALSE)
+    {
+      put_header("Édition d'un évènement");
+      error ("La requête <i>" . $sql . "</i> a échoué");
+      put_footer();
+      exit;
+    }
+
+  if (mysql_num_rows($ret) != 1)
+    {
+      put_header("Édition d'un évènement");
+      error("Hash d'identification non reconnu");
+      put_footer();
+      exit;
+    }
+
+  $user = false;
+}
 
 if ($_POST['__event_save'])
 {
@@ -183,9 +215,18 @@
   $tags        = $event->tags;
 }
 
-echo '<p class="moderationheader">';
-echo "<a href=\"moderation.php\">Modération</a>&nbsp;&gt;&gt;&gt;&nbsp;Prévisualisation de l'évènement";
-echo "</p>";
+if ($user)
+{
+  echo '<p class="moderationheader">';
+  echo "<a href=\"moderation.php\">Modération</a>&nbsp;&gt;&gt;&gt;&nbsp;Prévisualisation de l'évènement";
+  echo "</p>";
+}
+else
+{
+  echo '<p class="moderationheader">';
+  echo "&gt;&gt;&gt;&nbsp;Prévisualisation de l'évènement";
+  echo "</p>";
+}
 
 if ($event->moderated)
 {
@@ -200,12 +241,27 @@
 		   $tags);
 echo '</div>';
 
-echo '<p class="moderationheader">';
-echo "<a href=\"moderation.php\">Modération</a>&nbsp;&gt;&gt;&gt;&nbsp;Édition de l'évènement";
-echo "</p>";
+if ($user)
+{
+  echo '<p class="moderationheader">';
+  echo "<a href=\"moderation.php\">Modération</a>&nbsp;&gt;&gt;&gt;&nbsp;Édition de l'évènement";
+  echo "</p>";
+}
+else
+{
+  echo '<p class="moderationheader">';
+  echo "&gt;&gt;&gt;&nbsp;Édition de l'évènement";
+  echo "</p>";
+}
 
 echo '<div class="moderationbox">';
-echo "<form action=\"?id=".$id."\" method=\"post\">\n";
+
+if ($user)
+  $posturl = "?id=" . $id;
+else
+  $posturl = "?id=" . $id . "&secret=" . $secret;
+
+echo "<form action=\"" . $posturl . "\" method=\"post\">\n";
 edit_event ($db, $title, $start, $end, $description, $city,
 	    $region, $locality, $url, $contact, $submitter,
 	    $tags, TRUE);

Modified: trunk/funcs.inc.php
==============================================================================
--- trunk/funcs.inc.php	(original)
+++ trunk/funcs.inc.php	Wed Jul  9 21:15:18 2008
@@ -761,6 +761,15 @@
   }
 }
 
+function get_safe_hash($name, $default)
+{
+  if (ereg("^[0-9a-f]+$", $_GET[$name])) {
+    return $_GET[$name];
+  } else {
+    return $default;
+  }
+}
+
 function edit_event ($db, $title, $start, $end, $description,
 		     $city, $region, $locality, $url, $contact,
 		     $submitter, $tags, $wants_preview = FALSE)

Modified: trunk/schema.sql
==============================================================================
--- trunk/schema.sql	(original)
+++ trunk/schema.sql	Wed Jul  9 21:15:18 2008
@@ -11,6 +11,7 @@
   `contact` varchar(255) NOT NULL default '',
   `submitter` varchar(255) NOT NULL default '',
   `tags` varchar(255) NOT NULL default '',
+  `secret` varchar(255) NOT NULL default '',
   `moderated` int(11) NOT NULL default '0',
   PRIMARY KEY  (`id`)
 ) TYPE=MyISAM;

Modified: trunk/showevent.php
==============================================================================
--- trunk/showevent.php	(original)
+++ trunk/showevent.php	Wed Jul  9 21:15:18 2008
@@ -96,7 +96,8 @@
 if ($session->exists("agenda_libre_id"))
 {
   echo "<h1>Actions</h1>";
-  echo "<a href=\"editevent.php?id=" . $event_id . "\">Éditer évènement</a>";
+  echo "<a href=\"editevent.php?id=" . $event_id . "\">Éditer évènement</a><br/>";
+  echo "<a href=\"cancelevent.php?id=" . $event_id . "\">Annuler évènement</a>";
 }
 
 echo "</div>";

Modified: trunk/submit.php
==============================================================================
--- trunk/submit.php	(original)
+++ trunk/submit.php	Wed Jul  9 21:15:18 2008
@@ -163,7 +163,7 @@
     $submitter = $contact;
 
   /* Checks are done, add to database */
-  $sql = "INSERT INTO events (title,description,start_time,end_time,city,region,locality,url,contact,submitter,tags,moderated) values (" .
+  $sql = "INSERT INTO events (title,description,start_time,end_time,city,region,locality,url,contact,submitter,tags,moderated,secret) values (" .
     $db->quote_smart($title)                        . "," .
     $db->quote_smart($description)                  . "," .
     $db->quote_smart(date_timestamp2mysql ($start)) . "," .
@@ -175,7 +175,9 @@
     $db->quote_smart($contact)                      . "," .
     $db->quote_smart($submitter)                    . "," .
     $db->quote_smart($tags)                         . "," .
-    "'0')";
+    "'0'"                                           . "," .
+    "'" . md5(uniqid(rand(), true)) . "'"                 .
+    ")";
 
   $ret = $db->query ($sql);
 

Modified: trunk/validateevent.php
==============================================================================
--- trunk/validateevent.php	(original)
+++ trunk/validateevent.php	Wed Jul  9 21:15:18 2008
@@ -49,6 +49,7 @@
   $row = mysql_fetch_object($ret);
   $email = $row->contact;
   $title = $row->title;
+  $secret = $row->secret;
   $link = calendar_absolute_url("showevent.php?id=".$id);
 
   /* Accept event */
@@ -64,10 +65,12 @@
   calendar_mail ($row->submitter, $moderatorlist,
 		 "Évènement '" . $row->title . "' modéré",
 		 "Bonjour,\n\n" .
-		 "L'évènement que vous avez soumis a été modéré par " . $user->get_name() .
-		 ".\nIl est maintenant visible dans l'Agenda à l'adresse\n" . $link . "\n\n" .
-		 "Si vous souhaitez modifier cet évènement ultérieurement, merci de contacter\n" .
-		 "l'équipe de modération à l'adresse moderateurs at agendadulibre.org\n\n" .
+		 wordwrap("L'évènement que vous avez soumis a été modéré par " . $user->get_name() . ". Il est maintenant visible dans l'Agenda à l'adresse : \n") .
+		 "  " . $link . "\n\n" .
+		 wordwrap("Vous pouvez modifier cet évènement ultérieurement pour y ajouter des précisions en vous rendant à l'adresse :\n") .
+		 "  " . calendar_absolute_url("editevent.php?id=" . $id . "&secret=" . $secret) . "\n\n" .
+		 wordwrap("Vous pouvez également l'annuler en vous rendant à l'adresse :\n") .
+		 "  " . calendar_absolute_url("cancelevent.php?id=" . $id . "&secret=" . $secret) . "\n\n" .
 		 "=====================================================\n" .
 		 format_ascii_event ($db, $row->title, date_mysql2timestamp($row->start_time),
 				     date_mysql2timestamp($row->end_time),


Plus d'informations sur la liste de diffusion Devel