public function update() { $validator = new Planning_RequestValidator($this->planning_factory); if ($validator->isValid($this->request)) { $this->planning_factory->updatePlanning($this->request->get('planning_id'), PlanningParameters::fromArray($this->request->get('planning'))); $this->redirect(array('group_id' => $this->request->get('group_id'), 'action' => 'index')); } else { $this->addFeedback('error', $GLOBALS['Language']->getText('plugin_agiledashboard', 'planning_all_fields_mandatory')); $this->redirect(array('group_id' => $this->group_id, 'planning_id' => $this->request->get('planning_id'), 'action' => 'edit')); } }
/** * Returns true when the $request contains sufficent data to create a valid * Planning. * * Existing planning update validation is not implemented yet. * * @param Codendi_Request $request * * @return bool */ public function isValid(Codendi_Request $request) { $group_id = $request->get('group_id'); $planning_id = $request->get('planning_id'); $planning_parameters = $request->get('planning'); if (!$planning_parameters) { $planning_parameters = array(); } $planning_parameters = PlanningParameters::fromArray($planning_parameters); return $this->nameIsPresent($planning_parameters) && $this->backlogTrackerIdIsPresentAndIsAPositiveIntegers($planning_parameters) && $this->planningTrackerIdIsPresentAndIsAPositiveInteger($planning_parameters) && $this->planningTrackerIsNotThePlanningTrackerOfAnotherPlanningInTheSameProject($group_id, $planning_id, $planning_parameters); }
/** * Duplicate plannings for some previously duplicated trackers. * * @param int $group_id The id of the project where plannings should be created. * @param array $tracker_mapping An array mapping source tracker ids to destination tracker ids. */ public function duplicatePlannings($group_id, $tracker_mapping) { if (!$tracker_mapping) { return; } $planning_rows = $this->dao->searchByPlanningTrackerIds(array_keys($tracker_mapping)); foreach ($planning_rows as $row) { $row['backlog_tracker_id'] = $tracker_mapping[$row['backlog_tracker_id']]; $row['planning_tracker_id'] = $tracker_mapping[$row['planning_tracker_id']]; $this->dao->createPlanning($group_id, PlanningParameters::fromArray($row)); } }
/** * Duplicate plannings for some previously duplicated trackers. * * @param int $group_id The id of the project where plannings should be created. * @param array $tracker_mapping An array mapping source tracker ids to destination tracker ids. * @param array $ugroups_mapping An array mapping source ugroups and destinations ones. */ public function duplicatePlannings($group_id, $tracker_mapping, array $ugroups_mapping) { if (!$tracker_mapping) { return; } $planning_rows = $this->dao->searchByPlanningTrackerIds(array_keys($tracker_mapping)); foreach ($planning_rows as $row) { if (isset($tracker_mapping[$row['planning_tracker_id']])) { $row['planning_tracker_id'] = $tracker_mapping[$row['planning_tracker_id']]; $row['backlog_tracker_ids'] = array(); foreach ($this->dao->searchBacklogTrackersById($row['id']) as $backlog_row) { $row['backlog_tracker_ids'][] = $tracker_mapping[$backlog_row['tracker_id']]; } $inserted_planning_id = $this->dao->createPlanning($group_id, PlanningParameters::fromArray($row)); $this->duplicatePriorityChangePermission($group_id, $row['id'], $inserted_planning_id, $ugroups_mapping); } } }
public function import() { $this->checkUserIsAdmin(); $xml = $this->request->get('xml_content')->agiledashboard; $xml_validator = new XML_RNGValidator(); $rng_path = realpath(AGILEDASHBOARD_BASE_DIR . '/../www/resources/xml_project_agiledashboard.rng'); $xml_validator->validate($xml, $rng_path); $xml_importer = new AgileDashboard_XMLImporter(); $data = $xml_importer->toArray($xml, $this->request->get('mapping')); $validator = new Planning_RequestValidator($this->planning_factory, $this->kanban_factory); foreach ($data['plannings'] as $planning) { $request_params = array('planning' => $planning, 'group_id' => $this->group_id, 'planning_id' => ''); $request = new Codendi_Request($request_params); if ($validator->isValid($request)) { $this->planning_factory->createPlanning($this->group_id, PlanningParameters::fromArray($planning)); } else { throw new Exception('Planning is not valid: ' . print_r($planning, true)); } } }
public function itDuplicatesPlannings() { $dao = new MockPlanningDao(); $factory = aPlanningFactory()->withDao($dao)->build(); $group_id = 123; $sprint_tracker_id = 1; $story_tracker_id = 2; $bug_tracker_id = 3; $faq_tracker_id = 4; $sprint_tracker_copy_id = 5; $story_tracker_copy_id = 6; $bug_tracker_copy_id = 7; $faq_tracker_copy_id = 8; $tracker_mapping = array($sprint_tracker_id => $sprint_tracker_copy_id, $story_tracker_id => $story_tracker_copy_id, $bug_tracker_id => $bug_tracker_copy_id, $faq_tracker_id => $faq_tracker_copy_id); $sprint_planning_name = 'Sprint Planning'; $rows = TestHelper::arrayToDar(array('id' => 1, 'name' => $sprint_planning_name, 'group_id' => 101, 'backlog_title' => 'Backlog', 'plan_title' => 'Plan', 'planning_tracker_id' => $sprint_tracker_id, 'backlog_tracker_id' => $story_tracker_id)); stub($dao)->searchByPlanningTrackerIds(array_keys($tracker_mapping))->returns($rows); $expected_paramters = PlanningParameters::fromArray(array('id' => 1, 'name' => $sprint_planning_name, 'group_id' => 101, 'backlog_title' => 'Backlog', 'plan_title' => 'Plan', 'planning_tracker_id' => $sprint_tracker_copy_id, 'backlog_tracker_id' => $story_tracker_copy_id)); $dao->expectOnce('createPlanning', array($group_id, $expected_paramters)); $factory->duplicatePlannings($group_id, $tracker_mapping); }
public function itUpdatesThePlanningAndRedirectToTheIndex() { $this->userIsAdmin(); $this->planning_factory->expectOnce('updatePlanning', array($this->planning_id, $this->group_id, PlanningParameters::fromArray($this->planning_parameters))); $this->expectRedirectTo("/plugins/agiledashboard/?group_id={$this->group_id}&planning_id={$this->planning_id}&action=edit"); $this->planning_controller->update(); }
public function itTranslatesUgroupsIdsFromUgroupsMapping() { $dao = new MockPlanningDao(); $planning_permissions_manager = stub('PlanningPermissionsManager')->getGroupIdsWhoHasPermissionOnPlanning()->returns(array(4, 103, 104)); $factory = partial_mock('PlanningFactory', array('getPlanning'), array($dao, mock('TrackerFactory'), mock('Tracker_FormElementFactory'), $planning_permissions_manager)); $group_id = 123; $sprint_tracker_id = 1; $story_tracker_id = 2; $bug_tracker_id = 3; $faq_tracker_id = 4; $sprint_tracker_copy_id = 5; $story_tracker_copy_id = 6; $bug_tracker_copy_id = 7; $faq_tracker_copy_id = 8; stub($factory)->getPlanning(1)->returns(aPlanning()->withId(1)->withGroupId($group_id)->build()); $tracker_mapping = array($sprint_tracker_id => $sprint_tracker_copy_id, $story_tracker_id => $story_tracker_copy_id, $bug_tracker_id => $bug_tracker_copy_id, $faq_tracker_id => $faq_tracker_copy_id); $sprint_planning_name = 'Sprint Planning'; $rows = TestHelper::arrayToDar(array('id' => 1, 'name' => $sprint_planning_name, 'group_id' => 101, 'backlog_title' => 'Backlog', 'plan_title' => 'Plan', 'planning_tracker_id' => $sprint_tracker_id)); stub($dao)->searchByPlanningTrackerIds(array_keys($tracker_mapping))->returns($rows); stub($dao)->searchBacklogTrackersById(1)->returnsDar(array('planning_id' => 1, 'tracker_id' => $story_tracker_id)); stub($dao)->searchById(1)->returnsDar(array('id' => 1, 'name' => $sprint_planning_name, 'group_id' => 101, 'backlog_title' => 'Backlog', 'plan_title' => 'Plan', 'planning_tracker_id' => $sprint_tracker_copy_id, 'backlog_tracker_ids' => array($story_tracker_copy_id))); $expected_paramters = PlanningParameters::fromArray(array('id' => 1, 'name' => $sprint_planning_name, 'group_id' => 101, 'backlog_title' => 'Backlog', 'plan_title' => 'Plan', 'planning_tracker_id' => $sprint_tracker_copy_id, 'backlog_tracker_ids' => array($story_tracker_copy_id))); $expected_ugroups = array(4, 113, 114); expect($planning_permissions_manager)->savePlanningPermissionForUgroups('*', '*', PlanningPermissionsManager::PERM_PRIORITY_CHANGE, $expected_ugroups)->once(); $ugroups_mapping = array(103 => 113, 104 => 114); $factory->duplicatePlannings($group_id, $tracker_mapping, $ugroups_mapping); }
public function itUpdatesThePlanningAndRedirectToTheIndex() { $group_id = 456; $planning_id = 123; $planning_parameters = array('name' => 'Foo', 'backlog_title' => 'Bar', 'plan_title' => 'Baz', 'backlog_tracker_id' => 43875, 'planning_tracker_id' => 654823); $request = aRequest()->with('group_id', $group_id)->with('planning_id', $planning_id)->with('planning', $planning_parameters)->build(); $planning_factory = mock('PlanningFactory'); $this->controller = new Planning_Controller($request, $planning_factory); // TODO: Inject validator into controller so that we can mock it and test it in isolation. stub($planning_factory)->getPlanningTrackerIdsByGroupId($group_id)->returns(array()); $planning_factory->expectOnce('updatePlanning', array($planning_id, PlanningParameters::fromArray($planning_parameters))); $this->expectRedirectTo("/plugins/agiledashboard/?group_id={$group_id}&action=index"); $this->controller->update(); }