#592: User can unsubscribe from a group
authorx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Thu, 7 Dec 2006 20:16:58 +0000 (20:16 +0000)
committerx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Thu, 7 Dec 2006 20:16:58 +0000 (20:16 +0000)
git-svn-id: svn+ssh://murphy/home/svn/platal/trunk@1256 839d8a87-29fc-0310-9880-83ba4fa771e5

ChangeLog
modules/xnetgrp.php
templates/xnet/groupe/asso.tpl
templates/xnet/groupe/edit.tpl
templates/xnet/groupe/membres-add.tpl
templates/xnet/groupe/membres-del.tpl
upgrade/0.9.13/02_xnet.sql

index f7d6ab4..56912f0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -43,6 +43,7 @@ Bug/Wish:
     * Xnet:
         - #570: Fix geoloc skin.                                           -FRU
         - #589: Can attach a file when sending an email                    -FRU
+        - #592: Can unsubscribe                                            -FRU
 
 From 0.9.12 branch:
 
index 00bc231..5dbe9bb 100644 (file)
@@ -82,6 +82,7 @@ class XnetGrpModule extends PLModule
             '%grp/annuaire/vcard' => $this->make_hook('vcard',     AUTH_MDP),
             '%grp/trombi'         => $this->make_hook('trombi',    AUTH_MDP),
             '%grp/subscribe'      => $this->make_hook('subscribe', AUTH_MDP),
+            '%grp/unsubscribe'    => $this->make_hook('unsubscribe', AUTH_MDP),
 
             '%grp/admin/annuaire'
                  => $this->make_hook('admin_annuaire', AUTH_MDP),
@@ -218,7 +219,7 @@ class XnetGrpModule extends PLModule
                         SET  nom={?}, diminutif={?}, cat={?}, dom={?},
                              descr={?}, site={?}, mail={?}, resp={?},
                              forum={?}, mail_domain={?}, ax={?}, pub={?},
-                             sub_url={?}, inscriptible={?}
+                             sub_url={?}, inscriptible={?}, unsub_url={?}
                       WHERE  id={?}",
                       Post::v('nom'), Post::v('diminutif'),
                       Post::v('cat'), Post::i('dom'),
@@ -227,7 +228,7 @@ class XnetGrpModule extends PLModule
                       Post::v('forum'), Post::v('mail_domain'),
                       Post::has('ax'), Post::has('pub')?'private':'public',
                       Post::v('sub_url'), Post::v('inscriptible'),
-                      $globals->asso('id'));
+                      Post::v('unsub_url'),$globals->asso('id'));
                 if (Post::v('mail_domain')) {
                     XDB::execute('INSERT INTO virtual_domains (domain) VALUES({?})',
                                            Post::v('mail_domain'));
@@ -236,13 +237,15 @@ class XnetGrpModule extends PLModule
                 XDB::execute(
                     "UPDATE  groupex.asso
                         SET  descr={?}, site={?}, mail={?}, resp={?},
-                             forum={?}, ax={?}, pub= {?}, sub_url={?}
+                             forum={?}, ax={?}, pub= {?}, sub_url={?},
+                             unsub_url={?}
                       WHERE  id={?}",
                       Post::v('descr'), Post::v('site'),
                       Post::v('mail'), Post::v('resp'),
                       Post::v('forum'), Post::has('ax'),
                       Post::has('pub')?'private':'public',
-                      Post::v('sub_url'), $globals->asso('id'));
+                      Post::v('sub_url'), Post::v('unsub_url'),
+                      $globals->asso('id'));
             }
 
             if ($_FILES['logo']['name']) {
@@ -706,56 +709,88 @@ class XnetGrpModule extends PLModule
         }
     }
 
