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;
                 }
             }
         }
     }
 }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 4
0
 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;
 }
Ejemplo n.º 7
0
 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);
 }
Ejemplo n.º 8
0
 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;
 }
Ejemplo n.º 9
0
 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;
 }
Ejemplo n.º 13
0
 /**
  * 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());
 }
Ejemplo n.º 16
0
 public static function clearInstance()
 {
     self::$_instance = null;
 }
Ejemplo n.º 17
0
 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;
 }
Ejemplo n.º 18
0
 public function tearDown()
 {
     parent::tearDown();
     Tracker_HierarchyFactory::clearInstance();
 }
Ejemplo n.º 19
0
 /**
  * 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()));
 }