Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cfg/const.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,7 @@

/** Follows CODES present in roles table - DO NOT CHANGE ON ANY CIRCUNSTANCE */
define('TL_ROLES_MANAGER', 1);
define('TL_ROLES_RESERVED', 2);
define('TL_ROLES_ADMIN', 8);
define('TL_ROLES_LEADER', 9);
define('TL_ROLES_TESTER', 7);
Expand Down
17 changes: 16 additions & 1 deletion firstLogin.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,21 @@
$user->lastName = $args->lastName;
$result = $user->writeToDB($db);

//if user was created successfully check if any projects have default roles defined.
//in positive case assign the default project role to the new user as well.
if(!is_null($user->dbID))
{
$tproject_mgr = new testproject($db);
$projects = $tproject_mgr->get_all();
foreach($projects as $tproj)
{
if(isset($tproj['opt']) && property_exists($tproj['opt'], 'defaultRole') && $tproj['opt']->defaultRole != TL_ROLES_INHERITED)
{
$tproject_mgr->addUserRole($user->dbID,$tproj['id'],$tproj['opt']->defaultRole);
}
}
}

$cfg = config_get('notifications');
if($cfg->userSignUp->enabled)
{
Expand Down Expand Up @@ -189,4 +204,4 @@ function notifyGlobalAdmins(&$dbHandler,&$userObj)
@email_send(config_get('from_email'), $mail['to'], $mail['subject'], $mail['body']);
}
}
}
}
42 changes: 40 additions & 2 deletions gui/templates/project/projectEdit.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
testproject_prefix,availability,mandatory,warning,warning_empty_tcase_prefix,api_key,
warning_empty_tproject_name,testproject_issue_tracker_integration,issue_tracker,
testproject_code_tracker_integration,code_tracker,testproject_reqmgr_integration,reqmgrsystem,
no_rms_defined,no_issuetracker_defined,no_codetracker_defined'}
no_rms_defined,no_issuetracker_defined,no_codetracker_defined,th_roles_testproject,default_auth_method,
no_testproject_default_role'}

{include file="inc_head.tpl" openHead="yes" jsValidate="yes" editorType=$editorType}
{include file="inc_del_onclick.tpl"}
Expand All @@ -38,6 +39,7 @@
var alert_box_title = "{$labels.warning|escape:'javascript'}";
var warning_empty_tcase_prefix = "{$labels.warning_empty_tcase_prefix|escape:'javascript'}";
var warning_empty_tproject_name = "{$labels.warning_empty_tproject_name|escape:'javascript'}";
var public_note = " ({$labels.no_testproject_default_role|escape:'javascript'})";

function validateForm(f)
{
Expand Down Expand Up @@ -78,6 +80,22 @@ function manageTracker(selectOID,targetOID)

}

function setDefaultRole(is_public)
{
var selectRoleObj = document.getElementById('tproject_role_id');
var spanNoteObj = document.getElementById('public_note');
if (is_public.checked == true)
{
selectRoleObj.disabled = false;
spanNoteObj.innerHTML = "";
}
else
{
selectRoleObj.disabled = true;
spanNoteObj.innerHTML = public_note;
}
}

</script>
</head>

Expand Down Expand Up @@ -302,10 +320,30 @@ manageTracker('code_tracker_id','code_tracker_enabled');">

<tr>
<td></td><td>
<input type="checkbox" name="is_public" {if $gui->is_public eq 1} checked="checked" {/if} />
<input type="checkbox" name="is_public" id="is_public" {if $gui->is_public eq 1} checked="checked" {/if} onchange="javascript:setDefaultRole(this);" />
{$labels.public}
</td>
</tr>
<tr>
<td></td>
<td>
{$labels.default_auth_method} {$labels.th_roles_testproject}
<select name="tproject_role_id" id="tproject_role_id">
{foreach item=role from=$gui->allRoles}
<option value="{$role->dbID}"
{if $role->dbID == $gui->default_role_id} selected {/if}>{$role->name|escape}</option>
{/foreach}
</select>
<span id="public_note">{if $gui->is_public eq 0} ({$labels.no_testproject_default_role}){/if}</span></td>
</tr>
{if $doActionValue eq "doUpdate"}
<tr>
<td></td><td>
&emsp;&emsp;<input type="checkbox" name="update_default_role" id="update_default_role" />
{$gui->overwrite_default_role}
</td>
</tr>
{/if}

{if $gui->api_key != ''}
<tr>
Expand Down
46 changes: 46 additions & 0 deletions lib/functions/testproject.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -1930,6 +1930,52 @@ function getUserRoleIDs($tproject_id)
return $roles;
}

