Happy New Year!
[platal.git] / modules / profile.php
index f85558e..5617b7c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2010 Polytechnique.org                              *
+ *  Copyright (C) 2003-2011 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -30,7 +30,7 @@ class ProfileModule extends PLModule
             'fiche.php'                  => $this->make_hook('fiche',                      AUTH_PUBLIC),
             'profile'                    => $this->make_hook('profile',                    AUTH_PUBLIC),
             'profile/private'            => $this->make_hook('profile',                    AUTH_COOKIE),
-            'profile/ax'                 => $this->make_hook('ax',                         AUTH_COOKIE, 'admin'),
+            'profile/ax'                 => $this->make_hook('ax',                         AUTH_COOKIE, 'admin,edit_directory'),
             'profile/edit'               => $this->make_hook('p_edit',                     AUTH_MDP),
             'profile/ajax/address'       => $this->make_hook('ajax_address',               AUTH_COOKIE, 'user', NO_AUTH),
             'profile/ajax/tel'           => $this->make_hook('ajax_tel',                   AUTH_COOKIE, 'user', NO_AUTH),
@@ -139,25 +139,25 @@ class ProfileModule extends PLModule
         exit;
     }
 
-    /** Tries to return the correct user from given hrpid
-     * Will redirect to $returnurl$hrpid if $hrpid was empty
+    /** Tries to return the correct profile from a given hrpid.
      */
-    private function findProfile($returnurl, $hrpid = null)
+    private function findProfile($hrpid = null)
     {
         if (is_null($hrpid)) {
             $user = S::user();
             if (!$user->hasProfile()) {
                 return PL_NOT_FOUND;
             } else {
-                pl_redirect($returnurl . $user->profile()->hrid());
+                $profile = $user->profile();
             }
         } else {
             $profile = Profile::get($hrpid);
-            if (!$profile) {
-                return PL_NOT_FOUND;
-            } else if (!S::user()->canEdit($profile) && Platal::notAllowed()) {
-                return PL_FORBIDDEN;
-            }
+        }
+
+        if (!$profile) {
+            return PL_NOT_FOUND;
+        } else if (!S::user()->canEdit($profile) && Platal::notAllowed()) {
+            return PL_FORBIDDEN;
         }
         return $profile;
     }
