diff --git a/htdocs/includes/triggers/interface_all_Demo.class.php-NORUN b/htdocs/includes/triggers/interface_all_Demo.class.php-NORUN
index 18d7b0b8a2c..26521381d3d 100644
--- a/htdocs/includes/triggers/interface_all_Demo.class.php-NORUN
+++ b/htdocs/includes/triggers/interface_all_Demo.class.php-NORUN
@@ -140,6 +140,14 @@ class InterfaceDemo
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
}
elseif ($action == 'USER_LOGOUT')
+ {
+ dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
+ }
+ elseif ($action == 'USER_SETINGROUP')
+ {
+ dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
+ }
+ elseif ($action == 'USER_REMOVEFROMGROUP')
{
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
}
diff --git a/htdocs/install/mysql/migration/3.0.0-3.1.0.sql b/htdocs/install/mysql/migration/3.0.0-3.1.0.sql
index 56fa30c376d..15433786e65 100755
--- a/htdocs/install/mysql/migration/3.0.0-3.1.0.sql
+++ b/htdocs/install/mysql/migration/3.0.0-3.1.0.sql
@@ -117,8 +117,9 @@ ALTER TABLE llx_mailing_cibles ADD COLUMN tag varchar(128) NULL AFTER other;
ALTER TABLE llx_mailing ADD COLUMN tag varchar(128) NULL AFTER email_errorsto;
ALTER TABLE llx_usergroup_user DROP INDEX fk_user;
+ALTER TABLE llx_usergroup_user DROP INDEX uk_user_group_entity;
ALTER TABLE llx_usergroup_user ADD COLUMN entity integer DEFAULT 1 NOT NULL AFTER rowid;
-ALTER TABLE llx_usergroup_user ADD UNIQUE INDEX uk_usergroup_entity (entity,fk_user,fk_usergroup);
+ALTER TABLE llx_usergroup_user ADD UNIQUE INDEX uk_usergroup_user (entity,fk_user,fk_usergroup);
ALTER TABLE llx_usergroup_user ADD CONSTRAINT fk_usergroup_user_fk_user FOREIGN KEY (fk_user) REFERENCES llx_user (rowid);
ALTER TABLE llx_usergroup_user ADD CONSTRAINT fk_usergroup_user_fk_usergroup FOREIGN KEY (fk_usergroup) REFERENCES llx_usergroup (rowid);
diff --git a/htdocs/install/mysql/tables/llx_usergroup_user.key.sql b/htdocs/install/mysql/tables/llx_usergroup_user.key.sql
index 08dd60b186c..f3a58aa1433 100644
--- a/htdocs/install/mysql/tables/llx_usergroup_user.key.sql
+++ b/htdocs/install/mysql/tables/llx_usergroup_user.key.sql
@@ -18,7 +18,7 @@
-- $Id$
-- ===========================================================================
-ALTER TABLE llx_usergroup_user ADD UNIQUE INDEX uk_user_group_entity (entity,fk_user,fk_usergroup);
+ALTER TABLE llx_usergroup_user ADD UNIQUE INDEX uk_usergroup_user (entity,fk_user,fk_usergroup);
ALTER TABLE llx_usergroup_user ADD CONSTRAINT fk_usergroup_user_fk_user FOREIGN KEY (fk_user) REFERENCES llx_user (rowid);
ALTER TABLE llx_usergroup_user ADD CONSTRAINT fk_usergroup_user_fk_usergroup FOREIGN KEY (fk_usergroup) REFERENCES llx_usergroup (rowid);
diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php
index 91af3e6fc32..45cf96ee311 100644
--- a/htdocs/user/class/user.class.php
+++ b/htdocs/user/class/user.class.php
@@ -47,8 +47,8 @@ class User extends CommonObject
var $id=0;
var $ldap_sid;
var $search_sid;
- var $nom;
- var $prenom;
+ var $nom; // TODO deprecated
+ var $prenom; // TODO deprecated
var $lastname;
var $firstname;
var $note;
@@ -530,9 +530,15 @@ class User extends CommonObject
// Maintenant les droits groupes
$sql = "SELECT r.module, r.perms, r.subperms";
- $sql.= " FROM ".MAIN_DB_PREFIX."usergroup_rights as gr, ".MAIN_DB_PREFIX."usergroup_user as gu, ".MAIN_DB_PREFIX."rights_def as r";
- $sql.= " WHERE r.id = gr.fk_id AND gr.fk_usergroup = gu.fk_usergroup AND gu.fk_user = ".$this->id." AND r.perms IS NOT NULL";
+ $sql.= " FROM ".MAIN_DB_PREFIX."usergroup_rights as gr,";
+ $sql.= " ".MAIN_DB_PREFIX."usergroup_user as gu,";
+ $sql.= " ".MAIN_DB_PREFIX."rights_def as r";
+ $sql.= " WHERE r.id = gr.fk_id";
+ $sql.= " AND gr.fk_usergroup = gu.fk_usergroup";
+ $sql.= " AND gu.fk_user = ".$this->id;
+ $sql.= " AND r.perms IS NOT NULL";
$sql.= " AND r.entity = ".$conf->entity;
+ $sql.= " AND gu.entity IN (0,".$conf->entity.")";
if ($moduletag) $sql.= " AND r.module = '".$this->db->escape($moduletag)."'";
dol_syslog('User::getRights sql='.$sql, LOG_DEBUG);
@@ -1474,9 +1480,10 @@ class User extends CommonObject
* Add user into a group
* @param group id du groupe
*/
- function SetInGroup($group, $notrigger=0)
+ function SetInGroup($group, $entity, $notrigger=0)
{
- global $conf;
+ global $conf, $langs, $user;
+
$error=0;
$this->db->begin();
@@ -1484,25 +1491,56 @@ class User extends CommonObject
$sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_user";
$sql.= " WHERE fk_user = ".$this->id;
$sql.= " AND fk_usergroup = ".$group;
- $sql.= " AND entity = ".$conf->entity;
+ $sql.= " AND entity = ".$entity;
$result = $this->db->query($sql);
$sql = "INSERT INTO ".MAIN_DB_PREFIX."usergroup_user (entity, fk_user, fk_usergroup)";
- $sql.= " VALUES (".$conf->entity.",".$this->id.",".$group.")";
+ $sql.= " VALUES (".$entity.",".$this->id.",".$group.")";
$result = $this->db->query($sql);
-
- $this->db->commit();
+ if ($result)
+ {
+ if (! $error && ! $notrigger)
+ {
+ // Appel des triggers
+ include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
+ $interface=new Interfaces($this->db);
+ $result=$interface->run_triggers('USER_SETINGROUP',$this,$user,$langs,$conf);
+ if ($result < 0) { $error++; $this->errors=$interface->errors; }
+ // Fin appel triggers
+ }
+
+ if (! $error)
+ {
+ $this->db->commit();
+ return 1;
+ }
+ else
+ {
+ $this->error=$interface->error;
+ dol_syslog("User::SetInGroup ".$this->error, LOG_ERR);
+ $this->db->rollback();
+ return -2;
+ }
+ }
+ else
+ {
+ $this->error=$this->db->lasterror();
+ dol_syslog("User::SetInGroup ".$this->error, LOG_ERR);
+ $this->db->rollback();
+ return -1;
+ }
}
/**
* Remove a user from a group
* @param group id du groupe
*/
- function RemoveFromGroup($group, $notrigger=0)
+ function RemoveFromGroup($group, $entity, $notrigger=0)
{
- global $conf;
+ global $conf,$langs,$user;
+
$error=0;
$this->db->begin();
@@ -1510,11 +1548,41 @@ class User extends CommonObject
$sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_user";
$sql.= " WHERE fk_user = ".$this->id;
$sql.= " AND fk_usergroup = ".$group;
- $sql.= " AND entity = ".$conf->entity;
+ $sql.= " AND entity = ".$entity;
$result = $this->db->query($sql);
+ if ($result)
+ {
+ if (! $error && ! $notrigger)
+ {
+ // Appel des triggers
+ include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
+ $interface=new Interfaces($this->db);
+ $result=$interface->run_triggers('USER_REMOVEFROMGROUP',$this,$user,$langs,$conf);
+ if ($result < 0) { $error++; $this->errors=$interface->errors; }
+ // Fin appel triggers
+ }
- $this->db->commit();
+ if (! $error)
+ {
+ $this->db->commit();
+ return 1;
+ }
+ else
+ {
+ $this->error=$interface->error;
+ dol_syslog("User::RemoveFromGroup ".$this->error, LOG_ERR);
+ $this->db->rollback();
+ return -2;
+ }
+ }
+ else
+ {
+ $this->error=$this->db->lasterror();
+ dol_syslog("User::RemoveFromGroup ".$this->error, LOG_ERR);
+ $this->db->rollback();
+ return -1;
+ }
}
/**
diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php
index a53dae05dbd..3bb668d7e55 100644
--- a/htdocs/user/class/usergroup.class.php
+++ b/htdocs/user/class/usergroup.class.php
@@ -45,6 +45,7 @@ class UserGroup extends CommonObject
var $id; // Group id
var $entity; // Entity of group
var $nom; // Name of group
+ var $globalgroup; // Global group
var $note; // Note on group
var $datec; // Creation date of group
var $datem; // Modification date of group
@@ -58,10 +59,9 @@ class UserGroup extends CommonObject
* \param DB Handler acces base de donnees
* \param id Id du groupe (0 par defaut)
*/
- function UserGroup($DB, $id=0)
+ function UserGroup($DB)
{
$this->db = $DB;
- $this->id = $id;
return 0;
}
@@ -116,19 +116,22 @@ class UserGroup extends CommonObject
/**
- * \brief Return array of groups objects for a particular user
- * \param usertosearch
- * \return array of groups objects
+ * Return array of groups objects for a particular user
+ * @param usertosearch
+ * @return array of groups objects
*/
- function listGroupsForUser($usertosearch)
+ function listGroupsForUser($userid)
{
+ global $conf;
+
$ret=array();
- $sql = "SELECT g.rowid, g.nom, g.note, g.datec, g.tms as datem";
+ $sql = "SELECT g.rowid, ug.entity as usergroup_entity";
$sql.= " FROM ".MAIN_DB_PREFIX."usergroup as g,";
$sql.= " ".MAIN_DB_PREFIX."usergroup_user as ug";
$sql.= " WHERE ug.fk_usergroup = g.rowid";
- $sql.= " AND ug.fk_user = ".$usertosearch->id;
+ $sql.= " AND ug.fk_user = ".$userid;
+ $sql.= " AND ug.entity IN (0,".$conf->entity.")";
$sql.= " ORDER BY g.nom";
dol_syslog("UserGroup::listGroupsForUser sql=".$sql,LOG_DEBUG);
@@ -138,15 +141,15 @@ class UserGroup extends CommonObject
while ($obj = $this->db->fetch_object($result))
{
$group=new UserGroup($this->db);
- $group->id=$obj->rowid;
- $group->nom=$obj->nom;
- $group->note=$obj->note;
- $group->datec = $obj->datec;
- $group->datem = $obj->datem;
-
+ $group->fetch($obj->rowid);
+ $group->usergroup_entity = $obj->usergroup_entity;
+
$ret[]=$group;
}
+
$this->db->free($result);
+
+ return $ret;
}
else
{
@@ -154,22 +157,24 @@ class UserGroup extends CommonObject
dol_syslog("UserGroup::listGroupsForUser ".$this->error, LOG_ERR);
return -1;
}
- return $ret;
}
/**
- * \brief Return array of users id for group
- * \return array of users id
+ * Return array of users id for group
+ * @return array of users
*/
function listUsersForGroup()
{
+ global $conf;
+
$ret=array();
- $sql = "SELECT u.rowid, u.login, u.name, u.firstname";
+ $sql = "SELECT u.rowid, ug.entity as usergroup_entity";
$sql.= " FROM ".MAIN_DB_PREFIX."user as u,";
$sql.= " ".MAIN_DB_PREFIX."usergroup_user as ug";
$sql.= " WHERE ug.fk_user = u.rowid";
$sql.= " AND ug.fk_usergroup = ".$this->id;
+ $sql.= " AND u.entity IN (0,".$conf->entity.")";
dol_syslog("UserGroup::listUsersForGroup sql=".$sql,LOG_DEBUG);
$result = $this->db->query($sql);
@@ -177,9 +182,16 @@ class UserGroup extends CommonObject
{
while ($obj = $this->db->fetch_object($result))
{
- $ret[]=$obj->rowid;
+ $user=new User($this->db);
+ $user->fetch($obj->rowid);
+ $user->usergroup_entity = $obj->usergroup_entity;
+
+ $ret[]=$user;
}
+
$this->db->free($result);
+
+ return $ret;
}
else
{
@@ -187,7 +199,6 @@ class UserGroup extends CommonObject
dol_syslog("UserGroup::listUsersForGroup ".$this->error, LOG_ERR);
return -1;
}
- return $ret;
}
/**
@@ -486,17 +497,25 @@ class UserGroup extends CommonObject
}
/**
- * \brief Cree un groupe en base
- * \return si erreur <0, si ok renvoie id groupe cr
+ * Create group into database
+ * @param notrigger 0=triggers enabled, 1=triggers disabled
+ * @return int <0 if KO, >=0 if OK
*/
- function create()
+ function create($notrigger=0)
{
global $user, $conf, $langs;
$now=dol_now();
- $sql = "INSERT INTO ".MAIN_DB_PREFIX."usergroup (datec, nom, entity)";
- $sql.= " VALUES('".$this->db->idate($now)."','".$this->db->escape($this->nom)."',".$conf->entity.")";
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX."usergroup (";
+ $sql.= "datec";
+ $sql.= ", nom";
+ $sql.= ", entity";
+ $sql.= ") VALUES (";
+ $sql.= "'".$this->db->idate($now)."'";
+ $sql.= ",'".$this->db->escape($this->nom)."'";
+ $sql.= ",".($this->globalgroup ? 0 : $conf->entity);
+ $sql.= ")";
dol_syslog("UserGroup::Create sql=".$sql, LOG_DEBUG);
$result=$this->db->query($sql);
@@ -505,13 +524,16 @@ class UserGroup extends CommonObject
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."usergroup");
if ($this->update(1) < 0) return -2;
-
- // Appel des triggers
- include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
- $interface=new Interfaces($this->db);
- $result=$interface->run_triggers('GROUP_CREATE',$this,$user,$langs,$conf);
- if ($result < 0) { $error++; $this->errors=$interface->errors; }
- // Fin appel triggers
+
+ if (! $notrigger)
+ {
+ // Appel des triggers
+ include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
+ $interface=new Interfaces($this->db);
+ $result=$interface->run_triggers('GROUP_CREATE',$this,$user,$langs,$conf);
+ if ($result < 0) { $error++; $this->errors=$interface->errors; }
+ // Fin appel triggers
+ }
return $this->id;
}
@@ -523,7 +545,6 @@ class UserGroup extends CommonObject
}
}
-
/**
* Update group into database
* @param notrigger 0=triggers enabled, 1=triggers disabled
@@ -536,15 +557,16 @@ class UserGroup extends CommonObject
$error=0;
$sql = "UPDATE ".MAIN_DB_PREFIX."usergroup SET ";
- $sql .= " nom = '".$this->db->escape($this->nom)."',";
- $sql .= " note = '".$this->db->escape($this->note)."'";
- $sql .= " WHERE rowid = ".$this->id;
+ $sql.= " nom = '".$this->db->escape($this->nom)."'";
+ $sql.= ", entity = ".(empty($this->globalgroup) ? $conf->entity : 0);
+ $sql.= ", note = '".$this->db->escape($this->note)."'";
+ $sql.= " WHERE rowid = ".$this->id;
dol_syslog("Usergroup::update sql=".$sql);
$resql = $this->db->query($sql);
if ($resql)
{
- if (!$error && ! $notrigger)
+ if (! $notrigger)
{
// Appel des triggers
include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
diff --git a/htdocs/user/fiche.php b/htdocs/user/fiche.php
index b3b0b5d8565..c6c13d54a93 100644
--- a/htdocs/user/fiche.php
+++ b/htdocs/user/fiche.php
@@ -233,37 +233,22 @@ if (($action == 'addgroup' || $action == 'removegroup') && $caneditfield)
$edituser = new User($db);
$edituser->fetch($_GET["id"]);
- if ($action == 'addgroup') $edituser->SetInGroup($group);
- if ($action == 'removegroup') $edituser->RemoveFromGroup($group);
-
- // We reload members (list has changed)
- $editgroup->members=$editgroup->listUsersForGroup();
-
- // We update group to force triggers that update groups content
- $result=$editgroup->update();
+ if ($action == 'addgroup') $edituser->SetInGroup($group,GETPOST('entity'));
+ if ($action == 'removegroup') $edituser->RemoveFromGroup($group,GETPOST('entity'));
if ($result > 0)
{
header("Location: fiche.php?id=".$_GET["id"]);
exit;
}
+ else
+ {
+ $message.=$edituser->error;
+ }
}
}
-if ($_GET["action"] == 'removegroup' && $caneditfield)
-{
- if ($_GET["group"])
- {
- $edituser = new User($db);
- $edituser->fetch($_GET["id"]);
- $edituser->RemoveFromGroup($_GET["group"]);
-
- Header("Location: fiche.php?id=".$_GET["id"]);
- exit;
- }
-}
-
-if ($_POST["action"] == 'update' && ! $_POST["cancel"])
+if ($action == 'update' && ! $_POST["cancel"])
{
require_once(DOL_DOCUMENT_ROOT."/lib/files.lib.php");
@@ -549,7 +534,7 @@ if (($action == 'create') || ($action == 'adduserldap'))
}
}
- if ($message) { print $message.'
'; }
+ dol_htmloutput_errors($message);
if ($conf->ldap->enabled && $conf->global->LDAP_SYNCHRO_ACTIVE == 'ldap2dolibarr')
{
@@ -909,7 +894,8 @@ else
$ret=$html->form_confirm("fiche.php?id=$fuser->id",$langs->trans("DeleteAUser"),$langs->trans("ConfirmDeleteUser",$fuser->login),"confirm_delete", '', 0, 1);
if ($ret == 'html') print '
';
}
-
+
+ dol_htmloutput_errors($message);
/*
* Fiche en mode visu
@@ -1217,35 +1203,18 @@ else
print_fiche_titre($langs->trans("ListOfGroupsForUser"),'','');
// On selectionne les groupes auquel fait parti le user
- // TODO move sql query to dao class
- $grouplistid = array();
-
- $sql = "SELECT ug.fk_usergroup";
- $sql.= " FROM ".MAIN_DB_PREFIX."usergroup_user as ug";
- $sql.= ", ".MAIN_DB_PREFIX."usergroup as u";
- $sql.= " WHERE ug.fk_user = ".$fuser->id;
- $sql.= " AND ug.fk_usergroup = u.rowid";
- $sql.= " AND u.entity IN (0,".$conf->entity.")";
-
- $result = $db->query($sql);
- if ($result)
- {
- $num = $db->num_rows($result);
- $i = 0;
-
- while ($i < $num)
- {
- $obj = $db->fetch_object($result);
-
- $grouplistid[]=$obj->fk_usergroup;
- $i++;
- }
- }
- else {
- dol_print_error($db);
- }
-
- $db->free($resql);
+ $exclude = array();
+
+ $usergroup=new UserGroup($db);
+ $groupslist = $usergroup->listGroupsForUser($fuser->id);
+
+ if (! empty($groupslist))
+ {
+ foreach($groupslist as $groupforuser)
+ {
+ $exclude[]=$groupforuser->id;
+ }
+ }
if ($caneditgroup)
{
@@ -1253,10 +1222,11 @@ else
print '