Imrpoves group's X finder, and use it for merging accounts.
authorStéphane Jacob <sj@m4x.org>
Sun, 4 Dec 2011 22:53:08 +0000 (23:53 +0100)
committerStéphane Jacob <sj@m4x.org>
Wed, 7 Dec 2011 10:50:42 +0000 (11:50 +0100)
Signed-off-by: Stéphane Jacob <sj@m4x.org>
htdocs/javascript/xnet_members.js [new file with mode: 0644]
modules/xnetgrp.php
templates/xnetgrp/members_new_form.tpl [new file with mode: 0644]
templates/xnetgrp/membres-add.tpl
templates/xnetgrp/membres-edit.tpl
templates/xnetgrp/membres-new-search.tpl

diff --git a/htdocs/javascript/xnet_members.js b/htdocs/javascript/xnet_members.js
new file mode 100644 (file)
index 0000000..3f8999b
--- /dev/null
@@ -0,0 +1,61 @@
+/***************************************************************************
+ *  Copyright (C) 2003-2011 Polytechnique.org                              *
+ *  http://opensource.polytechnique.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                *
+ ***************************************************************************/
+
+function xStateChange(box, baseurl)
+{
+    $('.details').toggle();
+    $('#search_result').updateHtml(baseurl + 'member/new/ajax?login=' + $('#email').val());
+}
+
+var nom;
+var prenom;
+var promo;
+function searchX(baseurl)
+{
+    if ($('#nom').val() == nom && $('#prenom').val() == prenom && $('#promo').val() == promo) {
+       return;
+    }
+    nom = $('#nom').val();
+    prenom = $('#prenom').val();
+    promo = $('#promo').val();
+    $('#search_result').updateHtml(baseurl + 'member/new/ajax?prenom=' + prenom + '&nom=' + nom + '&promo=' + promo,
+        function (data) {
+            updateSuggestions(baseurl, $('select:[name=userid]').val());
+    });
+}
+
+function updateSuggestions(baseurl, uid)
+{
+    $('#broken').hide();
+    $('#marketing').hide();
+    if (uid && uid != 0) {
+        $.xget(baseurl + 'member/reg/' + uid, function(data) {
+            if (data) {
+                $('#broken').show();
+                $('#broken').find('[name=broken]').attr('checked', 'checked');
+            } else {
+                $('#marketing').show();
+                $('#marketing').find('[name=marketing]').attr('checked', 'checked');
+            }
+        });
+    }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 812836e..4fccb1b 100644 (file)
@@ -51,6 +51,7 @@ class XnetGrpModule extends PLModule
             '%grp/member/new/ajax' => $this->make_hook('admin_member_new_ajax', AUTH_PASSWD, 'groups', NO_AUTH),
             '%grp/member/del'      => $this->make_hook('admin_member_del',      AUTH_PASSWD, 'groupadmin'),
             '%grp/member/suggest'  => $this->make_hook('admin_member_suggest',  AUTH_PASSWD, 'groupadmin'),
+            '%grp/member/reg'      => $this->make_hook('admin_member_reg',      AUTH_PASSWD, 'groupadmin'),
 
             '%grp/rss'             => $this->make_token_hook('rss',             AUTH_PUBLIC),
             '%grp/announce/new'    => $this->make_hook('edit_announce',         AUTH_PASSWD, 'groupadmin'),
@@ -881,6 +882,7 @@ class XnetGrpModule extends PLModule
         global $globals;
 
         $page->changeTpl('xnetgrp/membres-add.tpl');
+        $page->addJsLink('xnet_members.js');
 
         if (is_null($email)) {
             return;
@@ -909,16 +911,20 @@ class XnetGrpModule extends PLModule
                 XDB::query('UPDATE  accounts
                                SET  email = {?}
                              WHERE  uid = {?} AND email IS NULL',
-                           Post::t('email'), $user->id());
+                           $email, $user->id());
                 // Add email for marketing if required.
-                if (Env::v('market')) {
+                if (Env::v('marketing')) {
                     $market = Marketing::get($user->uid, $email);
                     if (!$market) {
                         $market = new Marketing($user->uid, $email, 'group', $globals->asso('nom'),
-                                                Env::v('market_from'), S::v('uid'));
+                                                Env::v('marketing_from'), S::v('uid'));
                         $market->add();
                     }
                 }
+            } elseif (Env::v('broken')) {
+                // Add email for broken if required.
+                $valid = new BrokenReq(S::user(), $user, $email, 'Groupe : ' . $globals->asso('nom'));
+                $valid->submit();
             }
         } else {
             $user = User::getSilent($email);
@@ -1042,20 +1048,34 @@ class XnetGrpModule extends PLModule
         $page->assign('hruid', $hruid);
     }
 
+    function handler_admin_member_reg($page, $uid)
+    {
+        pl_content_headers('text/plain');
+
+        $user = User::getSilentWithUID($uid);
+        if ($user && $user->state != 'pending' && $user->hasProfile()) {
+            echo true;
+        }
+        echo false;
+        exit();
+    }
+
     function handler_admin_member_new_ajax($page)
     {
         pl_content_headers("text/html");
         $page->changeTpl('xnetgrp/membres-new-search.tpl', NO_SKIN);
         $users = array();
+        $same_email = false;
         if (Env::has('login')) {
             $user = User::getSilent(Env::t('login'));
             if ($user && $user->state != 'pending') {
-                $users = array($user);
+                $users = array($user->id() => $user);
+                $same_email = true;
             }
         }
         if (empty($users)) {
             list($lastname, $firstname) = str_replace(array('-', ' ', "'"), '%', array(Env::t('nom'), Env::t('prenom')));
-            $cond = new PFC_And(new PFC_Not(new UFC_Registered()));
+            $cond = new PFC_And();
             if (!empty($lastname)) {
                 $cond->addChild(new UFC_NameTokens($lastname, array(), false, false, Profile::LASTNAME));
             }
@@ -1072,7 +1092,9 @@ class XnetGrpModule extends PLModule
                 $users = array();
             }
         }
+
         $page->assign('users', $users);
+        $page->assign('same_email', $same_email);
     }
 
     function unsubscribe(PlUser $user, $remember = false)
@@ -1195,7 +1217,7 @@ class XnetGrpModule extends PLModule
         }
     }
 
-    private function changeLogin(PlPage $page, PlUser $user, $login)
+    private function changeLogin(PlPage $page, PlUser $user, $login, $req_broken = false, $req_marketing = false, $marketing_from = 'user')
     {
         // Search the user's uid.
         $xuser = User::getSilent($login);
@@ -1215,6 +1237,19 @@ class XnetGrpModule extends PLModule
             return false;
         }
 
+        // Market or suggest new redirection if required.
+        $email = $user->bestEmail();
+        if ($req_broken) {
+            $valid = new BrokenReq(S::user(), $xuser, $email, 'Groupe : ' . Platal::globals()->asso('nom'));
+            $valid->submit();
+        } elseif ($req_marketing) {
+            $market = Marketing::get($xuser->uid, $email);
+            if (!$market) {
+                $market = new Marketing($xuser->uid, $email, 'group', Platal::globals()->asso('nom'), $marketing_from, S::i('uid'));
+                $market->add();
+            }
+        }
+
         if ($user->mergeIn($xuser)) {
             return $xuser->login();
         }
@@ -1235,6 +1270,7 @@ class XnetGrpModule extends PLModule
         }
 
         $page->changeTpl('xnetgrp/membres-edit.tpl');
+        $page->addJsLink('xnet_members.js');
 
         $mmlist = new MMList(S::user(), $globals->asso('mail_domain'));
 
@@ -1244,8 +1280,8 @@ class XnetGrpModule extends PLModule
             require_once 'name.func.inc.php';
 
             // Convert user status to X
