[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> >>> Annulation de l'évènement";
+ echo "</p>";
+}
+else
+{
+ echo '<p class="moderationheader">';
+ echo ">>> 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 ?</p>';
+echo '<input name="__event_cancelation_confirm" type="submit" value="Oui"/> ';
+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> >>> Visualisation de l'évènement";
+ echo "</p>";
+}
+else
+{
+ echo '<p class="moderationheader">';
+ echo ">>> 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> >>> Prévisualisation de l'évènement";
-echo "</p>";
+if ($user)
+{
+ echo '<p class="moderationheader">';
+ echo "<a href=\"moderation.php\">Modération</a> >>> Prévisualisation de l'évènement";
+ echo "</p>";
+}
+else
+{
+ echo '<p class="moderationheader">';
+ echo ">>> 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> >>> Édition de l'évènement";
-echo "</p>";
+if ($user)
+{
+ echo '<p class="moderationheader">';
+ echo "<a href=\"moderation.php\">Modération</a> >>> Édition de l'évènement";
+ echo "</p>";
+}
+else
+{
+ echo '<p class="moderationheader">';
+ echo ">>> É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