From 4eda336b2768c9fd3eefd318f998c9c4a41a5836 Mon Sep 17 00:00:00 2001 From: tianshujie98 Date: Tue, 10 Aug 2021 14:39:30 +0800 Subject: [PATCH 1/6] * Finish task #41234. --- module/doc/control.php | 7 ++++++- module/doc/js/browse.js | 5 ++++- module/doc/lang/de.php | 1 + module/doc/lang/en.php | 1 + module/doc/lang/fr.php | 1 + module/doc/lang/vi.php | 1 + module/doc/lang/zh-cn.php | 1 + module/doc/model.php | 29 +++++++++++++++++++++++++++++ module/doc/view/browse.html.php | 9 +++++++++ module/my/control.php | 7 ++++++- module/my/view/doc.html.php | 9 +++++++++ module/program/model.php | 2 +- 12 files changed, 69 insertions(+), 4 deletions(-) diff --git a/module/doc/control.php b/module/doc/control.php index 7724b65df6..35f930da6f 100644 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -70,7 +70,12 @@ class doc extends control */ public function browse($browseType = 'all', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { - $this->session->set('docList', $this->app->getURI(true), 'doc'); + /* Save session, load module. */ + $uri = $this->app->getURI(true); + $this->session->set('docList', $uri, 'doc'); + $this->session->set('productList', $uri, 'product'); + $this->session->set('executionList', $uri, 'execution'); + $this->session->set('projectList', $uri, 'project'); $this->loadModel('search'); /* Set browseType.*/ diff --git a/module/doc/js/browse.js b/module/doc/js/browse.js index 0b95e564e5..7069c7e805 100644 --- a/module/doc/js/browse.js +++ b/module/doc/js/browse.js @@ -1,4 +1,7 @@ $('.ajaxCollect').click(function() { - window.location.reload(); + if(browseType == 'collectedbyme') + { + window.location.reload(); + } }) diff --git a/module/doc/lang/de.php b/module/doc/lang/de.php index de3c45d8fe..25cd16baa5 100644 --- a/module/doc/lang/de.php +++ b/module/doc/lang/de.php @@ -16,6 +16,7 @@ $lang->doc->product = $lang->productCommon; $lang->doc->execution = $lang->executionCommon; $lang->doc->lib = 'Bibliothek'; $lang->doc->module = 'Modul'; +$lang->doc->object = 'Object'; $lang->doc->title = 'Titel'; $lang->doc->digest = 'Zusammenfassung'; $lang->doc->comment = 'Bemerkung'; diff --git a/module/doc/lang/en.php b/module/doc/lang/en.php index 86ad3fcb9c..95b90e6c8e 100644 --- a/module/doc/lang/en.php +++ b/module/doc/lang/en.php @@ -17,6 +17,7 @@ $lang->doc->project = 'Project'; $lang->doc->execution = $lang->executionCommon; $lang->doc->lib = 'Library'; $lang->doc->module = 'Catalog'; +$lang->doc->object = 'Object'; $lang->doc->title = 'Name'; $lang->doc->digest = 'Summary'; $lang->doc->comment = 'Comment'; diff --git a/module/doc/lang/fr.php b/module/doc/lang/fr.php index b7130464e3..b13b96b2c3 100644 --- a/module/doc/lang/fr.php +++ b/module/doc/lang/fr.php @@ -16,6 +16,7 @@ $lang->doc->product = $lang->productCommon; $lang->doc->execution = $lang->executionCommon; $lang->doc->lib = 'Bibliothèque'; $lang->doc->module = 'Catégorie'; +$lang->doc->object = 'Object'; $lang->doc->title = 'Nom'; $lang->doc->digest = 'Résumé'; $lang->doc->comment = 'Commentaire'; diff --git a/module/doc/lang/vi.php b/module/doc/lang/vi.php index 6104d9e766..d232acb35f 100644 --- a/module/doc/lang/vi.php +++ b/module/doc/lang/vi.php @@ -16,6 +16,7 @@ $lang->doc->product = $lang->productCommon; $lang->doc->execution = $lang->executionCommon; $lang->doc->lib = 'Thư viện'; $lang->doc->module = 'Danh mục'; +$lang->doc->object = 'Object'; $lang->doc->title = 'Tên'; $lang->doc->digest = 'Tóm tắt'; $lang->doc->comment = 'Nhận xét'; diff --git a/module/doc/lang/zh-cn.php b/module/doc/lang/zh-cn.php index 20d4dc8fd4..821eeb15ad 100644 --- a/module/doc/lang/zh-cn.php +++ b/module/doc/lang/zh-cn.php @@ -17,6 +17,7 @@ $lang->doc->project = '所属项目'; $lang->doc->execution = '所属' . $lang->executionCommon; $lang->doc->lib = '所属文档库'; $lang->doc->module = '所属目录'; +$lang->doc->object = '所属对象'; $lang->doc->title = '文档标题'; $lang->doc->digest = '文档摘要'; $lang->doc->comment = '文档备注'; diff --git a/module/doc/model.php b/module/doc/model.php index 6d46b39d42..a30c4b5658 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -255,9 +255,38 @@ class docModel extends model ->fetchAll('id'); } + $projects = $this->dao->select('t1.id, t1.name')->from(TABLE_PROJECT)->alias('t1') + ->leftJoin(TABLE_DOC)->alias('t2')->on('t1.id=t2.project') + ->where('t2.id')->in(array_keys($docs)) + ->andWhere('t2.execution')->eq(0) + ->fetchPairs(); + + $executions = $this->dao->select('t1.id, t1.name')->from(TABLE_EXECUTION)->alias('t1') + ->leftJoin(TABLE_DOC)->alias('t2')->on('t1.id=t2.execution') + ->where('t2.id')->in(array_keys($docs)) + ->fetchPairs(); + + $products = $this->dao->select('t1.id, t1.name')->from(TABLE_PRODUCT)->alias('t1') + ->leftJoin(TABLE_DOC)->alias('t2')->on('t1.id=t2.product') + ->where('t2.id')->in(array_keys($docs)) + ->fetchPairs(); + $docContents = $this->dao->select('*')->from(TABLE_DOCCONTENT)->where('doc')->in(array_keys($docs))->orderBy('version,doc')->fetchAll('doc'); + + $objects = array('product' => 'products', 'execution' => 'executions', 'project' => 'projects'); foreach($docs as $index => $doc) { + foreach($objects as $type => $object) + { + if(!empty($doc->{$type})) + { + $doc->objectID = $doc->{$type}; + $doc->objectName = ${$object}[$doc->{$type}]; + $doc->objectType = $type; + break; + } + } + $docs[$index]->fileSize = 0; if(isset($files[$index])) { diff --git a/module/doc/view/browse.html.php b/module/doc/view/browse.html.php index 2c4a7ad128..2b93faab33 100644 --- a/module/doc/view/browse.html.php +++ b/module/doc/view/browse.html.php @@ -36,6 +36,7 @@ doc->title;?> + doc->object;?> doc->size;?> doc->addedBy;?> doc->addedDate;?> @@ -49,6 +50,14 @@ collector, ',' . $this->app->user->account . ',') !== false ? $lang->doc->cancelCollection : $lang->doc->collect;?> createLink('doc', 'view', "docID=$doc->id&version=0", '', true), "  " . $doc->title, '', "title={$doc->title} class='iframe' data-width='90%'");?> + + objectType)):?> + {$doc->objectType}->common . ' : ';?> + objectID");?>' data-app="objectType;?>"> + objectName;?> + + + fileSize ? $doc->fileSize : '-';?> addedBy);?> addedDate, 'y-m-d');?> diff --git a/module/my/control.php b/module/my/control.php index 2bb5f21477..d27d9ae06e 100644 --- a/module/my/control.php +++ b/module/my/control.php @@ -480,9 +480,14 @@ class my extends control public function doc($type = 'openedbyme', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { /* Save session, load lang. */ - if($this->app->viewType != 'json') $this->session->set('docList', $this->app->getURI(true), 'doc'); + $uri = $this->app->getURI(true); + if($this->app->viewType != 'json') $this->session->set('docList', $uri, 'doc'); $this->loadModel('doc'); + $this->session->set('productList', $uri, 'product'); + $this->session->set('executionList', $uri, 'execution'); + $this->session->set('projectList', $uri, 'project'); + /* Load pager. */ $this->app->loadClass('pager', $static = true); $pager = pager::init($recTotal, $recPerPage, $pageID); diff --git a/module/my/view/doc.html.php b/module/my/view/doc.html.php index 7dc567d712..4c777bbdc7 100644 --- a/module/my/view/doc.html.php +++ b/module/my/view/doc.html.php @@ -34,6 +34,7 @@ doc->title;?> + doc->object;?> doc->size;?> doc->addedBy;?> @@ -49,6 +50,14 @@ collector, ',' . $this->app->user->account . ',') !== false ? $lang->doc->cancelCollection : $lang->doc->collect;?> createLink('doc', 'view', "docID=$doc->id&version=0&from={$lang->navGroup->doc}", '', true), "  " . $doc->title, '', "title={$doc->title} class='iframe' data-width='90%'");?> + + objectType)):?> + {$doc->objectType}->common . ' : ';?> + objectID");?>' data-app="objectType;?>"> + objectName;?> + + + fileSize ? $doc->fileSize : '-';?> addedBy);?> diff --git a/module/program/model.php b/module/program/model.php index 197b011be2..5b891db4f4 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -773,7 +773,7 @@ class programModel extends model $treeMenu = array(); foreach($modules as $module) { - if(strpos($this->app->user->view->programs, $module->id) === false) continue; + if(strpos($this->app->user->view->programs, $module->id) === false and (!$this->app->user->admin)) continue; $moduleName = '/'; $parentModules = explode(',', $module->path); From 5020a6f181acddf3bed8101e2e4a8e29c243366e Mon Sep 17 00:00:00 2001 From: tianshujie98 Date: Tue, 10 Aug 2021 15:15:57 +0800 Subject: [PATCH 2/6] * Fix the main library permission issue when upgrading the project. --- module/upgrade/model.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index d7bab9e0da..d850944a5c 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -4701,10 +4701,18 @@ class upgradeModel extends model $today = helper::today(); foreach($projectTeams as $projectID => $projectMember) { + unset($projectMember['']); $project = zget($projects, $projectID, ''); + $users = implode(',', $projectMember); + + $this->dao->update(TABLE_DOCLIB) + ->set('users')->eq($users) + ->where('project')->eq($projectID) + ->andWhere('main')->eq(1) + ->exec(); + foreach($projectMember as $account) { - if(empty($account)) continue; if(!isset($users[$account])) continue; $user = $users[$account]; From 63038c836c8dde06c867016b3f1bac1da15fb33b Mon Sep 17 00:00:00 2001 From: leiyong <1549684884@qq.com> Date: Tue, 10 Aug 2021 15:31:33 +0800 Subject: [PATCH 3/6] * Finish task#40904. --- module/bug/control.php | 5 +++++ module/bug/view/view.html.php | 14 ++++++++++---- module/common/lang/.menu.php.swp | Bin 0 -> 16384 bytes module/productplan/view/.view.html.php.swp | Bin 0 -> 45056 bytes module/productplan/view/view.html.php | 2 +- 5 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 module/common/lang/.menu.php.swp create mode 100644 module/productplan/view/.view.html.php.swp diff --git a/module/bug/control.php b/module/bug/control.php index d9b2ab1289..7decc3783f 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -742,6 +742,11 @@ class bug extends control $this->repo->setMenu($repos); $this->lang->navGroup->bug = 'devops'; } + if($this->app->openApp == 'product') + { + $this->loadModel('product')->setMenu($bug->product); + $this->lang->product->menu->plan['subModule'] .= ',bug'; + } } /* Get product info. */ diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php index 2f3277774f..517e5232b8 100644 --- a/module/bug/view/view.html.php +++ b/module/bug/view/view.html.php @@ -32,7 +32,7 @@
app->openApp) !== false ? $this->app->openApp : 'qa';?> - product}&branch={$bug->branch}&extra=moduleID={$bug->module},projectID={$bug->project},executionID={$bug->execution}", " " . $lang->bug->create, '', "class='btn btn-primary' data-app='$openApp'"); ?> + app->openApp != 'product') common::printLink('bug', 'create', "productID={$bug->product}&branch={$bug->branch}&extra=moduleID={$bug->module},projectID={$bug->project},executionID={$bug->execution}", " " . $lang->bug->create, '', "class='btn btn-primary' data-app='$openApp'"); ?>
@@ -86,14 +86,20 @@ common::printIcon('bug', 'close', $params, $bug, 'button', '', '', 'text-danger iframe showinonlybody', true); common::printIcon('bug', 'activate', $params, $bug, 'button', '', '', 'text-success iframe showinonlybody', true); - common::printIcon('bug', 'toStory', "product=$bug->product&branch=$bug->branch&module=0&story=0&execution=0&bugID=$bug->id", $bug, 'button', $lang->icons['story'], '', '', '', "data-app='" . ($this->app->openApp == 'project' ? 'project' : 'product') . "'", $lang->bug->toStory); - common::printIcon('bug', 'createCase', $convertParams, $bug, 'button', 'sitemap'); + if($this->app->openApp != 'product') + { + common::printIcon('bug', 'toStory', "product=$bug->product&branch=$bug->branch&module=0&story=0&execution=0&bugID=$bug->id", $bug, 'button', $lang->icons['story'], '', '', '', "data-app='" . ($this->app->openApp == 'project' ? 'project' : 'product') . "'", $lang->bug->toStory); + common::printIcon('bug', 'createCase', $convertParams, $bug, 'button', 'sitemap'); + } echo $this->buildOperateMenu($bug, 'view'); echo "
"; common::printIcon('bug', 'edit', $params, $bug); - common::printIcon('bug', 'create', $copyParams, $bug, 'button', 'copy', '', '', false, "data-app='qa'"); + if($this->app->openApp != 'product') + { + common::printIcon('bug', 'create', $copyParams, $bug, 'button', 'copy', '', '', false, "data-app='qa'"); + } common::printIcon('bug', 'delete', $params, $bug, 'button', 'trash', 'hiddenwin'); ?> diff --git a/module/common/lang/.menu.php.swp b/module/common/lang/.menu.php.swp new file mode 100644 index 0000000000000000000000000000000000000000..840cbd60ae710c2af51d7a76e4ae279f78762599 GIT binary patch literal 16384 zcmeHNONbmr7%ty=m>3dof_661-i^CE`$#~OolPV@2xOCk7{N7YO?PFs-F|I9W_Qd4 zy_g6hDu^gKDR|P{g5t$<(1QmLIj96AAP9O3n8c`GRabY<&UE)=^h8wGu|sp(W8;$q+ZIB8d3Ot)esD9nGEYe0c@Zxjw8f3sjp9KpLTW7<)Rvc* zYp*glqMq-BHODh!o7D`@aXhzXQ@2@jm>ZA#3;tkxilG!x3amweO=Nm%a)O_+V`#g! zZR>MuIazU)0!jg;fKosypcGIFC@W{(MjU9kP6f{NF4EOa04Y^`{h23Md7X0!jg;fKosypcGIFCxd5%M$e6Yv9Y9GD002EM$9ke7ff zcN6jvun*V^Yy*Bn13m^?z%Jm%orGKj&H<-^7lA2YJ+KbAipBgz;4NS)@F~{v6Tmmn zzy-J#8rOqwJNZWmW3x^hz?TVQvu4|+j%8@r>KY9K+8)+z%U#s9`m8o2>5|lO+MRTF zXk=f%F~f7Cz-q)1t1y<6xV`Qp&t&z8hKq%^*$Ok_$nxC6Ku^j@GuGH_@)gD@?j$Si zL~WndW7qUt#=Tf4hIb-@6BaZH+hN3zeMeWqm~J)5{OMSC|nMwJ(i9QdUJE z%Q}TkTlRuQ-T~MO`XDvS`;0S1i}+3lpPNX*Mm0T*8;BjBpNO8*xsG~aA5ojRCJl<6 z$@UtOBzh>_A1d(TnVybfYFjjvj(Jg$W6L$!ifCj}E7MG);X=csfyq6KGYS;L`RE-j zj7-C(VK@wLwO!g=TN5AKXuE28o>R*`LR(3)9}P?v%hX>qg1m1GUio#r?GRk7HF?hP7T%vi9OEi!16yZkF`5?`bY)BQGPRB@> z{p^g~&CaYWxq^4P3Rtw@nY>Xa39~~+{#6*6{qBZlg=-FE&>$vjALdf1n^sZsyF!;G zsehdTKGmnF0>PsfL;Fq@2ki>Owbx6Eubx6FV zDYJfth(j}$ChnH% zx`i1`<3D4D*BtZW$hKUj&(74W*?gwT?WA*2($qpb&A^NOatrB0XDD*JPkYrJOo_D`u}_29B>9W4ZIBO1?~ra$1{Noz$ZWlI0j4r z8-UArHt;p@ArJukS-~T~!vFz(L@Zwc9{@Zq4^W#@Kq;UUPzopolmbctrGQf4R#ZSf zPrzdF8NLJ@n~i*Y=4fz`=SSx4Y6ts#rJYQOMnEt3SbPi^Ul$LK>Mx3Ffs}5Lu2GJ+zeN&_yP? zn@3;DvKeiq1E`#p)JP>#Tm9kVRjN;2{;W`!PlJj^QPWDg2rT&^C429Y54EtBWML)A Su!LCLU%4e7lw}LCGSWXauLA)9 literal 0 HcmV?d00001 diff --git a/module/productplan/view/.view.html.php.swp b/module/productplan/view/.view.html.php.swp new file mode 100644 index 0000000000000000000000000000000000000000..e9826fd45c6220bc6081618df457e95f10319a5e GIT binary patch literal 45056 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 g5Xv|s=`kOsw1A@<{&=ZzdX$o0+ bug->priList, $bug->pri, $bug->pri);?> - createLink('bug', 'view', "bugID=$bug->id"), $bug->title);?> + createLink('bug', 'view', "bugID=$bug->id"), $bug->title, '', 'data-app="product"');?> openedBy);?> assignedTo);?> From 6d5eb4fa8e4f62957f2e841687a31ce992c30cea Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Tue, 10 Aug 2021 15:53:13 +0800 Subject: [PATCH 4/6] * Finish task #41242. --- module/story/control.php | 7 +++-- module/story/model.php | 65 +++++++++++++++++++++++++--------------- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 8ee5a75e54..87eab50d21 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -572,6 +572,9 @@ class story extends control $action = !empty($changes) ? 'Edited' : 'Commented'; $actionID = $this->action->create('story', $storyID, $action, $this->post->comment); $this->action->logHistory($actionID, $changes); + + $story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch(); + $this->story->recordReviewAction($story); } $this->executeHooks($storyID); @@ -603,11 +606,11 @@ class story extends control /* Get users. */ $users = $this->user->getPairs('pofirst|nodeleted|noclosed', "$story->assignedTo,$story->openedBy,$story->closedBy"); - $isShowReviewer = true; + $isShowReviewer = false; $reviewerList = $this->story->getReviewerPairs($story->id, $story->version); $reviewerList = array_keys($reviewerList); $reviewedBy = explode(',', trim($story->reviewedBy, ',')); - if(!array_diff($reviewerList, $reviewedBy)) $isShowReviewer = false; + if(array_diff($reviewerList, $reviewedBy) and strpos('draft,changed', $story->status) !== false) $isShowReviewer = true; $reviewedReviewer = array(); foreach($reviewedBy as $reviewer) $reviewedReviewer[] = zget($users, $reviewer); diff --git a/module/story/model.php b/module/story/model.php index b3d8dbcaf9..28d3eefc8e 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -720,7 +720,7 @@ class storyModel extends model * * @param int $storyID * @access public - * @return array the changes of the story. + * @return array the changes of the story. */ public function update($storyID) { @@ -791,6 +791,44 @@ class storyModel extends model if(isset($story->stage) and $oldStory->stage != $story->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : ''; + if(isset($_POST['reviewer'])) + { + $_POST['reviewer'] = array_filter($_POST['reviewer']); + $oldReviewer = $this->getReviewerPairs($storyID, $oldStory->version); + + /* Update story reviewer. */ + $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($oldStory->version)->andWhere('reviewer')->notin(implode(',', $_POST['reviewer']))->exec(); + foreach($_POST['reviewer'] as $reviewer) + { + if(in_array($reviewer, array_keys($oldReviewer))) continue; + + $reviewData = new stdclass(); + $reviewData->story = $storyID; + $reviewData->version = $oldStory->version; + $reviewData->reviewer = $reviewer; + $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); + } + + /* Update the story status by review rules. */ + $reviewerList = $this->getReviewerPairs($storyID, $oldStory->version); + $reviewedBy = explode(',', trim($oldStory->reviewedBy, ',')); + if(!array_diff(array_keys($reviewerList), $reviewedBy)) + { + $status = $this->setStatusByReviewRules($reviewerList); + $story->status = $status ? $status : $oldStory->status; + if($story->status == 'closed') + { + $story->closedBy = $this->app->user->account; + $story->closedDate = $now; + $story->assignedTo = 'closed'; + $story->assignedDate = $now; + $story->stage = 'closed'; + if($this->post->closedReason == 'done') $story->stage = 'released'; + } + + } + } + $this->dao->update(TABLE_STORY) ->data($story) ->autoCheck() @@ -869,27 +907,6 @@ class storyModel extends model if(empty($oldStory->plan) or empty($story->plan)) $this->setStage($storyID); // Set new stage for this story. } - if(isset($_POST['reviewer'])) - { - $_POST['reviewer'] = array_filter($_POST['reviewer']); - $oldReviewer = $this->getReviewerPairs($storyID, $oldStory->version); - $oldStory->reviewers = implode(',', array_keys($oldReviewer)); - $story->reviewers = implode(',', $_POST['reviewer']); - - /* Update story reviewer. */ - $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($oldStory->version)->andWhere('reviewer')->notin(implode(',', $_POST['reviewer']))->exec(); - foreach($_POST['reviewer'] as $reviewer) - { - if(in_array($reviewer, array_keys($oldReviewer))) continue; - - $reviewData = new stdclass(); - $reviewData->story = $storyID; - $reviewData->version = $oldStory->version; - $reviewData->reviewer = $reviewer; - $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); - } - } - unset($oldStory->parent); unset($story->parent); return common::createChanges($oldStory, $story); @@ -4467,14 +4484,14 @@ class storyModel extends model * @access public * @return int */ - public function recordReviewAction($story, $result, $reason) + public function recordReviewAction($story, $result = '', $reason = '') { $reasonParam = $result == 'reject' ? ',' . $reason : ''; $reviewers = $this->getReviewerPairs($story->id, $story->version); $reviewedBy = explode(',', trim($story->reviewedBy, ',')); $comment = isset($_POST['comment']) ? $this->post->comment : ''; - $actionID = $this->loadModel('action')->create('story', $story->id, 'Reviewed', $comment, ucfirst($result) . $reasonParam); + $actionID = !empty($result) ? $this->loadModel('action')->create('story', $story->id, 'Reviewed', $comment, ucfirst($result) . $reasonParam) : ''; if($story->status == 'closed') $this->action->create('story', $story->id, 'ReviewClosed'); if($story->status == 'active') $this->action->create('story', $story->id, 'PassReviewed'); From d030b717848e45e0bb5f011a1da8945de4d414c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Tue, 10 Aug 2021 16:26:24 +0800 Subject: [PATCH 5/6] * Adjust for check https. --- framework/base/router.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/base/router.class.php b/framework/base/router.class.php index 0ee006df6f..e49536f612 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -609,6 +609,9 @@ class baseRouter if($this->config->framework->filterCSRF) { $httpType = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') ? 'https' : 'http'; + if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') $httpType = 'https'; + if(isset($_SERVER['REQUEST_SCHEME']) and strtolower($_SERVER['REQUEST_SCHEME']) == 'https') $httpType = 'https'; + $httpHost = $_SERVER['HTTP_HOST']; $isAPI = (defined('RUN_MODE') && RUN_MODE == 'api') || isset($_GET[$this->config->sessionVar]); if(!$isAPI && strpos($this->server->http_referer, "$httpType://$httpHost") !== 0) $_FILES = $_POST = array(); From 14c03ae9202ecee328481d186f960f3a191bc3b9 Mon Sep 17 00:00:00 2001 From: qiyu-xie Date: Tue, 10 Aug 2021 16:25:48 +0800 Subject: [PATCH 6/6] * Finish task#41219. --- module/my/view/task.html.php | 4 ++-- module/task/model.php | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/module/my/view/task.html.php b/module/my/view/task.html.php index b5ced4b4ba..2b28749604 100644 --- a/module/my/view/task.html.php +++ b/module/my/view/task.html.php @@ -91,7 +91,7 @@ createLink('task', 'view', "taskID=$task->id", '', '', $task->project), $task->name, null, "style='color: $task->color' data-group='execution'");?> children)) echo '';?> - createLink('project', 'view', "projectID=$task->project"), zget($projects, $task->project));?> + createLink('project', 'view', "projectID=$task->project"), $task->projectName);?> createLink('execution', 'task', "executionID=$task->execution"), $task->executionName, '', "data-group='execution'");?> openedBy);?> @@ -156,7 +156,7 @@ parent > 0) echo '' . $this->lang->task->childrenAB . ' ';?> createLink('task', 'view', "taskID=$child->id", '', '', $child->project), $child->name, null, "style='color: $child->color' data-group='project'");?> - createLink('project', 'view', "projectID=$child->project"), zget($projects, $child->project));?> + createLink('project', 'view', "projectID=$child->project"), $child->projectName);?> createLink('execution', 'task', "executionID=$child->project"), $child->executionName, '', "data-group='execution'");?> openedBy);?> diff --git a/module/task/model.php b/module/task/model.php index d3a749953f..e415bd0ab8 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -2138,6 +2138,11 @@ class taskModel extends model foreach($taskTeam as $taskID => $team) $tasks[$taskID]->team = $team; } + $projectList = ''; + foreach($tasks as $task) $projectList[] = $task->project; + $projectPairs = $this->dao->select('id,name')->from(TABLE_PROJECT)->where('id')->in($projectList)->fetchPairs('id'); + foreach($tasks as $task) $task->projectName = zget($projectPairs, $task->project); + if($tasks) return $this->processTasks($tasks); return array(); }