-    function handler_admin_member_del(&$page, $user = null)
+    function unsubscribe(&$user)
     {
-        global $globals;
-
-        new_groupadmin_page('xnet/groupe/membres-del.tpl');
-        $user = get_infos($user);
-        if (empty($user)) {
-            return PL_NOT_FOUND;
-        }
-        $page->assign('user', $user);
-
-        if (!Post::has('confirm')) {
-            return;
-        }
-
+        global $globals, $page;
         XDB::execute(
                 "DELETE FROM  groupex.membres WHERE uid={?} AND asso_id={?}",
                 $user['uid'], $globals->asso('id'));
 
-        // don't unsubscribe email from list if other user use same email
         $user_same_email = get_infos($user['email']);
+        $domain = $globals->asso('mail_domain');
 
-        if (($domain = $globals->asso('mail_domain')) && empty($user_same_email)) {
+        if (!$domain || !empty($user_same_email)) {
+            return true;
+        }
 
-            $mmlist = new MMList(S::v('uid'), S::v('password'), $domain);
-            $listes = $mmlist->get_lists($user['email2']);
+        $mmlist = new MMList(S::v('uid'), S::v('password'), $domain);
+        $listes = $mmlist->get_lists($user['email2']);
 
-            foreach ($listes as $liste) {
-                if ($liste['sub'] == 2) {
+        $may_update = may_update();
+        $warning    = false;
+        foreach ($listes as $liste) {
+            if ($liste['sub'] == 2) {
+                if ($may_update) {
                     $mmlist->mass_unsubscribe($liste['list'], Array($user['email2']));
-                    $page->trig("{$user['prenom']} {$user['nom']} a été"
-                                ." désinscrit de {$liste['list']}");
-                } elseif ($liste['sub']) {
-                    $page->trig("{$user['prenom']} {$user['nom']} a une"
-                                ." demande d'inscription en cours sur la"
-                                ." liste {$liste['list']}@ !");
+                } else {
+                    $mmlist->unsubscribe($liste['list']);
                 }
+            } elseif ($liste['sub']) {
+                $page->trig("{$user['prenom']} {$user['nom']} a une"
+                            ." demande d'inscription en cours sur la"
+                            ." liste {$liste['list']}@ !");
+                $warning = true;
             }
+        }
 
-            XDB::execute(
-                    "DELETE FROM  virtual_redirect
-                           USING  virtual_redirect
-                      INNER JOIN  virtual USING(vid)
-                           WHERE  redirect={?} AND alias LIKE {?}", $user['email'], '%@'.$domain);
-            if (mysql_affected_rows()) {
-                $page->trig("{$user['prenom']} {$user['nom']} a été désabonné des alias du groupe !");
-            }
+        XDB::execute(
+                "DELETE FROM  virtual_redirect
+                       USING  virtual_redirect
+                  INNER JOIN  virtual USING(vid)
+                       WHERE  redirect={?} AND alias LIKE {?}", $user['email'], '%@'.$domain);
+        return !$warning;
+    }
+
+    function handler_unsubscribe(&$page)
+    {
+        new_group_page('xnet/groupe/membres-del.tpl');
+        $user = get_infos(S::v('forlife'));
+        if (empty($user)) {
+            return PL_NOT_FOUND;
         }
+        $page->assign('self', true);
+        $page->assign('user', $user);
 
-        $page->trig("{$user['prenom']} {$user['nom']} a été retiré du groupe !");
+        if (!Post::has('confirm')) {
+            return;
+        }
+
+        if ($this->unsubscribe($user)) {
+            $page->trig('Vous avez été désinscrit du groupe avec succès');
+        } else {
+            $page->trig('Vous avez été désinscrit du groupe, mais des erreurs se sont produites lors des désinscriptions des alias et des mailing-lists.');
+        }
+        $page->assign('is_member', false);
+    }
+
+    function handler_admin_member_del(&$page, $user = null)
+    {
+        new_groupadmin_page('xnet/groupe/membres-del.tpl');
+        $user = get_infos($user);
+        if (empty($user)) {
+            return PL_NOT_FOUND;
+        }
+        $page->assign('user', $user);
+
+        if (!Post::has('confirm')) {
+            return;
+        }
+
+        if ($this->unsubscribe($user)) {
+            $page->trig("{$user['prenom']} {$user['nom']} a été désabonné du groupe !");
+        } else {
+            $page->trig("{$user['prenom']} {$user['nom']} a été désabonné du groupe, mais des erreurs subsistent !");
+        }
     }
 
     function handler_admin_member(&$page, $user)
index 187000d..1aee2f9 100644 (file)
       <a href="{if $asso.sub_url}{$asso.sub_url}{else}{$platal->ns}subscribe{/if}">m'inscrire</a>
     </td>
   </tr>
+  {elseif $is_member}
+  <tr>
+    <td class="titre">
+      Me désinscrire :
+    </td>
+    <td>
+      <a href="{if $asso.unsub_url}{$asso.unsub_url}{else}{$platal->ns}unsubscribe{/if}">me désinscrire</a>
+    </td>
+  </tr>
   {/if}
 
   {if $asso.ax}
index 239d7b2..0a1455d 100644 (file)
     </tr>
 
     <tr>
+      <td class="titre">
+        Lien pour la désinscription:<br/>
+        <em>laisser vide par défaut</em>
+      </td>
+      <td>
+        <input type="text" size="40" name="unsub_url" value="{$asso.unsub_url}" />
+      </td>
+    </tr>
+
+    <tr>
       <td class="titre center" colspan="2">
         <input type="checkbox" value="1" name="ax" {if $asso.ax}checked="checked"{/if} />
         groupe agréé par l'AX
index f17a5de..e52c7f8 100644 (file)
@@ -20,7 +20,7 @@
 {*                                                                        *}
 {**************************************************************************}
 
-<script type="text/javascript">
+<script type="text/javascript">//<![CDATA[
 {literal}
 function xStateChange(box)
 {
@@ -48,7 +48,7 @@ function searchX()
       '{/literal}{$platal->ns}{literal}member/new/ajax?prenom=' + prenom + '&nom=' + nom + '&promo=' + promo);
 }
 {/literal}
-</script>
+//]]></script>
 
 <h1>{$asso.nom} : Ajout d'un membre</h1>
 
index b11ff3b..a325106 100644 (file)
 {if $smarty.post.confirm}
 
 <p class="descr">
+{if !$self}
 <a href="{$platal->ns}annuaire">retour à l'annuaire</a>
+{else}
+<a href="">retour à l'accueil</a>
+{/if}
 </p>
 
 {else}
  
-<h1>{$asso.nom} : gestion des memebres</h1>
+<h1>{$asso.nom} : gestion des membres</h1>
 
 <h2>
   Suppression du membre : {$user.prenom} {$user.nom}
 </h2>
 
 
-<form method="post" action="{$platal->ns}member/del/{$platal->argv[1]}">
+<form method="post" action="{$platal->pl_self()}">
   <div class="center">
     <p class="descr">
+    {if $self}
+    Etes-vous sûr de vouloir vous désinscrire du groupe {$asso.nom} et de toutes
+    les listes de diffusion associées ?
+    {else}
     Etes-vous sûr de vouloir supprimer {$user.prenom} {$user.nom} du groupe,
     lui retirer tous les droits associés à son statut de membre,
     et le désabonner de toutes les listes de diffusion du groupe ?
+    {/if}
     </p>
-    <input type='submit' name='confirm' value='Oui, je le désinscris complètement du groupe !' />
+    <input type='submit' name='confirm' value='Oui, je {if $self}me{else}le{/if} désinscris complètement du groupe !' />
   </div>
 </form>
 
index afff7ed..8c224b2 100644 (file)
@@ -1,4 +1,5 @@
 use groupex;
 alter table membres change origine origine enum('X', 'ext', 'groupe') not null default 'X';
+alter table asso add column unsub_url varchar(255) not null;
 use x4dat;
 # vim:set syntax=mysql: