/** * Update a tool version * * @return void */ public function updateTask() { // get vars if (!$this->_toolid) { $this->_toolid = Request::getInt('toolid', 0); } // Create a Tool object $obj = new \Components\Tools\Tables\Tool($this->database); // do we have an alias? if ($this->_toolid == 0) { if ($alias = Request::getVar('app', '')) { $this->_toolid = $obj->getToolId($alias); } } if (!$this->_error) { $this->_error = Request::getVar('error', ''); } $error = ''; //$id = $this->_toolid; // make sure user is authorized to go further if (!$this->_checkAccess($this->_toolid)) { App::abort(403, Lang::txt('COM_TOOLS_ALERTNOTAUTH')); return; } $newstate = Request::getVar('newstate', ''); $priority = Request::getVar('priority', 3); $comment = Request::getVar('comment', ''); $access = Request::getInt('access', 0); $newversion = Request::getVar('newversion', ''); $editversion = Request::getVar('editversion', 'dev'); $hzt = \Components\Tools\Models\Tool::getInstance($this->_toolid); $hztv = $hzt->getRevision($editversion); $oldstatus = $hztv ? $hztv->toArray() : array(); $oldstatus['toolstate'] = $hzt->state; if ($newstate && !intval($newstate)) { $newstate = \Components\Tools\Helpers\Html::getStatusNum($newstate); } if (intval($newstate) && $newstate != $oldstatus['toolstate']) { Log::debug(__FUNCTION__ . "() state changing"); if ($newstate == \Components\Tools\Helpers\Html::getStatusNum('Approved') && \Components\Tools\Models\Tool::validateVersion($oldstatus['version'], $error, $hzt->id)) { $this->_error = $error; Log::debug(__FUNCTION__ . "() state changing to approved, action confirm"); $this->_action = 'confirm'; $this->_task = Lang::txt('COM_TOOLS_CONTRIBTOOL_APPROVE_TOOL'); $this->versionsTask(); return; } else { if ($newstate == \Components\Tools\Helpers\Html::getStatusNum('Approved')) { $this->_error = $error; Log::debug(__FUNCTION__ . "() state changing to approved, action new"); $this->_action = 'new'; $this->_task = Lang::txt('COM_TOOLS_CONTRIBTOOL_APPROVE_TOOL'); $this->versionsTask(); return; } else { if ($newstate == \Components\Tools\Helpers\Html::getStatusNum('Published')) { Log::debug(__FUNCTION__ . "() state changing to published"); $hzt->published = '1'; } } } $this->_error = $error; // update dev screenshots of a published tool changes status if ($oldstatus['state'] == \Components\Tools\Helpers\Html::getStatusNum('Published')) { // Create a Tool Version object $objV = new \Components\Tools\Tables\Version($this->database); Log::debug(__FUNCTION__ . "() state changing away from published"); // Get version ids $rid = \Components\Tools\Models\Tool::getResourceId($hzt->toolname, $hzt->id); $to = $objV->getVersionIdFromResource($rid, 'dev'); $from = $objV->getVersionIdFromResource($rid, 'current'); $dev_hztv = $hzt->getRevision('dev'); $current_hztv = $hzt->getRevision('current'); Log::debug("update: to={$to} from={$from} dev=" . $dev_hztv->id . " current=" . $current_hztv->id); if ($to && $from) { require_once __DIR__ . DS . 'screenshots.php'; $ss = new Screenshots(); $ss->transfer($from, $to, $rid); } } // If the tool was cancelled ... if ($oldstatus['state'] == \Components\Tools\Helpers\Html::getStatusNum('Abandoned')) { include_once __DIR__ . DS . 'resource.php'; $r = new \Components\Resources\Tables\Resource($this->database); $r->loadAlias($hzt->toolname); if ($r && $r->id) { $rstatus = 2; if ($newstate == \Components\Tools\Helpers\Html::getStatusNum('Published')) { $rstatus = 1; } $resource = new Resource(); $resource->updatePage($r->id, $oldstatus, $rstatus); } } Log::debug(__FUNCTION__ . "() state changing to {$newstate}"); $hzt->state = $newstate; $hzt->state_changed = Date::toSql(); } // if priority changes if (intval($priority) && $priority != $oldstatus['priority']) { $hzt->priority = $priority; } // save tool info $hzt->update(); $hztv->update(); //@FIXME: look // get tool status after updates $status = $hztv->toArray(); $status['toolstate'] = $hzt->state; // update history ticket Log::debug(__FUNCTION__ . "() before newUpdateTicket test"); if ($oldstatus != $status || !empty($comment)) { Log::debug(__FUNCTION__ . "() before newUpdateTicket"); $this->_newUpdateTicket($hzt->id, $hzt->ticketid, $oldstatus, $status, $comment, $access, 1); Log::debug(__FUNCTION__ . "() after newUpdateTicket"); } $this->_msg = Lang::txt('COM_TOOLS_NOTICE_STATUS_CHANGED'); $this->statusTask(); }
/** * Publish a tool * * @return void */ public function publishTask() { // Set the layout (note: all the views for this controller use the same layout) $this->view->setLayout('display'); // Create a Tool object $obj = new \Components\Tools\Tables\Tool($this->database); // Do we have an alias? if ($alias = Request::getVar('app', '')) { $this->_toolid = $obj->getToolId($alias); } // Do we have a tool ID if (!$this->_toolid) { App::abort(403, Lang::txt('COM_TOOLS_ERROR_TOOL_NOT_FOUND')); return; } // Get the tool status $obj->getToolStatus($this->_toolid, $this->_option, $status, 'dev'); // Check for a status if (count($status) <= 0) { App::abort(500, Lang::txt('COM_TOOLS_ERR_CANNOT_RETRIEVE')); return; } $result = true; Log::debug("publish(): checkpoint 1:{$result}"); // get config // Create a Tool Version object $objV = new \Components\Tools\Tables\Version($this->database); $objV->getToolVersions($this->_toolid, $tools, '', 1); // make checks if (!is_numeric($status['revision'])) { // bad format $result = false; $this->setError(Lang::txt('COM_TOOLS_ERR_MISSING_REVISION_OR_BAD_FORMAT')); } else { if (count($tools) > 0 && $status['revision']) { // check for duplicate revision foreach ($tools as $t) { if ($t->revision == $status['revision']) { $result = false; $this->setError(Lang::txt('COM_TOOLS_ERR_REVISION_EXISTS') . ' ' . $status['revision']); } } // check that revision number is greater than in previous version $currentrev = $objV->getCurrentVersionProperty($status['toolname'], 'revision'); if ($currentrev && intval($currentrev) > intval($status['revision'])) { $result = false; $this->setError(Lang::txt('COM_TOOLS_ERR_REVISION_GREATER')); } } } // Log checkpoint Log::debug("publish(): checkpoint 2:{$result}, check revision"); // check if version is valid if (!\Components\Tools\Models\Tool::validateVersion($status['version'], $error_v, $this->_toolid)) { $result = false; $this->setError($error_v); } // Log checkpoint Log::debug("publish(): checkpoint 3:{$result}, running finalize tool"); // Run finalizetool if (!$this->getError()) { if ($this->_finalizeTool($out)) { $this->setMessage(Lang::txt('COM_TOOLS_Version finalized.')); } else { $this->setError($out); $result = false; } } Log::debug("publish(): checkpoint 4:{$result}, running doi stuff"); // Register DOI handle if ($result && $this->config->get('new_doi', 0)) { include_once PATH_CORE . DS . 'components' . DS . 'com_resources' . DS . 'tables' . DS . 'doi.php'; // Collect metadata $url = Request::base() . ltrim(Route::url('index.php?option=com_resources&id=' . $status['resourceid'] . '&rev=' . $status['revision']), DS); // Check if DOI exists for this revision $objDOI = new \Components\Resources\Tables\Doi($this->database); $bingo = $objDOI->getDoi($status['resourceid'], $status['revision'], '', 1); // DOI already exists for this revision if ($bingo) { $this->setError(Lang::txt('COM_TOOLS_ERR_DOI_ALREADY_EXISTS') . ': ' . $bingo); } else { // Get latest DOI label $latestdoi = $objDOI->getLatestDoi($status['resourceid']); $newlabel = $latestdoi ? intval($latestdoi) + 1 : 1; // Collect metadata $metadata = array('targetURL' => $url, 'title' => htmlspecialchars(stripslashes($status['title'])), 'version' => $status['version'], 'abstract' => htmlspecialchars(stripslashes($status['description']))); // Get authors $objA = new \Components\Tools\Tables\Author($this->database); $authors = $objA->getAuthorsDOI($status['resourceid']); // Register DOI $doiSuccess = $objDOI->registerDOI($authors, $this->config, $metadata, $doierr); // Save [new] DOI record if ($doiSuccess) { if (!$objDOI->loadDOI($status['resourceid'], $status['revision'])) { if ($objDOI->saveDOI($status['revision'], $newlabel, $status['resourceid'], $status['toolname'], 0, $doiSuccess)) { $this->setMessage(Lang::txt('COM_TOOLS_SUCCESS_DOI_CREATED') . ' ' . $doiSuccess); } else { $this->setError(Lang::txt('COM_TOOLS_ERR_DOI_STORE_FAILED')); $result = false; } } else { $this->setError(Lang::txt('COM_TOOLS_DOI already exists: ') . $objDOI->doi); } } else { $this->setError(Lang::txt('COM_TOOLS_ERR_DOI_STORE_FAILED')); $this->setError($doierr); $result = false; } } } if ($result) { $invokedir = rtrim($this->config->get('invokescript_dir', DS . 'apps'), "\\/"); $hzt = \Components\Tools\Models\Tool::getInstance($this->_toolid); $hztv_cur = $hzt->getCurrentVersion(); $hztv_dev = $hzt->getDevelopmentVersion(); Log::debug("publish(): checkpoint 6:{$result}, running database stuff"); // create tool instance in the database $newtool = $status['toolname'] . '_r' . $status['revision']; // get version id $currentid = is_object($hztv_cur) ? $hztv_cur->id : null; $new = $currentid ? 0 : 1; $devid = $hztv_dev->id; $exportmap = array('@OPEN' => null, '@GROUP' => null, '@US' => 'us', '@PU' => 'pu', '@D1' => 'd1'); $new_hztv = \Components\Tools\Models\Version::createInstance($status['toolname'], $newtool); $new_hztv->toolname = $status['toolname']; $new_hztv->instance = $newtool; $new_hztv->toolid = $this->_toolid; $new_hztv->state = 1; $new_hztv->title = $status['title']; $new_hztv->version = $status['version']; $new_hztv->revision = $status['revision']; $new_hztv->description = $status['description']; $new_hztv->toolaccess = $status['exec']; $new_hztv->codeaccess = $status['code']; $new_hztv->wikiaccess = $status['wiki']; $new_hztv->vnc_geometry = $status['vncGeometry']; $new_hztv->vnc_command = $invokedir . DS . $status['toolname'] . DS . 'r' . $status['revision'] . DS . 'middleware' . DS . 'invoke -T r' . $status['revision']; $new_hztv->mw = $status['mw']; $new_hztv->released = Date::toSql(); $new_hztv->released_by = User::get('username'); $new_hztv->license = $status['license']; $new_hztv->fulltxt = $status['fulltxt']; $new_hztv->exportControl = $exportmap[strtoupper($status['exec'])]; $new_hztv->owner = $hztv_dev->owner; $new_hztv->member = $hztv_dev->member; $new_hztv->vnc_timeout = $hztv_dev->vnc_timeout; $new_hztv->hostreq = $hztv_dev->hostreq; $new_hztv->params = $status['params']; if (!$new_hztv->update()) { $this->setError(Lang::txt('COM_TOOLS_ERROR_UPDATING_INSTANCE')); $result = false; } else { $this->_setTracAccess($new_hztv->toolname, $new_hztv->codeaccess, $new_hztv->wikiaccess); // update tool entry $hzt = \Components\Tools\Models\Tool::getInstance($this->_toolid); $hzt->add('version', $new_hztv->instance); $hzt->update(); if ($hzt->published != 1) { $hzt->published = 1; // save tool info if (!$hzt->update()) { $this->setError(Lang::txt('COM_TOOLS_ERROR_UPDATING_INSTANCE')); } else { $this->setMessage(Lang::txt('COM_TOOLS_NOTICE_TOOL_MARKED_PUBLISHED')); } } // unpublish previous version if (!$new) { if ($hzt->unpublishVersion($hztv_cur->instance)) { $this->setMessage(Lang::txt('COM_TOOLS_NOTICE_UNPUBLISHED_PREV_VERSION_DB')); } else { $this->setError(Lang::txt('COM_TOOLS_ERR_FAILED_TO_UNPUBLISH_PREV_VERSION_DB')); } } // get version id $currentid = $new_hztv->id; // save authors for this version $objA = new \Components\Tools\Tables\Author($this->database); if ($objA->saveAuthors($status['developers'], $currentid, $status['resourceid'], $status['revision'], $status['toolname'])) { $this->setMessage(Lang::txt('COM_TOOLS_AUTHORS_SAVED')); } else { $this->setError(Lang::txt('COM_TOOLS_ERROR_SAVING_AUTHORS', $currentid)); } // transfer screenshots if ($devid && $currentid) { include_once __DIR__ . DS . 'screenshots.php'; $screenshots = new Screenshots(); if ($screenshots->transfer($devid, $currentid, $status['resourceid'])) { $this->setMessage(Lang::txt('COM_TOOLS_SCREENSHOTS_TRANSFERRED')); } else { $this->setError(Lang::txt('COM_TOOLS_ERROR_TRANSFERRING_SCREENSHOTS')); } } include_once __DIR__ . DS . 'resource.php'; $resource = new Resource(); // update and publish resource page $resource->updatePage($status['resourceid'], $status, '1', $new); } } Log::debug("publish(): checkpoint 7:{$result}, gather output"); // Set errors to view foreach ($this->getErrors() as $error) { $this->view->setError($error); } // Set messages to view $this->view->messages = $this->getMessages(); // Output HTML if (!($no_html = Request::getInt('no_html', 0))) { App::redirect(Route::url('index.php?option=' . $this->_option . '&controller=pipeline&task=status&app=' . $alias)); return; } $this->view->display(); }