Adds first and last names to accounts.
authorStéphane Jacob <sj@m4x.org>
Mon, 18 Apr 2011 15:17:38 +0000 (17:17 +0200)
committerStéphane Jacob <sj@m4x.org>
Mon, 18 Apr 2011 15:17:38 +0000 (17:17 +0200)
Signed-off-by: Stéphane Jacob <sj@m4x.org>
classes/user.php
include/name.func.inc.php
modules/admin.php
modules/xnet.php
modules/xnetgrp.php
templates/admin/user.tpl
templates/xnet/edit.tpl
templates/xnetgrp/membres-edit.tpl
upgrade/1.1.1/06_accounts.sql [new file with mode: 0644]
upgrade/1.1.1/accounts.php [new file with mode: 0644]

index cc82689..801fe39 100644 (file)
@@ -159,7 +159,7 @@ class User extends PlUser
 
         $uids = array_map(array('XDB', 'escape'), $uids);
 
-        return XDB::iterator('SELECT  a.uid, a.hruid, a.registration_date, h.uid IS NOT NULL AS homonym,
+        return XDB::iterator('SELECT  a.uid, a.hruid, a.registration_date, h.uid IS NOT NULL AS homonym, a.firstname, a.lastname,
                                       IF(ef.email IS NULL, NULL, CONCAT(ef.email, \'@\', mf.name)) AS forlife,
                                       IF(ef.email IS NULL, NULL, CONCAT(ef.email, \'@\', df.name)) AS forlife_alternate,
                                       IF(eb.email IS NULL, NULL, CONCAT(eb.email, \'@\', mb.name)) AS bestalias,
index d2cbe65..2c9b079 100644 (file)
@@ -317,6 +317,28 @@ function set_alias_names(&$sn_new, $sn_old, $pid, PlUser $user, $update_new = fa
                             WHERE  name = {?}',
                      $new_alias, $user->id(), $user->mainEmailDomain());
     }
+
+    // XXX: Improve this when we optimize names handling.
+    // Updates accounts firt and last names.
+    XDB::execute('UPDATE TABLE  accounts          AS a
+                    INNER JOIN  profile_name_enum AS le ON (le.type = \'lastname\')
+                    INNER JOIN  profile_name_enum AS ce ON (ce.type = \'lastname_ordinary\')
+                    INNER JOIN  profile_name      AS l  ON (a.uid = l.uid AND le.id = l.typeid)
+                     LEFT JOIN  profile_name      AS c  ON (a.uid = c.uid AND ce.id = c.typeid)
+                           SET  a.lastname = IF(c.uid IS NULL, IF(l.particle != \'\', l.name, CONCAT(l.particle, \' \', l.name))
+                                                               IF(c.particle != \'\', c.name, CONCAT(c.particle, \' \', c.name)))
+                         WHERE  a.uid = {?}',
+                 $user->id());
+
+    XDB::execute('UPDATE TABLE  accounts          AS a
+                    INNER JOIN  profile_name_enum AS fe ON (fe.type = \'firstname\')
+                    INNER JOIN  profile_name_enum AS ce ON (ce.type = \'firstname_ordinary\')
+                    INNER JOIN  profile_name      AS f  ON (a.uid = f.uid AND fe.id = f.typeid)
+                     LEFT JOIN  profile_name      AS c  ON (a.uid = c.uid AND ce.id = c.typeid)
+                           SET  a.firstname = IF(c.uid IS NULL, f.name, c.name)
+                         WHERE  a.uid = {?}',
+                 $user->id());
+
     Profile::rebuildSearchTokens($pid, false);
     return $has_new;
 }
index a8e62eb..fd22950 100644 (file)
@@ -450,15 +450,27 @@ class AdminModule extends PLModule
             $to_update['weak_password'] = null;
         } else if (Post::has('update_account')) {
             if (!$user->hasProfile()) {
-                if (Post::s('full_name') != $user->fullName()) {
-                    $to_update['full_name'] = Post::s('full_name');
+                $name_update = false;
+                if (Post::s('lastname') != $user->lastname) {
+                    $to_update['lastname'] = Post::s('lastname');
+                    $name_update = true;
+                }
+                if (Post::s('type') != 'virtual' && Post::s('firstname') != $user->firstname) {
+                    $to_update['firstname'] = Post::s('firstname');
+                    $name_update = true;
+                }
+                if ($name_update) {
+                    if (Post::s('type') != 'virtual') {
+                        $to_update['full_name'] = Post::s('firstname') . ' ' . Post::s('lastname');
+                        $to_update['directory_name'] = mb_strtoupper(Post::s('lastname')) . ' ' . Post::s('firstname');
+                    } else {
+                        $to_update['full_name'] = Post::s('lastname');
+                        $to_update['directory_name'] = mb_strtoupper(Post::s('lastname'));
+                    }
                 }
                 if (Post::s('display_name') != $user->displayName()) {
                     $to_update['display_name'] = Post::s('display_name');
                 }
-                if (Post::s('directory_name') != $user->directoryName()) {
-                    $to_update['directory_name'] = Post::s('directory_name');
-                }
             }
             if (Post::s('sex') != ($user->isFemale() ? 'female' : 'male')) {
                 $to_update['sex'] = Post::s('sex');
index 12c961c..bd95e38 100644 (file)
@@ -395,11 +395,14 @@ Email envoyé à " . Post::t('login'));
             }
 
             // Update user info
+            $full_name = Post::t('firstname') . ' ' . Post::t('lastname');
+            $directory_name = mb_strtoupper(Post::t('lastname')) . ' ' . Post::t('firstname');
             XDB::query('UPDATE  accounts
                            SET  full_name = {?}, directory_name = {?}, display_name = {?},
-                                sex = {?}, email = {?}
+                                firstname = {?}, lastname = {?}, sex = {?}, email = {?}
                          WHERE  uid = {?}',
-                       Post::t('full_name'), Post::t('directory_name'), Post::t('display_name'),
+                       $full_name, $directory_name, Post::t('display_name'),
+                       Post::t('firstname'), Post::t('lastname'),
                        (Post::t('sex') == 'male') ? 'male' : 'female', Post::t('email'), $user->id());
             if (XDB::affectedRows()) {
                 require_once 'emails.inc.php';
index 7b46cfd..6b06bcd 100644 (file)
@@ -719,7 +719,8 @@ class XnetGrpModule extends PLModule
             if (empty($user)) {
                 $parts = explode('.', $mbox);
                 if (count($parts) == 1) {
-                    $display_name = $full_name = $directory_name = ucfirst($mbox);
+                    $lastname = $display_name = $full_name = $directory_name = ucfirst($mbox);
+                    $firstname = '';
                 } else {
                     $firstname = ucfirst($parts[0]);
                     $lastname = ucwords(implode(' ', array_slice($parts, 1)));
@@ -727,9 +728,9 @@ class XnetGrpModule extends PLModule
                     $full_name = "$firstname $lastname";
                     $directory_name = strtoupper($lastname) . " " . $firstname;
                 }
-                XDB::execute('INSERT INTO  accounts (hruid, display_name, full_name, directory_name, email, type, state)
+                XDB::execute('INSERT INTO  accounts (hruid, display_name, full_name, directory_name, firstname, lastname, email, type, state)
                                    VALUES  ({?}, {?}, {?}, {?}, {?}, \'xnet\', \'disabled\')',
-                             $hruid, $display_name, $full_name, $directory_name, $email);
+                             $hruid, $display_name, $full_name, $directory_name, $firstname, $lastname, $email);
                 $user = User::get($hruid);
             }
 
@@ -1007,11 +1008,21 @@ class XnetGrpModule extends PLModule
             $email_changed = (!$user->profile() && strtolower($user->forlifeEmail()) != strtolower(Post::v('email')));
             $from_email = $user->forlifeEmail();
             if ($user->type == 'virtual' || ($user->type == 'xnet' && !$user->perms)) {
+                $lastname = Post::s('lastname');
+                if (Post::s('type') != 'virtual') {
+                    $firstname = Post::s('firstname');
+                    $full_name = $firstname . ' ' . $lastname;
+                    $directory_name = mb_strtoupper($lastname) . ' ' . $firstname;
+                } else {
+                    $firstname = '';
+                    $full_name = $lastname;
+                    $directory_name = mb_strtoupper($lastname);
+                }
                 XDB::query('UPDATE  accounts
                                SET  full_name = {?}, directory_name = {?}, display_name = {?},
-                                    sex = {?}, email = {?}, type = {?}
+                                    firstname = {?}, lastname = {?}, sex = {?}, email = {?}, type = {?}
                              WHERE  uid = {?}',
-                           Post::t('full_name'), Post::t('directory_name'), Post::t('display_name'),
+                           $full_name, $directory_name, Post::t('display_name'), $firstname, $lastname,
                            (Post::t('sex') == 'male') ? 'male' : 'female', Post::t('email'),
                            (Post::t('type') == 'xnet') ? 'xnet' : 'virtual', $user->id());
             } else if (!$user->perms) {
index b369443..c3b7c64 100644 (file)
@@ -137,21 +137,31 @@ $(function() {
       </th>
     </tr>
     <tr>
-      <td class="titre">Nom complet<br />
-        <span class="smaller">Prénom NOM</span>
-      </td>
-      <td>{if $hasProfile}{$user->fullName()}{else}<input type="text" name="full_name" maxlength="255" value="{$user->fullName()}" />{/if}</td>
+      <td class="titre">Nom complet</td>
+      <td>{$user->fullName()}</td>
     </tr>
     <tr>
-      <td class="titre">Nom annuaire<br />
-        <span class="smaller">NOM Prénom</span>
-      </td>
-      <td>{if $hasProfile}{$user->directoryName()}{else}<input type="text" name="directory_name" maxlength="255" value="{$user->directoryName()}" />{/if}</td>
+      <td class="titre">Nom annuaire</td>
+      <td>{$user->directoryName()}</td>
     </tr>
+    {if !$hasProfile}
+    <tr>
+      <td class="titre">Nom</td>
+      <td><input type="text" name="lastname" maxlength="255" value="{$user->lastname}" /></td>
+    </tr>
+    {if $user->type neq 'virtual'}
+    <tr>
+      <td class="titre">Prénom</td>
+      <td><input type="text" name="firstname" maxlength="255" value="{$user->firstname}" /></td>
+    </tr>
+    {/if}
+    {/if}
+    {if $user->type neq 'virtual'}
     <tr>
       <td class="titre">Nom affiché</td>
       <td>{if $hasProfile}{$user->displayName()}{else}<input type="text" name="display_name" maxlength="255" value="{$user->displayName()}" />{/if}</td>
     </tr>
+    {/if}
     <tr>
       <td class="titre">Sexe</td>
       <td>
index d1bd875..30d2d50 100644 (file)
 <form method="post" action="{$platal->ns}edit">
   {xsrf_token_field}
   <table cellpadding="0" cellspacing="0" class='tinybicol'>
-    <tr id="prenom" class="impair">
-      <td class="titre">
-        Nom affiché&nbsp;:
-      </td>
+    <tr class="impair">
+      <td class="titre">Nom complet&nbsp;:</td>
+      <td>{$user->fullName()}</td>
+    </tr>
+    <tr class="impair">
+      <td class="titre">Nom annuaire&nbsp;:</td>
+      <td>{$user->directoryName()}</td>
+    <tr class="impair">
+      <td class="titre">Nom&nbsp;:</td>
       <td>
-        <input type="text" value="{$user->displayName()}" name="display_name" size="40" />
+        <input type="text" value="{$user->lastname}" name="lastname" size="40" />
       </td>
     </tr>
     <tr class="impair">
-      <td class="titre">
-        Nom complet&nbsp;:
-      </td>
+      <td class="titre">Prénom&nbsp;:</td>
       <td>
-        <input type="text" value="{$user->fullName()}" name="full_name" size="40" />
+        <input type="text" value="{$user->firstname}" name="firstname" size="40" />
       </td>
     </tr>
-    <tr class="impair">
+    <tr id="prenom" class="impair">
       <td class="titre">
-        Nom annuaire&nbsp;:
+        Nom affiché&nbsp;:
       </td>
       <td>
-        <input type="text" value="{$user->directoryName()}" name="directory_name" size="40" />
+        <input type="text" value="{$user->displayName()}" name="display_name" size="40" />
       </td>
     </tr>
     <tr id="sexe" class="impair">
index a3347d2..c7ac026 100644 (file)
         </select>
       </td>
     </tr>
-      <tr id="prenom" class="impair" {if $user->type eq "virtual"}style="display: none"{/if}>
-      <td class="titre">
-        Nom affiché&nbsp;:
-      </td>
+    <tr class="impair">
+      <td class="titre">Nom complet&nbsp;:</td>
+      <td>{$user->fullName()}</td>
+    </tr>
+    <tr class="impair">
+      <td class="titre">Nom annuaire&nbsp;:</td>
+      <td>{$user->directoryName()}</td>
+    </tr>
+    <tr class="impair">
+      <td class="titre">Nom&nbsp;:</td>
       <td>
-        <input type="text" value="{$user->displayName()}" name="display_name" size="40" />
+        <input type="text" value="{$user->lastname}" name="lastname" size="40" />
       </td>
     </tr>
+    {if $user->type neq "virtual"}
     <tr class="impair">
-      <td class="titre">
-        Nom complet&nbsp;:
-      </td>
+      <td class="titre">Prénom&nbsp;:</td>
       <td>
-        <input type="text" value="{$user->fullName()}" name="full_name" size="40" />
+        <input type="text" value="{$user->firstname}" name="firstname" size="40" />
       </td>
     </tr>
     <tr class="impair">
-      <td class="titre">
-        Nom annuaire&nbsp;:
-      </td>
+      <td class="titre">Nom affiché&nbsp;:</td>
       <td>
-        <input type="text" value="{$user->directoryName()}" name="directory_name" size="40" />
+        <input type="text" value="{$user->displayName()}" name="display_name" size="40" />
       </td>
     </tr>
+    {/if}
     <tr id="sexe" class="impair" {if $user->type eq "virtual"}style="display: none"{/if}>
       <td class="titre">
         Sexe&nbsp;:
diff --git a/upgrade/1.1.1/06_accounts.sql b/upgrade/1.1.1/06_accounts.sql
new file mode 100644 (file)
index 0000000..4327491
--- /dev/null
@@ -0,0 +1,21 @@
+ALTER TABLE accounts ADD COLUMN firstname VARCHAR(255) DEFAULT NULL AFTER email;
+ALTER TABLE accounts ADD COLUMN lastname VARCHAR(255) DEFAULT NULL AFTER firstname;
+
+UPDATE TABLE  accounts          AS a
+  INNER JOIN  profile_name_enum AS le ON (le.type = 'lastname')
+  INNER JOIN  profile_name_enum AS ce ON (ce.type = 'lastname_ordinary')
+  INNER JOIN  profile_name      AS l  ON (a.uid = l.uid AND le.id = l.typeid)
+   LEFT JOIN  profile_name      AS c  ON (a.uid = c.uid AND ce.id = c.typeid)
+         SET  a.lastname = IF(c.uid IS NULL, IF(l.particle != '', l.name, CONCAT(l.particle, ' ', l.name))
+                                             IF(c.particle != '', c.name, CONCAT(c.particle, ' ', c.name)))
+       WHERE  a.type IN ('x', 'master', 'phd');
+
+UPDATE TABLE  accounts          AS a
+  INNER JOIN  profile_name_enum AS fe ON (fe.type = 'firstname')
+  INNER JOIN  profile_name_enum AS ce ON (ce.type = 'firstname_ordinary')
+  INNER JOIN  profile_name      AS f  ON (a.uid = f.uid AND fe.id = f.typeid)
+   LEFT JOIN  profile_name      AS c  ON (a.uid = c.uid AND ce.id = c.typeid)
+         SET  a.firstname = IF(c.uid IS NULL, f.name, c.name)
+       WHERE  a.type IN ('x', 'master', 'phd');
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/1.1.1/accounts.php b/upgrade/1.1.1/accounts.php
new file mode 100644 (file)
index 0000000..3d2f35a
--- /dev/null
@@ -0,0 +1,34 @@
+#!/usr/bin/php5
+<?php
+
+require_once 'connect.db.inc.php';
+
+$globals->debug = 0; // Do not store backtraces.
+
+$it = XDN::rawIterator('SELECT  uid, full_name, email, type
+                          FROM  accounts
+                         WHERE  type NOT IN (\'x\', \'master\', \'phd\')');
+while ($item = $it->next()) {
+    if ($item['type'] == 'virtual') {
+        $firstname = '';
+        $lastname = $item['full_name'];
+    } elseif (strpos(' ', $item['full_name'])) {
+        list($firstname, $lastname) = explode(' ', $item['full_name']);
+    } else {
+        list($local_part, ) = explode('@', strtolower($item['email']));
+        $parts = explode('.', $local_part);
+        if (count($parts) == 1) {
+            $lastname = ucfirst($local_part);
+            $firstname = '';
+        } else {
+            $firstname = ucfirst($parts[0]);
+            $lastname = ucwords(implode(' ', array_slice($parts, 1)));
+        }
+    }
+    XDB::execute('UPDATE  accounts
+                     SET  firstname = {?}, lastname = {?}',
+                 $firstname, $lastname);
+}
+
+/* vim:set et sw=4 sts=4 ts=4: */
+?>