This commit is contained in:
hufangzhou
2021-03-12 08:21:44 +08:00
29 changed files with 388 additions and 541 deletions
-87
View File
@@ -1,87 +0,0 @@
<?php
/**
* The admin module English file 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 Chunsheng Wang <chunsheng@cnezsoft.com>
* @package admin
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->common = 'Admin';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Datenbank prüfen';
$lang->admin->sso = 'SSO';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Sicherheit';
$lang->admin->checkWeak = 'Schwache Passwörter prüfen';
$lang->admin->certifyMobile = 'Prüfen Sie die Mobilnummer';
$lang->admin->certifyEmail = 'Prüfen Sie die Emailadresse';
$lang->admin->ztCompany = 'Prüfen Sie das Unternehmen';
$lang->admin->captcha = 'Bestätigungscode';
$lang->admin->getCaptcha = 'Bestätigungscode anfordern';
$lang->admin->register = 'Register';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Einstellungen';
$lang->admin->days = 'Gültige Tage';
$lang->admin->info = new stdclass();
$lang->admin->info->version = 'Aktuelle Version ist %s. ';
$lang->admin->info->links = 'You can visit links below';
$lang->admin->info->account = 'Ihr ZenTao Konto ist %s.';
$lang->admin->info->log = 'Logs die über die Gültigen Tage hinausgehen werden gelöscht. Aufgabenplanung muss laufen (cron).';
$lang->admin->notice = new stdclass();
$lang->admin->notice->register = "Hinweiß: Sie haben sich nicht bei ZenTao (www.zentao.pm) registriert. %s um die aktuellen Updates und News zu erhalten.";
$lang->admin->notice->ignore = "Ignorieren";
$lang->admin->notice->int = "『%s』sollte eine positive Zahl sein.";
$lang->admin->registerNotice = new stdclass();
$lang->admin->registerNotice->common = 'Verbinde neues Konto';
$lang->admin->registerNotice->caption = 'In der Zentao Community registieren';
$lang->admin->registerNotice->click = 'Bitte registieren Sie sich hier';
$lang->admin->registerNotice->lblAccount = 'mindestens 3 Zeichen bitte; mit Buchsten und Ziffern.';
$lang->admin->registerNotice->lblPasswd = 'mindestens 6 Zeichen bitte; mit Buchsten und Ziffern.';
$lang->admin->registerNotice->submit = 'Registieren';
$lang->admin->registerNotice->bind = "Verbinde bestehendes Konto";
$lang->admin->registerNotice->success = "Sie haben sich erfolgreich registriert!";
$lang->admin->bind = new stdclass();
$lang->admin->bind->caption = 'Konto verknüpfen';
$lang->admin->bind->success = "Konto wurde verknüpft!";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = 'Sicherheits-Regeln';
$lang->admin->safe->set = 'PasswortStärke';
$lang->admin->safe->password = 'Passwort Stärke';
$lang->admin->safe->weak = 'Schwache Passwörter';
$lang->admin->safe->reason = 'Typ';
$lang->admin->safe->checkWeak = 'Schwache Passwörter prüfen';
$lang->admin->safe->changeWeak = 'Ihr Passwort ist schwach. Bitte ändern.';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->modifyPasswordFirstLogin = 'Passwort nach der ersten Anmeldung ändern';
$lang->admin->safe->modeList[0] = 'N/A';
$lang->admin->safe->modeList[1] = 'Medium';
$lang->admin->safe->modeList[2] = 'Stark';
$lang->admin->safe->modeRuleList[1] = 'Beinhaltet Groß und Kleinbuchstaben sowie Ziffern. Länge >= 6';
$lang->admin->safe->modeRuleList[2] = 'Beinhaltet Groß und Kleinbuchstaben, Ziffern sowie Sonderzeichen. Länge >= 10.';
$lang->admin->safe->reasonList['weak'] = 'Bekannte Schwache Passwörter';
$lang->admin->safe->reasonList['account'] = 'Entspricht ihrem Konto';
$lang->admin->safe->reasonList['mobile'] = 'Entspricht Ihrer Mobilnummer';
$lang->admin->safe->reasonList['phone'] = 'Entspricht Ihrer Telefonnummer';
$lang->admin->safe->reasonList['birthday'] = 'Entspricht Ihrem Geburtstag';
$lang->admin->safe->modifyPasswordList[1] = 'Ja';
$lang->admin->safe->modifyPasswordList[0] = 'Nein';
$lang->admin->safe->loginCaptchaList[1] = 'Ja';
$lang->admin->safe->loginCaptchaList[0] = 'Nein';
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
$lang->admin->safe->noticeStrong = '';
-87
View File
@@ -1,87 +0,0 @@
<?php
/**
* The admin module English file 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 Chunsheng Wang <chunsheng@cnezsoft.com>
* @package admin
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->common = 'Admin';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Check Database';
$lang->admin->sso = 'Zdoo';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Security';
$lang->admin->checkWeak = 'Check Weak Password';
$lang->admin->certifyMobile = 'Verify your cellphone';
$lang->admin->certifyEmail = 'Verify your Email';
$lang->admin->ztCompany = 'Verify your company';
$lang->admin->captcha = 'Verification Code';
$lang->admin->getCaptcha = 'Send Verification Code';
$lang->admin->register = 'Register';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Setting';
$lang->admin->days = 'Valid Day';
$lang->admin->info = new stdclass();
$lang->admin->info->version = 'Current Version is %s. ';
$lang->admin->info->links = 'You can visit links below';
$lang->admin->info->account = 'Your ZenTao account is %s.';
$lang->admin->info->log = 'Log that exceeds valid days will be deleted and you have to run cron.';
$lang->admin->notice = new stdclass();
$lang->admin->notice->register = "Note: You haven't registered in ZenTao official website(www.zentao.pm). %s then get the Latest ZenTao Upgrades and News.";
$lang->admin->notice->ignore = "Ignore";
$lang->admin->notice->int = "『%s』should be a positive integer.";
$lang->admin->registerNotice = new stdclass();
$lang->admin->registerNotice->common = 'Bind Account';
$lang->admin->registerNotice->caption = 'ZenTao Community Signup';
$lang->admin->registerNotice->click = 'Sign Up';
$lang->admin->registerNotice->lblAccount = '>= 3 letters and numbers';
$lang->admin->registerNotice->lblPasswd = '>= 6 letters and numbers';
$lang->admin->registerNotice->submit = 'Submit';
$lang->admin->registerNotice->bind = "Bind Exsiting Account";
$lang->admin->registerNotice->success = "You have signed up!";
$lang->admin->bind = new stdclass();
$lang->admin->bind->caption = 'Link Account';
$lang->admin->bind->success = "Account is linked!";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = 'Security Policy';
$lang->admin->safe->set = 'Password Settings';
$lang->admin->safe->password = 'Password Strength';
$lang->admin->safe->weak = 'Common Weak Passwords';
$lang->admin->safe->reason = 'Type';
$lang->admin->safe->checkWeak = 'Weak Password Scan';
$lang->admin->safe->changeWeak = 'Force to change weak password';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->modifyPasswordFirstLogin = 'Force to change password after first login';
$lang->admin->safe->modeList[0] = 'I don\'t care.';
$lang->admin->safe->modeList[1] = 'Medium';
$lang->admin->safe->modeList[2] = 'Strong';
$lang->admin->safe->modeRuleList[1] = ' >= 6 upper and lower case, and numbers';
$lang->admin->safe->modeRuleList[2] = ' >= 10 upper and lower case, numbers and special characters.';
$lang->admin->safe->reasonList['weak'] = 'Common Weak Password';
$lang->admin->safe->reasonList['account'] = 'Same as account';
$lang->admin->safe->reasonList['mobile'] = 'Same as mobilephone number';
$lang->admin->safe->reasonList['phone'] = 'Same as phone number';
$lang->admin->safe->reasonList['birthday'] = 'Same as DOB';
$lang->admin->safe->modifyPasswordList[1] = 'Yes';
$lang->admin->safe->modifyPasswordList[0] = 'No';
$lang->admin->safe->loginCaptchaList[1] = 'Yes'
$lang->admin->safe->loginCaptchaList[0] = 'No';
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
$lang->admin->safe->noticeStrong = '';
-87
View File
@@ -1,87 +0,0 @@
<?php
/**
* The admin module English file 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 Chunsheng Wang <chunsheng@cnezsoft.com>
* @package admin
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link https://www.zentao.pm
*/
$lang->admin->common = 'Admin';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Check Database';
$lang->admin->sso = 'Zdoo';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Sécurité';
$lang->admin->checkWeak = 'Contrôle niveau de sécurité des mots de passe';
$lang->admin->certifyMobile = 'Vérifier votre smartphone';
$lang->admin->certifyEmail = 'Vérifier votre Email';
$lang->admin->ztCompany = 'Vérifier votre entreprise';
$lang->admin->captcha = 'Code de vérification';
$lang->admin->getCaptcha = 'Obtenir le Code de vérification';
$lang->admin->register = 'Register';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Paramétrage';
$lang->admin->days = 'Durée de conservation';
$lang->admin->info = new stdclass();
$lang->admin->info->version = 'La version actuelle est %s customisée. ';
$lang->admin->info->links = 'Vous pouvez visiter les liens ci-dessous';
$lang->admin->info->account = 'Votre identifiant client ZenTao est %s.';
$lang->admin->info->log = 'Les logs qui dépassent la durée de conservation seront supprimés et vous devrez exécuter un cron.';
$lang->admin->notice = new stdclass();
$lang->admin->notice->register = "Note: Vous n'êtes pas enregistré sur le site officiel de ZenTao (www.zentao.pm). %s vous pourrez ensuite obtenir les dernières Mises à Jour de ZenTao et des informations.";
$lang->admin->notice->ignore = "Ignorer";
$lang->admin->notice->int = "『 %s 』 devrait être un entier positif.";
$lang->admin->registerNotice = new stdclass();
$lang->admin->registerNotice->common = 'Connectez-vous avec votre nouveau compte';
$lang->admin->registerNotice->caption = "S'enregistrer sur la communauté Zentao";
$lang->admin->registerNotice->click = "S'enregistrer ici";
$lang->admin->registerNotice->lblAccount = '>= 3 lettres et chiffres';
$lang->admin->registerNotice->lblPasswd = '>= 6 lettres et chiffres';
$lang->admin->registerNotice->submit = "S'enregistrer";
$lang->admin->registerNotice->bind = "S'associer à un compte existant";
$lang->admin->registerNotice->success = "Vous êtes enregistré !";
$lang->admin->bind = new stdclass();
$lang->admin->bind->caption = 'Lier au compte';
$lang->admin->bind->success = "Le compte est associé !";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = 'Politique de sécurité';
$lang->admin->safe->set = 'Paramétrages du Mot de passe';
$lang->admin->safe->password = 'Force du Mot de passe';
$lang->admin->safe->weak = 'Mots de passes non sécurisés courrants';
$lang->admin->safe->reason = 'Type';
$lang->admin->safe->checkWeak = 'Balayage des mots de passe faibles';
$lang->admin->safe->changeWeak = 'Forcer le changement des mots de passe faibles';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->modifyPasswordFirstLogin = 'Forcer le changement du mot de passe après la première connexion';
$lang->admin->safe->modeList[0] = "Contrôle Modéré";
$lang->admin->safe->modeList[1] = 'Contrôle Moyen';
$lang->admin->safe->modeList[2] = 'Contrôle Fort';
$lang->admin->safe->modeRuleList[1] = ' >= 6 Majuscules, minuscules et chiffres';
$lang->admin->safe->modeRuleList[2] = ' >= 10 Majuscules, minuscules, chiffres et caractères spéciaux';
$lang->admin->safe->reasonList['weak'] = 'Mots de passe faibles courants';
$lang->admin->safe->reasonList['account'] = 'Identique au compte';
$lang->admin->safe->reasonList['mobile'] = 'Identique au numéro de mobile';
$lang->admin->safe->reasonList['phone'] = 'Identique au téléphone fixe';
$lang->admin->safe->reasonList['birthday'] = 'Identique à la date de naissance';
$lang->admin->safe->modifyPasswordList[1] = 'Oui';
$lang->admin->safe->modifyPasswordList[0] = 'Non';
$lang->admin->safe->loginCaptchaList[1] = 'Oui'
$lang->admin->safe->loginCaptchaList[0] = 'Non';
$lang->admin->safe->noticeMode = "Le mot de passe sera vérifié quand un utilisateur se connectera ou qu'un utilisateur sera créé ou modifier.";
$lang->admin->safe->noticeStrong = '';
-87
View File
@@ -1,87 +0,0 @@
<?php
/**
* The admin module English file 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 Nguyễn Quốc Nho <quocnho@gmail.com>
* @package admin
* @version $Id: vi.php 4460 2013-02-26 02:28:02Z quocnho@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->common = 'Quản trị';
$lang->admin->index = 'Trang quản trị';
$lang->admin->checkDB = 'Kiểm tra CSDL';
$lang->admin->sso = 'Zdoo';
$lang->admin->ssoAction = 'Liên kết Zdoo';
$lang->admin->safeIndex = 'Bảo mật';
$lang->admin->checkWeak = 'Kiểm tra độ yếu mật khẩu';
$lang->admin->certifyMobile = 'Xác thực di động của bạn';
$lang->admin->certifyEmail = 'Xác thực email của bạn';
$lang->admin->ztCompany = 'Xác thực doanh nghiệp của bạn';
$lang->admin->captcha = 'Mã xác thực';
$lang->admin->getCaptcha = 'Gửi Mã xác thực';
$lang->admin->register = 'Register';
$lang->admin->api = 'API';
$lang->admin->log = 'Nhật ký';
$lang->admin->setting = 'Thiết lập';
$lang->admin->days = 'Ngày hợp lệ';
$lang->admin->info = new stdclass();
$lang->admin->info->version = 'Phiên bản hiện tại là %s. ';
$lang->admin->info->links = ' Bạn có thể ghé thăm liên kết sau';
$lang->admin->info->account = 'Tài khoản ZenTao của bạn là %s.';
$lang->admin->info->log = 'Nhật ký vượt quá ngày hợp lệ sẽ bị xóa và bạn phải chay Cron.';
$lang->admin->notice = new stdclass();
$lang->admin->notice->register = "Chú ý: Bạn chưa đăng ký trên trang web chính thức của ZenTao (www.zentao.pm). %s sau đó nhận Bản tin và nâng cấp mới nhất của ZenTao.";
$lang->admin->notice->ignore = "Bỏ qua";
$lang->admin->notice->int = "『%s』 nên là số nguyên dương.";
$lang->admin->registerNotice = new stdclass();
$lang->admin->registerNotice->common = 'Kết nối tài khoản';
$lang->admin->registerNotice->caption = 'Đăng ký cộng đồng ZenTao';
$lang->admin->registerNotice->click = 'Đăng ký';
$lang->admin->registerNotice->lblAccount = '>= 3 chữ và số';
$lang->admin->registerNotice->lblPasswd = '>= 6 chữ và số';
$lang->admin->registerNotice->submit = 'Gửi';
$lang->admin->registerNotice->bind = "Kết nối với tài khoản đang tồn tại";
$lang->admin->registerNotice->success = "Bạn đã đăng ký!";
$lang->admin->bind = new stdclass();
$lang->admin->bind->caption = 'Liên kết tài khoản';
$lang->admin->bind->success = "Tài khoản đã được kết nối!";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = 'Chính sách bảo mật';
$lang->admin->safe->set = 'Thiết lập mật khẩu';
$lang->admin->safe->password = 'Độ mạnh mật khẩu';
$lang->admin->safe->weak = 'Mật khẩu yếu thường dùng';
$lang->admin->safe->reason = 'Loại';
$lang->admin->safe->checkWeak = 'Quét mật khẩu yếu';
$lang->admin->safe->changeWeak = 'Chủ động thay đổi mật khẩu yếu';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->modifyPasswordFirstLogin = 'Chủ động thay đổi mật khẩu sau lần đăng nhập đầu tiên';
$lang->admin->safe->modeList[0] = 'Yếu';
$lang->admin->safe->modeList[1] = 'Trung bình';
$lang->admin->safe->modeList[2] = 'Mạnh';
$lang->admin->safe->modeRuleList[1] = ' >= 6 chữ hoa, chữ thường và số';
$lang->admin->safe->modeRuleList[2] = ' >= 10 chữ hoa, chữ thường, số và ký tự đặc biệt.';
$lang->admin->safe->reasonList['weak'] = 'Mật khẩu yếu thường dùng';
$lang->admin->safe->reasonList['account'] = 'Giống tài khoản';
$lang->admin->safe->reasonList['mobile'] = 'Giống số di động';
$lang->admin->safe->reasonList['phone'] = 'Giống số điện thoại';
$lang->admin->safe->reasonList['birthday'] = 'Giống ngày sinh';
$lang->admin->safe->modifyPasswordList[1] = 'Có';
$lang->admin->safe->modifyPasswordList[0] = 'Không';
$lang->admin->safe->loginCaptchaList[1] = 'Yes'
$lang->admin->safe->loginCaptchaList[0] = 'No';
$lang->admin->safe->noticeMode = 'Mật khẩu sẽ được kiểm tra khi người dùng đăng nhập hoặc người dùng thêm hoặc sửa.';
$lang->admin->safe->noticeStrong = '';
+193 -3
View File
@@ -16,6 +16,196 @@ $lang->automation->description = '自动化测试解决方案';
$lang->automation->ztf = 'ZTF自动化测试管理框架';
$lang->automation->zendata = 'ZenData数据生成工具';
$lang->automation->details = '';
$lang->automation->ztfDetails = '';
$lang->automation->zendataDetails = '';
$lang->automation->details = <<<EOF
<article class="article">
<header>
<h1 class="text-center">自动化测试解决方案</h1>
<div class="abstract">
<p>
摘要:欢迎使用禅道提供的自动化解决方案,本次为大家带来了两款工具。Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。
</p>
</div>
</header>
<section class="content">
<h2>ZTF自动化测试管理框架</h2>
<p>
Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
和市面上已有的自动化测试框架相比,ZTF更聚焦于自动化测试的管理功能。
ZTF提供了自动化测试脚本的定义、管理、驱动、执行结果的回传、bug的创建以及和其他自动化测框架的集成。
ZTF使用go语言开发,可以支持各种平台。ZTF支持常见的编程语言,您可以选择您喜欢用的语言来开发自动化测试脚本。
</p>
<div class="section">
<div class="text-left" style="padding:25px 15px 10px 15px;">
<p>
<a href="https://ztf.im/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">禅道ZTF官网</a> &nbsp; &nbsp;
<a href="https://ztf.im/ztf.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架下载</a> &nbsp; &nbsp;
<a href="https://ztf.im/book/ztf/ztf-about-26.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架手册</a>
</p>
<div style="margin-top:15px;" class="text-muted">
<p>
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
</p>
<p>
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
</p>
</div>
</div>
</div>
<h2>ZenData数据生成工具</h2>
<p>
ZenData主要两大功能:数据生成和数据解析。通过一个配置文件,可以使用ZenData生成您想要的各种数据。
同样也可以对某一个数据文件,指定其数据类型定义的配置文件,完成到结构化数据的解析。
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。还可以一键生成海量数据用于性能和压力测试。
</p>
<div class="section">
<div class="text-left" style="padding:25px 15px 10px 15px;">
<p>
<a href="https://www.zendata.cn/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData官网</a> &nbsp; &nbsp;
<a href="https://www.zendata.cn/download.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData下载</a> &nbsp; &nbsp;
<a href="https://www.zendata.cn/book/zendata/why-zendata-115.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData手册</a>
</p>
<div style="margin-top:15px;" class="text-muted">
<p>
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
</p>
<p>
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
</p>
</div>
</div>
</div>
</section>
</article>
EOF;
$lang->automation->ztfDetails = <<<EOF
<article class="article">
<header>
<h1 class="text-center">ZTF自动化测试管理框架</h1>
<div class="abstract">
<p>
摘要:Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
</p>
</div>
</header>
<section class="content">
<h4>一、ZTF是什么</h4>
<p>
Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
和市面上已有的自动化测试框架相比,ZTF更聚焦于自动化测试的管理功能。
ZTF提供了自动化测试脚本的定义、管理、驱动、执行结果的回传、bug的创建以及和其他自动化测框架的集成。
ZTF使用go语言开发,可以支持各种平台。ZTF支持常见的编程语言,您可以选择您喜欢用的语言来开发自动化测试脚本。
</p>
<h4>二、为什么来做ZTF</h4>
<p>
市面上已经有很多自动化测试框架,我们为什么还要来做ZTF呢?ZTF主要是解决测试管理的问题。
目前市面上的自动化测试框架主要分为两大类,一类是单元测试框架,一类是某种领域的自动化测试框架。
单元测试框架是跟各个语言绑定的,比如cppunit, phpunit等。第二类框架以selenium为代表,可以用来做web的自动化测试。
也还有做GUI或者手机应用乃至游戏等场景的自动化测试的框架。
</p>
<p>
这就产生了一个问题,我们需要将这些自动化测试框架的测试脚本统一管理起来。
每一个脚本都可以和测试管理系统里面的一个用例进行关联,脚本里面的步骤信息和管理系统里面的用例信息可以互相同步。
测试执行的结果可以反映到测试管理系统中,失败的测试脚本可以创建bug。
为此我们开发了ZTF测试管理框架。
</p>
<h4>三、ZTF和其他自动化测试框架的关系</h4>
<p>
ZTF和其他的自动化测试框架是互相合作的关系。
您可以继续使用之前的自动化测试框架来进行脚本的开发,只需要通过注释的方式加入几个标签就可以转换成ztf的自动化测试脚本。
</p>
<h4>四、ZTF自动化测试框架的特点</h4>
<ol>
<li>简单:ZTF的语法标签和规则都很简单,一看就会,很容易上手。</li>
<li>跨平台:ZTF使用GO语言开发,跨平台,只有一个可执行文件,就可以运行。</li>
<li>跨语言:ZTF支持常见的编程语言,你喜欢用什么就用什么。</li>
<li>跨框架:ZTF可以和市面上常见的单元测试框架、常见的自动化测试框架都可以很好的集成。</li>
<li>工程化:使用ZTF可以真正达到工程化的自动化测试,可以大批量大规模的进行自动化测试的管理和执行。</li>
<li>跨场景:借助于其他框架,ZTF可以用来做单元测试、接口测试、web界面测试、GUI界面测试、APP测试等多种场景。</li>
</ol>
<div class="section">
<div class="text-left" style="padding:25px 15px 10px 15px;">
<p>
<a href="https://ztf.im/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">禅道ZTF官网</a> &nbsp; &nbsp;
<a href="https://ztf.im/ztf.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架下载</a> &nbsp; &nbsp;
<a href="https://ztf.im/book/ztf/ztf-about-26.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架手册</a>
</p>
<div style="margin-top:15px;" class="text-muted">
<p>
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
</p>
<p>
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
</p>
</div>
</div>
</div>
</section>
</article>
EOF;
$lang->automation->zendataDetails = <<<EOF
<article class="article">
<header>
<h1 class="text-center">ZenData数据生成工具</h1>
<div class="abstract">
<p>
摘要:ZenData使用YAML来作为数据类型配置文件实现了数据的生成和解析。
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。
还可以一键生成海量数据用于性能和压力测试。
</p>
</div>
</header>
<section class="content">
<h4>一、ZenData的实现原理</h4>
<p>
ZenData使用YAML来作为数据类型配置文件。对于每一种类型的数据来讲,我们都可以将其拆分成若干的字段。
比如我们要测试一个用户的订单表,会有订单的id,用户id或者账户名,订单的名称,订单的金额,订单的时间,订单状态等等字段。
我们可以针对每一个字段配置其取值的范围。比如订单id,我可以定义为从1到10000,用户id可以是1-100。
这样每一个字段都有了一个取值范围列表。当ZenData来生成数据的时候,从每一个字段里面依次取一个值,将其拼接在一起,就形成了一条记录。
大家可以想象成每个字段都是一个转盘,按照自己的频率进行旋转,每一次旋转都从中取出一个值,和其他的字段进行组合。
</p>
<p>上面说的是最基本的的工作原理,ZenData还提供了步长、随机、循环、引用等多种定义方式,我们会在接下来的手册里面展开讲。</p>
<h4>二、ZenData的用途</h4>
<p>
ZenData主要两大功能:数据生成和数据解析。通过一个配置文件,可以使用ZenData生成您想要的各种数据。
同样也可以对某一个数据文件,指定其数据类型定义的配置文件,完成到结构化数据的解析。
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。还可以一键生成海量数据用于性能和压力测试。
</p>
<h4>三、ZenData主要的特点</h4>
<ol>
<li>简单无依赖,只有一个可执行文件,即可满足命令行生成和HTTP接口两种数据生成服务。</li>
<li>使用配置文件来生成数据,使用人员不需要有开发知识,即可上手应用。</li>
<li>提供了功能强大的语法,分组、区间、步长、循环、随机、格式化和前后缀等,配置灵活性极强。</li>
<li>支持从文本文件中读取数据,方便用户对字段取值进行精确控制。</li>
<li>提供了Excel表格数据的标准SQL查询接口,使用更加灵活。</li>
<li>使用预制的序列(ranges)、实例(instances)、配置(config)对定义进行复用,以解决复杂数据格式的定义。</li>
<li>语法支持继承和扩展,为定义文件间的复用提供方便。</li>
<li>可以反向解析数据,可以对程序的输出进行解析,方便自动化测试脚本进行比对。</li>
<li>发行包內置了基础业务数据的定义文件(不断完善中)。</li>
<li>提供了HTTP接口数据生成服务,各种语言都可以方便调用。</li>
</ol>
<div class="section">
<div class="text-left" style="padding:25px 15px 10px 15px;">
<p>
<a href="https://www.zendata.cn/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData官网</a> &nbsp; &nbsp;
<a href="https://www.zendata.cn/download.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData下载</a> &nbsp; &nbsp;
<a href="https://www.zendata.cn/book/zendata/why-zendata-115.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData手册</a>
</p>
<div style="margin-top:15px;" class="text-muted">
<p>
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
</p>
<p>
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
</p>
</div>
</div>
</div>
</section>
</section>
</article>
EOF;
-83
View File
@@ -1,83 +0,0 @@
<?php
/**
* The admin module zh-tw file 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 Chunsheng Wang <chunsheng@cnezsoft.com>
* @package admin
* @version $Id: zh-tw.php 4767 2013-05-05 06:10:13Z wwccss $
* @link http://www.zentao.net
*/
$lang->admin->common = '後台管理';
$lang->admin->index = '後台管理首頁';
$lang->admin->checkDB = '檢查資料庫';
$lang->admin->sso = 'ZDOO整合';
$lang->admin->ssoAction = 'ZDOO整合';
$lang->admin->safeIndex = '安全';
$lang->admin->checkWeak = '弱口令檢查';
$lang->admin->certifyMobile = '認證手機';
$lang->admin->certifyEmail = '認證郵箱';
$lang->admin->ztCompany = '認證公司';
$lang->admin->captcha = '驗證碼';
$lang->admin->getCaptcha = '獲取驗證碼';
$lang->admin->register = '登記';
$lang->admin->api = '介面';
$lang->admin->log = '日誌';
$lang->admin->setting = '設置';
$lang->admin->days = '日誌保存天數';
$lang->admin->info = new stdclass();
$lang->admin->info->version = '當前系統的版本是%s,';
$lang->admin->info->links = '您可以訪問以下連結:';
$lang->admin->info->account = "您的禪道社區賬戶為%s。";
$lang->admin->info->log = '超出存天數的日誌會被刪除,需要開啟計劃任務。';
$lang->admin->notice = new stdclass();
$lang->admin->notice->register = "友情提示:您還未在禪道社區(www.zentao.net)登記,%s進行登記,以及時獲得禪道最新信息。";
$lang->admin->notice->ignore = "不再提示";
$lang->admin->notice->int = "『%s』應當是正整數。";
$lang->admin->registerNotice = new stdclass();
$lang->admin->registerNotice->common = '註冊新帳號綁定';
$lang->admin->registerNotice->caption = '禪道社區登記';
$lang->admin->registerNotice->click = '點擊此處';
$lang->admin->registerNotice->lblAccount = '請設置您的用戶名,英文字母和數字的組合,三位以上。';
$lang->admin->registerNotice->lblPasswd = '請設置您的密碼。數字和字母的組合,六位以上。';
$lang->admin->registerNotice->submit = '登記';
$lang->admin->registerNotice->bind = "綁定已有帳號";
$lang->admin->registerNotice->success = "登記賬戶成功";
$lang->admin->bind = new stdclass();
$lang->admin->bind->caption = '關聯社區帳號';
$lang->admin->bind->success = "關聯賬戶成功";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = '安全策略';
$lang->admin->safe->set = '密碼安全設置';
$lang->admin->safe->password = '密碼安全';
$lang->admin->safe->weak = '常用弱口令';
$lang->admin->safe->reason = '類型';
$lang->admin->safe->checkWeak = '弱口令掃瞄';
$lang->admin->safe->changeWeak = '修改弱口令密碼';
$lang->admin->safe->modifyPasswordFirstLogin = '首次登錄修改密碼';
$lang->admin->safe->modeList[0] = '不檢查';
$lang->admin->safe->modeList[1] = '中';
$lang->admin->safe->modeList[2] = '強';
$lang->admin->safe->modeRuleList[1] = '6位以上,包含大小寫字母,數字。';
$lang->admin->safe->modeRuleList[2] = '10位以上,包含字母,數字,特殊字元。';
$lang->admin->safe->reasonList['weak'] = '常用弱口令';
$lang->admin->safe->reasonList['account'] = '與帳號相同';
$lang->admin->safe->reasonList['mobile'] = '與手機相同';
$lang->admin->safe->reasonList['phone'] = '與電話相同';
$lang->admin->safe->reasonList['birthday'] = '與生日相同';
$lang->admin->safe->modifyPasswordList[1] = '必須修改';
$lang->admin->safe->modifyPasswordList[0] = '不強制';
$lang->admin->safe->noticeMode = '系統會在登錄、創建和修改用戶、修改密碼的時候檢查用戶口令。';
$lang->admin->safe->noticeStrong = '密碼長度越長,含有大寫字母或數字或特殊符號越多,密碼字母越不重複,安全度越強!';
+6 -6
View File
@@ -13,23 +13,23 @@
<?php include '../../common/view/header.html.php';?>
<div id='mainContent' class='main-content'>
<div class="row">
<div class="col-xs-3">
<div class="col-xs-2">
<ul class="nav nav-tabs nav-stacked">
<li class="active"><a href="###" data-target="#tab3Content1" data-toggle="tab"><?php echo $lang->automation->description;?></a></li>
<li><a href="###" data-target="#tab3Content2" data-toggle="tab"><?php echo $lang->automation->ztf;?></a></li>
<li><a href="###" data-target="#tab3Content3" data-toggle="tab"><?php echo $lang->automation->zendata;?></a></li>
</ul>
</div>
<div class="col-xs-9">
<div class="tab-content col-xs-9">
<div class="col-xs-10">
<div class="tab-content col-xs-10">
<div class="tab-pane fade active in" id="tab3Content1">
<p>我是标签1。</p>
<?php echo $lang->automation->details;?>
</div>
<div class="tab-pane fade" id="tab3Content2">
<p>标签2的内容。</p>
<?php echo $lang->automation->ztfDetails;?>
</div>
<div class="tab-pane fade" id="tab3Content3">
<p>这是标签3的内容。</p>
<?php echo $lang->automation->zendataDetails;?>
</div>
</div>
</div>
+1 -1
View File
@@ -157,7 +157,7 @@ class bug extends control
$productIDList = $productID ? $productID : array_keys($this->products);
/* Get bugs. */
$bugs = $this->bug->getBugs($productIDList, $executions, $branch, $browseType, $moduleID, $queryID, $sort, $pager);
$bugs = $this->bug->getBugs($productIDList, $executions, $branch, $browseType, $moduleID, $queryID, $sort, $pager, $this->session->PRJ);
/* Process the sql, get the conditon partion, save it to session. */
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'bug', $browseType == 'needconfirm' ? false : true);
+65 -34
View File
@@ -286,10 +286,11 @@ class bugModel extends model
* @param int $queryID
* @param string $sort
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getBugs($productIDList, $executions, $branch, $browseType, $moduleID, $queryID, $sort, $pager)
public function getBugs($productIDList, $executions, $branch, $browseType, $moduleID, $queryID, $sort, $pager, $projectID)
{
/* Set modules and browse type. */
$modules = $moduleID ? $this->loadModel('tree')->getAllChildId($moduleID) : '0';
@@ -298,21 +299,21 @@ class bugModel extends model
/* Get bugs by browse type. */
$bugs = array();
if($browseType == 'all') $bugs = $this->getAllBugs($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'bymodule') $bugs = $this->getModuleBugs($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'assigntome') $bugs = $this->getByAssigntome($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'openedbyme') $bugs = $this->getByOpenedbyme($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'resolvedbyme') $bugs = $this->getByResolvedbyme($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'assigntonull') $bugs = $this->getByAssigntonull($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'unconfirmed') $bugs = $this->getUnconfirmed($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'unresolved') $bugs = $this->getByStatus($productIDList, $branch, $modules, $executions, 'unresolved', $sort, $pager);
elseif($browseType == 'unclosed') $bugs = $this->getByStatus($productIDList, $branch, $modules, $executions, 'unclosed', $sort, $pager);
elseif($browseType == 'toclosed') $bugs = $this->getByStatus($productIDList, $branch, $modules, $executions, 'toclosed', $sort, $pager);
elseif($browseType == 'longlifebugs') $bugs = $this->getByLonglifebugs($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'postponedbugs') $bugs = $this->getByPostponedbugs($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'needconfirm') $bugs = $this->getByNeedconfirm($productIDList, $branch, $modules, $executions, $sort, $pager);
elseif($browseType == 'bysearch') $bugs = $this->getBySearch($productIDList, $branch, $queryID, $sort, '', $pager);
elseif($browseType == 'overduebugs') $bugs = $this->getOverdueBugs($productIDList, $branch, $modules, $executions, $sort, $pager);
if($browseType == 'all') $bugs = $this->getAllBugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'bymodule') $bugs = $this->getModuleBugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'assigntome') $bugs = $this->getByAssigntome($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'openedbyme') $bugs = $this->getByOpenedbyme($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'resolvedbyme') $bugs = $this->getByResolvedbyme($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'assigntonull') $bugs = $this->getByAssigntonull($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'unconfirmed') $bugs = $this->getUnconfirmed($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'unresolved') $bugs = $this->getByStatus($productIDList, $branch, $modules, $executions, 'unresolved', $sort, $pager, $projectID);
elseif($browseType == 'unclosed') $bugs = $this->getByStatus($productIDList, $branch, $modules, $executions, 'unclosed', $sort, $pager, $projectID);
elseif($browseType == 'toclosed') $bugs = $this->getByStatus($productIDList, $branch, $modules, $executions, 'toclosed', $sort, $pager, $projectID);
elseif($browseType == 'longlifebugs') $bugs = $this->getByLonglifebugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'postponedbugs') $bugs = $this->getByPostponedbugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'needconfirm') $bugs = $this->getByNeedconfirm($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'bysearch') $bugs = $this->getBySearch($productIDList, $branch, $queryID, $sort, '', $pager, $projectID);
elseif($browseType == 'overduebugs') $bugs = $this->getOverdueBugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
return $this->checkDelayBugs($bugs);
}
@@ -380,18 +381,22 @@ class bugModel extends model
* Get bugs of a module.
*
* @param int|array $productIDList
* @param int $branch
* @param string|array $moduleIdList
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getModuleBugs($productIDList, $branch = 0, $moduleIdList = 0, $executions, $orderBy = 'id_desc', $pager = null)
public function getModuleBugs($productIDList, $branch = 0, $moduleIdList = 0, $executions, $orderBy = 'id_desc', $pager = null, $projectID)
{
return $this->dao->select('*')->from(TABLE_BUG)
->where('product')->in($productIDList)
->beginIF(!empty($branch))->andWhere('branch')->eq($branch)->fi()
->beginIF(!empty($moduleIdList))->andWhere('module')->in($moduleIdList)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('execution')->in(array_keys($executions))
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
@@ -2007,10 +2012,11 @@ class bugModel extends model
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getAllBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager = null)
public function getAllBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager = null, $projectID)
{
$bugs = $this->dao->select('t1.*, t2.title as planTitle')->from(TABLE_BUG)->alias('t1')
->leftJoin(TABLE_PRODUCTPLAN)->alias('t2')->on('t1.plan = t2.id')
@@ -2018,6 +2024,7 @@ class bugModel extends model
->andWhere('t1.execution')->in(array_keys($executions))
->beginIF($branch)->andWhere('t1.branch')->eq($branch)->fi()
->beginIF($modules)->andWhere('t1.module')->in($modules)->fi()
->beginIF($projectID)->andWhere('t1.project')->eq($projectID)->fi()
->andWhere('t1.deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
@@ -2035,14 +2042,16 @@ class bugModel extends model
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getByAssigntome($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getByAssigntome($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
return $this->dao->findByAssignedTo($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->in($productIDList)
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
->beginIF($modules)->andWhere('module')->in($modules)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('execution')->in(array_keys($executions))
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
@@ -2057,14 +2066,16 @@ class bugModel extends model
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getByOpenedbyme($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getByOpenedbyme($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
return $this->dao->findByOpenedBy($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->in($productIDList)
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
->beginIF($modules)->andWhere('module')->in($modules)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('execution')->in(array_keys($executions))
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
@@ -2079,14 +2090,16 @@ class bugModel extends model
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getByResolvedbyme($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getByResolvedbyme($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
return $this->dao->findByResolvedBy($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->in($productIDList)
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
->beginIF($modules)->andWhere('module')->in($modules)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('execution')->in(array_keys($executions))
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
@@ -2101,15 +2114,17 @@ class bugModel extends model
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getByAssigntonull($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getByAssigntonull($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
return $this->dao->findByAssignedTo('')->from(TABLE_BUG)->andWhere('product')->in($productIDList)
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
->beginIF($modules)->andWhere('module')->in($modules)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('execution')->in(array_keys($executions))
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
@@ -2121,18 +2136,20 @@ class bugModel extends model
* @param array $productIDList
* @param int $branch
* @param array $modules
* @param int $executions
* @param int $orderBy
* @param int $pager
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return void
*/
public function getUnconfirmed($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getUnconfirmed($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
return $this->dao->select('*')->from(TABLE_BUG)
->where('confirmed')->eq(0)
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
->beginIF($modules)->andWhere('module')->in($modules)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('product')->in($productIDList)
->andWhere('execution')->in(array_keys($executions))
->andWhere('deleted')->eq(0)
@@ -2149,16 +2166,18 @@ class bugModel extends model
* @param string $status
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getOverdueBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getOverdueBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
return $this->dao->select('*')->from(TABLE_BUG)
->where('execution')->in(array_keys($executions))
->andWhere('product')->in($productIDList)
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
->beginIF($modules)->andWhere('module')->in($modules)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('status')->eq('active')
->andWhere('deleted')->eq(0)
->andWhere('deadline')->ne('0000-00-00')
@@ -2176,10 +2195,11 @@ class bugModel extends model
* @param string $status
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getByStatus($productIDList, $branch, $modules, $executions, $status, $orderBy, $pager)
public function getByStatus($productIDList, $branch, $modules, $executions, $status, $orderBy, $pager, $projectID)
{
return $this->dao->select('*')->from(TABLE_BUG)
->where('execution')->in(array_keys($executions))
@@ -2189,8 +2209,10 @@ class bugModel extends model
->beginIF($status == 'unclosed')->andWhere('status')->ne('closed')->fi()
->beginIF($status == 'unresolved')->andWhere('status')->eq('active')->fi()
->beginIF($status == 'toclosed')->andWhere('status')->eq('resolved')->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
->orderBy($orderBy)->page($pager)
->fetchAll();
}
/**
@@ -2202,16 +2224,18 @@ class bugModel extends model
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getByLonglifebugs($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getByLonglifebugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
$lastEditedDate = date(DT_DATE1, time() - $this->config->bug->longlife * 24 * 3600);
return $this->dao->findByLastEditedDate("<", $lastEditedDate)->from(TABLE_BUG)->andWhere('product')->in($productIDList)
->andWhere('execution')->in(array_keys($executions))
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
->beginIF($modules)->andWhere('module')->in($modules)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('openedDate')->lt($lastEditedDate)
->andWhere('deleted')->eq(0)
->andWhere('status')->ne('closed')->orderBy($orderBy)->page($pager)->fetchAll();
@@ -2226,14 +2250,16 @@ class bugModel extends model
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getByPostponedbugs($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getByPostponedbugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
return $this->dao->findByResolution('postponed')->from(TABLE_BUG)->andWhere('product')->in($productIDList)
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
->beginIF($modules)->andWhere('module')->in($modules)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('execution')->in(array_keys($executions))
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
@@ -2248,16 +2274,19 @@ class bugModel extends model
* @param array $executions
* @param string $orderBy
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getByNeedconfirm($productIDList, $branch, $modules, $executions, $orderBy, $pager)
public function getByNeedconfirm($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID)
{
return $this->dao->select('t1.*, t2.title AS storyTitle')->from(TABLE_BUG)->alias('t1')->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
return $this->dao->select('t1.*, t2.title AS storyTitle')->from(TABLE_BUG)->alias('t1')
->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
->where("t2.status = 'active'")
->andWhere('t1.product')->in($productIDList)
->beginIF($branch)->andWhere('t1.branch')->in($branch)->fi()
->beginIF($modules)->andWhere('t1.module')->in($modules)->fi()
->beginIF($projectID)->andWhere('t1.project')->eq($projectID)->fi()
->andWhere('t2.version > t1.storyVersion')
->andWhere('t1.execution')->in(array_keys($executions))
->andWhere('t1.deleted')->eq(0)
@@ -2275,10 +2304,11 @@ class bugModel extends model
* @param string $orderBy
* @param string $excludeBugs
* @param object $pager
* @param int $projectID
* @access public
* @return array
*/
public function getBySearch($productIDList, $branch = 0, $queryID, $orderBy, $excludeBugs = '', $pager = null)
public function getBySearch($productIDList, $branch = 0, $queryID, $orderBy, $excludeBugs = '', $pager = null, $projectID)
{
if($queryID)
{
@@ -2320,6 +2350,7 @@ class bugModel extends model
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where($bugQuery)
->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi()
->beginIF($excludeBugs)->andWhere('id')->notIN($excludeBugs)->fi()
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->andWhere('deleted')->eq(0)
->orderBy($orderBy)->page($pager)->fetchAll();
return $bugs;
+10 -12
View File
@@ -346,23 +346,21 @@ $lang->execution->viewMenu->burn = array('link' => '燃尽图|execution|burn
$lang->execution->viewMenu->view = array('link' => '视图|execution|grouptask|executionID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover');
$lang->execution->viewMenu->story = array('link' => "{$lang->SRCommon}|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban');
$lang->execution->viewMenu->qa = array('link' => '测试|qa|index|');
$lang->execution->viewMenu->ci = array('link' => '代码|repo|browse|');
$lang->execution->viewMenu->doc = array('link' => '文档|doc|objectLibs|type=execution&objectID=%s&from=execution', 'subModule' => 'doc');
$lang->execution->viewMenu->build = array('link' => '版本|execution|build|executionID=%s', 'subModule' => 'build');
$lang->execution->viewMenu->release = array('link' => '发布|projectrelease|browse|project=%s');
$lang->execution->viewMenu->action = array('link' => '动态|execution|dynamic|executionID=%s');
$lang->execution->viewMenu->setting = array('link' => '设置|execution|view|executionID=%s', 'subModule' => 'personnel', 'alias' => 'edit', 'class' => 'dropdown dropdown-hover');
$lang->execution->subMenu = new stdclass();
$lang->execution->subMenu->view = new stdclass();
$lang->execution->subMenu->view->groupTask = '分组视图|execution|grouptask|executionID=%s';
$lang->execution->subMenu->view->tree = '树状图|execution|tree|executionID=%s';
$lang->execution->groupMenu = new stdclass();
$lang->execution->groupMenu->groupTask = '分组视图|execution|grouptask|executionID={EXECUTION}';
$lang->execution->groupMenu->tree = '树状图|execution|tree|executionID={EXECUTION}';
$lang->execution->subMenu->setting = new stdclass();
$lang->execution->subMenu->setting->vie = array('link' => '概况|execution|view|executionID=%s', 'subModule' => 'view', 'alias' => 'edit,start,suspend,putoff,close');
$lang->execution->subMenu->setting->product = $lang->productCommon . '|execution|manageproducts|executionID=%s';
$lang->execution->subMenu->setting->team = array('link' => '团队|execution|team|executionID=%s', 'alias' => 'managemembers');
$lang->execution->subMenu->setting->whitelist = array('link' => '白名单|execution|whitelist|executionID=%s', 'subModule' => 'personnel', 'alias' => 'addwhitelist');
$lang->execution->settingMenu = new stdclass();
$lang->execution->settingMenu = new stdclass();
$lang->execution->settingMenu->view = array('link' => '概况|execution|view|executionID={EXECUTION}', 'subModule' => 'view', 'alias' => 'edit,start,suspend,putoff,close');
$lang->execution->settingMenu->products = $lang->productCommon . '|execution|manageproducts|executionID={EXECUTION}';
$lang->execution->settingMenu->team = array('link' => '团队|execution|team|executionID={EXECUTION}', 'alias' => 'managemembers');
$lang->execution->settingMenu->whitelist = array('link' => '白名单|execution|whitelist|executionID={EXECUTION}', 'subModule' => 'personnel', 'alias' => 'addwhitelist');
$lang->execution->dividerMenu = ',story,build,setting,';
@@ -664,6 +662,7 @@ $lang->navGroup->execution = 'execution';
$lang->navGroup->task = 'execution';
$lang->navGroup->build = 'execution';
$lang->navGroup->company = 'system';
$lang->navGroup->sqlbuilder = 'system';
$lang->navGroup->auditcl = 'system';
$lang->navGroup->cmcl = 'system';
@@ -685,7 +684,6 @@ $lang->navGroup->overtime = 'attend';
$lang->navGroup->lieu = 'attend';
$lang->navGroup->admin = 'admin';
$lang->navGroup->company = 'admin';
$lang->navGroup->dept = 'admin';
$lang->navGroup->user = 'admin';
$lang->navGroup->group = 'admin';
+5
View File
@@ -780,6 +780,11 @@ class commonModel extends model
$lang->product->menu = $lang->product->setMenu;
self::processMenuVars($lang->product->menu);
}
if($group == 'execution')
{
if(in_array($methodName, array('grouptask', 'tree'))) $lang->execution->menu = self::processMenuVars($lang->execution->groupMenu);
if(in_array($methodName, array('view', 'manageproducts', 'team', 'whitelist'))) $lang->execution->menu = self::processMenuVars($lang->execution->settingMenu);
}
if(strpos('qa|bug|testcase|testreport|testtask', $moduleName) !== false and $group == 'project')
{
unset($lang->$moduleName->menu->testsuite);
+1 -1
View File
@@ -25,7 +25,7 @@ $isQa = $rawModule == 'qa';
<?php if($this->config->systemMode == 'new'):?>
<?php if($isProgram) echo isset($lang->program->switcherMenu) ? $lang->program->switcherMenu : '';?>
<?php if($isProject) echo $this->loadModel('project')->getSwitcher($this->session->PRJ, $app->rawModule, $app->rawMethod);?>
<?php if($isExecution) echo $this->execution->getSwitcher($this->session->execution, $app->rawModule, $app->rawMethod);?>
<?php if($isExecution) echo $this->loadModel('execution')->getSwitcher($this->session->execution, $app->rawModule, $app->rawMethod);?>
<?php elseif($this->config->systemMode == 'classic'):?>
<?php if($isProject) echo isset($lang->project->switcherMenu) ? $lang->project->switcherMenu : '';;?>
<?php endif;?>
+4 -4
View File
@@ -48,6 +48,8 @@ class company extends control
*/
public function browse($browseType = 'inside', $param = 0, $type = 'bydept', $orderBy = 'id', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$this->lang->navGroup->company = 'admin';
$this->loadModel('search');
$this->lang->set('menugroup.company', 'company');
@@ -147,8 +149,7 @@ class company extends control
*/
public function view()
{
$this->lang->navGroup->company = 'system';
$this->lang->noMenuModule[] = 'company';
$this->lang->noMenuModule[] = 'company';
$this->company->setMenu();
$this->view->title = $this->lang->company->common . $this->lang->colon . $this->lang->company->view;
@@ -170,8 +171,7 @@ class company extends control
*/
public function dynamic($browseType = 'today', $param = '', $recTotal = 0, $date = '', $direction = 'next')
{
$this->lang->navGroup->company = 'system';
$this->lang->noMenuModule[] = 'company';
$this->lang->noMenuModule[] = 'company';
$this->company->setMenu();
$this->app->loadLang('user');
+5 -5
View File
@@ -19,7 +19,7 @@ $lang->custom->score = 'Score';
$lang->custom->timezone = 'Timezone';
$lang->custom->scoreReset = 'Reset Score';
$lang->custom->scoreTitle = 'Point Feature';
$lang->custom->execution = $lang->sprintCommon;
$lang->custom->execution = 'Execution';
$lang->custom->product = $lang->productCommon;
$lang->custom->convertFactor = 'Convert factor';
$lang->custom->region = 'Interval';
@@ -71,12 +71,12 @@ $lang->custom->saveTips = 'After clicking save, the current %s will b
$lang->custom->numberError = 'The interval must be greater than zero!';
$lang->custom->closedExecution = 'Closed ' . $lang->sprintCommon;
$lang->custom->closedExecution = 'Closed Executions';
$lang->custom->closedProduct = 'Closed ' . $lang->productCommon;
$lang->custom->object['project'] = 'Project';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->sprintCommon;
$lang->custom->object['execution'] = 'Execution';
$lang->custom->object['story'] = 'Story';
$lang->custom->object['task'] = 'Task';
$lang->custom->object['bug'] = 'Bug';
@@ -164,7 +164,7 @@ $lang->custom->notice->required = 'The selected field is required.';
$lang->custom->notice->conceptResult = 'According to your preference, <b> %s-%s </b> is set for you. Use <b>%s</b> + <b> %s</b>。';
$lang->custom->notice->conceptPath = 'Go to Admin -> Custom -> Concept to set it.';
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases and plans of the closed product is also forbidden.';
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed {$lang->sprintCommon} is also forbidden.";
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed execution is also forbidden.";
$lang->custom->notice->URSREmpty = 'Custom requirement name can not be empty!';
$lang->custom->notice->confirmDelete = 'Are you sure you want to delete it?';
@@ -221,7 +221,7 @@ $lang->custom->CRExecution[0] = 'Change Forbidden';
$lang->custom->moduleName['product'] = $lang->productCommon;
$lang->custom->moduleName['productplan'] = 'Plan';
$lang->custom->moduleName['execution'] = $lang->sprintCommon;
$lang->custom->moduleName['execution'] = 'Execution';
$lang->custom->conceptQuestions['overview'] = "1. Which combination of management fits your company?";
$lang->custom->conceptQuestions['URAndSR'] = "2. Do you want to use the concept of {$lang->URCommon} and {$lang->SRCommon} in ZenTao?";
+4 -4
View File
@@ -19,7 +19,7 @@ $lang->custom->score = 'Point';
$lang->custom->timezone = 'Timezone';
$lang->custom->scoreReset = 'Reset Points';
$lang->custom->scoreTitle = 'Point Feature';
$lang->custom->execution = $lang->sprintCommon;
$lang->custom->execution = 'Execution';
$lang->custom->product = $lang->productCommon;
$lang->custom->convertFactor = 'Convert factor';
$lang->custom->region = 'Interval';
@@ -71,12 +71,12 @@ $lang->custom->saveTips = 'After clicking save, the current %s will b
$lang->custom->numberError = 'The interval must be greater than zero!';
$lang->custom->closedExecution = 'Closed ' . $lang->sprintCommon;
$lang->custom->closedExecution = 'Closed Executions';
$lang->custom->closedProduct = 'Closed ' . $lang->productCommon;
$lang->custom->object['project'] = 'Project';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->sprintCommon;
$lang->custom->object['execution'] = 'Execution';
$lang->custom->object['story'] = 'Story';
$lang->custom->object['task'] = 'Task';
$lang->custom->object['bug'] = 'Bug';
@@ -164,7 +164,7 @@ $lang->custom->notice->required = 'The selected field is required.';
$lang->custom->notice->conceptResult = 'According to your preference, <b> %s-%s </b> is set for you. Use <b>%s</b> + <b> %s</b>.';
$lang->custom->notice->conceptPath = 'Go to Admin -> Custom -> Concept to set it.';
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases and plans of the closed product is also forbidden.';
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed {$lang->sprintCommon} is also forbidden.";
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed execution is also forbidden.";
$lang->custom->notice->URSREmpty = 'Custom requirement name can not be empty!';
$lang->custom->notice->confirmDelete = 'Are you sure you want to delete it?';
+5 -5
View File
@@ -19,7 +19,7 @@ $lang->custom->score = 'Point';
$lang->custom->timezone = 'Timezone';
$lang->custom->scoreReset = 'Réinit Points';
$lang->custom->scoreTitle = 'Fonctionnalité des Points';
$lang->custom->execution = $lang->sprintCommon;
$lang->custom->execution = 'Execution';
$lang->custom->product = $lang->productCommon;
$lang->custom->convertFactor = 'Convert factor';
$lang->custom->region = 'Interval';
@@ -71,12 +71,12 @@ $lang->custom->saveTips = 'After clicking save, the current %s will b
$lang->custom->numberError = 'The interval must be greater than zero!';
$lang->custom->closedExecution = 'Closed ' . $lang->sprintCommon;
$lang->custom->closedExecution = 'Closed Executions';
$lang->custom->closedProduct = 'Closed ' . $lang->productCommon;
$lang->custom->object['project'] = 'Project';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->sprintCommon;
$lang->custom->object['execution'] = 'Execution';
$lang->custom->object['story'] = 'Story';
$lang->custom->object['task'] = 'Tâche';
$lang->custom->object['bug'] = 'Bug';
@@ -164,7 +164,7 @@ $lang->custom->notice->required = 'Le champ sélectionné est obligat
$lang->custom->notice->conceptResult = 'Selon votre préférence, <b> %s-%s </b> peut être fixé pour vous. Utilisez <b>%s</b> + <b> %s</b>。';
$lang->custom->notice->conceptPath = 'Allez à Admin -> Custom -> Concept pour le paramétrer.';
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases and plans of the closed product is also forbidden.';
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed {$lang->sprintCommon} is also forbidden.";
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed execution is also forbidden.";
$lang->custom->notice->URSREmpty = 'Custom requirement name can not be empty!';
$lang->custom->notice->confirmDelete = 'Are you sure you want to delete it?';
@@ -221,7 +221,7 @@ $lang->custom->CRExecution[0] = 'Change Forbidden';
$lang->custom->moduleName['product'] = $lang->productCommon;
$lang->custom->moduleName['productplan'] = 'Plan';
$lang->custom->moduleName['execution'] = $lang->sprintCommon;
$lang->custom->moduleName['execution'] = 'Execution';
$lang->custom->conceptQuestions['overview'] = "1. Quelle combinaison de gestion convient le mieux à votre entreprise ?";
$lang->custom->conceptQuestions['URAndSR'] = "2. Do you want to use the concept of {$lang->URCommon} and {$lang->SRCommon} in ZenTao?";
+5 -5
View File
@@ -19,7 +19,7 @@ $lang->custom->score = 'Điểm';
$lang->custom->timezone = 'Timezone';
$lang->custom->scoreReset = 'Thiết lập lại điểm';
$lang->custom->scoreTitle = 'Tính năng điểm';
$lang->custom->execution = $lang->sprintCommon;
$lang->custom->execution = 'Execution';
$lang->custom->product = $lang->productCommon;
$lang->custom->convertFactor = 'Convert factor';
$lang->custom->region = 'Interval';
@@ -71,12 +71,12 @@ $lang->custom->saveTips = 'After clicking save, the current %s will b
$lang->custom->numberError = 'The interval must be greater than zero!';
$lang->custom->closedExecution = 'Closed ' . $lang->sprintCommon;
$lang->custom->closedExecution = 'Closed Executions';
$lang->custom->closedProduct = 'Closed ' . $lang->productCommon;
$lang->custom->object['project'] = 'Project';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->sprintCommon;
$lang->custom->object['execution'] = 'Execution';
$lang->custom->object['story'] = 'Câu chuyện';
$lang->custom->object['task'] = 'Nhiệm vụ';
$lang->custom->object['bug'] = 'Bug';
@@ -164,7 +164,7 @@ $lang->custom->notice->required = 'Trường được chọn là bắ
$lang->custom->notice->conceptResult = 'According to your preference, <b> %s-%s </b> is set for you. Sử dụng <b>%s</b> + <b> %s</b>.';
$lang->custom->notice->conceptPath = 'Vào Quản trị -> Tùy biến -> Mô hình để thiết lập nó.';
$lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on stories, bugs, cases, efforts, releases and plans of the closed product is also forbidden.';
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed {$lang->sprintCommon} is also forbidden.";
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed execution is also forbidden.";
$lang->custom->notice->URSREmpty = 'Custom requirement name can not be empty!';
$lang->custom->notice->confirmDelete = 'Are you sure you want to delete it?';
@@ -221,7 +221,7 @@ $lang->custom->CRExecution[0] = 'Change Forbidden';
$lang->custom->moduleName['product'] = $lang->productCommon;
$lang->custom->moduleName['productplan'] = 'Kế hoạch';
$lang->custom->moduleName['execution'] = $lang->sprintCommon;
$lang->custom->moduleName['execution'] = 'Execution';
$lang->custom->conceptQuestions['overview'] = "1. Sự kết hợp quản lý nào phù hợp với công ty của bạn?";
$lang->custom->conceptQuestions['URAndSR'] = "2. Do you want to use the concept of {$lang->URCommon} and {$lang->SRCommon} in ZenTao?";
+5 -5
View File
@@ -19,7 +19,7 @@ $lang->custom->score = '积分';
$lang->custom->timezone = '时区';
$lang->custom->scoreReset = '重置积分';
$lang->custom->scoreTitle = '积分功能';
$lang->custom->execution = $lang->sprintCommon;
$lang->custom->execution = '执行';
$lang->custom->product = $lang->productCommon;
$lang->custom->convertFactor = '换算系数';
$lang->custom->region = '区间';
@@ -71,12 +71,12 @@ $lang->custom->saveTips = '点击保存后,则以当前%s为默认
$lang->custom->numberError = '区间必须大于零';
$lang->custom->closedExecution = '已关闭' . $lang->sprintCommon;
$lang->custom->closedExecution = '已关闭执行';
$lang->custom->closedProduct = '已关闭' . $lang->productCommon;
$lang->custom->object['project'] = '项目';
$lang->custom->object['product'] = $lang->productCommon;
$lang->custom->object['execution'] = $lang->sprintCommon;
$lang->custom->object['execution'] = '执行';
$lang->custom->object['story'] = $lang->SRCommon;
$lang->custom->object['task'] = '任务';
$lang->custom->object['bug'] = 'Bug';
@@ -164,7 +164,7 @@ $lang->custom->notice->required = '页面提交时,选中
$lang->custom->notice->conceptResult = '我们已经根据您的选择为您设置了<b> %s-%s </b>模式,使用<b>%s</b> + <b> %s</b>。';
$lang->custom->notice->conceptPath = '您可以在:后台 -> 自定义 -> 流程页面修改。';
$lang->custom->notice->readOnlyOfProduct = '禁止修改后,已关闭' . $lang->productCommon . '下的' . $lang->SRCommon . '、Bug、用例、日志、发布、计划都禁止修改。';
$lang->custom->notice->readOnlyOfExecution = '禁止修改后,已关闭' . $lang->sprintCommon . '下的任务、版本、日志以及关联需求都禁止修改。';
$lang->custom->notice->readOnlyOfExecution = '禁止修改后,已关闭执行下的任务、版本、日志以及关联需求都禁止修改。';
$lang->custom->notice->URSREmpty = '自定义需求名称不能为空!';
$lang->custom->notice->confirmDelete = '您确定要删除吗?';
@@ -221,7 +221,7 @@ $lang->custom->CRExecution[0] = '禁止修改';
$lang->custom->moduleName['product'] = $lang->productCommon;
$lang->custom->moduleName['productplan'] = '计划';
$lang->custom->moduleName['execution'] = $lang->sprintCommon;
$lang->custom->moduleName['execution'] = '执行';
$lang->custom->conceptQuestions['overview'] = "1. 下述哪种组合方式更适合您公司的管理现状?";
$lang->custom->conceptQuestions['URAndSR'] = "2. 是否启用{$lang->URCommon}和{$lang->SRCommon}概念?";
+20 -1
View File
@@ -265,6 +265,9 @@ class execution extends control
*/
public function grouptask($executionID = 0, $groupBy = 'story', $filter = '')
{
$moduleIndex = array_search('execution', $this->lang->noMenuModule);
if($moduleIndex !== false) unset($this->lang->noMenuModule[$moduleIndex]);
$execution = $this->commonAction($executionID);
$executionID = $execution->id;
@@ -1086,6 +1089,9 @@ class execution extends control
*/
public function team($executionID = 0)
{
$moduleIndex = array_search('execution', $this->lang->noMenuModule);
if($moduleIndex !== false) unset($this->lang->noMenuModule[$moduleIndex]);
$execution = $this->commonAction($executionID);
$executionID = $execution->id;
@@ -1645,6 +1651,9 @@ class execution extends control
*/
public function view($executionID)
{
$moduleIndex = array_search('execution', $this->lang->noMenuModule);
if($moduleIndex !== false) unset($this->lang->noMenuModule[$moduleIndex]);
$execution = $this->execution->getById($executionID, true);
if(empty($execution) || strpos('stage,sprint', $execution->type) === false) die(js::error($this->lang->notFound) . js::locate('back'));
@@ -1758,6 +1767,9 @@ class execution extends control
*/
public function tree($executionID, $type = 'task')
{
$moduleIndex = array_search('execution', $this->lang->noMenuModule);
if($moduleIndex !== false) unset($this->lang->noMenuModule[$moduleIndex]);
$this->execution->setMenu($this->executions, $executionID);
$execution = $this->loadModel('execution')->getById($executionID);
$tree = $this->execution->getTree($executionID);
@@ -1987,6 +1999,9 @@ class execution extends control
*/
public function manageProducts($executionID, $from = '')
{
$moduleIndex = array_search('execution', $this->lang->noMenuModule);
if($moduleIndex !== false) unset($this->lang->noMenuModule[$moduleIndex]);
/* use first execution if executionID does not exist. */
if(!isset($this->executions[$executionID])) $executionID = key($this->executions);
@@ -2485,7 +2500,8 @@ class execution extends control
$this->view->module = $module;
$this->view->method = $method;
$this->view->extra = $extra;
$this->view->executions = $this->execution->getByProject($execution->project);
$this->view->projects = $this->project->getPairsByModel();
$this->view->executions = $this->execution->getList();
$this->display();
}
@@ -2623,6 +2639,9 @@ class execution extends control
*/
public function whitelist($executionID = 0, $module='execution', $objectType = 'sprint', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$moduleIndex = array_search('execution', $this->lang->noMenuModule);
if($moduleIndex !== false) unset($this->lang->noMenuModule[$moduleIndex]);
/* use first execution if executionID does not exist. */
if(!isset($this->executions[$executionID])) $executionID = key($this->executions);
+3
View File
@@ -17,6 +17,8 @@ $lang->execution->id = $lang->executionCommon . '编号';
$lang->execution->type = $lang->executionCommon . '类型';
$lang->execution->name = $lang->executionCommon . '名称';
$lang->execution->code = $lang->executionCommon . '代号';
$lang->execution->execName = '执行名称';
$lang->execution->execCode = '执行代号';
$lang->execution->statge = '阶段';
$lang->execution->pri = '优先级';
$lang->execution->openedBy = '由谁创建';
@@ -36,6 +38,7 @@ $lang->execution->workHourUnit = 'H';
$lang->execution->totalHours = '可用工时';
$lang->execution->totalDays = '可用工日';
$lang->execution->status = $lang->executionCommon . '状态';
$lang->execution->execStatus = '执行状态';
$lang->execution->subStatus = '子状态';
$lang->execution->desc = $lang->executionCommon . '描述';
$lang->execution->owner = '负责人';
+2 -2
View File
@@ -115,8 +115,8 @@ class executionModel extends model
if($methodName == 'all') $label = $this->lang->execution->allExecutions;
if($methodName == 'create' and $moduleName == 'execution') $label = $this->lang->execution->create;
$executionIndex = $this->select($executions, $executionID, null, $moduleName, $methodName, $extra);
if($this->config->systemMode == 'new') $this->lang->modulePageNav = $executionIndex;
//$executionIndex = $this->select($executions, $executionID, null, $moduleName, $methodName, $extra);
//if($this->config->systemMode == 'new') $this->lang->modulePageNav = $executionIndex;
foreach($this->lang->execution->menu as $key => $menu)
{
@@ -21,15 +21,16 @@ $executionsPinYin = common::convert2Pinyin($executionNames);
foreach($executions as $execution)
{
$executionName = zget($projects, $execution->project) . '/' . $execution->name;
if($execution->status != 'done' and $execution->status != 'closed' and $execution->PM == $this->app->user->account)
{
$myProjectsHtml .= html::a(sprintf($link, $execution->id), "<i class='icon icon-{$lang->icons[$execution->type]}'></i> " . $execution->name, '', "class='text-important' title='{$execution->name}' data-key='" . zget($executionsPinYin, $execution->name, '') . "'");
$myProjectsHtml .= html::a(sprintf($link, $execution->id), "<i class='icon icon-{$lang->icons[$execution->type]}'></i> " . $executionName, '', "class='text-important' title='{$executionName}' data-key='" . zget($executionsPinYin, $execution->name, '') . "'");
}
else if($execution->status != 'done' and $execution->status != 'closed' and !($execution->PM == $this->app->user->account))
{
$normalProjectsHtml .= html::a(sprintf($link, $execution->id), "<i class='icon icon-{$lang->icons[$execution->type]}'></i> " . $execution->name, '', "title='{$execution->name}' data-key='" . zget($executionsPinYin, $execution->name, '') . "'");
$normalProjectsHtml .= html::a(sprintf($link, $execution->id), "<i class='icon icon-{$lang->icons[$execution->type]}'></i> " . $executionName, '', "title='{$executionName}' data-key='" . zget($executionsPinYin, $execution->name, '') . "'");
}
else if($execution->status == 'done' or $execution->status == 'closed') $closedProjectsHtml .= html::a(sprintf($link, $execution->id), "<i class='icon icon-{$lang->icons[$execution->type]}'></i> " . $execution->name, '', "title='{$execution->name}' data-key='" . zget($executionsPinYin, $execution->name, '') . "'");
else if($execution->status == 'done' or $execution->status == 'closed') $closedProjectsHtml .= html::a(sprintf($link, $execution->id), "<i class='icon icon-{$lang->icons[$execution->type]}'></i> " . $executionName, '', "title='{$executionName}' data-key='" . zget($executionsPinYin, $execution->name, '') . "'");
}
?>
<div class="table-row">
+4 -4
View File
@@ -71,11 +71,11 @@
<?php endif;?>
<?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?>
</th>
<th><?php common::printOrderLink('name', $orderBy, $vars, $lang->execution->name);?></th>
<th class='w-150px'><?php common::printOrderLink('code', $orderBy, $vars, $lang->execution->code);?></th>
<th class='thWidth'><?php common::printOrderLink('PM', $orderBy, $vars, $lang->execution->PM);?></th>
<th><?php common::printOrderLink('name', $orderBy, $vars, $from == 'execution' ? $lang->execution->execName : $lang->execution->name);?></th>
<th class='w-150px'><?php common::printOrderLink('code', $orderBy, $vars, $from == 'execution' ? $lang->execution->execCode : $lang->execution->code);?></th>
<th class='thWidth'><?php common::printOrderLink('PM', $orderBy, $vars, $lang->execution->owner);?></th>
<th class='w-90px'><?php common::printOrderLink('end', $orderBy, $vars, $lang->execution->end);?></th>
<th class='w-90px'><?php common::printOrderLink('status', $orderBy, $vars, $lang->execution->status);?></th>
<th class='w-90px'><?php common::printOrderLink('status', $orderBy, $vars, $from == 'execution' ? $lang->execution->execStatus : $lang->execution->status);?></th>
<th class='w-70px hours'><?php echo $lang->execution->totalEstimate;?></th>
<th class='w-70px hours'><?php echo $lang->execution->totalConsumed;?></th>
<th class='w-70px hours'><?php echo $lang->execution->totalLeft;?></th>
+1 -1
View File
@@ -202,7 +202,7 @@
<?php foreach($products as $productID => $product):?>
<?php $branchName = isset($branchGroups[$productID][$product->branch]) ? '/' . $branchGroups[$productID][$product->branch] : '';?>
<div class="col-xs-6">
<?php echo html::a($this->createLink('product', 'browse', "productID=$productID&branch=$product->branch"), "<i class='icon icon-cube text-muted'></i> " . $product->name . $branchName);?>
<?php echo html::a($this->createLink('product', 'browse', "productID=$productID&branch=$product->branch"), "<i class='icon icon-product text-muted'></i> " . $product->name . $branchName);?>
</div>
<?php endforeach;?>
</div>
+11 -9
View File
@@ -1063,6 +1063,7 @@ $lang->resource->custom = new stdclass();
$lang->resource->custom->index = 'index';
$lang->resource->custom->set = 'set';
$lang->resource->custom->product = 'product';
$lang->resource->custom->execution = 'execution';
$lang->resource->custom->restore = 'restore';
$lang->resource->custom->flow = 'flow';
$lang->resource->custom->working = 'working';
@@ -1076,15 +1077,16 @@ $lang->resource->custom->deleteStoryConcept = 'deleteStoryConcept';
$lang->custom->methodOrder[5] = 'index';
$lang->custom->methodOrder[10] = 'set';
$lang->custom->methodOrder[15] = 'product';
$lang->custom->methodOrder[20] = 'restore';
$lang->custom->methodOrder[25] = 'flow';
$lang->custom->methodOrder[30] = 'working';
$lang->custom->methodOrder[35] = 'setPublic';
$lang->custom->methodOrder[40] = 'timezone';
$lang->custom->methodOrder[45] = 'setStoryContcept';
$lang->custom->methodOrder[50] = 'editStoryContcept';
$lang->custom->methodOrder[55] = 'browseStoryContcept';
$lang->custom->methodOrder[60] = 'deleteStoryContcept';
$lang->custom->methodOrder[20] = 'execution';
$lang->custom->methodOrder[25] = 'restore';
$lang->custom->methodOrder[30] = 'flow';
$lang->custom->methodOrder[35] = 'working';
$lang->custom->methodOrder[40] = 'setPublic';
$lang->custom->methodOrder[45] = 'timezone';
$lang->custom->methodOrder[50] = 'setStoryContcept';
$lang->custom->methodOrder[55] = 'editStoryContcept';
$lang->custom->methodOrder[60] = 'browseStoryContcept';
$lang->custom->methodOrder[65] = 'deleteStoryContcept';
$lang->resource->datatable = new stdclass();
$lang->resource->datatable->setGlobal = 'setGlobal';
+1 -1
View File
@@ -122,7 +122,7 @@
{
if(['todo', 'team', 'calendar'].includes(methodLowerCase)) return 'system';
}
if(moduleName === 'company') if(methodLowerCase === 'dynamic' || methodLowerCase == 'view') return 'system';
if(moduleName === 'company') if(methodLowerCase == 'browse') return 'admin';
if(moduleName === 'tree')
{
if(methodLowerCase === 'browse')
+1 -1
View File
@@ -141,7 +141,7 @@
<?php foreach($products as $productID => $product):?>
<?php $branchName = isset($branchGroups[$productID][$product->branch]) ? '/' . $branchGroups[$productID][$product->branch] : '';?>
<div class="col-xs-6">
<?php echo html::a($this->createLink('product', 'browse', "productID=$productID&branch=$product->branch"), "<i class='icon icon-cube text-muted'></i> " . $product->name . $branchName);?>
<?php echo html::a($this->createLink('product', 'browse', "productID=$productID&branch=$product->branch"), "<i class='icon icon-product text-muted'></i> " . $product->name . $branchName);?>
</div>
<?php endforeach;?>
</div>
+26
View File
@@ -636,6 +636,10 @@ class upgradeModel extends model
$this->saveLogs('Execute 15_0');
$this->execSQL($this->getUpgradeFile('15.0'));
$this->appendExec('15_0');
case '15_0_beta1':
$this->saveLogs('Execute 15_0_beta1');
$this->adjustBugOfProject();
$this->appendExec('15_0_beta1');
}
$this->deletePatch();
@@ -4563,4 +4567,26 @@ class upgradeModel extends model
return true;
}
/**
* Adjust the project field of the zt_bug table.
*
* @access public
* @return bool
*/
public function adjustBugOfProject()
{
$bugs = $this->dao->select('id,execution')->from(TABLE_BUG)->fetchAll('id');
$executions = $this->dao->select('id,project')->from(TABLE_EXECUTION)->fetchAll('id');
foreach($bugs as $id => $bug)
{
if($bug->execution == 0) continue;
$data = array();
$data['project'] = $executions[$bug->execution]->project;
if($data) $this->dao->update(TABLE_BUG)->data($data)->where('id')->eq($id)->exec();
}
return true;
}
}
+6 -3
View File
@@ -16,9 +16,12 @@
$active = $methodName == 'task' ? ' btn-active-text' : '';
common::printLink('user', 'task', "userID={$user->id}", $label, '', "class='btn btn-link $active'");
$label = "<span class='text'>{$lang->URCommon}</span>";
$active = ($methodName == 'story' and $storyType == 'requirement') ? ' btn-active-text' : '';
common::printLink('user', 'story', "userID={$user->id}&storyType=requirement", $label, '', "class='btn btn-link $active'");
if($config->URAndSR)
{
$label = "<span class='text'>{$lang->URCommon}</span>";
$active = ($methodName == 'story' and $storyType == 'requirement') ? ' btn-active-text' : '';
common::printLink('user', 'story', "userID={$user->id}&storyType=requirement", $label, '', "class='btn btn-link $active'");
}
$label = "<span class='text'>{$lang->SRCommon}</span>";
$active = ($methodName == 'story' and $storyType == 'story') ? ' btn-active-text' : '';