-            if (!Post::blank('login_X')) {
-                $forlife = $this->changeLogin($page, $user, Post::t('login_X'));
+            if (!Post::blank('x')) {
+                $forlife = $this->changeLogin($page, $user, Post::i('userid'), Post::b('broken'), Post::b('marketing'), Post::v('marketing_from'));
                 if ($forlife) {
                     pl_redirect('member/' . $forlife);
                 }
diff --git a/templates/xnetgrp/members_new_form.tpl b/templates/xnetgrp/members_new_form.tpl
new file mode 100644 (file)
index 0000000..2776c85
--- /dev/null
@@ -0,0 +1,47 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2011 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.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               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<tr>
+  <td colspan="2">
+    <input type="checkbox" id="x" name="x" onchange="xStateChange(this, '{$platal->ns}');" />
+    <label for="x">Coche cette case s'il s'agit d'un X ou un master ou doctorant de l'X non inscrit à Polytechnique.org.</label>
+  </td>
+</tr>
+<tr class="details" style="display: none">
+  <td class="titre">Nom&nbsp;:</td>
+  <td><input type="text" id="nom" name="nom" size="20" value="" onkeyup="searchX('{$platal->ns}');" /></td>
+</tr>
+<tr class="details" style="display: none">
+  <td class="titre">Prénom&nbsp;:</td>
+  <td><input type="text" id="prenom" name="prenom" size="20" value="" onkeyup="searchX('{$platal->ns}');" /></td>
+</tr>
+<tr class="details" style="display: none">
+  <td class="titre">Promotion&nbsp;:</td>
+  <td><input type="text" id="promo" name="promo" size="4" value="" onkeyup="searchX('{$platal->ns}');" /> <small>(X2004)</small></td>
+</tr>
+<tr class="details pair" style="display: none">
+  <td colspan="2" id="search_result">
+    {include file="xnetgrp/membres-new-search.tpl"}
+  </td>
+</tr>
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
index 43f52a7..1e2ee24 100644 (file)
 {*                                                                        *}
 {**************************************************************************}
 
-<script type="text/javascript">//<![CDATA[
-{literal}
-function xStateChange(box)
-{
-    var state = (box.checked ? '' : 'none');
-    document.getElementById('xnom').style.display = state;
-    document.getElementById('xprenom').style.display = state;
-    document.getElementById('xpromo').style.display = state;
-    document.getElementById('xsearch').style.display = state;
-    $('#search_result').updateHtml('{/literal}{$platal->ns}{literal}member/new/ajax?login='
-                                  + $('#email').val());
-}
-
-var nom;
-var prenom;
-var promo;
-function searchX()
-{
-    if (document.getElementById('nom').value == nom
-       && document.getElementById('prenom').value == prenom
-       && document.getElementById('promo').value == promo) {
-       return;
-    }
-    var nom = document.getElementById('nom').value;
-    var prenom = document.getElementById('prenom').value;
-    var promo = document.getElementById('promo').value;
-    $('#search_result').updateHtml('{/literal}{$platal->ns}{literal}member/new/ajax?prenom=' + prenom + '&nom=' + nom + '&promo=' + promo);
-}
-{/literal}
-//]]></script>
-
 <h1>{$asso->nom}&nbsp;: Ajout d'un membre</h1>
 
 <form method="post" action="{$platal->ns}member/new/">
@@ -77,34 +46,9 @@ function searchX()
           onclick='this.form.action += this.form.email.value' />
       </td>
     </tr>
-    <tr>
-      <td colspan="2">
-        <input type="checkbox" id="x" name="x" onchange="xStateChange(this);" />
-        {* TODO: adapts text for masters and doctorates when required. *}
-        <label for="x">Coche cette case s'il s'agit d'un X ou un master ou doctorant de l'X non inscrit à Polytechnique.org.</label>
-      </td>
-    </tr>
-    <tr id="xnom" style="display: none">
-      <td class="titre">Nom&nbsp;:</td>
-      <td><input type="text" id="nom" name="nom" size="20" value="" onkeyup="searchX();" /></td>
-    </tr>
-    <tr id="xprenom" style="display: none">
-      <td class="titre">Prénom&nbsp;:</td>
-      <td><input type="text" id="prenom" name="prenom" size="20" value="" onkeyup="searchX();" /></td>
-    </tr>
-    <tr id="xpromo" style="display: none">
-      <td class="titre">Promotion&nbsp;:</td>
-      {* TODO: add examples for masters and doctorates when required. *}
-      <td><input type="text" id="promo" name="promo" size="4" value="" onkeyup="searchX();" /> <small>(X2004)</small></td>
-    </tr>
-    <tr id="xsearch" style="display: none" class="pair">
-      <td colspan="2" id="search_result">
-        {include file="xnetgrp/membres-new-search.tpl"}
-      </td>
-    </tr>
+    {include file="xnetgrp/members_new_form.tpl" registered=false}
   </table>
 </form>
-
 {literal}
 <script type="text/javascript">
   $("#email").focus();
index 13f8b18..14aef75 100644 (file)
       var state = (box.value != 'virtual') ? '' : 'none';
       document.getElementById('prenom').style.display = state;
       document.getElementById('sexe').style.display = state;
-      document.getElementById('make_X').style.display = state;
       document.getElementById('password').style.display = state;
   }
-
-  function showXInput(box)
-  {
-     if (box.checked) {
-       document.getElementById('make_X_cb').style.display = 'none';
-       document.getElementById('make_X_login').style.display = '';
-     }
-  }
 {/literal}
 </script>
 
     </tr>
     {/if}
     {if $user->type eq 'xnet'}
-    <tr id="make_X">
-      <td colspan="2">
-        <span id="make_X_cb">
-          <input type="checkbox" name="is_x" id="is_x" onclick="showXInput(this);" onchange="showXInput(this);" />
-          <label for="is_x">coche cette case s'il s'agit d'un X ou un master ou doctorant de l'X</label>
-        </span>
-        <span id="make_X_login" style="display: none">
-          <span class="titre">Identifiant (prenom.nom.promo)&nbsp;:</span>
-          <input type="text" name="login_X" value="" />
-        </span>
-      </td>
-    </tr>
+    {include file="xnetgrp/members_new_form.tpl" registered=true}
     {/if}
     {if $user->type eq 'xnet' && $suggest}
     <tr>
index 8b70729..9c3b5b6 100644 (file)
 {*                                                                        *}
 {**************************************************************************}
 
-  {if t($too_many)}
-  Les critères de recherche ne sont pas assez précis.
-  {elseif !t($users) || $users|@count eq 0}
-  Aucun camarade non-inscrit ne correspond aux informations fournies.
-  {else}
-  Camarades correspondants&nbsp;:
-  <select name="userid" onchange="document.getElementById('marketing').style.display = (this.value == 0 ? 'none' : '')">
-    <option value="0">&nbsp;</option>
-    {foreach item=user from=$users}
-    <option value="{$user->id()}" {if $users|@count == 1}selected="selected"{/if}>{profile user=$user link=false promo=true}</option>
-    {/foreach}
+{if t($too_many)}
+Les critères de recherche ne sont pas assez précis.
+{elseif !t($users) || $users|@count eq 0}
+Aucun camarade non-inscrit ne correspond aux informations fournies.
+{else}
+Camarades correspondants&nbsp;:
+<select name="userid" onchange="updateSuggestions('{$platal->ns}', this.value)">
+  <option value="0" {if $users|@count neq 1}selected="selected"{/if}>&nbsp;</option>
+  {foreach item=user from=$users}
+  <option value="{$user->id()}" {if $users|@count == 1}selected="selected"{/if}>{profile user=$user link=false promo=true}</option>
+  {/foreach}
+</select>
+{if !$same_email}
+<span id="marketing" style="display: none"><br />
+  <label>
+    <input type="checkbox" name="marketing" onchange="$('#marketing_from').toggle()" />
+    Lui envoyer un marketing
+  </label>
+  <select name="marketing_from" id="marketing_from">
+    <option value="user" selected="selected">de ta part.</option>
+    <option value="staff">de la part de Polytechnique.org.</option>
   </select>
-  <span id="marketing" {if $users|@count != 1}style="display: none"{/if}><br />
-    <label><input type="checkbox" name="market" checked="checked"
-        onchange="document.getElementById('from').style.display = (this.checked ? '' : 'none')"/>
-    Lui envoyer un marketing</label>
-    <select name="market_from" id="from">
-      <option value="user" selected="selected">de ta part.</option>
-      <option value="staff">de la part de Polytechnique.org.</option>
-    </select>
-  </span>
-  {/if}
+</span>
+<span id="broken" style="display: none"><br />
+  Ce camarade est inscrit, mais l'email fourni ne fait pas partie de ses adresses de redirection.<br />
+  <label>
+    <input type="checkbox" name="broken" />
+    Lui suggérer d'ajouter cette adresse email à ses redirections.
+  </label>
+</span>
+{/if}
+{/if}
 
 {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}