public function linkToMilestoneParent(Planning_Milestone $milestone, PFUser $user, Tracker_Artifact $artifact_added)
 {
     $this->milestone_factory->addMilestoneAncestors($user, $milestone);
     $parent_milestone = $milestone->getParent();
     if (!$parent_milestone) {
         return;
     }
     $parent_milestone_artifact = $parent_milestone->getArtifact();
     if (!$this->parentMilestoneHasItemTrackerInItsBacklogTracker($parent_milestone, $artifact_added)) {
         return;
     }
     if (!$this->isParentLinkedToParentMilestone($artifact_added, $parent_milestone_artifact, $user)) {
         $parent_milestone_artifact->linkArtifact($artifact_added->getId(), $user);
         $this->linkToMilestoneParent($parent_milestone, $user, $artifact_added);
     }
 }
 /**
  * @return Planning_Presenter_MilestoneSummaryPresenter[]
  */
 private function getMilestoneSummaryPresenters(Planning $last_planning, PFUser $user)
 {
     $presenters = array();
     $has_cardwall = $this->hasCardwall($last_planning);
     $last_planning_current_milestones = $this->getPlanningMilestonesDependingOnTimePeriodOrStatus($last_planning);
     if (empty($last_planning_current_milestones)) {
         return $presenters;
     }
     foreach ($last_planning_current_milestones as $milestone) {
         $this->milestone_factory->addMilestoneAncestors($user, $milestone);
         $milestone = $this->milestone_factory->updateMilestoneContextualInfo($user, $milestone);
         if ($milestone->hasUsableBurndownField()) {
             $burndown_data = $milestone->getBurndownData($user);
             $presenters[] = new Planning_Presenter_MilestoneBurndownSummaryPresenter($milestone, $this->plugin_path, $has_cardwall, $burndown_data);
         } else {
             $presenters[] = new Planning_Presenter_MilestoneSummaryPresenter($milestone, $this->plugin_path, $has_cardwall, $this->milestone_factory->getMilestoneStatusCount($user, $milestone));
         }
     }
     return $presenters;
 }