/**
* Sets testproject related role assignment for all users
*
* @param integer $tproject_id
* @param integer $role_id
**/
function setAllUsersToRole($tproject_id, $role_id)
{
$retVal = tl::ERROR;
$delQuery = "DELETE FROM {$this->tables['user_testproject_roles']} WHERE testproject_id = {$tproject_id}";
if($this->db->exec_query($delQuery))
{
if($role_id == TL_ROLES_INHERITED)
{
$retVal = tl::OK;
}
else
{
$userQuery = "SELECT id, role_id FROM {$this->tables['users']} " .
"WHERE role_id != " . TL_ROLES_ADMIN;
$userArray = $this->db->get_recordset($userQuery);

if(!is_null($userArray) && $userArray != array())
{
$debugMsg = 'Class:' . __CLASS__ . ' - Method: ' . __FUNCTION__;
$query = "/* debugMsg*/ INSERT INTO {$this->tables['user_testproject_roles']} " .
" (user_id,testproject_id,role_id) VALUES ";
foreach($userArray as $value)
{
$query .= "({$value['id']},{$tproject_id},{$role_id}),";
}
$query = substr($query, 0, strlen($query)-1);
if($this->db->exec_query($query))
{
$testProject = $this->get_by_id($tproject_id);
$role = tlRole::getByID($this->db,$role_id,tlRole::TLOBJ_O_GET_DETAIL_MINIMUM);
logAuditEvent(TLS("audit_users_roles_added_testproject",'all users',
$testProject['name'],$role->name),"ASSIGN",$tproject_id,"testprojects");
$retVal = tl::OK;
}
}
}
}
return $retVal;
}

/**
* Inserts a testproject related role for a given user
*
Expand Down
42 changes: 33 additions & 9 deletions lib/project/projectEdit.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

require_once('../../config.inc.php');
require_once('common.php');
require_once('tlRole.class.php');
require_once("web_editor.php");
$editorCfg = getWebEditorCfg('testproject');
require_once(require_web_editor($editorCfg['type']));
Expand All @@ -40,7 +41,8 @@
$reloadType = 'none'; // domain 'none','reloadNavBar'

$tproject_mgr = new testproject($db);
$args = init_args($tproject_mgr, $_REQUEST, $session_tproject_id);
$role_mgr = new tlRole($db);
$args = init_args($tproject_mgr, $role_mgr, $_REQUEST);

$gui = initializeGui($db,$args);
$of = web_editor('notes',$_SESSION['basehref'],$editorCfg) ;
Expand Down Expand Up @@ -235,13 +237,14 @@
* Important: changes in HTML input elements on the Smarty template
* must be reflected here.
*
* @param class $tprojectMgr project manager class object
* @param class $role_mgr role manager class object
* @param array $request_hash the $_REQUEST
* @param hash session_hash the $_SESSION
* @return singleton object with html values tranformed and other
* generated variables.
* @internal
*/
function init_args($tprojectMgr,$request_hash, $session_tproject_id)
function init_args($tprojectMgr,$role_mgr, $request_hash)
{
$args = new stdClass();
$request_hash = strings_stripSlashes($request_hash);
Expand All @@ -252,7 +255,7 @@ function init_args($tprojectMgr,$request_hash, $session_tproject_id)
$args->$value = isset($request_hash[$value]) ? trim($request_hash[$value]) : null;
}

$intval_keys = array('tprojectID' => 0, 'copy_from_tproject_id' => 0);
$intval_keys = array('tprojectID' => 0, 'copy_from_tproject_id' => 0, 'tproject_role_id' => -1);
foreach ($intval_keys as $key => $value)
{
$args->$key = isset($request_hash[$key]) ? intval($request_hash[$key]) : $value;
Expand All @@ -264,7 +267,8 @@ function init_args($tprojectMgr,$request_hash, $session_tproject_id)
'optReq' => 0,'optInventory' => 0,
'issue_tracker_enabled' => 0,
'code_tracker_enabled' => 0,
'reqmgr_integration_enabled' => 0);
'reqmgr_integration_enabled' => 0,
'update_default_role' => 0);
foreach ($checkbox_keys as $key => $value)
{
$args->$key = isset($request_hash[$key]) ? 1 : $value;
Expand Down Expand Up @@ -329,6 +333,9 @@ function init_args($tprojectMgr,$request_hash, $session_tproject_id)
{
$args->notes = '';
}
$args->allRoles = $role_mgr->getAll($tprojectMgr->db, "WHERE id != 1 AND id != 2 AND id != " . TL_ROLES_ADMIN . " ",
+ null, null, $role_mgr::TLOBJ_O_GET_DETAIL_MINIMUM);
+ $args->default_role_id = TL_ROLES_INHERITED;
}