@@ -165,10 +165,13 @@ class ProfileModule extends PLModule
     function handler_photo_change(&$page, $hrpid = null)
     {
         global $globals;
-        $profile = $this->findProfile('photo/change/', $hrpid);
+        $profile = $this->findProfile($hrpid);
         if (! ($profile instanceof Profile) && ($profile == PL_NOT_FOUND || $profile == PL_FORBIDDEN)) {
             return $profile;
         }
+        if (is_null($hrpid)) {
+            pl_redirect('photo/change/' . $profile->hrid());
+        }
 
         $page->changeTpl('profile/trombino.tpl');
         $page->assign('hrpid', $profile->hrid());
@@ -232,17 +235,6 @@ class ProfileModule extends PLModule
         if (is_null($id)) {
             return PL_NOT_FOUND;
         }
-        $pid = (!is_numeric($id) || S::admin()) ? Profile::getPID($id) : null;
-        if (is_null($pid)) {
-            if (S::logged()) {
-                $page->trigError($id . " inconnu dans l'annuaire.");
-            }
-            return PL_NOT_FOUND;
-        }
-
-        // Now that we know this is an existing profile, we can switch to the
-        // appropriate template.
-        $page->changeTpl('profile/profile.tpl', SIMPLE);
 
         // Determines the access level at which the profile will be displayed.
         if (!S::logged() || !S::user()->checkPerms('directory_ax') || Env::v('view') == 'public') {
@@ -258,13 +250,30 @@ class ProfileModule extends PLModule
             $page->assign('with_pending_pic', true);
         }
 
-        // Fetches profile's and profile's owner information and redirects to
-        // marketing if the owner has not subscribed and the requirer has logged in.
-        $profile = Profile::get($pid, Profile::FETCH_ALL, $view);
-        $owner = $profile->owner();
-        if (S::logged() && !is_null($owner) && $owner->state == 'pending') {
-            pl_redirect('marketing/public/' . $profile->hrid());
+        $pid = (!is_numeric($id) || S::admin()) ? Profile::getPID($id) : null;
+        if (is_null($pid)) {
+            $owner = User::getSilent($id);
+            if ($owner) {
+                $profile = $owner->profile(true, Profile::FETCH_ALL, $view);
+                if ($profile) {
+                    $pid = $profile->id();
+                }
+            }
+        } else {
+            // Fetches profile's and profile's owner information and redirects to
+            // marketing if the owner has not subscribed and the requirer has logged in.
+            $profile = Profile::get($pid, Profile::FETCH_ALL, $view);
+            $owner = $profile->owner();
+        }
+        if (is_null($pid)) {
+            if (S::logged()) {
+                $page->kill($id . " inconnu dans l'annuaire.");
+            }
+            return PL_NOT_FOUND;
         }
+        // Now that we know this is an existing profile, we can switch to the
+        // appropriate template.
+        $page->changeTpl('profile/profile.tpl', SIMPLE);
 
         // Profile view are logged.
         if (S::logged()) {
@@ -304,13 +313,23 @@ class ProfileModule extends PLModule
     {
         global $globals;
 
-        $profile = $this->findProfile('profile/edit/', $hrpid);
+        if (in_array($hrpid, array('general', 'adresses', 'emploi', 'poly', 'deco', 'skill', 'mentor'))) {
+            $aux = $opened_tab;
+            $opened_tab = $hrpid;
+            $hrpid = $aux;
+            $url_error = true;
+        } else {
+            $url_error = false;
+        }
+        $profile = $this->findProfile($hrpid);
         if (! ($profile instanceof Profile) && ($profile == PL_NOT_FOUND || $profile == PL_FORBIDDEN)) {
             return $profile;
         }
+        if (is_null($hrpid) || $url_error) {
+            pl_redirect('profile/edit/' . $profile->hrid() . (is_null($opened_tab) ? '' : '/' . $opened_tab));
+        }
 
         // Build the page
-        $page->addJsLink('ajax.js');
         $page->addJsLink('education.js', false); /* dynamic content */
         $page->addJsLink('grades.js', false);    /* dynamic content */
         $page->addJsLink('profile.js');
@@ -381,7 +400,7 @@ class ProfileModule extends PLModule
         $page->assign('address', array());
     }
 
-    function handler_ajax_tel(&$page, $prefid, $prefname, $telid)
+    function handler_ajax_tel(&$page, $prefid, $prefname, $telid, $subField, $mainField, $mainId)
     {
         pl_content_headers("text/html");
         $page->changeTpl('profile/phone.tpl', NO_SKIN);
@@ -390,6 +409,11 @@ class ProfileModule extends PLModule
         $page->assign('telid', $telid);
         $phone = new Phone();
         $page->assign('tel', $phone->toFormArray());
+        if ($mainField) {
+            $page->assign('subField', $subField);
+            $page->assign('mainField', $mainField);
+            $page->assign('mainId', $mainId);
+        }
     }
 
     function handler_ajax_edu(&$page, $eduid, $class)
@@ -495,7 +519,7 @@ class ProfileModule extends PLModule
 
         // Retrieves referents' countries.
         $res = XDB::query(
-                "SELECT  gc.countryFR
+                "SELECT  gc.country
                    FROM  profile_mentor_country AS m
               LEFT JOIN  geoloc_countries       AS gc ON (m.country = gc.iso_3166_1_a2)
                   WHERE  pid = {?}", $pf->id());
@@ -509,11 +533,11 @@ class ProfileModule extends PLModule
         pl_content_headers("text/html");
         $page->changeTpl('include/field.select.tpl', NO_SKIN);
         $page->assign('name', 'pays_sel');
-        $it = XDB::iterator("SELECT  gc.iso_3166_1_a2 AS id, gc.countryFR AS field
+        $it = XDB::iterator("SELECT  gc.iso_3166_1_a2 AS id, gc.country AS field
                                FROM  geoloc_countries       AS gc
                          INNER JOIN  profile_mentor_country AS mp ON (mp.country = gc.iso_3166_1_a2)
                            GROUP BY  iso_3166_1_a2
-                           ORDER BY  countryFR");
+                           ORDER BY  country");
         $page->assign('list', $it);
     }
 
@@ -589,8 +613,9 @@ class ProfileModule extends PLModule
             }
             $res .= "\n";
         }
-        XDB::query('REPLACE INTO  search_autocomplete
-                          VALUES  ({?}, {?}, {?}, NOW())',
+        XDB::query('INSERT INTO  search_autocomplete (name, query, result, generated)
+                         VALUES  ({?}, {?}, {?}, NOW())
+        ON DUPLICATE KEY UPDATE  result = VALUES(result), generated = VALUES(generated)',
                     $type, $q_normalized, $res);
         echo $res;
         exit();
@@ -607,7 +632,7 @@ class ProfileModule extends PLModule
               FROM group_members AS m
         INNER JOIN groups AS a ON(m.asso_id = a.id)
          LEFT JOIN group_events AS e ON(e.asso_id = m.asso_id AND e.archive = 0)
-             WHERE uid = {?} GROUP BY m.asso_id ORDER BY a.nom', S::i('uid'));
+             WHERE m.uid = {?} GROUP BY m.asso_id ORDER BY a.nom', S::i('uid'));
         $page->assign('assos', $req->fetchAllAssoc());
     }
 
@@ -669,13 +694,14 @@ class ProfileModule extends PLModule
                 S::assert_xsrf_token();
 
                 $data = file_get_contents($_FILES['userfile']['tmp_name']);
-               list($x, $y) = getimagesize($_FILES['userfile']['tmp_name']);
-               $mimetype = substr($_FILES['userfile']['type'], 6);
-               unlink($_FILES['userfile']['tmp_name']);
-                XDB::execute(
-                        "REPLACE INTO profile_photos SET pid={?}, attachmime = {?}, attach={?}, x={?}, y={?}",
-                        $user->profile()->id(), $mimetype, $data, $x, $y);
-               break;
+                list($x, $y) = getimagesize($_FILES['userfile']['tmp_name']);
+                $mimetype = substr($_FILES['userfile']['type'], 6);
+                unlink($_FILES['userfile']['tmp_name']);
+                XDB::execute('INSERT INTO  profile_photos (pid, attachmime, attach, x, y)
+                                   VALUES  ({?}, {?}, {?}, {?}, {?})
+                  ON DUPLICATE KEY UPDATE  attachmime = VALUES(attachmime), attach = VALUES(attach), x = VALUES(x), y = VALUES(y)',
+                             $user->profile()->id(), $mimetype, $data, $x, $y);
+                break;
 
             case "delete":
                 S::assert_xsrf_token();
@@ -730,10 +756,10 @@ class ProfileModule extends PLModule
         $table_editor->describe('degree', 'niveau', true);
         $table_editor->apply($page, $action, $id);
     }
-    function handler_admin_education_degree_set(&$page, $action = 'list', $id = null) {
+    function handler_admin_education_degree_set(&$page, $action = 'list', $id = null, $id2 = null) {
         $page->setTitle('Administration - Correspondances formations - niveau de formation');
         $page->assign('title', 'Gestion des correspondances formations - niveau de formation');
-        $table_editor = new PLTableEditor('admin/education_degree_set', 'profile_education_degree', 'eduid', true);
+        $table_editor = new PLTableEditor('admin/education_degree_set', 'profile_education_degree', 'eduid', true, 'degreeid');
         $table_editor->describe('eduid', 'id formation', true);
         $table_editor->describe('degreeid', 'id niveau', true);
 
@@ -744,7 +770,7 @@ class ProfileModule extends PLModule
         $table_editor->add_option_table('profile_education_degree_enum','profile_education_degree_enum.id = t.degreeid');
         $table_editor->add_option_field('profile_education_degree_enum.degree', 'degree_name', 'niveau');
 
-        $table_editor->apply($page, $action, $id);
+        $table_editor->apply($page, $action, $id, $id2);
     }
     function handler_admin_sections(&$page, $action = 'list', $id = null) {
         $page->setTitle('Administration - Sections');