public function itUpdatesArtifactsWithoutBeenUnsubscribedFromNotifications() { $tracker = mock('Tracker'); $tracker_report = mock('Tracker_Report'); $user = mock('PFUser'); $request = mock('Codendi_Request'); stub($tracker)->userIsAdmin($user)->returns(true); stub($request)->get('masschange_aids')->returns(array(201, 202)); stub($request)->get('masschange-unsubscribe-option')->returns(false); stub($request)->get('artifact')->returns(array(1 => 'Value01')); stub($request)->get('artifact_masschange_followup_comment')->returns(''); $masschange_updater = new Tracker_MasschangeUpdater($tracker, $tracker_report); expect($tracker)->updateArtifactsMasschange()->once(); $masschange_updater->updateArtifacts($user, $request); }
public function process(Tracker_IDisplayTrackerLayout $layout, $request, $current_user) { if ($this->isObsolete()) { header('X-Codendi-Tracker-Report-IsObsolete: ' . $this->getLastUpdaterUserName()); } $hp = Codendi_HTMLPurifier::instance(); $tracker = $this->getTracker(); if ($request->exist('tracker') && $request->get('tracker') != $tracker->getId()) { $GLOBALS['Response']->addFeedback(Feedback::ERROR, $GLOBALS['Language']->getText('plugin_tracker_admin', 'invalid_request')); $GLOBALS['Response']->redirect('?' . http_build_query(array('tracker' => $tracker->getId()))); } switch ($request->get('func')) { case 'display-masschange-form': if ($tracker->userIsAdmin($current_user)) { $masschange_aids = array(); $renderer_table = $request->get('renderer_table'); if (!empty($renderer_table['masschange_checked'])) { $masschange_aids = $request->get('masschange_aids'); } else { if (!empty($renderer_table['masschange_all'])) { $masschange_aids = $request->get('masschange_aids_all'); } } if (empty($masschange_aids)) { $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_tracker_masschange_detail', 'no_items_selected')); $GLOBALS['Response']->redirect(TRACKER_BASE_URL . '/?tracker=' . $tracker->getId()); } $tracker->displayMasschangeForm($layout, $masschange_aids); } else { $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_tracker_admin', 'access_denied')); $GLOBALS['Response']->redirect(TRACKER_BASE_URL . '/?tracker=' . $tracker->getId()); } break; case 'update-masschange-aids': $masschange_updater = new Tracker_MasschangeUpdater($tracker, $this); $masschange_updater->updateArtifacts($current_user, $request); break; case 'remove-criteria': if ($request->get('field') && !$current_user->isAnonymous()) { $this->report_session->removeCriterion($request->get('field')); $this->report_session->setHasChanged(); } break; case 'add-criteria': if ($request->get('field') && !$current_user->isAnonymous()) { //TODO: make sure that the formElement exists and the user can read it if ($request->isAjax()) { $criteria = $this->getCriteria(); $field_id = $request->get('field'); $this->setCriteria($field_id); $this->report_session->storeCriterion($field_id, '', array('is_advanced' => 0)); $this->report_session->setHasChanged(); echo $this->criteria[$field_id]->fetch(); } } break; case 'toggle-advanced': if ($request->get('field') && !$current_user->isAnonymous()) { $this->toggleAdvancedCriterion($request->get('field')); $this->report_session->setHasChanged(); if ($request->isAjax()) { $criteria = $this->getCriteria(); if (isset($criteria[$request->get('field')])) { echo $criteria[$request->get('field')]->fetch(); } } } break; case self::ACTION_CLEANSESSION: $this->report_session->clean(); $GLOBALS['Response']->redirect('?' . http_build_query(array('tracker' => $this->tracker_id))); break; case 'renderer': if ($request->get('renderer')) { $store_in_session = true; if ($request->exist('store_in_session')) { $store_in_session = (bool) $request->get('store_in_session'); } $this->processRendererRequest($request->get('renderer'), $layout, $request, $current_user, $store_in_session); } break; case 'rename-renderer': if ($request->get('new_name') == '') { $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_tracker_report', 'renderer_name_mandatory')); } else { if (!$current_user->isAnonymous() && (int) $request->get('renderer') && trim($request->get('new_name'))) { $this->report_session->renameRenderer((int) $request->get('renderer'), trim($request->get('new_name')), trim($request->get('new_description'))); $this->report_session->setHasChanged(); } } $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id))); break; case 'delete-renderer': if (!$current_user->isAnonymous() && (int) $request->get('renderer')) { $this->report_session->removeRenderer((int) $request->get('renderer')); $this->report_session->setHasChanged(); $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id))); } break; case 'move-renderer': if (!$current_user->isAnonymous() && (int) $request->get('renderer')) { if ($request->isAjax()) { $this->report_session->moveRenderer($request->get('tracker_report_renderers')); $this->report_session->setHasChanged(); } else { if ($request->get('move-renderer-direction')) { $this->moveRenderer((int) $request->get('renderer'), $request->get('move-renderer-direction')); $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id))); } } } break; case 'add-renderer': $new_name = trim($request->get('new_name')); $new_description = trim($request->get('new_description')); $new_type = trim($request->get('new_type')); if (!$current_user->isAnonymous() && $new_name) { $new_renderer_id = $this->addRendererInSession($new_name, $new_description, $new_type); $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id, 'renderer' => $new_renderer_id ? $new_renderer_id : ''))); } break; case self::ACTION_SAVE: Tracker_ReportFactory::instance()->save($this); $this->saveCriteria(); $this->saveAdditionalCriteria(); $this->saveRenderers(); //Clean session $this->report_session->cleanNamespace(); $GLOBALS['Response']->addFeedback('info', '<a href="?report=' . $this->id . '">' . $hp->purify($this->name, CODENDI_PURIFIER_CONVERT_HTML) . '</a> has been saved.', CODENDI_PURIFIER_DISABLED); $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id))); break; case self::ACTION_SAVEAS: $redirect_to_report_id = $this->id; $report_copy_name = trim($request->get('report_copy_name')); if ($report_copy_name) { $new_report = Tracker_ReportFactory::instance()->duplicateReportSkeleton($this, $this->tracker_id, $current_user->getId()); //Set the name $new_report->name = $report_copy_name; //The new report is individual $new_report->user_id = $current_user->getId(); Tracker_ReportFactory::instance()->save($new_report); $GLOBALS['Response']->addFeedback('info', '<a href="?report=' . $new_report->id . '">' . $hp->purify($new_report->name, CODENDI_PURIFIER_CONVERT_HTML) . '</a> has been created.', CODENDI_PURIFIER_DISABLED); $redirect_to_report_id = $new_report->id; //copy parent tracker session content $this->report_session->copy($this->id, $redirect_to_report_id); //clean current session namespace $this->report_session->cleanNamespace(); //save session content into db $new_report->saveCriteria(); $new_report->saveAdditionalCriteria(); $new_report->saveRenderers(); $new_report->report_session->cleanNamespace(); } else { $GLOBALS['Response']->addFeedback('error', 'Invalid copy name', CODENDI_PURIFIER_DISABLED); } $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $redirect_to_report_id))); break; case self::ACTION_DELETE: $this->delete(); $GLOBALS['Response']->redirect('?' . http_build_query(array('tracker' => $this->tracker_id))); break; case self::ACTION_SCOPE: if ($this->getTracker()->userIsAdmin($current_user) && (!$this->user_id || $this->user_id == $current_user->getId())) { if ($request->exist('report_scope_public')) { $old_user_id = $this->user_id; if ($request->get('report_scope_public') && $this->user_id == $current_user->getId()) { $this->user_id = null; } else { if (!$request->get('report_scope_public') && !$this->user_id) { $this->user_id = $current_user->getId(); } } if ($this->user_id != $old_user_id) { Tracker_ReportFactory::instance()->save($this); } } } case self::ACTION_DEFAULT: if ($this->getTracker()->userIsAdmin($current_user)) { if ($request->exist('report_default')) { $old_user_id = $this->user_id; if ($request->get('report_default')) { $this->is_default = '1'; } else { $this->is_default = '0'; } } $this->setDefaultReport(); $GLOBALS['Response']->redirect('?' . http_build_query(array('report' => $this->id))); break; } default: if ($request->exist('tracker_query_submit')) { $criteria_values = $request->get('criteria'); if (!empty($criteria_values)) { $this->updateCriteriaValues($criteria_values); } $additional_criteria_values = $request->get('additional_criteria'); if (!empty($additional_criteria_values)) { $this->updateAdditionalCriteriaValues($additional_criteria_values); } $this->report_session->setHasChanged(); } $this->display($layout, $request, $current_user); break; } }