Merge branch 'master' of https://github.com/easysoft/zentaopms
This commit is contained in:
@@ -60,6 +60,12 @@ zentaoxx:
|
||||
cp -r xuan/xxb/module/chat zentaoxx/module/
|
||||
cp -r xuan/xxb/module/client zentaoxx/module/
|
||||
cp -r xuan/xxb/module/common/ext/model/hook zentaoxx/module/common/ext/model/
|
||||
mkdir -p zentaoxx/module/common/view
|
||||
cp -r xuan/xxb/module/common/view/header.modal.html.php zentaoxx/module/common/view
|
||||
cp -r xuan/xxb/module/common/view/marked.html.php zentaoxx/module/common/view
|
||||
cp -r xuan/xxb/module/common/view/footer.modal.html.php zentaoxx/module/common/view
|
||||
mkdir -p zentaoxx/www/js/
|
||||
cp -r xuan/xxb/www/js/markedjs zentaoxx/www/js/
|
||||
mkdir zentaoxx/module/action
|
||||
cp -r xuan/xxb/module/action/ext zentaoxx/module/action
|
||||
cp -r xuanxuan/config/* zentaoxx/config/
|
||||
@@ -79,10 +85,15 @@ zentaoxx:
|
||||
sed -i "s/'site', //g" zentaoxx/module/chat/config.php
|
||||
sed -i "s/'reload'/inlink('browse')/g" zentaoxx/module/client/control.php
|
||||
sed -i 's/tree/dept/' zentaoxx/module/chat/model.php
|
||||
sed -i 's/im_/zt_im_/' zentaoxx/db/*.sql
|
||||
sed -i 's/xxb_user/zt_user/' zentaoxx/db/*.sql
|
||||
sed -i 's/xxb_file/zt_file/' zentaoxx/db/*.sql
|
||||
sed -i 's/im_/zt_im_/g' zentaoxx/db/*.sql
|
||||
sed -i 's/xxb_user/zt_user/g' zentaoxx/db/*.sql
|
||||
sed -i 's/xxb_file/zt_file/g' zentaoxx/db/*.sql
|
||||
sed -i '/xxb_entry/d' zentaoxx/db/*.sql
|
||||
sed -i "s/marked\.html\.php';?>/marked\.html\.php';?>\n<div id='mainMenu' class='clearfix'><div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('xuanxuan');?><\/div><\/div>/g" zentaoxx/module/client/view/checkupgrade.html.php
|
||||
sed -i '/var serverVersions/d' zentaoxx/module/client/js/checkupgrade.js
|
||||
sed -i '/var currentVersion/d' zentaoxx/module/client/js/checkupgrade.js
|
||||
sed -i 's/v\.//g' zentaoxx/module/client/js/checkupgrade.js
|
||||
sed -i 's/xxb_/zt_/g' zentaoxx/db/*.sql
|
||||
mkdir zentaoxx/tools; cp tools/cn2tw.php zentaoxx/tools; cd zentaoxx/tools; php cn2tw.php
|
||||
rm -rf zentaoxx/tools
|
||||
zip -rqm -9 zentaoxx.$(VERSION).zip zentaoxx/*
|
||||
@@ -109,18 +120,6 @@ pms:
|
||||
make package
|
||||
zip -rq -9 ZenTaoPMS.$(VERSION).zip zentaopms
|
||||
rm -fr zentaopms zentaoxx zentaoxx.*.zip
|
||||
en:
|
||||
make common
|
||||
cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
|
||||
cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
|
||||
cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
|
||||
make package
|
||||
zip -r -9 ZenTaoPMS.$(VERSION).int.zip zentaopms
|
||||
rm -fr zentaopms
|
||||
echo $(VERSION).int > VERSION
|
||||
make deb
|
||||
make rpm
|
||||
echo $(VERSION) > VERSION
|
||||
deb:
|
||||
mkdir buildroot
|
||||
cp -r build/debian/DEBIAN buildroot
|
||||
@@ -148,6 +147,46 @@ rpm:
|
||||
rpmbuild -ba ~/rpmbuild/SPECS/zentaopms.spec
|
||||
cp ~/rpmbuild/RPMS/noarch/zentaopms-${VERSION}-1.noarch.rpm ./
|
||||
rm -rf ~/rpmbuild
|
||||
en:
|
||||
make common
|
||||
cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
|
||||
cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
|
||||
cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
|
||||
make package
|
||||
mv zentaopms zentaoalm
|
||||
zip -r -9 ZenTaoALM.$(VERSION).int.zip zentaoalm
|
||||
rm -fr zentaoalm
|
||||
echo $(VERSION).int > VERSION
|
||||
make endeb
|
||||
make enrpm
|
||||
echo $(VERSION) > VERSION
|
||||
endeb:
|
||||
mkdir buildroot
|
||||
cp -r build/debian/DEBIAN buildroot
|
||||
sed -i '/^Version/cVersion: ${VERSION}' buildroot/DEBIAN/control
|
||||
mkdir buildroot/opt
|
||||
mkdir buildroot/etc/apache2/sites-enabled/ -p
|
||||
cp build/debian/zentaopms.conf buildroot/etc/apache2/sites-enabled/
|
||||
cp ZenTaoALM.${VERSION}.zip buildroot/opt
|
||||
cd buildroot/opt; unzip ZenTaoALM.${VERSION}.zip; mv zentaoalm zentao; rm ZenTaoALM.${VERSION}.zip
|
||||
sed -i 's/index.php/\/zentao\/index.php/' buildroot/opt/zentao/www/.htaccess
|
||||
sudo dpkg -b buildroot/ ZenTaoALM_${VERSION}_1_all.deb
|
||||
rm -rf buildroot
|
||||
enrpm:
|
||||
mkdir ~/rpmbuild/SPECS -p
|
||||
cp build/rpm/zentaopms.spec ~/rpmbuild/SPECS
|
||||
sed -i '/^Version/cVersion:${VERSION}' ~/rpmbuild/SPECS/zentaopms.spec
|
||||
mkdir ~/rpmbuild/SOURCES
|
||||
cp ZenTaoALM.${VERSION}.zip ~/rpmbuild/SOURCES
|
||||
mkdir ~/rpmbuild/SOURCES/etc/httpd/conf.d/ -p
|
||||
cp build/debian/zentaopms.conf ~/rpmbuild/SOURCES/etc/httpd/conf.d/zentaoalm.conf
|
||||
mkdir ~/rpmbuild/SOURCES/opt/ -p
|
||||
cd ~/rpmbuild/SOURCES; unzip ZenTaoALM.${VERSION}.zip; mv zentaoalm opt/zentao;
|
||||
sed -i 's/index.php/\/zentao\/index.php/' ~/rpmbuild/SOURCES/opt/zentao/www/.htaccess
|
||||
cd ~/rpmbuild/SOURCES; tar -czvf zentaoalm-${VERSION}.tar.gz etc opt; rm -rf ZenTaoALM.${VERSION}.zip etc opt;
|
||||
rpmbuild -ba ~/rpmbuild/SPECS/zentaopms.spec
|
||||
cp ~/rpmbuild/RPMS/noarch/zentaoalm-${VERSION}-1.noarch.rpm ./
|
||||
rm -rf ~/rpmbuild
|
||||
patchphpdoc:
|
||||
sudo cp misc/doc/phpdoc/*.tpl /usr/share/php/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/phphtmllib/templates/
|
||||
phpdoc:
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
ALTER TABLE `zt_entry` ADD `calledTime` int(10) unsigned NOT NULL DEFAULT '0' AFTER `createdDate`;
|
||||
ALTER TABLE `zt_story` CHANGE `toBug` `toBug` mediumint(8) unsigned NOT NULL AFTER `closedReason`;
|
||||
UPDATE `zt_story` SET `stage` = 'closed' WHERE `status` = 'closed';
|
||||
ALTER TABLE `zt_story` ADD `stagedBy` char(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `stage`;
|
||||
ALTER TABLE `zt_storystage` ADD `stagedBy` char(30) COLLATE 'utf8_general_ci' NOT NULL;
|
||||
+3
-1
@@ -579,7 +579,7 @@ CREATE TABLE IF NOT EXISTS `zt_story` (
|
||||
`closedBy` varchar(30) NOT NULL default '',
|
||||
`closedDate` datetime NOT NULL,
|
||||
`closedReason` varchar(30) NOT NULL,
|
||||
`toBug` mediumint(9) NOT NULL,
|
||||
`toBug` mediumint(8) unsigned NOT NULL,
|
||||
`childStories` varchar(255) NOT NULL,
|
||||
`linkStories` varchar(255) NOT NULL,
|
||||
`duplicateStory` mediumint(8) unsigned NOT NULL,
|
||||
@@ -604,6 +604,7 @@ CREATE TABLE IF NOT EXISTS `zt_storystage` (
|
||||
`story` mediumint(8) unsigned NOT NULL,
|
||||
`branch` mediumint(8) unsigned NOT NULL,
|
||||
`stage` varchar(50) NOT NULL,
|
||||
UNIQUE KEY `story_branch` (`story`,`branch`),
|
||||
KEY `story` (`story`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_suitecase`;
|
||||
@@ -899,6 +900,7 @@ CREATE TABLE IF NOT EXISTS `zt_entry` (
|
||||
`desc` text NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`calledTime` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`editedBy` varchar(30) NOT NULL,
|
||||
`editedDate` datetime NOT NULL,
|
||||
`deleted` enum('0', '1') NOT NULL DEFAULT '0',
|
||||
|
||||
@@ -129,6 +129,12 @@ $lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,
|
||||
$lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n";
|
||||
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>';
|
||||
|
||||
/* 子任务修改父任务的历史操作记录 */
|
||||
|
||||
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 关联子任务 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkchildrentask = '$date, 由 <strong>$actor</strong> 移除子任务 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkparenttask = '$date, 由 <strong>$actor</strong> 关联父任务 <strong>$extra</strong>。' . "\n";
|
||||
|
||||
/* 关联用例和移除用例时的历史操作记录。*/
|
||||
$lang->action->desc->linkrelatedcase = '$date, 由 <strong>$actor</strong> 关联相关用例 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, 由 <strong>$actor</strong> 移除相关用例 <strong>$extra</strong>。' . "\n";
|
||||
|
||||
+13
-5
@@ -36,7 +36,7 @@ class actionModel extends model
|
||||
$actor = $actor ? $actor : $this->app->user->account;
|
||||
$actionType = strtolower($actionType);
|
||||
if($actor == 'guest' and $actionType == 'logout') return false;
|
||||
|
||||
|
||||
$action = new stdclass();
|
||||
|
||||
$objectType = str_replace('`', '', $objectType);
|
||||
@@ -291,7 +291,7 @@ class actionModel extends model
|
||||
$title = $this->dao->select('title')->from(TABLE_STORY)->where('id')->eq($action->extra)->fetch('title');
|
||||
if($title) $action->extra = common::hasPriv('story', 'view') ? html::a(helper::createLink('story', 'view', "storyID=$action->extra"), "#$action->extra " . $title) : "#$action->extra " . $title;
|
||||
}
|
||||
elseif($actionName == 'totask')
|
||||
elseif($actionName == 'totask' or $actionName == 'linkchildtask' or $actionName == 'unlinkchildrentask' or $actionName == 'linkparenttask')
|
||||
{
|
||||
$name = $this->dao->select('name')->from(TABLE_TASK)->where('id')->eq($action->extra)->fetch('name');
|
||||
if($name) $action->extra = common::hasPriv('task', 'view') ? html::a(helper::createLink('task', 'view', "taskID=$action->extra"), "#$action->extra " . $name) : "#$action->extra " . $name;
|
||||
@@ -346,7 +346,11 @@ class actionModel extends model
|
||||
{
|
||||
$linkedProducts = $this->dao->select('id,name')->from(TABLE_PRODUCT)->where('id')->in($action->extra)->fetchPairs('id', 'name');
|
||||
$action->extra = '';
|
||||
if($linkedProducts) $action->extra = sprintf($this->lang->project->action->extra, '<strong>' . join(', ', $linkedProducts) . '</strong>');
|
||||
if($linkedProducts)
|
||||
{
|
||||
foreach($linkedProducts as $productID => $productName) $linkedProducts[$productID] = html::a(helper::createLink('product', 'browse', "productID=$productID"), "#{$productID} {$productName}");
|
||||
$action->extra = sprintf($this->lang->project->action->extra, '<strong>' . join(', ', $linkedProducts) . '</strong>');
|
||||
}
|
||||
}
|
||||
$action->history = isset($histories[$actionID]) ? $histories[$actionID] : array();
|
||||
|
||||
@@ -365,7 +369,7 @@ class actionModel extends model
|
||||
if($history->field == 'git') $history->diff = str_replace('+', '%2B', $history->diff);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$action->comment = $this->file->setImgSize($action->comment, $this->config->action->commonImgSize);
|
||||
$actions[$actionID] = $action;
|
||||
}
|
||||
@@ -623,7 +627,11 @@ class actionModel extends model
|
||||
if(!$actions) return array();
|
||||
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'action');
|
||||
return $this->transformActions($actions);
|
||||
|
||||
$actions = $this->transformActions($actions);
|
||||
$actioned = $this->loadModel('setting')->getItem("owner=system&module=common§ion=global&key=setdynamic");
|
||||
foreach($actions as $index => $action) if(strpos($actioned, $action->action) === false) unset($actions[$index]);
|
||||
return $actions;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -46,7 +46,8 @@ class branchModel extends model
|
||||
$product = $this->loadModel('product')->getById($productID);
|
||||
if(!$product or $product->type == 'normal') return array();
|
||||
|
||||
$branches = array('0' => $this->lang->branch->all . $this->lang->product->branchName[$product->type]) + $branches;
|
||||
$space = $this->app->getClientLang() == 'en' ? ' ' : '';
|
||||
$branches = array('0' => $this->lang->branch->all . $space . $this->lang->product->branchName[$product->type]) + $branches;
|
||||
}
|
||||
return $branches;
|
||||
}
|
||||
|
||||
@@ -193,7 +193,7 @@ class bug extends control
|
||||
$chartFunc = 'getDataOf' . $chart;
|
||||
$chartData = $this->bug->$chartFunc();
|
||||
$chartOption = $this->lang->bug->report->$chart;
|
||||
if(!empty($chartType)) $chartOption->type = $chartType;
|
||||
if(!empty($chartType) and $chartType != 'default') $chartOption->type = $chartType;
|
||||
$this->bug->mergeChartOption($chart);
|
||||
|
||||
$this->view->charts[$chart] = $chartOption;
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#buildBoxActions {padding-left: 15px;}
|
||||
|
||||
#module_chosen.chosen-container .chosen-drop {min-width: 400px; border-top: 1px solid #ddd!important}
|
||||
#os_chosen.chosen-container .chosen-drop{min-width: 200px}
|
||||
#openedBuild_chosen.chosen-container .chosen-drop {min-width: 450px; border-top: 1px solid #ddd!important}
|
||||
#module + .chosen-container-single .chosen-single,
|
||||
#task + .chosen-container-single .chosen-single,
|
||||
@@ -37,4 +38,3 @@
|
||||
.title-group #severity + .chosen-container > .chosen-single {border-radius: 0!important;}
|
||||
.title-group #pri + .chosen-container > .chosen-single {border-top-left-radius: 0!important; border-bottom-left-radius: 0!important;}
|
||||
.title-group .has-icon-right{min-width:700px}
|
||||
#dataform .chosen[name ^= "os"] + .chosen-container .chosen-drop{min-width: 200px}
|
||||
|
||||
@@ -468,17 +468,20 @@ function notice()
|
||||
if($('#openedBuild').find('option').length <= 1)
|
||||
{
|
||||
var html = '';
|
||||
if($('#project').val() == '')
|
||||
if($('#project').length == 0 || $('#project').val() == '')
|
||||
{
|
||||
branch = $('#branch').val();
|
||||
var branch = $('#branch').val();
|
||||
if(typeof(branch) == 'undefined') branch = 0;
|
||||
html += '<a href="' + createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch) + '" target="_blank" style="padding-right:5px">' + createRelease + '</a> ';
|
||||
var link = createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch);
|
||||
if(typeof(flow) != 'undefined' && flow == 'onlyTest') link = createLink('build', 'create','projectID=' + $('#product').val());
|
||||
html += '<a href="' + link + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
|
||||
html += '<a href="javascript:loadProductBuilds(' + $('#product').val() + ')">' + refresh + '</a>';
|
||||
}
|
||||
else
|
||||
{
|
||||
html += '<a href="' + createLink('build', 'create','projectID=' + $('#project').val()) + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
|
||||
html += '<a href="javascript:loadProjectBuilds(' + $('#project').val() + ')">' + refresh + '</a>';
|
||||
projectID = $('#project').val();
|
||||
html += '<a href="' + createLink('build', 'create','projectID=' + projectID) + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
|
||||
html += '<a href="javascript:loadProjectBuilds(' + projectID + ')">' + refresh + '</a>';
|
||||
}
|
||||
var $bba = $('#buildBoxActions');
|
||||
if($bba.length)
|
||||
|
||||
@@ -1670,7 +1670,12 @@ class bugModel extends model
|
||||
{
|
||||
$datas = $this->dao->select('openedBuild as name, count(openedBuild) as value')->from(TABLE_BUG)->where($this->reportCondition())->groupBy('openedBuild')->orderBy('value DESC')->fetchAll('name');
|
||||
if(!$datas) return array();
|
||||
$builds = $this->loadModel('build')->getProductBuildPairs($this->session->product, $branch = 0, $params = '');
|
||||
/* Judge if all product or not. */
|
||||
$products = $this->session->product;
|
||||
preg_match('/`product` IN \((?P<productIdList>.+)\)/', $this->reportCondition(), $matchs);
|
||||
if(!empty($matchs) and isset($matchs['productIdList'])) $products = str_replace('\'', '', $matchs['productIdList']);
|
||||
$builds = $this->loadModel('build')->getProductBuildPairs($products, $branch = 0, $params = '');
|
||||
|
||||
/* Deal with the situation that a bug maybe associate more than one openedBuild. */
|
||||
foreach($datas as $buildIDList => $data)
|
||||
{
|
||||
|
||||
@@ -19,7 +19,7 @@ js::set('page', 'create');
|
||||
js::set('createRelease', $lang->release->create);
|
||||
js::set('createBuild', $lang->build->create);
|
||||
js::set('refresh', $lang->refresh);
|
||||
js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
|
||||
js::set('flow', $config->global->flow);
|
||||
?>
|
||||
<div id="mainContent" class="main-content fade">
|
||||
<div class="center-block">
|
||||
|
||||
@@ -21,7 +21,7 @@ $lang->percent = '%';
|
||||
$lang->dash = '-';
|
||||
|
||||
$lang->zentaoPMS = 'ZenTao';
|
||||
$lang->welcome = "%s";
|
||||
$lang->welcome = "%s ALM";
|
||||
$lang->logout = 'Logout';
|
||||
$lang->login = 'Login';
|
||||
$lang->help = 'Help';
|
||||
@@ -94,13 +94,6 @@ $lang->preShortcutKey = '[Shortcut:←]';
|
||||
$lang->nextShortcutKey = '[Shortcut:→]';
|
||||
$lang->backShortcutKey = '[Shortcut:Alt+↑]';
|
||||
|
||||
$lang->saveTemplate = 'Save as Template';
|
||||
$lang->setPublic = 'Set as Public Template';
|
||||
$lang->deleteTemplate = 'Delete Template';
|
||||
$lang->setTemplateTitle = 'Please enter the title of template.';
|
||||
$lang->applyTemplate = 'Template';
|
||||
$lang->confirmDeleteTemplate = 'Do you want to delete this template?';
|
||||
|
||||
$lang->select = 'Select';
|
||||
$lang->selectAll = 'Select All';
|
||||
$lang->selectReverse = 'Select Inverse';
|
||||
@@ -518,7 +511,7 @@ $lang->proVersion = "<a href='https://www.zentao.pm/book/zentaopromanual/fre
|
||||
$lang->downNotify = "Download Desktop Notification";
|
||||
$lang->downloadClient = "Download Desktop Client";
|
||||
$lang->clientHelp = "Client Help";
|
||||
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-open-source-client-214.html";
|
||||
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/";
|
||||
$lang->website = "https://www.zentao.pm";
|
||||
|
||||
$lang->suhosinInfo = "Warning! Data is reaching the limit. Please change <font color=red>sohusin.post.max_vars</font> and <font color=red>sohusin.request.max_vars</font> (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved.";
|
||||
|
||||
@@ -94,13 +94,6 @@ $lang->preShortcutKey = '[快捷键:←]';
|
||||
$lang->nextShortcutKey = '[快捷键:→]';
|
||||
$lang->backShortcutKey = '[快捷键:Alt+↑]';
|
||||
|
||||
$lang->saveTemplate = '保存模板';
|
||||
$lang->setPublic = '设为公共模板';
|
||||
$lang->deleteTemplate = '删除模板';
|
||||
$lang->setTemplateTitle = '请输入模板标题';
|
||||
$lang->applyTemplate = '应用模板';
|
||||
$lang->confirmDeleteTemplate = '您确认要删除该模板吗?';
|
||||
|
||||
$lang->select = '选择';
|
||||
$lang->selectAll = '全选';
|
||||
$lang->selectReverse = '反选';
|
||||
|
||||
+27
-6
@@ -1645,7 +1645,6 @@ EOD;
|
||||
public function checkEntry()
|
||||
{
|
||||
$this->loadModel('entry');
|
||||
|
||||
if($this->session->valid_entry)
|
||||
{
|
||||
if(!$this->session->entry_code) $this->response('SESSION_CODE_MISSING');
|
||||
@@ -1661,7 +1660,7 @@ EOD;
|
||||
if(!$entry->key) $this->response('EMPTY_KEY');
|
||||
if(empty($entry->account)) $this->response('ACCOUNT_UNBOUND');
|
||||
if(!$this->checkIP($entry->ip)) $this->response('IP_DENIED');
|
||||
if(!$this->checkEntryToken($entry->key)) $this->response('INVALID_TOKEN');
|
||||
if(!$this->checkEntryToken($entry)) $this->response('INVALID_TOKEN');
|
||||
|
||||
$this->loadModel('user');
|
||||
$user = $this->dao->findByAccount($entry->account)->from(TABLE_USER)->fetch();
|
||||
@@ -1676,6 +1675,14 @@ EOD;
|
||||
$this->session->set('VALID_ENTRY', md5(md5($this->get->code) . $this->server->remote_addr));
|
||||
$this->loadModel('entry')->saveLog($entry->id, $this->server->request_uri);
|
||||
|
||||
/* Add for task #5384. */
|
||||
if($_SERVER['REQUEST_METHOD'] == 'POST' and empty($_POST))
|
||||
{
|
||||
$post = file_get_contents("php://input");
|
||||
if(!empty($post)) $post = json_decode($post, true);
|
||||
if(!empty($post)) $_POST = $post;
|
||||
}
|
||||
|
||||
unset($_GET['code']);
|
||||
unset($_GET['token']);
|
||||
}
|
||||
@@ -1683,16 +1690,30 @@ EOD;
|
||||
/**
|
||||
* Check token of an entry.
|
||||
*
|
||||
* @param string $key
|
||||
* @param object $entry
|
||||
* @access public
|
||||
* @return void
|
||||
* @return bool
|
||||
*/
|
||||
public function checkEntryToken($key)
|
||||
public function checkEntryToken($entry)
|
||||
{
|
||||
parse_str($this->server->query_String, $queryString);
|
||||
unset($queryString['token']);
|
||||
|
||||
/* Change for task #5384. */
|
||||
if(isset($queryString['time']))
|
||||
{
|
||||
$result = $this->get->token == md5($entry->code . $entry->key . $queryString['time']);
|
||||
if($result)
|
||||
{
|
||||
if($queryString['time'] <= $entry->calledTime) $this->response('CALLED_TIME');
|
||||
$this->loadModel('entry')->updateTime($entry->code, $queryString['time']);
|
||||
unset($_GET['time']);
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
$queryString = http_build_query($queryString);
|
||||
return $this->get->token == md5(md5($queryString) . $key);
|
||||
return $this->get->token == md5(md5($queryString) . $entry->key);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -323,6 +323,31 @@ class custom extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
*Set dynamic recode what action
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function setDynamic()
|
||||
{
|
||||
if($_POST)
|
||||
{
|
||||
$actions = $this->post->actions;
|
||||
$actions = implode(',', array_filter($actions));
|
||||
$this->loadModel('setting')->setItem('system.common.global.setdynamic', $actions);
|
||||
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
|
||||
|
||||
}
|
||||
$this->app->loadLang('action');
|
||||
$this->view->title = $this->lang->custom->setDynamic;
|
||||
$this->view->position[] = $this->lang->custom->common;
|
||||
$this->view->position[] = $this->view->title;
|
||||
$this->view->actions = $this->lang->action->search->label;
|
||||
$this->view->actioned = $this->loadModel('setting')->getItem("owner=system&module=common§ion=global&key=setdynamic");
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Timezone.
|
||||
*
|
||||
|
||||
@@ -18,6 +18,8 @@ $lang->custom->required = 'Required';
|
||||
$lang->custom->score = 'Point';
|
||||
$lang->custom->timezone = 'Timezone';
|
||||
$lang->custom->scoreReset = 'Reset Point';
|
||||
$lang->custom->setDynamic = 'Set Dynamic';
|
||||
$lang->custom->setAction = 'Set Action';
|
||||
|
||||
$lang->custom->object['story'] = 'Story';
|
||||
$lang->custom->object['task'] = 'Task';
|
||||
@@ -77,7 +79,7 @@ $lang->custom->user->fields['statusList'] = 'Status';
|
||||
$lang->custom->user->fields['contactField'] = 'Available Contact';
|
||||
$lang->custom->user->fields['deleted'] = 'Deleted User';
|
||||
|
||||
$lang->custom->system = array('flow', 'working', 'required', 'score');
|
||||
$lang->custom->system = array('flow', 'working', 'required', 'score', 'setDynamic');
|
||||
|
||||
$lang->custom->block->fields['closed'] = 'Closed Block';
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@ $lang->custom->required = '必填项';
|
||||
$lang->custom->score = '积分';
|
||||
$lang->custom->timezone = '时区';
|
||||
$lang->custom->scoreReset = '重置积分';
|
||||
$lang->custom->setDynamic = '动态设置';
|
||||
$lang->custom->setAction = '设置动作';
|
||||
|
||||
$lang->custom->object['story'] = '需求';
|
||||
$lang->custom->object['task'] = '任务';
|
||||
@@ -77,7 +79,7 @@ $lang->custom->user->fields['statusList'] = '状态';
|
||||
$lang->custom->user->fields['contactField'] = '可用联系方式';
|
||||
$lang->custom->user->fields['deleted'] = '列出已删除用户';
|
||||
|
||||
$lang->custom->system = array('flow', 'working', 'required', 'score');
|
||||
$lang->custom->system = array('flow', 'working', 'required', 'score', 'setDynamic');
|
||||
|
||||
$lang->custom->block->fields['closed'] = '关闭的区块';
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
/**
|
||||
* The score view file of custom module of ZenTaoPMS.
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Memory <lvtao@cnezsoft.com>
|
||||
* @package custom
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include 'header.html.php';?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<form class="load-indicator main-form form-ajax" method='post'>
|
||||
<div class='main-header'>
|
||||
<div class='heading'>
|
||||
<strong><?php echo $lang->custom->setDynamic?></strong>
|
||||
</div>
|
||||
</div>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-100px'><?php echo $lang->custom->setAction;?></th>
|
||||
<td><?php echo html::select("actions[]", $actions, $actioned, "class='form-control chosen' multiple");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th>
|
||||
<td class='form-actions'>
|
||||
<?php echo html::submitButton();?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('#mainMenu #setDynamicTab').addClass('btn-active-text');
|
||||
})
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -1588,6 +1588,7 @@ class docModel extends model
|
||||
$parantMoudles = $this->dao->select('id, name')->from(TABLE_MODULE)
|
||||
->where('id')->in($path)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->orderBy('`grade`')
|
||||
->fetchAll('id');
|
||||
|
||||
foreach($parantMoudles as $parentID => $moduleName)
|
||||
|
||||
@@ -17,3 +17,4 @@ $config->entry->errcode['SESSION_VERIFY_FAILED'] = 401;
|
||||
$config->entry->errcode['IP_DENIED'] = 403;
|
||||
$config->entry->errcode['ACCOUNT_UNBOUND'] = 403;
|
||||
$config->entry->errcode['EMPTY_ENTRY'] = 404;
|
||||
$config->entry->errcode['CALLED_TIME'] = 405;
|
||||
|
||||
@@ -46,3 +46,4 @@ $lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'Session verification failed.';
|
||||
$lang->entry->errmsg['IP_DENIED'] = 'IP is denied.';
|
||||
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = 'Account is not bound.';
|
||||
$lang->entry->errmsg['EMPTY_ENTRY'] = 'Entry does not exist.';
|
||||
$lang->entry->errmsg['CALLED_TIME'] = 'Token has expired';
|
||||
|
||||
@@ -46,3 +46,4 @@ $lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'session验证失败';
|
||||
$lang->entry->errmsg['IP_DENIED'] = '该IP被限制访问';
|
||||
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = '未绑定用户';
|
||||
$lang->entry->errmsg['EMPTY_ENTRY'] = '应用不存在';
|
||||
$lang->entry->errmsg['CALLED_TIME'] = 'Token已失效';
|
||||
|
||||
@@ -125,6 +125,20 @@ class entryModel extends model
|
||||
return common::createChanges($oldEntry, $entry);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update called time.
|
||||
*
|
||||
* @param string $code
|
||||
* @param int $time
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function updateTime($code, $time)
|
||||
{
|
||||
$this->dao->update(TABLE_ENTRY)->set('calledTime')->eq($time)->where('code')->eq($code)->exec();
|
||||
return !dao::isError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save log of an entry.
|
||||
*
|
||||
|
||||
+1
-23
@@ -287,29 +287,7 @@ class file extends control
|
||||
*/
|
||||
public function sendDownHeader($fileName, $fileType, $content)
|
||||
{
|
||||
/* Clean the ob content to make sure no space or utf-8 bom output. */
|
||||
$obLevel = ob_get_level();
|
||||
for($i = 0; $i < $obLevel; $i++) ob_end_clean();
|
||||
|
||||
/* Set the downloading cookie, thus the export form page can use it to judge whether to close the window or not. */
|
||||
setcookie('downloading', 1);
|
||||
|
||||
/* Append the extension name auto. */
|
||||
$extension = '.' . $fileType;
|
||||
if(strpos($fileName, $extension) === false) $fileName .= $extension;
|
||||
|
||||
/* urlencode the filename for ie. */
|
||||
if(strpos($this->server->http_user_agent, 'MSIE') !== false or strpos($this->server->http_user_agent, 'Trident') !== false or strpos($this->server->http_user_agent, 'Edge') !== false) $fileName = urlencode($fileName);
|
||||
|
||||
/* Judge the content type. */
|
||||
$mimes = $this->config->file->mimes;
|
||||
$contentType = isset($mimes[$fileType]) ? $mimes[$fileType] : $mimes['default'];
|
||||
|
||||
header("Content-type: $contentType");
|
||||
header("Content-Disposition: attachment; filename=\"$fileName\"");
|
||||
header("Pragma: no-cache");
|
||||
header("Expires: 0");
|
||||
die($content);
|
||||
$this->file->sendDownHeader($fileName, $fileType, $content);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -821,4 +821,40 @@ class fileModel extends model
|
||||
unset($_SESSION['album'][$uid]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the download header to the client.
|
||||
*
|
||||
* @param string $fileName
|
||||
* @param string $fileType
|
||||
* @param string $content
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function sendDownHeader($fileName, $fileType, $content)
|
||||
{
|
||||
/* Clean the ob content to make sure no space or utf-8 bom output. */
|
||||
$obLevel = ob_get_level();
|
||||
for($i = 0; $i < $obLevel; $i++) ob_end_clean();
|
||||
|
||||
/* Set the downloading cookie, thus the export form page can use it to judge whether to close the window or not. */
|
||||
setcookie('downloading', 1);
|
||||
|
||||
/* Append the extension name auto. */
|
||||
$extension = '.' . $fileType;
|
||||
if(strpos($fileName, $extension) === false) $fileName .= $extension;
|
||||
|
||||
/* urlencode the filename for ie. */
|
||||
if(strpos($this->server->http_user_agent, 'MSIE') !== false or strpos($this->server->http_user_agent, 'Trident') !== false or strpos($this->server->http_user_agent, 'Edge') !== false) $fileName = urlencode($fileName);
|
||||
|
||||
/* Judge the content type. */
|
||||
$mimes = $this->config->file->mimes;
|
||||
$contentType = isset($mimes[$fileType]) ? $mimes[$fileType] : $mimes['default'];
|
||||
|
||||
header("Content-type: $contentType");
|
||||
header("Content-Disposition: attachment; filename=\"$fileName\"");
|
||||
header("Pragma: no-cache");
|
||||
header("Expires: 0");
|
||||
die($content);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,9 +25,9 @@ $lang->install->seeLatestRelease = 'View latest version';
|
||||
$lang->install->welcome = 'Thanks for choosing ZenTao!';
|
||||
$lang->install->license = 'ZenTao is under Z PUBLIC LICENSE(ZPL) 1.2';
|
||||
$lang->install->desc = <<<EOT
|
||||
ZenTao is an Open Source software released under <a href='http://zpl.pub/page/zplv12.html' target='_blank'>Z Public License</a>. It integrates with Product Management, Project Management, QA Management, Document Management, Todos Management, Company Management etc. ZenTao is the best choice for software project management.
|
||||
ZenTao ALM is an Open Source software released under <a href='http://zpl.pub/page/zplv12.html' target='_blank'>Z Public License</a>. It integrates with Product Management, Project Management, QA Management, Document Management, Todos Management, Company Management etc. ZenTao is the best choice for software project management.
|
||||
|
||||
ZenTao is built on PHP + MySQL and based on ZenTaoPHP framework, an independent framework developed by our team. Third party developers/organizations can develop plug-ins or customize for their requirements.
|
||||
ZenTao ALM is built on PHP + MySQL and based on ZenTaoPHP framework, an independent framework developed by our team. Third party developers/organizations can develop plug-ins or customize for their requirements.
|
||||
EOT;
|
||||
$lang->install->links = <<<EOT
|
||||
ZenTao is developed by <strong><a href='http://easysoft.ltd' target='_blank' class='text-danger'>Nature Easy Soft Co., LTD</a></strong>.
|
||||
|
||||
@@ -273,6 +273,7 @@
|
||||
foreach($lang->story->stageList as $key => $stage)
|
||||
{
|
||||
if(empty($key)) continue;
|
||||
if(strpos('tested|verified|released|closed', $key) === false) continue;
|
||||
$actionLink = $this->createLink('story', 'batchChangeStage', "stage=$key");
|
||||
echo "<li>" . html::a('#', $stage, '', "onclick=\"setFormAction('$actionLink','hiddenwin')\"") . "</li>";
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
<div id='mainContent' class="main-row">
|
||||
<div class="col-8 main-col">
|
||||
<div class="row">
|
||||
<?php $isRoadmap = common::hasPriv('product', 'roadmap');?>
|
||||
<?php if($isRoadmap):?>
|
||||
<div class="col-sm-6">
|
||||
<div class="panel block-release">
|
||||
<div class="panel-heading">
|
||||
@@ -50,7 +52,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<?php endif;?>
|
||||
<div class="col-sm-<?php echo $isRoadmap ? 6 : 12?>">
|
||||
<div class="panel block-dynamic">
|
||||
<div class="panel-heading">
|
||||
<div class="panel-title"><?php echo $lang->product->latestDynamic;?></div>
|
||||
|
||||
@@ -136,10 +136,11 @@ class release extends control
|
||||
|
||||
$release = $this->release->getById((int)$releaseID, true);
|
||||
if(!$release) die(js::error($this->lang->notFound) . js::locate('back'));
|
||||
|
||||
|
||||
$stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0)
|
||||
->beginIF($type == 'story')->orderBy($orderBy)->fi()
|
||||
->fetchAll('id');
|
||||
->beginIF($type == 'story')->orderBy($orderBy)->fi()
|
||||
->fetchAll('id');
|
||||
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story');
|
||||
$stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($release->stories)->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage');
|
||||
foreach($stages as $storyID => $stage)$stories[$storyID]->stage = $stage;
|
||||
|
||||
@@ -102,7 +102,7 @@ $config->story->datatable->fieldList['estimate']['required'] = 'no';
|
||||
|
||||
$config->story->datatable->fieldList['stage']['title'] = 'stageAB';
|
||||
$config->story->datatable->fieldList['stage']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['stage']['width'] = '80';
|
||||
$config->story->datatable->fieldList['stage']['width'] = '95';
|
||||
$config->story->datatable->fieldList['stage']['required'] = 'no';
|
||||
|
||||
$config->story->datatable->fieldList['openedBy']['title'] = 'openedByAB';
|
||||
|
||||
@@ -1453,7 +1453,8 @@ class story extends control
|
||||
}
|
||||
else
|
||||
{
|
||||
$stmt = $this->dbh->query($this->session->storyQueryCondition . ($this->post->exportType == 'selected' ? " AND t1.id IN({$this->cookie->checkedItem})" : '') . " ORDER BY " . strtr($orderBy, '_', ' '));
|
||||
$field = $projectID ? 't2.id' : 't1.id';
|
||||
$stmt = $this->dbh->query($this->session->storyQueryCondition . ($this->post->exportType == 'selected' ? " AND $field IN({$this->cookie->checkedItem})" : '') . " ORDER BY " . strtr($orderBy, '_', ' '));
|
||||
while($row = $stmt->fetch()) $stories[$row->id] = $row;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,9 +5,7 @@ $(function()
|
||||
link = createLink('story', 'create', 'productID=' + productID + "&branch=" + branch + '&moduleID=' + moduleID);
|
||||
$('#modulemenu ul.nav li.right:first').before("<li class='right'><a href='" + link + "'><i class='icon-story-create icon-plus'></i> " + createStory + "</a></li>");
|
||||
}
|
||||
|
||||
if(isonlybody)
|
||||
{
|
||||
$('.main-actions').css('width', '100%')
|
||||
}
|
||||
|
||||
/* Add for task #5385. */
|
||||
if(config.onlybody == 'yes') $('.main-actions').css('width', '100%')
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
$(function()
|
||||
{
|
||||
$('#sourceNote').parent().find('span').remove();
|
||||
$('#sourceNote').prev('span').remove();
|
||||
$('#sourceNote').remove();
|
||||
$('table tbody tr th').addClass('w-70px');
|
||||
});
|
||||
|
||||
+63
-13
@@ -515,6 +515,7 @@ class storyModel extends model
|
||||
if(empty($_POST['branch'])) $story->branch = 0;
|
||||
if(!empty($_POST['stages']))
|
||||
{
|
||||
$oldStages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->fetchAll('branch');
|
||||
$this->dao->delete()->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->exec();
|
||||
|
||||
$stageList = join(',', array_keys($this->lang->story->stageList));
|
||||
@@ -522,7 +523,17 @@ class storyModel extends model
|
||||
$minStage = '';
|
||||
foreach($this->post->stages as $branch => $stage)
|
||||
{
|
||||
$this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
|
||||
$newStage = new stdclass();
|
||||
$newStage->story = $storyID;
|
||||
$newStage->branch = $branch;
|
||||
$newStage->stage = $stage;
|
||||
if(isset($oldStages[$branch]))
|
||||
{
|
||||
$oldStage = $oldStages[$branch];
|
||||
$newStage->stagedBy = $oldStage->stagedBy;
|
||||
if($stage != $oldStage->stage) $newStage->stagedBy = (strpos('tested|verified|released|closed', $stage) !== false) ? $this->app->user->account : '';
|
||||
}
|
||||
$this->dao->insert(TABLE_STORYSTAGE)->data($newStage)->exec();
|
||||
if(strpos($stageList, $stage) !== false and strpos($stageList, $stage) < $minStagePos)
|
||||
{
|
||||
$minStage = $stage;
|
||||
@@ -531,6 +542,7 @@ class storyModel extends model
|
||||
}
|
||||
$story->stage = $minStage;
|
||||
}
|
||||
if($oldStory->stage != $story->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : '';
|
||||
|
||||
$this->dao->update(TABLE_STORY)
|
||||
->data($story)
|
||||
@@ -585,7 +597,7 @@ class storyModel extends model
|
||||
foreach($storyIDList as $storyID)
|
||||
{
|
||||
if($data->pris[$storyID] == 'ditto') $data->pris[$storyID] = isset($prev['pri']) ? $prev['pri'] : 0;
|
||||
if($data->branches[$storyID] == 'ditto') $data->branches[$storyID] = isset($prev['branch']) ? $prev['branch'] : 0;
|
||||
if(isset($data->branches) and $data->branches[$storyID] == 'ditto') $data->branches[$storyID] = isset($prev['branch']) ? $prev['branch'] : 0;
|
||||
if($data->modules[$storyID] == 'ditto') $data->modules[$storyID] = isset($prev['module']) ? $prev['module'] : 0;
|
||||
if($data->plans[$storyID] == 'ditto') $data->plans[$storyID] = isset($prev['plan']) ? $prev['plan'] : 0;
|
||||
if($data->sources[$storyID] == 'ditto') $data->sources[$storyID] = isset($prev['source']) ? $prev['source'] : '';
|
||||
@@ -628,6 +640,7 @@ class storyModel extends model
|
||||
$story->duplicateStory = isset($data->duplicateStories[$storyID]) ? $data->duplicateStories[$storyID] : $oldStory->duplicateStory;
|
||||
$story->childStories = isset($data->childStoriesIDList[$storyID]) ? $data->childStoriesIDList[$storyID] : $oldStory->childStories;
|
||||
$story->version = $story->title == $oldStory->title ? $oldStory->version : $oldStory->version + 1;
|
||||
if($story->stage != $oldStory->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : '';
|
||||
|
||||
if($story->title != $oldStory->title) $story->status = 'changed';
|
||||
if($story->plan !== false and $story->plan == '') $story->plan = 0;
|
||||
@@ -854,7 +867,6 @@ class storyModel extends model
|
||||
->setDefault('assignedDate', $now)
|
||||
->removeIF($this->post->closedReason != 'duplicate', 'duplicateStory')
|
||||
->removeIF($this->post->closedReason != 'subdivided', 'childStories')
|
||||
->setIF($this->post->closedReason == 'done', 'stage', 'released')
|
||||
->setIF($this->post->closedReason != 'done', 'plan', 0)
|
||||
->remove('comment')
|
||||
->get();
|
||||
@@ -864,7 +876,7 @@ class storyModel extends model
|
||||
->batchCheck($this->config->story->close->requiredFields, 'notempty')
|
||||
->checkIF($story->closedReason == 'duplicate', 'duplicateStory', 'notempty')
|
||||
->where('id')->eq($storyID)->exec();
|
||||
if(!dao::isError() && $this->post->closedReason == 'done') $this->loadModel('score')->create('story', 'close', $storyID);
|
||||
if(!dao::isError()) $this->loadModel('score')->create('story', 'close', $storyID);
|
||||
return common::createChanges($oldStory, $story);
|
||||
}
|
||||
|
||||
@@ -903,7 +915,6 @@ class storyModel extends model
|
||||
$story->duplicateStory = $data->duplicateStoryIDList[$storyID] ? $data->duplicateStoryIDList[$storyID] : $oldStory->duplicateStory;
|
||||
$story->childStories = $data->childStoriesIDList[$storyID] ? $data->childStoriesIDList[$storyID] : $oldStory->childStories;
|
||||
|
||||
if($story->closedReason == 'done') $story->stage = 'released';
|
||||
if($story->closedReason != 'done') $story->plan = 0;
|
||||
|
||||
$stories[$storyID] = $story;
|
||||
@@ -929,7 +940,7 @@ class storyModel extends model
|
||||
{
|
||||
die(js::error('story#' . $storyID . dao::getError(true)));
|
||||
}
|
||||
if(!dao::isError() && $story->stage == 'released') $this->loadModel('score')->create('story', 'close', $storyID);
|
||||
if(!dao::isError()) $this->loadModel('score')->create('story', 'close', $storyID);
|
||||
}
|
||||
|
||||
return $allChanges;
|
||||
@@ -1045,6 +1056,7 @@ class storyModel extends model
|
||||
{
|
||||
$now = helper::now();
|
||||
$allChanges = array();
|
||||
$account = $this->app->user->account;
|
||||
$oldStories = $this->getByList($storyIDList);
|
||||
$ignoreStories = '';
|
||||
foreach($storyIDList as $storyID)
|
||||
@@ -1057,12 +1069,13 @@ class storyModel extends model
|
||||
}
|
||||
|
||||
$story = new stdclass();
|
||||
$story->lastEditedBy = $this->app->user->account;
|
||||
$story->lastEditedBy = $account;
|
||||
$story->lastEditedDate = $now;
|
||||
$story->stage = $stage;
|
||||
$story->stagedBy = $account;
|
||||
|
||||
$this->dao->update(TABLE_STORY)->data($story)->autoCheck()->where('id')->eq((int)$storyID)->exec();
|
||||
$this->dao->update(TABLE_STORYSTAGE)->set('stage')->eq($stage)->where('story')->eq((int)$storyID)->exec();
|
||||
$this->dao->update(TABLE_STORYSTAGE)->set('stage')->eq($stage)->set('stagedBy')->eq($account)->where('story')->eq((int)$storyID)->exec();
|
||||
if(!dao::isError()) $allChanges[$storyID] = common::createChanges($oldStory, $story);
|
||||
}
|
||||
if($ignoreStories) echo js::alert(sprintf($this->lang->story->ignoreChangeStage, $ignoreStories));
|
||||
@@ -1165,8 +1178,12 @@ class storyModel extends model
|
||||
$storyID = (int)$storyID;
|
||||
|
||||
/* Get projects which status is doing. */
|
||||
$oldStages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->fetchAll('branch');
|
||||
$this->dao->delete()->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->exec();
|
||||
$story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch();
|
||||
|
||||
$story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch();
|
||||
if(!empty($story->stagedBy)) return false;
|
||||
|
||||
$product = $this->dao->findById($story->product)->from(TABLE_PRODUCT)->fetch();
|
||||
$projects = $this->dao->select('t1.project,t3.branch')->from(TABLE_PROJECTSTORY)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
|
||||
@@ -1188,7 +1205,19 @@ class storyModel extends model
|
||||
{
|
||||
$this->dao->update(TABLE_STORY)->set('stage')->eq('wait')->where('id')->eq($storyID)->andWhere('plan')->eq('')->exec();
|
||||
|
||||
foreach($stages as $branch => $stage) $this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
|
||||
foreach($stages as $branch => $stage)
|
||||
{
|
||||
if(isset($oldStages[$branch]))
|
||||
{
|
||||
$oldStage = $oldStages[$branch];
|
||||
if(!empty($oldStage->stagedBy))
|
||||
{
|
||||
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
|
||||
}
|
||||
$this->dao->update(TABLE_STORY)->set('stage')->eq('planned')->where('id')->eq($storyID)->andWhere("(plan != '' AND plan != '0')")->exec();
|
||||
}
|
||||
|
||||
@@ -1210,7 +1239,19 @@ class storyModel extends model
|
||||
/* No tasks, then the stage is projected. */
|
||||
if(!$tasks and $projects)
|
||||
{
|
||||
foreach($stages as $branch => $stage) $this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq('projected')->exec();
|
||||
foreach($stages as $branch => $stage)
|
||||
{
|
||||
if(isset($oldStages[$branch]))
|
||||
{
|
||||
$oldStage = $oldStages[$branch];
|
||||
if(!empty($oldStage->stagedBy))
|
||||
{
|
||||
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq('projected')->exec();
|
||||
}
|
||||
$this->dao->update(TABLE_STORY)->set('stage')->eq('projected')->where('id')->eq($storyID)->exec();
|
||||
}
|
||||
|
||||
@@ -1285,7 +1326,16 @@ class storyModel extends model
|
||||
$minStage = '';
|
||||
foreach($stages as $branch => $stage)
|
||||
{
|
||||
$this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
|
||||
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
|
||||
if(isset($oldStages[$branch]))
|
||||
{
|
||||
$oldStage = $oldStages[$branch];
|
||||
if(!empty($oldStage->stagedBy))
|
||||
{
|
||||
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
|
||||
$stage = $oldStage->$stage;
|
||||
}
|
||||
}
|
||||
if(strpos($stageList, $stage) !== false and strpos($stageList, $stage) < $minStagePos)
|
||||
{
|
||||
$minStage = $stage;
|
||||
@@ -2425,7 +2475,7 @@ class storyModel extends model
|
||||
echo "<ul class='dropdown-menu pull-right'>";
|
||||
foreach($storyStages[$story->id] as $storyBranch => $storyStage)
|
||||
{
|
||||
echo '<li class="text-ellipsis">' . $branches[$storyBranch] . ": " . $this->lang->story->stageList[$storyStage->stage] . '</li>';
|
||||
if(isset($branches[$storyBranch])) echo '<li class="text-ellipsis">' . $branches[$storyBranch] . ": " . $this->lang->story->stageList[$storyStage->stage] . '</li>';
|
||||
}
|
||||
echo "</ul>";
|
||||
echo '</div>';
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<?php $browseLink = $app->session->storyList != false ? $app->session->storyList : $this->createLink('product', 'browse', "productID=$story->product&branch=$story->branch&moduleID=$story->module");?>
|
||||
<?php js::set('sysurl', common::getSysUrl());?>
|
||||
<?php js::set('isonlybody', isonlybody());?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php if(!isonlybody()):?>
|
||||
|
||||
@@ -1212,9 +1212,8 @@ class task extends control
|
||||
$chartFunc = 'getDataOf' . $chart;
|
||||
$chartData = $this->task->$chartFunc();
|
||||
$chartOption = $this->lang->task->report->$chart;
|
||||
if(!empty($chartType)) $chartOption->type = $chartType;
|
||||
if(!empty($chartType) and $chartType != 'default') $chartOption->type = $chartType;
|
||||
$this->task->mergeChartOption($chart);
|
||||
|
||||
$this->view->charts[$chart] = $chartOption;
|
||||
$this->view->datas[$chart] = $this->report->computePercent($chartData);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
.chosen-container[id^="story"] .chosen-drop {min-width: 450px !important;}
|
||||
.chosen-container[id^="module"] .chosen-drop {min-width: 400px !important;}
|
||||
[id^=name] {min-width: 165px;}
|
||||
#mainContent .main-header h2{max-width:300px}
|
||||
|
||||
#batchCreateForm .input-group,
|
||||
#batchCreateForm .input-group .form-control {position: static;}
|
||||
@@ -18,4 +19,4 @@
|
||||
.chosen-results > li.has-task,
|
||||
.chosen-results > li.has-new-task {position: relative; color: #388E3C;}
|
||||
.chosen-results > li.has-task.highlighted,
|
||||
.chosen-results > li.has-new-task.highlighted {color: #fff;}
|
||||
.chosen-results > li.has-new-task.highlighted {color: #fff;}
|
||||
|
||||
@@ -274,8 +274,3 @@ $lang->task->report->tasksPerClosedReason->graph->xAxisName = '关闭原因';
|
||||
|
||||
$lang->task->report->finishedTasksPerDay->type = 'bar';
|
||||
$lang->task->report->finishedTasksPerDay->graph->xAxisName = '日期';
|
||||
|
||||
$lang->task->action = new stdclass();
|
||||
$lang->task->action->batchcreate = array('main' => '$date, 由 <strong>$actor</strong> 创建子任务 。');
|
||||
$lang->task->action->unlink = array('main' => '$date, 由 <strong>$actor</strong> 取消关联父任务 。');
|
||||
$lang->task->action->linkto = array('main' => '$date, 由 <strong>$actor</strong> 关联到父任务 。');
|
||||
|
||||
@@ -679,10 +679,9 @@ class taskModel extends model
|
||||
|
||||
if(isset($task->parent) and $task->parent != $oldTask->parent)
|
||||
{
|
||||
$comment = html::a(helper::createLink('task', 'view', 'taskID=' . $taskID), $task->name);
|
||||
$this->loadModel('action')->create('task', $task->parent, 'linkTo', $comment);
|
||||
$this->loadModel('action')->create('task', $oldTask->parent, 'unLink', $comment);
|
||||
|
||||
$this->loadModel('action')->create('task', $task->parent, 'linkChildTask', '', $taskID);
|
||||
$this->loadModel('action')->create('task', $oldTask->parent, 'unLinkChildrenTask', '', $taskID);
|
||||
$this->loadModel('action')->create('task', $taskID, 'linkParentTask', '', $task->parent);
|
||||
}
|
||||
|
||||
$task = $this->loadModel('file')->processImgURL($task, $this->config->task->editor->edit['id'], $this->post->uid);
|
||||
@@ -751,7 +750,7 @@ class taskModel extends model
|
||||
if($oldTask->parent > 0)
|
||||
{
|
||||
if($task->parent == 0) $this->computeWorkingHours($oldTask->parent);
|
||||
$this->updateParentStatus($taskID);
|
||||
$this->updateParentStatus($taskID, false);
|
||||
$this->computeBeginAndEnd($oldTask->parent);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<div class="main-header clearfix">
|
||||
<h2 class="pull-left">
|
||||
<?php if($parent):?>
|
||||
<span class='pull-left'><?php echo $parentTitle;?></span>
|
||||
<span class='pull-left'><?php echo $parentTitle . $this->lang->colon;?></span>
|
||||
<?php echo $lang->task->batchCreateChildren;?>
|
||||
<?php else:?>
|
||||
<?php echo $lang->task->batchCreate;?>
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
<?php if(!isonlybody()) echo "<div class='divider'></div>";?>
|
||||
<?php if(!$task->deleted):?>
|
||||
<?php
|
||||
if(empty($task->team) or empty($task->children)) common::printIcon('task', 'batchCreate', "project=$task->project&storyID=$task->story&moduleID=$task->module&taskID=$task->id", $task, 'button', 'treemap-alt', '', '', '', "title='{$lang->task->children}'", $lang->task->children);
|
||||
common::printIcon('task', 'assignTo', "projectID=$task->project&taskID=$task->id", $task, 'button', '', '', 'iframe', true, '', empty($task->team) ? $lang->task->assignTo : $lang->task->transfer);
|
||||
common::printIcon('task', 'start', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
|
||||
common::printIcon('task', 'restart', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
|
||||
@@ -163,11 +164,9 @@
|
||||
common::printIcon('task', 'cancel', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
|
||||
|
||||
if(!isonlybody()) echo "<div class='divider'></div>";
|
||||
if(empty($task->team) or empty($task->children)) common::printIcon('task', 'batchCreate', "project=$task->project&storyID=$task->story&moduleID=$task->module&taskID=$task->id", $task, 'button', 'plus', '', '', '', "title='{$lang->task->children}'", ' ');
|
||||
common::printIcon('task', 'edit', "taskID=$task->id", $task, 'button', '', '', 'showinonlybody');
|
||||
common::printIcon('task', 'create', "projctID={$task->project}&storyID=0&moduleID=0&taskID=$task->id", $task, 'button', 'copy');
|
||||
common::printIcon('task', 'delete', "projectID=$task->project&taskID=$task->id", $task, 'button', 'trash', 'hiddenwin');
|
||||
if($task->parent <= 0) common::printIcon('task', 'batchCreate', "project=$task->project&storyID=$task->story&moduleID=$task->module&taskID=$task->id&ifame=0", $task, 'list', 'treemap-alt', '', '', '', '', $this->lang->task->children);
|
||||
if($task->parent > 0) echo html::a(helper::createLink('task', 'view', "taskID=$task->parent"), "<i class='icon icon-chevron-double-up'></i>", '', "class='btn btn-link' title='{$lang->task->parent}'");
|
||||
?>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -816,7 +816,6 @@ class testcase extends control
|
||||
else
|
||||
{
|
||||
$this->testcase->delete(TABLE_CASE, $caseID);
|
||||
|
||||
/* if ajax request, send result. */
|
||||
if($this->server->ajax)
|
||||
{
|
||||
|
||||
@@ -499,7 +499,15 @@ class testtaskModel extends model
|
||||
*/
|
||||
public function getDataOfTestTaskPerRunResult($taskID)
|
||||
{
|
||||
$datas = $this->dao->select('lastRunResult AS name, COUNT(*) AS value')->from(TABLE_TESTRUN)->where('task')->eq($taskID)->groupBy('name')->orderBy('value DESC')->fetchAll('name');
|
||||
$datas = $this->dao->select("t1.lastRunResult AS name, COUNT('t1.*') AS value")->from(TABLE_TESTRUN)->alias('t1')
|
||||
->leftJoin(TABLE_CASE)->alias('t2')
|
||||
->on('t1.case = t2.id')
|
||||
->where('t1.task')->eq($taskID)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->groupBy('name')
|
||||
->orderBy('value DESC')
|
||||
->fetchAll('name');
|
||||
|
||||
if(!$datas) return array();
|
||||
|
||||
foreach($datas as $result => $data) $data->name = isset($this->lang->testcase->resultList[$result])? $this->lang->testcase->resultList[$result] : $this->lang->testtask->unexecuted;
|
||||
|
||||
@@ -65,7 +65,7 @@ class todo extends control
|
||||
|
||||
if($this->app->getViewType() == 'xhtml') die(js::locate($this->createLink('todo', 'view', "todoID=$todoID"), 'parent'));
|
||||
if(isonlybody()) die(js::locate($this->createLink('my', 'todo', "type=$date"), 'parent.parent'));
|
||||
die(js::locate($this->createLink('my', 'todo', "type=all"), 'parent'));
|
||||
die(js::locate($this->createLink('my', 'todo', "type=all&account=&status=all&orderBy=id_desc"), 'parent'));
|
||||
}
|
||||
|
||||
unset($this->lang->todo->typeList['cycle']);
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
#projectModal .modal-dialog, #productModal .modal-dialog {top: auto!important; bottom: 90px;}
|
||||
.body-modal #projectModal .modal-dialog, .body-modal #productModal .modal-dialog {top: auto!important; bottom: 55px;}
|
||||
.body-modal #projectModal .modal-dialog, .body-modal #productModal .modal-dialog {top: auto!important; bottom: 55px;}
|
||||
|
||||
@@ -243,8 +243,6 @@
|
||||
<?php echo $lang->todo->thisIsPrivate;?>
|
||||
<?php endif;?>
|
||||
<script>
|
||||
$(function(){
|
||||
parent.$('body.hide-modal-close').removeClass('hide-modal-close');
|
||||
})
|
||||
$(function() { parent.$('body.hide-modal-close').removeClass('hide-modal-close'); })
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -375,7 +375,9 @@ class upgradeModel extends model
|
||||
$this->saveLogs('Execute 11_4');
|
||||
$this->execSQL($this->getUpgradeFile('11.4'));
|
||||
case '11_4_1':
|
||||
$this->saveLogs('Execute 11_4');
|
||||
$this->saveLogs('Execute 11_4_1');
|
||||
$this->execSQL($this->getUpgradeFile('11.4.1'));
|
||||
$this->addPriv11_5();
|
||||
if(!isset($this->config->isINT) or !($this->config->isINT))
|
||||
{
|
||||
if(!$executeXuanxuan)
|
||||
@@ -519,6 +521,7 @@ class upgradeModel extends model
|
||||
case '11_3': $confirmContent .= file_get_contents($this->getUpgradeFile('11.3'));
|
||||
case '11_4': $confirmContent .= file_get_contents($this->getUpgradeFile('11.4'));
|
||||
case '11_4_1':
|
||||
$confirmContent .= file_get_contents($this->getUpgradeFile('11.4.1'));
|
||||
if(!isset($this->config->isINT) or !($this->config->isINT))
|
||||
{
|
||||
$xuanxuanSql = $this->app->getAppRoot() . 'db' . DS . 'upgradexuanxuan2.4.0.sql';
|
||||
@@ -2269,6 +2272,49 @@ class upgradeModel extends model
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Priv for 11.5
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function addPriv11_5()
|
||||
{
|
||||
$this->saveLogs('Run Method ' . __FUNCTION__);
|
||||
$groups = $this->dao->select('`group`')->from(TABLE_GROUPPRIV)->where('module')->eq('bug')->andWhere('method')->eq('setPublic')->fetchPairs('group', 'group');
|
||||
foreach($groups as $groupID)
|
||||
{
|
||||
$data = new stdclass();
|
||||
$data->group = $groupID;
|
||||
$data->module = 'user';
|
||||
$data->method = 'setPublicTemplate';
|
||||
$this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec();
|
||||
$this->saveLogs($this->dao->get());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add unique key for stage.
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function addUniqueKey4Stage()
|
||||
{
|
||||
$this->saveLogs('Run Method ' . __FUNCTION__);
|
||||
$stmt = $this->dao->select('story,branch')->from(TABLE_STORYSTAGE)->orderBy('story,branch')->query();
|
||||
$preStage = '';
|
||||
while($stage = $stmt->fetch())
|
||||
{
|
||||
if($preStage == "{$stage->story}_{$stage->branch}") $this->dao->delete()->from(TABLE_STORYSTAGE)->where('story')->eq($stage->story)->andWhere('branch')->eq($stage->branch)->exec();
|
||||
$preStage = "{$stage->story}_{$stage->branch}";
|
||||
}
|
||||
$this->dao->exec("ALTER TABLE " . TABLE_STORYSTAGE . " ADD UNIQUE `story_branch` (`story`, `branch`)");
|
||||
$this->saveLogs($this->dao->get());
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Judge any error occers.
|
||||
*
|
||||
|
||||
+29
-22
@@ -48,28 +48,35 @@ $lang->user->originalPassword = 'Old Password';
|
||||
$lang->user->verifyPassword = 'Your Login Password';
|
||||
$lang->user->resetPassword = 'Forgot Password?';
|
||||
|
||||
$lang->user->index = "Home";
|
||||
$lang->user->view = "Overview";
|
||||
$lang->user->create = "Add User";
|
||||
$lang->user->batchCreate = "Batch Add";
|
||||
$lang->user->edit = "Edit";
|
||||
$lang->user->batchEdit = "Batch Edit";
|
||||
$lang->user->unlock = "Unlock";
|
||||
$lang->user->delete = "Delete";
|
||||
$lang->user->unbind = "Unbind Zdoo";
|
||||
$lang->user->login = "Login";
|
||||
$lang->user->mobileLogin = "Mobile";
|
||||
$lang->user->editProfile = "Edit Profile";
|
||||
$lang->user->deny = "Your access is denied.";
|
||||
$lang->user->confirmDelete = "Do you want to delete this user?";
|
||||
$lang->user->confirmUnlock = "Do you want to unlock this user?";
|
||||
$lang->user->confirmUnbind = "Do you want to unbind this user from Zdoo?";
|
||||
$lang->user->relogin = "Login Again";
|
||||
$lang->user->asGuest = "Guest";
|
||||
$lang->user->goback = "Back";
|
||||
$lang->user->deleted = '(Deleted)';
|
||||
$lang->user->search = 'Search';
|
||||
$lang->user->setPublicTemplate = 'Set as Public Template';
|
||||
$lang->user->index = "Home";
|
||||
$lang->user->view = "Overview";
|
||||
$lang->user->create = "Add User";
|
||||
$lang->user->batchCreate = "Batch Add";
|
||||
$lang->user->edit = "Edit";
|
||||
$lang->user->batchEdit = "Batch Edit";
|
||||
$lang->user->unlock = "Unlock";
|
||||
$lang->user->delete = "Delete";
|
||||
$lang->user->unbind = "Unbind Zdoo";
|
||||
$lang->user->login = "Login";
|
||||
$lang->user->mobileLogin = "Mobile";
|
||||
$lang->user->editProfile = "Edit Profile";
|
||||
$lang->user->deny = "Your access is denied.";
|
||||
$lang->user->confirmDelete = "Do you want to delete this user?";
|
||||
$lang->user->confirmUnlock = "Do you want to unlock this user?";
|
||||
$lang->user->confirmUnbind = "Do you want to unbind this user from Zdoo?";
|
||||
$lang->user->relogin = "Login Again";
|
||||
$lang->user->asGuest = "Guest";
|
||||
$lang->user->goback = "Back";
|
||||
$lang->user->deleted = '(Deleted)';
|
||||
$lang->user->search = 'Search';
|
||||
|
||||
$lang->user->saveTemplate = 'Save as Template';
|
||||
$lang->user->setPublic = 'Set as Public Template';
|
||||
$lang->user->deleteTemplate = 'Delete Template';
|
||||
$lang->user->setTemplateTitle = 'Please enter the title of template.';
|
||||
$lang->user->applyTemplate = 'Template';
|
||||
$lang->user->confirmDeleteTemplate = 'Do you want to delete this template?';
|
||||
$lang->user->setPublicTemplate = 'Set as Public Template';
|
||||
|
||||
$lang->user->profile = 'Profile';
|
||||
$lang->user->project = $lang->projectCommon;
|
||||
|
||||
+29
-22
@@ -48,28 +48,35 @@ $lang->user->originalPassword = '原密码';
|
||||
$lang->user->verifyPassword = '您的系统登录密码';
|
||||
$lang->user->resetPassword = '忘记密码';
|
||||
|
||||
$lang->user->index = "用户视图首页";
|
||||
$lang->user->view = "用户详情";
|
||||
$lang->user->create = "添加用户";
|
||||
$lang->user->batchCreate = "批量添加用户";
|
||||
$lang->user->edit = "编辑用户";
|
||||
$lang->user->batchEdit = "批量编辑";
|
||||
$lang->user->unlock = "解锁用户";
|
||||
$lang->user->delete = "删除用户";
|
||||
$lang->user->unbind = "解除然之绑定";
|
||||
$lang->user->login = "用户登录";
|
||||
$lang->user->mobileLogin = "手机访问";
|
||||
$lang->user->editProfile = "修改档案";
|
||||
$lang->user->deny = "访问受限";
|
||||
$lang->user->confirmDelete = "您确定删除该用户吗?";
|
||||
$lang->user->confirmUnlock = "您确定解除该用户的锁定状态吗?";
|
||||
$lang->user->confirmUnbind = "您确定解除该用户跟然之的绑定吗?";
|
||||
$lang->user->relogin = "重新登录";
|
||||
$lang->user->asGuest = "游客访问";
|
||||
$lang->user->goback = "返回前一页";
|
||||
$lang->user->deleted = '(已删除)';
|
||||
$lang->user->search = '搜索';
|
||||
$lang->user->setPublicTemplate = '设为公共模板';
|
||||
$lang->user->index = "用户视图首页";
|
||||
$lang->user->view = "用户详情";
|
||||
$lang->user->create = "添加用户";
|
||||
$lang->user->batchCreate = "批量添加用户";
|
||||
$lang->user->edit = "编辑用户";
|
||||
$lang->user->batchEdit = "批量编辑";
|
||||
$lang->user->unlock = "解锁用户";
|
||||
$lang->user->delete = "删除用户";
|
||||
$lang->user->unbind = "解除然之绑定";
|
||||
$lang->user->login = "用户登录";
|
||||
$lang->user->mobileLogin = "手机访问";
|
||||
$lang->user->editProfile = "修改档案";
|
||||
$lang->user->deny = "访问受限";
|
||||
$lang->user->confirmDelete = "您确定删除该用户吗?";
|
||||
$lang->user->confirmUnlock = "您确定解除该用户的锁定状态吗?";
|
||||
$lang->user->confirmUnbind = "您确定解除该用户跟然之的绑定吗?";
|
||||
$lang->user->relogin = "重新登录";
|
||||
$lang->user->asGuest = "游客访问";
|
||||
$lang->user->goback = "返回前一页";
|
||||
$lang->user->deleted = '(已删除)';
|
||||
$lang->user->search = '搜索';
|
||||
|
||||
$lang->user->saveTemplate = '保存模板';
|
||||
$lang->user->setPublic = '设为公共模板';
|
||||
$lang->user->deleteTemplate = '删除模板';
|
||||
$lang->user->setTemplateTitle = '请输入模板标题';
|
||||
$lang->user->applyTemplate = '应用模板';
|
||||
$lang->user->confirmDeleteTemplate = '您确认要删除该模板吗?';
|
||||
$lang->user->setPublicTemplate = '设为公共模板';
|
||||
|
||||
$lang->user->profile = '档案';
|
||||
$lang->user->project = $lang->projectCommon;
|
||||
|
||||
@@ -1332,7 +1332,9 @@ class userModel extends model
|
||||
$userView = $this->dao->select('*')->from(TABLE_USERVIEW)->where('account')->eq($account)->fetch();
|
||||
|
||||
if(empty($userView)) $userView = $this->computeUserView($account);
|
||||
if(!empty($acls['products']) and !$this->session->user->admin)
|
||||
if(isset($_SESSION['user']->admin)) $isAdmin = $this->session->user->admin;
|
||||
if(!isset($isAdmin)) $isAdmin = strpos($this->app->company->admins, ",{$account},") !== false;
|
||||
if(!empty($acls['products']) and !$isAdmin)
|
||||
{
|
||||
$grantProducts = '';
|
||||
foreach($acls['products'] as $productID)
|
||||
@@ -1341,7 +1343,7 @@ class userModel extends model
|
||||
}
|
||||
$userView->products = $grantProducts;
|
||||
}
|
||||
if(!empty($acls['projects']) and !$this->session->user->admin)
|
||||
if(!empty($acls['projects']) and !$isAdmin)
|
||||
{
|
||||
$grantProjects = '';
|
||||
foreach($acls['projects'] as $projectID)
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
foreach($templates as $key => $template)
|
||||
{
|
||||
echo "<li id='tplBox$template->id' onmouseover='displayXIcon($template->id)' onmouseout='hideXIcon($template->id)'>";
|
||||
echo "<a title='{$lang->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
|
||||
if($template->public) echo "<span class='label label-info label-badge'>{$lang->public}</span> ";
|
||||
echo "<a title='{$lang->user->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
|
||||
if($template->public) echo "<span class='label label-info label-badge'>{$lang->user->public}</span> ";
|
||||
echo $template->title . "</a>";
|
||||
if(empty($template->public) or $template->account == $app->user->account)echo "<a href='###' onclick='deleteTemplate($template->id)' id='templateID$template->id' class='btn-delete hidden'><i class='icon-close'></i></a>";
|
||||
echo "<span id='template$template->id' class='hidden'>$template->content</span>";
|
||||
@@ -14,8 +14,9 @@ foreach($templates as $key => $template)
|
||||
<?php else:?>
|
||||
<style>
|
||||
#tplBoxWrapper {position: relative; z-index: 10;}
|
||||
#tplBoxWrapper > .btn-toolbar {position: absolute; right: 0px; top: 0px;}
|
||||
#tplBoxWrapper .btn {padding: 4px 8px}
|
||||
#tplBoxWrapper > .btn-toolbar {position: absolute; right: 1px; top: 1px;}
|
||||
#tplBoxWrapper .btn {padding: 4px 8px; border-top:0px; border-bottom:0px;}
|
||||
#tplBoxWrapper #applyTplBtn {border-right:0px;}
|
||||
#tplBox li {position: relative;}
|
||||
#tplBox li .btn-delete {position: absolute; right: 0; top: -5px; display: block; width: 40px; text-align:center;}
|
||||
#tplBox li:hover .btn-delete {color:#fff;}
|
||||
@@ -24,15 +25,15 @@ foreach($templates as $key => $template)
|
||||
<div id='tplBoxWrapper'>
|
||||
<div class='btn-toolbar'>
|
||||
<div class='btn-group'>
|
||||
<button id='saveTplBtn' type='button' class='btn btn-mini' data-toggle='saveTplModal'><?php echo $lang->saveTemplate?></button>
|
||||
<button type='button' class='btn btn-mini dropdown-toggle' data-toggle='dropdown'><?php echo $lang->applyTemplate?> <span class='caret'></span></button>
|
||||
<button id='saveTplBtn' type='button' class='btn btn-mini' data-toggle='saveTplModal'><?php echo $lang->user->saveTemplate?></button>
|
||||
<button id='applyTplBtn' type='button' class='btn btn-mini dropdown-toggle' data-toggle='dropdown'><?php echo $lang->user->applyTemplate?> <span class='caret'></span></button>
|
||||
<ul id='tplBox' class='dropdown-menu pull-right'>
|
||||
<?php
|
||||
foreach($templates as $key => $template)
|
||||
{
|
||||
echo "<li id='tplBox$template->id' onmouseover='displayXIcon($template->id)' onmouseout='hideXIcon($template->id)'>";
|
||||
echo "<a title='{$lang->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
|
||||
if($template->public) echo "<span class='label label-info label-badge'>{$lang->public}</span> ";
|
||||
echo "<a title='{$lang->user->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
|
||||
if($template->public) echo "<span class='label label-info label-badge'>{$lang->user->public}</span> ";
|
||||
echo $template->title . "</a>";
|
||||
if(empty($template->public) or $template->account == $app->user->account)echo "<a href='###' onclick='deleteTemplate($template->id)' id='templateID$template->id' class='btn-delete hidden'><i class='icon-close'></i></a>";
|
||||
echo "<span id='template$template->id' class='hidden'>$template->content</span>";
|
||||
@@ -48,15 +49,20 @@ foreach($templates as $key => $template)
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><i class="icon icon-close"></i></button>
|
||||
<h4 class="modal-title"><?php echo $lang->setTemplateTitle;?></h4>
|
||||
<h4 class="modal-title"><?php echo $lang->user->setTemplateTitle;?></h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class='input-group'>
|
||||
<?php echo html::input('title', '' , "class='form-control'")?>
|
||||
<input type="text" id="title" value="" class="form-control" autocomplete="off">
|
||||
<?php if(common::hasPriv('user', 'setPublicTemplate')):?>
|
||||
<span class='input-group-addon'><?php echo html::checkbox('public', array('1' => $lang->public))?></span>
|
||||
<span class="input-group-addon">
|
||||
<div class="checkbox-primary">
|
||||
<input type="checkbox" value="1" id="public" />
|
||||
<label for="public"><?php echo $lang->public;?></label>
|
||||
</div>
|
||||
</span>
|
||||
<?php endif;?>
|
||||
<span class='input-group-btn'><?php echo html::commonButton($lang->save, "id='submit'", 'btn btn-primary')?></span>
|
||||
<span class='input-group-btn'><?php echo html::commonButton($lang->save, "id='templateSubmit'", 'btn btn-primary')?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -76,7 +82,7 @@ function setTemplate(templateID)
|
||||
function deleteTemplate(templateID)
|
||||
{
|
||||
if(!templateID) return;
|
||||
if(confirm(<?php echo json_encode($lang->confirmDeleteTemplate);?>))
|
||||
if(confirm(<?php echo json_encode($lang->user->confirmDeleteTemplate);?>))
|
||||
{
|
||||
hiddenwin.location.href = createLink('user', 'ajaxDeleteTemplate', 'templateID=' + templateID);
|
||||
$('#tplBox' + templateID).addClass('hidden');
|
||||
@@ -97,10 +103,10 @@ $(function()
|
||||
{
|
||||
$('#saveTplModal').on('hide.zui.modal', function(){$(this).find('#title').val('');});
|
||||
$('#saveTplBtn').click(function(){$('#saveTplModal').modal('show');});
|
||||
$('#saveTplModal #submit').click(function()
|
||||
$('#saveTplModal #templateSubmit').click(function()
|
||||
{
|
||||
var $inputGroup = $('#saveTplModal div.input-group');
|
||||
var $publicBox = $inputGroup.find('input[id^="public"]');
|
||||
var $publicBox = $inputGroup.find('input#public');
|
||||
var title = $inputGroup.find('#title').val();
|
||||
var content = editor['<?php echo $link;?>'].html();
|
||||
var isPublic = ($publicBox.size() > 0 && $publicBox.prop('checked')) ? $publicBox.val() : 0;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
?>
|
||||
<?php include '../../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('sso');?></div>
|
||||
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('xuanxuan');?></div>
|
||||
</div>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='center-block'>
|
||||
@@ -36,6 +36,11 @@
|
||||
<th><?php echo $lang->chat->key;?></th>
|
||||
<td><?php echo zget($config->xuanxuan, 'key', '');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->chat->debug;?></th>
|
||||
<td><?php echo $type == 'edit' ? html::radio('debug', $lang->chat->debugStatus, zget($config->xuanxuan, 'debug', 0)) : zget($lang->chat->debugStatus, zget($config->xuanxuan, 'debug', 0));?></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->chat->xxdServer;?></th>
|
||||
<td><?php echo $type == 'edit' ? html::input('server', $domain, "class='form-control'") : $domain;?></td>
|
||||
@@ -114,7 +119,6 @@
|
||||
<?php echo html::a(helper::createLink('admin', 'downloadXXD', 'type=package'), $lang->chat->downloadXXD, 'hiddenwin', "class='btn btn-primary download download-package'");?>
|
||||
<?php echo html::a(helper::createLink('admin', 'downloadXXD', 'type=config'), $lang->chat->downloadConfig, 'hiddenwin', "class='btn btn-primary download'");?>
|
||||
<?php echo html::a(helper::createLink('admin', 'xuanxuan', 'type=edit'), $lang->chat->changeSetting, '', "class='btn'");?>
|
||||
<?php echo html::a(helper::createLink('client', 'browse'), $lang->client->browseVersion, '', "class='btn'");?>
|
||||
<?php echo html::a('http://www.zentao.net/book/zentaopmshelp/302.html', $lang->chat->help, '_blank', "class='btn'");?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
|
||||
@@ -12,12 +12,14 @@
|
||||
?>
|
||||
<?php include '../../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('sso');?></div>
|
||||
<div class="btn-toolbar pull-right"><?php common::printLink('admin', 'xuanxuan', '', $lang->goback, '', "class='btn'");?></div>
|
||||
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('xuanxuan');?></div>
|
||||
</div>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='main-header'>
|
||||
<div class='pull-right'><?php common::printLink('client', 'create', '', $lang->client->create, '', "class='btn btn-primary' data-toggle='modal'");?></div>
|
||||
<div class='pull-right'>
|
||||
<?php common::printLink('client', 'checkUpgrade', '', $lang->client->checkUpgrade, '', "class='btn'");?>
|
||||
<?php common::printLink('client', 'create', '', $lang->client->create, '', "class='btn btn-primary' data-toggle='modal'");?>
|
||||
</div>
|
||||
<div class='heading'>
|
||||
<h4><?php echo $lang->client->browseVersion;?></h4>
|
||||
</div>
|
||||
|
||||
@@ -1,17 +1,12 @@
|
||||
<?php
|
||||
$lang->xuanxuan = new stdclass();
|
||||
$lang->admin->menu->xuanxuan = array('link' => 'ZT Client|admin|xuanxuan', 'subModule' => 'client');
|
||||
|
||||
$lang->admin->menu->sso['link'] = 'Integrate|admin|xuanxuan';
|
||||
if(!isset($lang->admin->menu->sso['alias'])) $lang->admin->menu->sso['alias'] = '';
|
||||
$lang->admin->menu->sso['alias'] = $lang->admin->menu->sso['alias'] . ',sso';
|
||||
if(!isset($lang->admin->menu->sso['subModule'])) $lang->admin->menu->sso['subModule'] = '';
|
||||
$lang->admin->menu->sso['subModule'] = $lang->admin->menu->sso['subModule'] . ',client';
|
||||
|
||||
$lang->admin->subMenu->sso->xuanxuan = array('link' => 'ZT Client|admin|xuanxuan', 'subModule' => 'client');
|
||||
$lang->admin->subMenuOrder->sso[4] = 'xuanxuan';
|
||||
|
||||
$lang->client = new stdclass();
|
||||
$lang->client->menu = $lang->admin->menu;
|
||||
$lang->admin->subMenu->xuanxuan = new stdclass();
|
||||
$lang->admin->subMenu->xuanxuan->setting = array('link' => 'Parameter|admin|xuanxuan');
|
||||
$lang->admin->subMenu->xuanxuan->update = array('link' => 'Update|client|browse', 'subModule' => 'client');
|
||||
$lang->admin->subMenuOrder->xuanxuan[0] = 'setting';
|
||||
$lang->admin->subMenuOrder->xuanxuan[5] = 'update';
|
||||
|
||||
$lang->menugroup->client = 'admin';
|
||||
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
<?php
|
||||
$lang->xuanxuan = new stdclass();
|
||||
$lang->admin->menu->xuanxuan = array('link' => '客户端|admin|xuanxuan', 'subModule' => 'client');
|
||||
|
||||
$lang->admin->menu->sso['link'] = '集成|admin|xuanxuan';
|
||||
if(!isset($lang->admin->menu->sso['alias'])) $lang->admin->menu->sso['alias'] = '';
|
||||
$lang->admin->menu->sso['alias'] = $lang->admin->menu->sso['alias'] . ',sso';
|
||||
if(!isset($lang->admin->menu->sso['subModule'])) $lang->admin->menu->sso['subModule'] = '';
|
||||
$lang->admin->menu->sso['subModule'] = $lang->admin->menu->sso['subModule'] . ',client';
|
||||
|
||||
$lang->admin->subMenu->sso->xuanxuan = array('link' => '客户端集成|admin|xuanxuan', 'subModule' => 'client');
|
||||
$lang->admin->subMenuOrder->sso[4] = 'xuanxuan';
|
||||
$lang->admin->subMenu->xuanxuan = new stdclass();
|
||||
$lang->admin->subMenu->xuanxuan->setting = array('link' => '参数|admin|xuanxuan');
|
||||
$lang->admin->subMenu->xuanxuan->update = array('link' => '更新|client|browse', 'subModule' => 'client');
|
||||
$lang->admin->subMenuOrder->xuanxuan[0] = 'setting';
|
||||
$lang->admin->subMenuOrder->xuanxuan[5] = 'update';
|
||||
|
||||
$lang->menugroup->client = 'admin';
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* The common modal footer view file of RanZhi.
|
||||
*
|
||||
* @copyright Copyright 2009-2016 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Xiying Guan <guanxiying@xirangit.com>
|
||||
* @package RanZhi
|
||||
* @version $Id$
|
||||
* @link http://www.ranzhico.com
|
||||
*/
|
||||
?>
|
||||
<?php if(helper::isAjaxRequest()):?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(isset($pageJS)) js::execute($pageJS);?>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
var options =
|
||||
{
|
||||
language: '<?php echo $this->app->getClientLang(); ?>',
|
||||
weekStart: 1,
|
||||
todayBtn: 1,
|
||||
autoclose: 1,
|
||||
todayHighlight: 1,
|
||||
startView: 2,
|
||||
forceParse: 0,
|
||||
showMeridian: 1,
|
||||
format: 'yyyy-mm-dd hh:ii'
|
||||
}
|
||||
|
||||
$('.form-datetime').datetimepicker(options);
|
||||
$('.form-date').datetimepicker($.extend(options, {minView: 2, format: 'yyyy-mm-dd'}));
|
||||
$('.form-time').datetimepicker($.extend(options, {eleClass: 'only-pick-time', startView: 1, minView: 0, maxView: 1, format: 'hh:ii'}));
|
||||
$('.form-month').datetimepicker($.extend(options, {startView: 3, minView: 3, format: 'yyyy-mm'}));
|
||||
$('.chosen').chosen();
|
||||
});
|
||||
</script>
|
||||
<?php else:?>
|
||||
<?php include $this->app->getAppRoot() . 'module/common/view/footer.html.php'; ?>
|
||||
<?php endif;?>
|
||||
@@ -1,43 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* The header.modal view of common module of RanZhi.
|
||||
*
|
||||
* @copyright Copyright 2009-2016 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package common
|
||||
* @version $Id$
|
||||
* @link http://www.ranzhico.com
|
||||
*/
|
||||
?>
|
||||
<?php if(helper::isAjaxRequest()):?>
|
||||
<?php
|
||||
$webRoot = $config->webRoot;
|
||||
$jsRoot = $webRoot . "js/";
|
||||
$themeRoot = $webRoot . "theme/";
|
||||
$modalSizeList = array('lg' => '900px', 'sm' => '300px');
|
||||
if(!isset($modalWidth)) $modalWidth = 700;
|
||||
if(is_numeric($modalWidth))
|
||||
{
|
||||
$modalWidth .= 'px';
|
||||
}
|
||||
else if(isset($modalSizeList[$modalWidth]))
|
||||
{
|
||||
$modalWidth = $modalSizeList[$modalWidth];
|
||||
}
|
||||
if(isset($pageCSS)) css::internal($pageCSS);
|
||||
?>
|
||||
<style>
|
||||
#ajaxForm .table tr:first-child td:nth-child(3){width:5px;}
|
||||
</style>
|
||||
<div class="modal-dialog" style="width:<?php echo $modalWidth;?>;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<?php echo html::closeButton();?>
|
||||
<strong class="modal-title"><?php if(!empty($title)) echo $title; ?></strong>
|
||||
<?php if(!empty($subtitle)) echo "<label class='text-important'>" . $subtitle . '</label>'; ?>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<?php else:?>
|
||||
<?php include $this->app->getAppRoot() . 'module/common/view/header.html.php';?>
|
||||
<?php endif;?>
|
||||
@@ -47,7 +47,17 @@ class entry extends control
|
||||
|
||||
$this->user->cleanLocked($user->account);
|
||||
|
||||
$user->admin = strpos($this->app->company->admins, ",{$user->account},") !== false;
|
||||
$user->lastTime = $user->last;
|
||||
$user->last = date(DT_DATETIME1, $user->last);
|
||||
$user->admin = strpos($this->app->company->admins, ",{$user->account},") !== false;
|
||||
$user->modifyPassword = ($user->visits == 0 and !empty($this->config->safe->modifyPasswordFirstLogin));
|
||||
if($user->modifyPassword) $user->modifyPasswordReason = 'modifyPasswordFirstLogin';
|
||||
if(!$user->modifyPassword and !empty($this->config->safe->changeWeak))
|
||||
{
|
||||
$user->modifyPassword = $this->loadModel('admin')->checkWeak($user);
|
||||
if($user->modifyPassword) $user->modifyPasswordReason = 'weak';
|
||||
}
|
||||
|
||||
$user->rights = $this->user->authorize($user->account);
|
||||
$user->groups = $this->user->getGroups($user->account);
|
||||
$user->view = $this->user->grantUserView($user->account, $user->rights['acls']);
|
||||
|
||||
Reference in New Issue
Block a user