public function findFirstSubmilestoneTracker(Planning_Milestone $milestone) { $children = $this->hierarchy_factory->getChildren($milestone->getTrackerId()); if (!$children) { return null; } $milestone_backlog_trackers = $milestone->getPlanning()->getBacklogTrackers(); foreach ($milestone_backlog_trackers as $milestone_backlog_tracker) { foreach ($children as $tracker) { $planning = $this->planning_factory->getPlanningByPlanningTracker($tracker); if (!$planning) { continue; } $planning_backlog_trackers = $planning->getBacklogTrackers(); foreach ($planning_backlog_trackers as $planning_backlog_tracker) { if ($milestone_backlog_tracker == $planning_backlog_tracker) { return $tracker; } $backlog_tracker_ancestors = $this->hierarchy_factory->getAllParents($planning_backlog_tracker); if (in_array($milestone_backlog_tracker, $backlog_tracker_ancestors)) { return $tracker; } } } } }
public function build(User $user, Project $project, Tracker_CrossSearch_Query $cross_search_query, array $already_planned_artifact_ids, $backlog_tracker_id, Planning $planning, $planning_redirect_parameter) { $report = $this->getReport($user); $criteria = $this->getCriteria($user, $project, $report, $cross_search_query); $tracker_ids = $this->hierarchy_factory->getHierarchy(array($backlog_tracker_id))->flatten(); $artifacts = $this->getHierarchicallySortedArtifacts($user, $project, $tracker_ids, $cross_search_query, $already_planned_artifact_ids); $visitor = new Planning_BacklogItemFilterVisitor($backlog_tracker_id, $this->hierarchy_factory, $already_planned_artifact_ids); $artifacts = $artifacts->accept($visitor); return new Planning_SearchContentView($report, $criteria, $artifacts, Tracker_ArtifactFactory::instance(), $this->form_element_factory, $user, $planning, $planning_redirect_parameter); }
/** * Returns the previously injected factory (e.g. in tests), or a new * instance (e.g. in production). * * @return Tracker_HierarchyFactory */ public function getHierarchyFactory() { if ($this->hierarchy_factory == null) { $this->hierarchy_factory = Tracker_HierarchyFactory::instance(); } return $this->hierarchy_factory; }
public function itRetrievesTheChildrenOfAGivenTracker() { $hierarchy_dao = mock('Tracker_Hierarchy_Dao'); $tracker_factory = mock('TrackerFactory'); $hierarchy_factory = new Tracker_HierarchyFactory($hierarchy_dao, $tracker_factory, mock('Tracker_ArtifactFactory')); $tracker_id = 1; $child_ids = array(array('id' => 11), array('id' => 12)); $child_1 = mock('Tracker'); $child_2 = mock('Tracker'); stub($hierarchy_dao)->searchChildTrackerIds($tracker_id)->returns($child_ids); stub($tracker_factory)->getTrackerById(11)->returns($child_1); stub($tracker_factory)->getTrackerById(12)->returns($child_2); $expected_children = array($child_1, $child_2); $actual_children = $hierarchy_factory->getChildren($tracker_id); $this->assertEqual($actual_children, $expected_children); }
public function build(Planning_Milestone $milestone, array $status_count, array $backlog_trackers, $has_user_priority_change_permission, $representation_type) { $this->id = JsonCast::toInt($milestone->getArtifactId()); $this->uri = self::ROUTE . '/' . $this->id; $this->label = $milestone->getArtifactTitle(); $this->status_value = $milestone->getArtifact()->getStatus(); $this->semantic_status = $milestone->getArtifact()->getSemanticStatusValue(); $this->submitted_by = JsonCast::toInt($milestone->getArtifact()->getFirstChangeset()->getSubmittedBy()); $this->submitted_on = JsonCast::toDate($milestone->getArtifact()->getFirstChangeset()->getSubmittedOn()); $this->capacity = JsonCast::toFloat($milestone->getCapacity()); $this->remaining_effort = JsonCast::toFloat($milestone->getRemainingEffort()); $this->sub_milestone_type = $this->getSubmilestoneType($milestone); $this->planning = new PlanningReference(); $this->planning->build($milestone->getPlanning()); $this->project = new ProjectReference(); $this->project->build($milestone->getProject()); $this->artifact = new ArtifactReference(); $this->artifact->build($milestone->getArtifact()); $this->start_date = null; if ($milestone->getStartDate()) { $this->start_date = JsonCast::toDate($milestone->getStartDate()); if ($representation_type === self::ALL_FIELDS) { $this->number_days_since_start = JsonCast::toInt($milestone->getDaysSinceStart()); } } $this->end_date = null; if ($milestone->getEndDate()) { $this->end_date = JsonCast::toDate($milestone->getEndDate()); if ($representation_type === self::ALL_FIELDS) { $this->number_days_until_end = JsonCast::toInt($milestone->getDaysUntilEnd()); } } if ($representation_type === self::ALL_FIELDS) { $this->parent = null; $parent = $milestone->getParent(); if ($parent) { $this->parent = new MilestoneParentReference(); $this->parent->build($parent); } } $this->has_user_priority_change_permission = $has_user_priority_change_permission; $this->sub_milestones_uri = $this->uri . '/' . self::ROUTE; $this->backlog_uri = $this->uri . '/' . BacklogItemRepresentation::BACKLOG_ROUTE; $this->content_uri = $this->uri . '/' . BacklogItemRepresentation::CONTENT_ROUTE; $this->last_modified_date = JsonCast::toDate($milestone->getLastModifiedDate()); if ($representation_type === self::ALL_FIELDS && $status_count) { $this->status_count = $status_count; } $finder = new \AgileDashboard_Milestone_Pane_Planning_SubmilestoneFinder(\Tracker_HierarchyFactory::instance(), PlanningFactory::build()); $submilestone_tracker = $finder->findFirstSubmilestoneTracker($milestone); $submilestone_trackers = array(); if ($submilestone_tracker) { $submilestone_tracker_ref = new TrackerReference(); $submilestone_tracker_ref->build($finder->findFirstSubmilestoneTracker($milestone)); $submilestone_trackers = array($submilestone_tracker_ref); } $this->resources['milestones'] = array('uri' => $this->uri . '/' . self::ROUTE, 'accept' => array('trackers' => $submilestone_trackers)); $this->resources['backlog'] = array('uri' => $this->uri . '/' . BacklogItemRepresentation::BACKLOG_ROUTE, 'accept' => array('trackers' => $this->getTrackersRepresentation($backlog_trackers))); $this->resources['content'] = array('uri' => $this->uri . '/' . BacklogItemRepresentation::CONTENT_ROUTE, 'accept' => array('trackers' => $this->getContentTrackersRepresentation($milestone))); }
/** @return Tracker[] */ private function getParentsWithPlanningAndOrderedFromTopToBottom(Tracker $nearest_planning_tracker) { $parents = $this->hierarchy_factory->getAllParents($nearest_planning_tracker); $parents = $this->keepsTrackersUntilThereIsNoPlanning($parents); $parents = array_reverse($parents); $parents[] = $nearest_planning_tracker; return $parents; }
public function build(User $user, Project $project, Tracker_CrossSearch_Query $cross_search_query, array $already_planned_artifact_ids, $backlog_tracker_id, Planning $planning, $planning_redirect_parameter) { $backlog_hierarchy = $this->hierarchy_factory->getHierarchy(array($backlog_tracker_id)); $report = $this->getReport($user); $criteria = $this->getCriteria($user, $project, $report, $cross_search_query); $tracker_ids = $backlog_hierarchy->flatten(); $artifacts = $this->getHierarchicallySortedArtifacts($user, $project, $tracker_ids, $cross_search_query, $already_planned_artifact_ids); // The following lines allows to tailor/rebuild the result before display // As of today (aug-12), we decided to display everything and to wait for // user feedback to see if we need to enable one of them. //$visitor = new Planning_BacklogItemFilterVisitor($backlog_tracker_id, $this->hierarchy_factory, $already_planned_artifact_ids); //$artifacts = $artifacts->accept($visitor); //$visitor = new Planning_GroupByParentsVisitor($user); //$artifacts->accept($visitor); $backlog_actions_presenter = new Planning_BacklogActionsPresenter($planning->getBacklogTracker(), $planning_redirect_parameter); return new Planning_SearchContentView($report, $criteria, $artifacts, Tracker_ArtifactFactory::instance(), $this->form_element_factory, $user, $backlog_actions_presenter, $planning, $planning_redirect_parameter); }
protected function buildContentView(Planning_ViewBuilder $view_builder, Planning $planning, Project $project = null) { $already_planned_artifact_ids = $this->getAlreadyPlannedArtifactsIds(); $cross_search_query = $this->getCrossSearchQuery(); $backlog_tracker_ids = $this->hierarchy_factory->getHierarchy(array($planning->getBacklogTrackerId()))->flatten(); $backlog_actions_presenter = new Planning_BacklogActionsPresenter($planning->getBacklogTracker(), $this->milestone, $this->getPlanningRedirectToSelf()); $view = $view_builder->build($this->getCurrentUser(), $project, $cross_search_query, $already_planned_artifact_ids, $backlog_tracker_ids, $planning, $backlog_actions_presenter, $this->getPlanningRedirectToSelf()); return $view; }
private function getHierarchyFactory() { return Tracker_HierarchyFactory::instance(); }
/** * @return Tracker_HierarchyFactory */ protected function getHierarchyFactory() { return Tracker_HierarchyFactory::instance(); }
public function __construct($backlog_tracker_id, Tracker_HierarchyFactory $hierarchy_factory, array $already_planned_ids) { $this->backlog_tracker_id = $backlog_tracker_id; $this->hierarchy = $hierarchy_factory->getHierarchy(array($backlog_tracker_id)); $this->already_planned_ids = array_flip($already_planned_ids); }
private function getHierarchiesToSearchIn() { $hierarchy_factory = Tracker_HierarchyFactory::instance(); $types_in_submilestone_but_not_in_milestone = array_diff($this->descendant_tracker_ids, $this->backlog_tracker_ids); $hierarchies = array(); foreach ($types_in_submilestone_but_not_in_milestone as $tracker_id) { $submilestone_backlog_tracker_hierarchy_tree = array_reverse($hierarchy_factory->getUpwardsHierarchyForTracker($tracker_id)); $this->extractRelevantSubmilestoneBacklogTrackerHierarchyTreeSection($submilestone_backlog_tracker_hierarchy_tree); if (!$submilestone_backlog_tracker_hierarchy_tree) { continue; } $hierarchies[] = $submilestone_backlog_tracker_hierarchy_tree; } return $hierarchies; }
/** * Retrieve a tree of artifacts matching the given search criteria. * * The artifacts tree matches the trackers hierarchy definition. * * @param PFUser $user The user who will see the search result * @param Project $project The project where the search occurs * @param array $tracker_ids The trackers to retrieve artifacts from. * @param Tracker_CrossSearch_Query $query The query that artifacts should match (e.g. title). * @param array $excluded_artifact_ids Some (optional) artifacts to exclude. * @return TreeNode */ public function getHierarchicallySortedArtifacts(PFUser $user, Project $project, $tracker_ids, Tracker_CrossSearch_Query $query, $excluded_artifact_ids = array()) { $hierarchy = $this->hierarchy_factory->getHierarchy($tracker_ids); return $this->getMatchingArtifacts($user, $project, $tracker_ids, $hierarchy, $query, $excluded_artifact_ids); }
private function sortPlanningTrackersIdsUsingHierarchy(array $trackers_ids, Tracker_HierarchyFactory $hierarchy_factory) { $hierarchy = $hierarchy_factory->getHierarchy($trackers_ids); $trackers_ids = $hierarchy->sortTrackerIds($trackers_ids); return $trackers_ids; }
protected function getTrackerChildrenFromHierarchy(Tracker $tracker) { return Tracker_HierarchyFactory::instance()->getChildren($tracker->getId()); }
public static function clearInstance() { self::$_instance = null; }
private function buildContentView(Planning_ViewBuilder $view_builder, Planning $planning, Project $project = null) { $already_planned_artifact_ids = $this->getAlreadyPlannedArtifactsIds(); $cross_search_query = $this->getCrossSearchQuery(); $view_builder->setHierarchyFactory(Tracker_HierarchyFactory::instance()); $view = $view_builder->build($this->getCurrentUser(), $project, $cross_search_query, $already_planned_artifact_ids, $planning->getBacklogTrackerId(), $planning, $this->getPlanningRedirectToSelf()); return $view; }
public function tearDown() { parent::tearDown(); Tracker_HierarchyFactory::clearInstance(); }
/** * Return the hierarchy the tracker belongs to * * @return Tracker_Hierarchy */ public function getHierarchy() { $hierarchy_factory = new Tracker_HierarchyFactory(new Tracker_Hierarchy_Dao(), $this->getTrackerFactory(), $this->getTrackerArtifactFactory()); return $hierarchy_factory->getHierarchy(array($this->getId())); }