* Finish task#43849,43851

This commit is contained in:
zenggang
2021-11-12 02:36:43 +00:00
parent c004b06e1e
commit 430ded3626
7 changed files with 370 additions and 1 deletions
+126
View File
@@ -304,6 +304,7 @@ class gitlab extends control
{
$gitlabGroupList = $this->gitlab->apiGetGroups($gitlabID, $orderBy);
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseGroup;
$this->view->gitlabID = $gitlabID;
$this->view->gitlabGroupList = $gitlabGroupList;
$this->view->orderBy = $orderBy;
@@ -329,6 +330,7 @@ class gitlab extends control
$gitlab = $this->gitlab->getByID($gitlabID);
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->group->create;
$this->view->gitlab = $gitlab;
$this->view->gitlabID = $gitlabID;
$this->display();
@@ -355,12 +357,129 @@ class gitlab extends control
$gitlab = $this->gitlab->getByID($gitlabID);
$group = $this->gitlab->apiGetSingleGroup($gitlabID, $groupID);
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->group->edit;
$this->view->gitlab = $gitlab;
$this->view->group = $group;
$this->view->gitlabID = $gitlabID;
$this->display();
}
/**
* Delete a gitlab group.
*
* @param int $gitlabID
* @param int $groupID
* @access public
* @return void
*/
public function deleteGroup($gitlabID, $groupID, $confirm = 'no')
{
if($confirm != 'yes') die(js::confirm($this->lang->gitlab->group->confirmDelete , inlink('deleteGroup', "gitlabID=$gitlabID&groupID=$groupID&confirm=yes")));
$reponse = $this->gitlab->apiDeleteGroup($gitlabID, $groupID);
if(!$reponse or substr($reponse->message, 0, 2) == '20') die(js::reload('parent'));
die(js::alert($reponse->message));
}
/**
* Manage a gitlab group members.
*
* @param int $gitlabID
* @param int $groupID
* @access public
* @return void
*/
public function manageGroupMembers($gitlabID, $groupID)
{
if($_POST)
{
$data = (array) fixer::input('post')->get();
extract($data);
$ids = array_filter($ids);
if(count($ids) != count(array_unique($ids))) return $this->send(array('result' => 'fail', 'message' => $this->lang->gitlab->group->repeatError));
$newMembers = array();
foreach($ids as $key => $id)
{
/* Check whether each member has selected accesslevel. */
if(empty($levels[$key])) return $this->send(array('result' => 'fail', 'message' => $this->lang->gitlab->group->memberAccessLevel . $this->lang->gitlab->group->emptyError ));
$newMembers[$id] = (object)array('access_level'=>$levels[$key], 'expires_at'=>$expires[$key]);
}
$currentMembers = $this->gitlab->apiGetGroupMembers($gitlabID, $groupID);
/* Get the updated,deleted data. */
$addedMembers = $deletedMembers = $updatedMembers = array();
foreach($currentMembers as $currentMember)
{
if(empty($newMembers[$currentMember->id]))
{
$deletedMembers[] = $currentMember->id;
}
else
{
if($newMembers[$currentMember->id]->access_level != $currentMember->access_level or $newMembers[$currentMember->id]->expires_at != $currentMember->expires_at) $updatedMembers[] = (object)array('user_id' => $currentMember->id, 'access_level' => $newMembers[$currentMember->id]->access_level, 'expires_at' => $newMembers[$currentMember->id]->expires_at);
}
}
/* Get the added data. */
foreach($newMembers as $id => $newMember)
{
$exist = FALSE;
foreach($currentMembers as $currentMember)
{
if($currentMember->id == $id)
{
$exist = TRUE;
break;
}
}
if($exist == FALSE) $addedMembers[] = (object)array('user_id' => $id, 'access_level' => $newMembers[$id]->access_level, 'expires_at' => $newMembers[$id]->expires_at);
}
if(count($addedMembers) > 0)
{
foreach($addedMembers as $addedMember)
{
$this->gitlab->apiCreateGroupMember($gitlabID, $groupID, $addedMember);
}
}
if(count($updatedMembers) > 0)
{
foreach($updatedMembers as $updatedMember)
{
$this->gitlab->apiUpdateGroupMember($gitlabID, $groupID, $updatedMember);
}
}
if(count($deletedMembers) > 0)
{
foreach($deletedMembers as $deletedMemberID)
{
$this->gitlab->apiDeleteGroupMember($gitlabID, $groupID, $deletedMemberID);
}
}
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('groupBrowse', "gitlabID=$gitlabID")));
}
/* Get gitlab users data. */
$gitlabUserList = $this->gitlab->apiGetUsers($gitlabID);
$gitlabUsers = array(''=>'');
foreach($gitlabUserList as $gitlabUser)
{
$gitlabUsers[$gitlabUser->id] = $gitlabUser->realname;
}
$accessLevels = $this->lang->gitlab->accessLevels;
$currentMembers = $this->gitlab->apiGetGroupMembers($gitlabID, $groupID);
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->group->manageMembers;
$this->view->currentMembers = $currentMembers;
$this->view->gitlabUsers = $gitlabUsers;
$this->view->gitlabID = $gitlabID;
$this->display();
}
/**
* Browse gitlab project.
*
@@ -370,6 +489,7 @@ class gitlab extends control
*/
public function userBrowse($gitlabID)
{
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseUser;
$this->view->gitlabID = $gitlabID;
$this->view->gitlabUserList = $this->gitlab->apiGetUsers($gitlabID);
$this->display();
@@ -394,6 +514,7 @@ class gitlab extends control
$userPairs = $this->loadModel('user')->getPairs('noclosed|noletter');
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->user->create;
$this->view->userPairs = $userPairs;
$this->view->gitlabID = $gitlabID;
$this->display();
@@ -421,6 +542,7 @@ class gitlab extends control
$user = $this->gitlab->apiGetSingleUser($gitlabID, $userID);
$zentaoBindAccount = $this->dao->select('account')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('openID')->eq($user->id)->fetch('account');
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->user->edit;
$this->view->user = $user;
$this->view->userPairs = $userPairs;
$this->view->zentaoBindAccount = $zentaoBindAccount;
@@ -454,6 +576,7 @@ class gitlab extends control
*/
public function projectBrowse($gitlabID)
{
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseProject;
$this->view->gitlabID = $gitlabID;
$this->view->gitlabProjectList = $this->gitlab->apiGetProjects($gitlabID);
$this->display();
@@ -488,6 +611,7 @@ class gitlab extends control
if($namespace->kind == 'group') $namespaces[$namespace->id] = $namespace->path;
}
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->project->create;
$this->view->gitlab = $gitlab;
$this->view->user = $user;
$this->view->namespaces = $namespaces;
@@ -514,6 +638,8 @@ class gitlab extends control
}
$project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID);
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->project->edit;
$this->view->project = $project;
$this->view->gitlabID = $gitlabID;
$this->display();
+46
View File
@@ -0,0 +1,46 @@
/**
* Save team members.
*
* @access public
* @return void
*/
function saveMembers()
{
$('#saveBtn').addClass('hidden');
$('#submit').removeClass('hidden');
$('#submit').click();
}
/**
* Add item.
*
* @param object $obj
* @access public
* @return void
*/
function addItem(obj)
{
var item = $('#addItem').html().replace(/%i%/g, i);
$(obj).closest('tr').after('<tr class="addedItem">' + item + '</tr>');
var selects = $(obj).closest('tr').next('tr').find('select');
selects.each(function()
{
$(this).trigger('liszt:updated');
$(this).chosen();
});
$(obj).closest('tr').next('tr').find('.form-date').datetimepicker();
i ++;
}
/**
* Delete item.
*
* @param object $obj
* @access public
* @return void
*/
function deleteItem(obj)
{
if($('#teamForm .table tbody').children().length < 2) return false;
$(obj).closest('tr').remove();
}
+11
View File
@@ -55,6 +55,12 @@ $lang->gitlab->bindUserError = "Can not bind users repeatedly %s";
$lang->gitlab->importIssueError = "The execution to which this issue belongs is not selected.";
$lang->gitlab->importIssueWarn = "There is a problem of import failure, you can try to import again.";
$lang->gitlab->accessLevel[10] = 'Guest';
$lang->gitlab->accessLevel[20] = 'Reporter';
$lang->gitlab->accessLevel[30] = 'Developer';
$lang->gitlab->accessLevel[40] = 'Maintainer';
$lang->gitlab->accessLevel[50] = 'Owner';
$lang->gitlab->project = new stdclass;
$lang->gitlab->project->id = "Project ID";
$lang->gitlab->project->name = "Project name";
@@ -131,3 +137,8 @@ $lang->gitlab->group->createOn = "Created on";
$lang->gitlab->group->members = "Group Members";
$lang->gitlab->group->confirmDelete = 'Do you want to delete this GitLab group?';
$lang->gitlab->group->emptyError = "cannot be empty";
$lang->gitlab->group->manageMembers = 'Manage Group Members';
$lang->gitlab->group->memberName = 'Account';
$lang->gitlab->group->memberAccessLevel = 'Access Level';
$lang->gitlab->group->memberExpiresAt = 'Expiration time';
$lang->gitlab->group->repeatError = "Group members cannot be added repeatedly";
+11
View File
@@ -55,6 +55,12 @@ $lang->gitlab->bindUserError = "不能重复绑定用户 %s";
$lang->gitlab->importIssueError = "未选择该issue所属的执行。";
$lang->gitlab->importIssueWarn = "存在导入失败的issue,可再次尝试导入。";
$lang->gitlab->accessLevels[10] = '客人';
$lang->gitlab->accessLevels[20] = '报告者';
$lang->gitlab->accessLevels[30] = '开发者';
$lang->gitlab->accessLevels[40] = '维护者';
$lang->gitlab->accessLevels[50] = '所有者';
$lang->gitlab->project = new stdclass;
$lang->gitlab->project->id = "项目ID";
$lang->gitlab->project->name = "项目名称";
@@ -131,3 +137,8 @@ $lang->gitlab->group->createOn = "创建于";
$lang->gitlab->group->members = "群组成员";
$lang->gitlab->group->confirmDelete = '确认删除该GitLab群组吗?';
$lang->gitlab->group->emptyError = "不能为空";
$lang->gitlab->group->manageMembers = '群组成员管理';
$lang->gitlab->group->memberName = '账号';
$lang->gitlab->group->memberAccessLevel = '角色权限';
$lang->gitlab->group->memberExpiresAt = '过期时间';
$lang->gitlab->group->repeatError = "群组成员不能重复添加";
+93
View File
@@ -474,6 +474,30 @@ class gitlabModel extends model
return $users;
}
/**
* Get group members of one gitlab.
*
* @param int $gitlabID
* @param int $groupID
* @access public
* @return object
*/
public function apiGetGroupMembers($gitlabID, $groupID)
{
$apiRoot = $this->getApiRoot($gitlabID);
$url = sprintf($apiRoot, "/groups/$groupID/members/all");
$allResults = array();
for($page = 1; true; $page++)
{
$results = json_decode(commonModel::http($url . "&&page={$page}&per_page=100"));
if(!empty($results)) $allResults = array_merge($allResults, $results);
if(count($results)<100) break;
}
return $allResults;
}
/**
* Get namespaces of one gitlab.
*
@@ -582,6 +606,58 @@ class gitlabModel extends model
return json_decode(commonModel::http($url, $project));
}
/**
* Add a gitab group member by api.
*
* @param int $gitlabID
* @param int $groupID
* @param object $member
* @access public
* @return object
*/
public function apiCreateGroupMember($gitlabID, $groupID, $member)
{
if(empty($member->user_id) or empty($member->access_level)) return false;
$apiRoot = $this->getApiRoot($gitlabID);
$url = sprintf($apiRoot, "/groups/{$groupID}/members");
return json_decode(commonModel::http($url, $member));
}
/**
* Update a gitab group member by api.
*
* @param int $gitlabID
* @param int $groupID
* @param object $member
* @access public
* @return object
*/
public function apiUpdateGroupMember($gitlabID, $groupID, $member)
{
if(empty($member->user_id) or empty($member->access_level)) return false;
$apiRoot = $this->getApiRoot($gitlabID);
$url = sprintf($apiRoot, "/groups/{$groupID}/members/{$member->user_id}");
return json_decode(commonModel::http($url, $member, $options = array(CURLOPT_CUSTOMREQUEST => 'PUT')));
}
/**
* Delete a gitab group member by api.
*
* @param int $gitlabID
* @param int $groupID
* @param int $memberID
* @access public
* @return object
*/
public function apiDeleteGroupMember($gitlabID, $groupID, $memberID)
{
$apiRoot = $this->getApiRoot($gitlabID);
$url = sprintf($apiRoot, "/groups/{$groupID}/members/{$memberID}");
return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE')));
}
/**
* Create a gitab user by api.
*
@@ -633,6 +709,23 @@ class gitlabModel extends model
return json_decode(commonModel::http($url, $group, $options = array(CURLOPT_CUSTOMREQUEST => 'PUT')));
}
/**
* Delete a gitab group by api.
*
* @param int $gitlabID
* @param int $groupID
* @access public
* @return object
*/
public function apiDeleteGroup($gitlabID, $groupID)
{
if(empty($groupID)) return false;
$apiRoot = $this->getApiRoot($gitlabID);
$url = sprintf($apiRoot, "/groups/{$groupID}");
return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE')));
}
/**
* Update a gitab project by api.
*
+1 -1
View File
@@ -51,7 +51,7 @@
<td class='text' title='<?php echo substr($gitlabGroup->created_at, 0, 10);?>'><?php echo substr($gitlabGroup->created_at, 0, 10);?></td>
<td class='c-actions text-left'>
<?php
common::printLink('gitlab', 'groupMembers', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", "<i class='icon icon-team'></i> ", '',"title={$lang->gitlab->group->members} class='btn btn-primary'");
common::printLink('gitlab', 'manageGroupMembers', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", "<i class='icon icon-team'></i> ", '',"title={$lang->gitlab->group->manageMembers} class='btn btn-primary'");
common::printLink('gitlab', 'editGroup', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", "<i class='icon icon-edit'></i> ", '', "title={$lang->gitlab->group->edit} class='btn btn-primary'");
if(common::hasPriv('gitlab', 'delete')) echo html::a($this->createLink('gitlab', 'deleteGroup', "gitlabID=$gitlabID&groupID=$gitlabGroup->id"), '<i class="icon-trash"></i>', 'hiddenwin', "title='{$lang->gitlab->group->confirmDelete}' class='btn'");
?>
@@ -0,0 +1,82 @@
<?php include '../../common/view/header.html.php';?>
<?php js::set('oldAccountList', array_keys($currentMembers));?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<span class='btn btn-link btn-active-text'>
<?php echo html::a('###', "<span class='text'> {$lang->gitlab->group->manageMembers}</span>");?>
</span>
</div>
</div>
<div id='mainContent' class='main-content'>
<form class='main-form form-ajax' method='post' id='teamForm'>
<table class='table table-form'>
<thead>
<tr class='text-center'>
<th><?php echo $lang->gitlab->group->memberName;?></th>
<th><?php echo $lang->gitlab->group->memberAccessLevel;?></th>
<th class='c-date'><?php echo $lang->gitlab->group->memberExpiresAt;?></th>
<th class="c-actions"><?php echo $lang->actions;?></th>
</tr>
</thead>
<tbody>
<?php $i = 0;?>
<?php foreach($currentMembers as $member):?>
<tr>
<td><?php echo html::input("names[$i]", $member->name, "class='form-control' readonly");?></td>
<td><?php echo html::select("levels[$i]", array(''=>'') + $this->lang->gitlab->accessLevels, $member->access_level, "class='form-control chosen'");?></td>
<td>
<?php echo html::input("expires[$i]", $member->expires_at, "class='form-control form-date'");?>
<?php echo html::hidden("ids[$i]", $member->id);?>
</td>
<td class='c-actions text-center'>
<?php echo html::a('javascript:;', "<i class='icon-plus'></i>", '', "onclick='addItem(this)' class='btn btn-link'");?>
<?php echo html::a('javascript:;', "<i class='icon icon-close'></i>", '', "onclick='deleteItem(this)' class='btn btn-link'");?>
</td>
</tr>
<?php $i ++;?>
<?php endforeach;?>
<?php for($j = 0; $j < 5; $j ++):?>
<tr class='addedItem'>
<td><?php echo html::select("ids[$i]", $gitlabUsers, '', "class='form-control chosen'");?></td>
<td><?php echo html::select("levels[$i]", array(''=>'') + $this->lang->gitlab->accessLevels, '', "class='form-control chosen'");?></td>
<td><?php echo html::input("expires[$i]", '', "class='form-control form-date'");?></td>
<td class='c-actions text-center'>
<?php echo html::a('javascript:;', "<i class='icon-plus'></i>", '', "onclick='addItem(this)' class='btn btn-link'");?>
<?php echo html::a('javascript:;', "<i class='icon icon-close'></i>", '', "onclick='deleteItem(this)' class='btn btn-link'");?>
</td>
</tr>
<?php $i ++;?>
<?php endfor;?>
</tbody>
<tfoot>
<tr>
<td colspan='6' class='text-center form-actions'>
<?php
echo html::submitButton('', '', 'hidden btn btn-wide btn-primary');
echo html::commonButton($lang->save, 'onclick="saveMembers()" id="saveBtn"', 'btn btn-wide btn-primary');
echo html::backButton();
?>
</td>
</tr>
</tfoot>
</table>
<?php js::set('i', $i);?>
</form>
</div>
<div>
<?php $i = '%i%';?>
<table class='hidden'>
<tr id='addItem' class='hidden'>
<td><?php echo html::select("ids[]", $gitlabUsers, '', "class='form-control'");?></td>
<td><?php echo html::select("levels[]", array(''=>'') + $this->lang->gitlab->accessLevels, '', "class='form-control'");?></td>
<td><?php echo html::input("expires[$i]", '', "class='form-control form-date'");?></td>
<td class='c-actions text-center'>
<?php echo html::a('javascript:;', "<i class='icon-plus'></i>", '', "onclick='addItem(this)' class='btn btn-link'");?>
<?php echo html::a('javascript:;', "<i class='icon icon-close'></i>", '', "onclick='deleteItem(this)' class='btn btn-link'");?>
</td>
</tr>
</table>
</div>
<?php include '../../common/view/footer.html.php';?>