// sanitize output via black list
Expand Down Expand Up @@ -364,6 +371,7 @@ function prepareOptions($argsObj)
$opts->testPriorityEnabled = $argsObj->optPriority;
$opts->automationEnabled = $argsObj->optAutomation;
$opts->inventoryEnabled = $argsObj->optInventory;
$opts->defaultRole = $argsObj->tproject_role_id;

return $opts;
}
Expand Down Expand Up @@ -460,7 +468,14 @@ function doCreate($argsObj,&$tprojectMgr)
// Need to add specific role on test project in order to not make
// it invisible for me!!!
$tprojectMgr->addUserRole($argsObj->userID,$new_id,$argsObj->user->globalRole->dbID);
}
}
else
{
if($argsObj->tproject_role_id !== -1)
{
$tprojectMgr->setAllUsersToRole($argsObj->tprojectID, $argsObj->tproject_role_id);
}
}
}
}

Expand Down Expand Up @@ -575,7 +590,14 @@ function doUpdate($argsObj,&$tprojectMgr,$sessionTprojectID)
{
$tprojectMgr->addUserRole($argsObj->userID,$argsObj->tprojectID,$argsObj->user->globalRole->dbID);
}
}
}
else
{
if($argsObj->update_default_role === 1 && $argsObj->tproject_role_id !== -1)
{
$tprojectMgr->setAllUsersToRole($argsObj->tprojectID, $argsObj->tproject_role_id);
}
}

$event = new stdClass();
$event->message = TLS("audit_testproject_saved",$argsObj->tprojectName);
Expand All @@ -591,7 +613,7 @@ function doUpdate($argsObj,&$tprojectMgr,$sessionTprojectID)
$op->status_ok=0;
}
}
if($op->status_ok)
if($op->status_ok)
{
if($sessionTprojectID == $argsObj->tprojectID)
{
Expand Down Expand Up @@ -626,6 +648,7 @@ function edit(&$argsObj,&$tprojectMgr)
$argsObj->tprojectName = $tprojectInfo['name'];
$argsObj->projectOptions = $tprojectInfo['opt'];
$argsObj->tcasePrefix = $tprojectInfo['prefix'];
$argsObj->default_role_id = $argsObj->projectOptions->defaultRole;

$k2l = array('color','notes', 'active','is_public','issue_tracker_enabled',
'code_tracker_enabled','reqmgr_integration_enabled','api_key');
Expand Down Expand Up @@ -713,12 +736,12 @@ function create(&$argsObj,&$tprojectMgr)
$gui->active = $argsObj->active;
$gui->is_public = $argsObj->is_public;
$gui->projectOptions = $argsObj->projectOptions = prepareOptions($argsObj);
$gui->tproject_role_id = $argsObj->tproject_role_id;
$gui->doActionValue = 'doCreate';
$gui->buttonValue = lang_get('btn_create');
$gui->caption = lang_get('caption_new_tproject');



new dBug($gui);

$gui->testprojects = $tprojectMgr->get_all(null,array('access_key' => 'id'));
Expand Down Expand Up @@ -769,6 +792,7 @@ function initializeGui(&$dbHandler,$argsObj)
$guiObj = $argsObj;
$guiObj->canManage = $argsObj->user->hasRight($dbHandler,"mgt_modify_product");
$guiObj->found = 'yes';
$guiObj->overwrite_default_role = sprintf(lang_get('overwrite_default_role'), lang_get('testproject'), lang_get('testproject'));

$ent2loop = array('tlIssueTracker' => 'issueTrackers', 'tlCodeTracker' => 'codeTrackers',
'tlReqMgrSystem' => 'reqMgrSystems');
Expand Down
2 changes: 2 additions & 0 deletions locale/en_GB/strings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1636,6 +1636,8 @@ $TLS_reqmgrsystem = 'Req. Management System';
$TLS_no_rms_defined = ' >> There are no Req. Management Systems defined <<';
$TLS_no_issuetracker_defined = ' >> There are no Issue Tracker Systems defined <<';
$TLS_no_codetracker_defined = ' >> There are no Code Tracker Systems defined <<';
$TLS_no_testproject_default_role = 'Note: Default Test Project Role option is only applicable for public projects';
$TLS_overwrite_default_role = "Set new default role for %s, deleting existing User %s roles?";


$TLS_info_failed_loc_prod = 'Failed to localize the Test Project.';
Expand Down