* finish task #4887.
This commit is contained in:
+38
-77
@@ -740,9 +740,10 @@ class block extends control
|
||||
{
|
||||
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
|
||||
|
||||
$status = isset($this->params->type) ? $this->params->type : '';
|
||||
$status = isset($this->params->type) ? $this->params->type : '';
|
||||
$num = isset($this->params->num) ? $this->params->num : '';
|
||||
|
||||
$products = $this->block->getProductsLikeDropMenu($status);
|
||||
$products = $this->block->getProductsLikeDropMenu($status, $num);
|
||||
$productIdList = array_keys($products);
|
||||
|
||||
if(empty($products))
|
||||
@@ -873,7 +874,7 @@ class block extends control
|
||||
$num = isset($this->params->num) ? (int)$this->params->num : 0;
|
||||
|
||||
/* Get projects. */
|
||||
$projects = $this->block->getProjectsLikeDropMenu($status);
|
||||
$projects = $this->block->getProjectsLikeDropMenu($status, $num);
|
||||
if(empty($projects))
|
||||
{
|
||||
$this->view->projects = $projects;
|
||||
@@ -979,9 +980,11 @@ class block extends control
|
||||
{
|
||||
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
|
||||
|
||||
$this->app->loadLang('bug');
|
||||
$status = isset($this->params->type) ? $this->params->type : '';
|
||||
$num = isset($this->params->num) ? (int)$this->params->num : 0;
|
||||
|
||||
$products = $this->block->getProductsLikeDropMenu($status);
|
||||
$products = $this->block->getProductsLikeDropMenu($status, $num);
|
||||
$productIdList = array_keys($products);
|
||||
|
||||
if(empty($products))
|
||||
@@ -990,91 +993,49 @@ class block extends control
|
||||
return false;
|
||||
}
|
||||
|
||||
$testedBuilds = $this->dao->select('build')->from(TABLE_TESTTASK)->where('product')->in(array_keys($products))->andWhere('project')->ne(0)->andWhere('deleted')->eq(0)->fetchPairs();
|
||||
$builds = $this->dao->select('id, product, name, bugs')->from(TABLE_BUILD)->where('id')->in($testedBuilds)->andWhere('deleted')->eq(0)->orderBy('id_desc')->fetchGroup('product', 'id');
|
||||
$openedBugs = $this->dao->select('id, openedBuild')->from(TABLE_BUG)->where('openedBuild')->in($testedBuilds)->andWhere('deleted')->eq(0)->fetchGroup('openedBuild', 'id');
|
||||
|
||||
/* Get bugs. */
|
||||
$bugIDList = array();
|
||||
foreach($builds as $product => $productBuilds)
|
||||
{
|
||||
foreach($productBuilds as $buildID => $build)
|
||||
{
|
||||
/* If don't clone $build, the exploded bugs of build will be stored in dao::$cache and it occurs an error when the qa statistic block be loaded twice. */
|
||||
$build = clone $build;
|
||||
$build->bugs = explode(',', trim($build->bugs, ','));
|
||||
foreach($build->bugs as $bugID) $bugIDList[$bugID] = $bugID;
|
||||
|
||||
$builds[$product][$buildID] = $build;
|
||||
}
|
||||
}
|
||||
foreach($openedBugs as $buildBugs)
|
||||
{
|
||||
foreach($buildBugs as $bugID => $bug) $bugIDList[$bugID] = $bugID;
|
||||
}
|
||||
|
||||
$today = date(DT_DATE1);
|
||||
$yesterday = date(DT_DATE1, strtotime('yesterday'));
|
||||
$testtasks = $this->dao->select('*')->from(TABLE_TESTTASK)->where('product')->in($productIdList)->andWhere('project')->ne(0)->andWhere('deleted')->eq(0)->orderBy('id')->fetchAll('product');
|
||||
$bugs = $this->dao->select("product, count(id) as total,
|
||||
count(assignedTo = '{$this->app->user->account}' or null) as assignedToMe,
|
||||
count(status != 'closed' or null) as unclosed,
|
||||
count((status != 'closed' and status != 'resolved') or null) as unresolved,
|
||||
count(confirmed = '0' or null) as unconfirmed,
|
||||
count((resolvedDate >= '$yesterday' and resolvedDate < '$today') or null) as yesterdayResolved,
|
||||
count((closedDate >= '$yesterday' and closedDate < '$today') or null) as yesterdayClosed")
|
||||
->from(TABLE_BUG)
|
||||
->where('product')->in($productIdList)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->groupBy('product')
|
||||
->fetchAll('product');
|
||||
|
||||
$bugs = $this->loadModel('bug')->getByList($bugIDList, 'id, assignedTo, resolvedDate, closedDate, status');
|
||||
$confirmedBugs = $this->dao->select('objectID')->from(TABLE_ACTION)
|
||||
$confirmedBugs = $this->dao->select('count(product) as product')->from(TABLE_ACTION)
|
||||
->where('objectType')->eq('bug')
|
||||
->andWhere('action')->eq('bugconfirmed')
|
||||
->andWhere('date')->ge($yesterday)
|
||||
->andWhere('date')->lt($today)
|
||||
->fetchPairs();
|
||||
->groupBy('product')
|
||||
->fetchPairs('product', 'product');
|
||||
|
||||
foreach($builds as $product => $productBuilds)
|
||||
foreach($products as $productID => $product)
|
||||
{
|
||||
foreach($productBuilds as $buildID => $build)
|
||||
{
|
||||
$build->total = 0;
|
||||
$build->assignedToMe = 0;
|
||||
$build->unresolved = 0;
|
||||
$build->unconfirmed = 0;
|
||||
$build->unclosed = 0;
|
||||
$build->yesterdayResolved = 0;
|
||||
$build->yesterdayConfirmed = 0;
|
||||
$build->yesterdayClosed = 0;
|
||||
$bug = isset($bugs[$productID]) ? $bugs[$productID] : '';
|
||||
$product->total = empty($bug) ? 0 : $bug->total;
|
||||
$product->assignedToMe = empty($bug) ? 0 : $bug->assignedToMe;
|
||||
$product->unclosed = empty($bug) ? 0 : $bug->unclosed;
|
||||
$product->unresolved = empty($bug) ? 0 : $bug->unresolved;
|
||||
$product->unconfirmed = empty($bug) ? 0 : $bug->unconfirmed;
|
||||
$product->yesterdayResolved = empty($bug) ? 0 : $bug->yesterdayResolved;
|
||||
$product->yesterdayClosed = empty($bug) ? 0 : $bug->yesterdayClosed;
|
||||
$product->yesterdayConfirmed = empty($confirmedBugs[",$productID,"]) ? 0 : $confirmedBugs[",$productID,"];
|
||||
|
||||
$buildOpenedBugs = zget($openedBugs, $buildID, array());
|
||||
$build->bugs = array_flip(array_merge(array_flip($build->bugs), array_flip(array_keys($buildOpenedBugs))));
|
||||
foreach($build->bugs as $key => $bugID)
|
||||
{
|
||||
if(!isset($bugs[$bugID])) continue;
|
||||
|
||||
$bug = $bugs[$bugID];
|
||||
|
||||
if($bug->assignedTo = $this->app->user->account) $build->assignedToMe++;
|
||||
|
||||
if($bug->status != 'closed')
|
||||
{
|
||||
$build->unclosed++;
|
||||
|
||||
if($bug->status != 'resoloved')
|
||||
{
|
||||
$build->unresolved++;
|
||||
|
||||
if($bug->status != 'confirmed') $build->unconfirmed++;
|
||||
}
|
||||
}
|
||||
|
||||
if($bug->resolvedDate >= $yesterday && $bug->resolvedDate < $today) $build->yesterdayResolved++;
|
||||
if($bug->closedDate >= $yesterday && $bug->closedDate < $today) $build->yesterdayClosed++;
|
||||
if(isset($confirmedBugs[$bugID])) $yesterdayConfirmed++;
|
||||
|
||||
$build->total++;
|
||||
}
|
||||
|
||||
$build->assignedRate = $build->total ? round($build->assignedToMe / $build->total * 100, 2) : 0;
|
||||
$build->unresolvedRate = $build->total ? round($build->unresolved / $build->total * 100, 2) : 0;
|
||||
$build->unconfirmedRate = $build->total ? round($build->unconfirmed / $build->total * 100, 2) : 0;
|
||||
$build->unclosedRate = $build->total ? round($build->unclosed / $build->total * 100, 2) : 0;
|
||||
}
|
||||
$product->assignedRate = $product->total ? round($product->assignedToMe / $product->total * 100, 2) : 0;
|
||||
$product->unresolvedRate = $product->total ? round($product->unresolved / $product->total * 100, 2) : 0;
|
||||
$product->unconfirmedRate = $product->total ? round($product->unconfirmed / $product->total * 100, 2) : 0;
|
||||
$product->unclosedRate = $product->total ? round($product->unclosed / $product->total * 100, 2) : 0;
|
||||
$product->testtask = isset($testtasks[$productID]) ? $testtasks[$productID] : '';
|
||||
}
|
||||
|
||||
foreach($products as $product) $product->builds = zget($builds, $product->id, array());
|
||||
|
||||
$this->view->products = $products;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ $lang->block->dynamic = 'Dynamic';
|
||||
$lang->block->assignToMe = 'Assign To Me';
|
||||
$lang->block->lblFlowchart = 'Workflow';
|
||||
$lang->block->welcome = 'Welcome';
|
||||
$lang->block->lblTesttask = 'Show test task';
|
||||
|
||||
$lang->block->leftToday = 'Works for Today';
|
||||
$lang->block->myTask = 'My Task';
|
||||
|
||||
@@ -34,6 +34,7 @@ $lang->block->dynamic = '最新动态';
|
||||
$lang->block->assignToMe = '指派给我';
|
||||
$lang->block->lblFlowchart = '流程图';
|
||||
$lang->block->welcome = '欢迎总览';
|
||||
$lang->block->lblTesttask = '查看测试详情';
|
||||
|
||||
$lang->block->leftToday = '今天剩余工作总计';
|
||||
$lang->block->myTask = '我的任务';
|
||||
@@ -66,8 +67,8 @@ $lang->block->default['product']['1']['title'] = $lang->productCommon . '统计'
|
||||
$lang->block->default['product']['1']['block'] = 'statistic';
|
||||
$lang->block->default['product']['1']['grid'] = 8;
|
||||
|
||||
$lang->block->default['product']['1']['params']['orderBy'] = 'id_desc';
|
||||
$lang->block->default['product']['1']['params']['type'] = 'all';
|
||||
$lang->block->default['product']['1']['params']['type'] = 'all';
|
||||
$lang->block->default['product']['1']['params']['num'] = '20';
|
||||
|
||||
$lang->block->default['product']['2']['title'] = $lang->productCommon . '总览';
|
||||
$lang->block->default['product']['2']['block'] = 'overview';
|
||||
@@ -92,8 +93,8 @@ $lang->block->default['project']['1']['title'] = $lang->projectCommon . '统计'
|
||||
$lang->block->default['project']['1']['block'] = 'statistic';
|
||||
$lang->block->default['project']['1']['grid'] = 8;
|
||||
|
||||
$lang->block->default['project']['1']['params']['orderBy'] = 'id_desc';
|
||||
$lang->block->default['project']['1']['params']['type'] = 'all';
|
||||
$lang->block->default['project']['1']['params']['type'] = 'all';
|
||||
$lang->block->default['project']['1']['params']['num'] = '20';
|
||||
|
||||
$lang->block->default['project']['2']['title'] = $lang->projectCommon . '总览';
|
||||
$lang->block->default['project']['2']['block'] = 'overview';
|
||||
|
||||
+17
-4
@@ -471,6 +471,9 @@ class blockModel extends model
|
||||
$params->type['options'] = $this->lang->block->typeList->product;
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->num['name'] = $this->lang->block->num;
|
||||
$params->num['control'] = 'input';
|
||||
|
||||
return json_encode($params);
|
||||
}
|
||||
|
||||
@@ -487,6 +490,9 @@ class blockModel extends model
|
||||
$params->type['options'] = $this->lang->block->typeList->project;
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->num['name'] = $this->lang->block->num;
|
||||
$params->num['control'] = 'input';
|
||||
|
||||
return json_encode($params);
|
||||
}
|
||||
|
||||
@@ -503,6 +509,9 @@ class blockModel extends model
|
||||
$params->type['options'] = $this->lang->block->typeList->product;
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->num['name'] = $this->lang->block->num;
|
||||
$params->num['control'] = 'input';
|
||||
|
||||
return json_encode($params);
|
||||
}
|
||||
|
||||
@@ -635,10 +644,11 @@ class blockModel extends model
|
||||
* Get products like drop menu order
|
||||
*
|
||||
* @param strint $status
|
||||
* @param int $num
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProductsLikeDropMenu($status)
|
||||
public function getProductsLikeDropMenu($status, $num)
|
||||
{
|
||||
$products = $this->loadModel('product')->getList($status);
|
||||
if(empty($products)) return $products;
|
||||
@@ -678,17 +688,19 @@ class blockModel extends model
|
||||
}
|
||||
$products = $mineProducts + $otherProducts + $closedProducts;
|
||||
|
||||
return $products;
|
||||
if(empty($num)) return $products;
|
||||
return array_slice($products, 0, $num, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get projects like drop menu order
|
||||
*
|
||||
* @param string $status
|
||||
* @param int $num
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProjectsLikeDropMenu($status)
|
||||
public function getProjectsLikeDropMenu($status, $num)
|
||||
{
|
||||
$projectList = $this->loadModel('project')->getList($status);
|
||||
if(empty($projectList)) return $projectList;
|
||||
@@ -712,6 +724,7 @@ class blockModel extends model
|
||||
}
|
||||
$projects = $mineProjects + $otherProjects + $closedProjects;
|
||||
|
||||
return $projects;
|
||||
if(empty($num)) return $projects;
|
||||
return array_slice($projects, 0, $num, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
.block-statistic.block-sm .nav-secondary > li > a {padding: 5px 10px; border-radius: 4px;}
|
||||
.block-statistic.block-sm .nav-secondary > li > a:before {display: none;}
|
||||
.block-statistic.block-sm .nav-secondary > li.switch-icon {width: 40px;}
|
||||
.block-statistic .statistic-menu {height:20px;}
|
||||
</style>
|
||||
<script>
|
||||
<?php $blockNavId = 'nav-' . uniqid(); ?>
|
||||
@@ -80,91 +81,78 @@ $(function()
|
||||
<?php $index = 1;?>
|
||||
<?php foreach($products as $product):?>
|
||||
<div class="tab-pane fade <?php if($index == 1) echo 'active';?> in" id="tabContent<?php echo $product->id;?>">
|
||||
<?php if(!$product->builds):?>
|
||||
<div class="table-empty-tip">
|
||||
<p><span class="text-muted"><?php echo $lang->block->noData;?></span></p>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="statistic-menu input-group space w-400px">
|
||||
<?php if($product->builds):?>
|
||||
<select id='build' name='build' class="form-control chosen">
|
||||
<?php foreach($product->builds as $build):?>
|
||||
<option value="<?php echo $build->id;?>"><?php echo $build->name;?></option>
|
||||
<?php endforeach;?>
|
||||
</select>
|
||||
<div class="input-group-cell">
|
||||
<span class="text-muted small"><?php echo $lang->bug->hasSubmittedTest;?><a href="<?php echo $this->createLink('testtask', 'browse', "productID={$product->id}");?>" class="text-primary"><?php echo $lang->bug->nowToTest;?> <i class="icon icon-right-circle icon-sm"></i></a></span>
|
||||
</div>
|
||||
<?php if($product->testtask):?>
|
||||
<?php echo $product->testtask->name;?>
|
||||
<span class="text-muted small"><a href="<?php echo $this->createLink('testtask', 'browse', "productID={$product->id}");?>" class="text-primary"><?php echo $lang->block->lblTesttask;?> <i class="icon icon-right-circle icon-sm"></i></a></span>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php $buildIndex = 1;?>
|
||||
<?php foreach($product->builds as $build):?>
|
||||
<div class="table-row <?php if($buildIndex != 1) echo 'hidden';?>" id='bugBox<?php echo $build->id;?>'>
|
||||
<div class="table-row" id='bugBox<?php echo $product->id;?>'>
|
||||
<div class="col-5 text-middle text-center">
|
||||
<div class="progress-pie inline-block space progress-pie-100" data-value="<?php echo $build->assignedRate;?>" data-doughnut-size="80">
|
||||
<div class="progress-pie inline-block space progress-pie-100" data-value="<?php echo $product->assignedRate;?>" data-doughnut-size="80">
|
||||
<canvas width="100" height="100" style="width: 100px; height: 100px;"></canvas>
|
||||
<div class="progress-info">
|
||||
<small><?php echo $lang->bug->allBugs . ' Bug';?></small>
|
||||
<strong><span class="progress-value"><?php echo $build->total;?></span></strong>
|
||||
<strong><span class="progress-value"><?php echo $product->total;?></span></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center small with-padding">
|
||||
<span class="label label-dot label-primary"></span> <?php echo $lang->bug->assignToMe;?> <strong><?php echo $build->assignedToMe;?></strong>
|
||||
<span class="label label-dot label-primary"></span> <?php echo $lang->bug->assignToMe;?> <strong><?php echo $product->assignedToMe;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-7">
|
||||
<div class="product-info">
|
||||
<?php if($build->yesterdayResolved):?>
|
||||
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayResolved;?></span> <strong><?php echo $build->yesterdayResolved;?></strong></div>
|
||||
<?php if($product->yesterdayResolved):?>
|
||||
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayResolved;?></span> <strong><?php echo $product->yesterdayResolved;?></strong></div>
|
||||
<?php endif;?>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $build->unresovedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $build->unresovedRate;?>%"></div>
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $product->unresolvedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $product->unresolvedRate;?>%"></div>
|
||||
</div>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->bug->unResolved;?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<strong><?php echo $build->unresolved;?></strong>
|
||||
<strong><?php echo $product->unresolved;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<?php if($build->yesterdayConfirmed):?>
|
||||
<div class="progress-info"><i class="icon icon-exclamation-sign text-danger icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayConfirmed;?></span> <strong><?php echo $build->yesterdayConfirmed;?></strong></div>
|
||||
<?php if($product->yesterdayConfirmed):?>
|
||||
<div class="progress-info"><i class="icon icon-exclamation-sign text-danger icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayConfirmed;?></span> <strong><?php echo $product->yesterdayConfirmed;?></strong></div>
|
||||
<?php endif;?>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $build->unconfirmedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $build->unconfirmedRate;?>%"></div>
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $product->unconfirmedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $product->unconfirmedRate;?>%"></div>
|
||||
</div>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->bug->unconfirmed;?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<strong><?php echo $build->unconfirmed;?></strong>
|
||||
<strong><?php echo $product->unconfirmed;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-info">
|
||||
<?php if($build->yesterdayClosed):?>
|
||||
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayClosed;?></span> <strong><?php echo $build->yesterdayClosed;?></strong></div>
|
||||
<?php if($product->yesterdayClosed):?>
|
||||
<div class="progress-info"><i class="icon icon-check-circle text-success icon-sm"></i> <span class="text-muted"><?php echo $lang->bug->yesterdayClosed;?></span> <strong><?php echo $product->yesterdayClosed;?></strong></div>
|
||||
<?php endif;?>
|
||||
<div class="progress">
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $build->unclosedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $build->unclosedRate;?>%"></div>
|
||||
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $product->unclosedRate;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $product->unclosedRate;?>%"></div>
|
||||
</div>
|
||||
<div class="type-info">
|
||||
<div class="type-label">
|
||||
<span><?php echo $lang->bug->unclosed;?></span>
|
||||
</div>
|
||||
<div class="type-value">
|
||||
<strong><?php echo $build->unclosed;?></strong>
|
||||
<strong><?php echo $product->unclosed;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php $buildIndex++;?>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
<?php $index++;?>
|
||||
<?php endforeach;?>
|
||||
|
||||
@@ -167,8 +167,6 @@ $lang->bug->remindTask = 'This Bug has been converted to Task. Do you
|
||||
$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
|
||||
$lang->bug->applyTemplate = 'Template';
|
||||
$lang->bug->confirmDeleteTemplate = 'Do you want to delete this template?';
|
||||
$lang->bug->hasSubmittedTest = 'Developer has submitted test task,';
|
||||
$lang->bug->nowToTest = 'Now to test';
|
||||
|
||||
/* 模板。*/
|
||||
$lang->bug->tplStep = "<p>[Steps]</p><br/>";
|
||||
|
||||
@@ -167,8 +167,6 @@ $lang->bug->remindTask = '该Bug已经转化为任务,是否更新
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭。';
|
||||
$lang->bug->applyTemplate = '应用模板';
|
||||
$lang->bug->confirmDeleteTemplate = '您确认要删除该模板吗?';
|
||||
$lang->bug->hasSubmittedTest = '开发已提交测试申请,';
|
||||
$lang->bug->nowToTest = '现在去测试';
|
||||
|
||||
/* 模板。*/
|
||||
$lang->bug->tplStep = "<p>[步骤]</p><br/>";
|
||||
|
||||
Reference in New Issue
Block a user