public function createArtifact()
 {
     $planning_id = $this->request->get('planning_id');
     $planning = $this->planning_factory->getPlanning($planning_id);
     $tracker_id = $planning->getPlanningTrackerId();
     $GLOBALS['Response']->redirect(TRACKER_BASE_URL . "/?tracker={$tracker_id}&func=new-artifact&planning[{$planning_id}]=-1");
 }
 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;
                 }
             }
         }
     }
 }
 private function getFirstChildBacklogTracker(Planning_Milestone $milestone)
 {
     $backlog_tracker_children = $milestone->getPlanning()->getPlanningTracker()->getChildren();
     if ($backlog_tracker_children) {
         $first_child_tracker = current($backlog_tracker_children);
         $first_child_planning = $this->planning_factory->getPlanningByPlanningTracker($first_child_tracker);
         if ($first_child_planning) {
             return $first_child_planning->getBacklogTrackers();
         }
     }
     return null;
 }
Пример #4
0
 /**
  * @param Tracker $tracker
  * @return \Tracker
  */
 private function getSwimlineTracker(Tracker $tracker)
 {
     //TODO This file should be in agile dashboard and the generic part of the cardwall in plugin/tracker
     @(include_once dirname(__FILE__) . '/../../../agiledashboard/include/Planning/PlanningFactory.class.php');
     if (class_exists('PlanningFactory')) {
         $planning_factory = new PlanningFactory(new PlanningDao(), $this->tracker_factory);
         if ($planning = $planning_factory->getPlanningByPlanningTracker($tracker)) {
             return $planning->getBacklogTracker();
         }
     }
     return $tracker;
 }
 public function createKanban()
 {
     $kanban_name = $this->request->get('kanban-name');
     $tracker_id = $this->request->get('tracker-kanban');
     $tracker = $this->tracker_factory->getTrackerById($tracker_id);
     $user = $this->request->getCurrentUser();
     $hierarchy = new Tracker_Hierarchy();
     if (!$user->isAdmin($this->group_id)) {
         $GLOBALS['Response']->addFeedback(Feedback::ERROR, $GLOBALS['Language']->getText('global', 'perm_denied'));
         return;
     }
     if ($this->kanban_manager->doesKanbanExistForTracker($tracker)) {
         $GLOBALS['Response']->addFeedback(Feedback::ERROR, $GLOBALS['Language']->getText('plugin_agiledashboard', 'kanban_tracker_used'));
         $this->redirectToHome();
         return;
     }
     try {
         $hierarchy->getLevel($tracker_id);
         $is_in_hierarchy = true;
     } catch (Tracker_Hierarchy_NotInHierarchyException $exeption) {
         $is_in_hierarchy = false;
     }
     if ((count($this->planning_factory->getPlanningsByBacklogTracker($tracker)) > 0 || count($this->planning_factory->getPlanningByPlanningTracker($tracker)) > 0) && !$is_in_hierarchy) {
         $GLOBALS['Response']->addFeedback(Feedback::ERROR, $GLOBALS['Language']->getText('plugin_agiledashboard', 'tracker_used_in_scrum'));
         $this->redirectToHome();
         return;
     }
     if ($this->kanban_manager->createKanban($kanban_name, $tracker_id)) {
         $GLOBALS['Response']->addFeedback(Feedback::INFO, $GLOBALS['Language']->getText('plugin_agiledashboard', 'kanban_created', array($kanban_name)));
     } else {
         $GLOBALS['Response']->addFeedback(Feedback::ERROR, $GLOBALS['Language']->getText('plugin_agiledashboard', 'kanban_creation_error', array($kanban_name)));
     }
     $this->redirectToHome();
 }
 private function hasUserPriorityChangePermission(PFUser $user, Project $project)
 {
     $root_planning = $this->planning_factory->getRootPlanning($user, $project->getId());
     if ($root_planning) {
         return $this->planning_permissions_manager->userHasPermissionOnPlanning($root_planning->getId(), $root_planning->getGroupId(), $user, PlanningPermissionsManager::PERM_PRIORITY_CHANGE);
     }
     return false;
 }
 private function getPlanning($planning_id)
 {
     $planning = $this->planning_factory->getPlanning($planning_id);
     if ($planning) {
         return $planning;
     }
     throw new CardControllerBuilderRequestPlanningIdException();
 }
 private function canUserPrioritizeBacklog(PFUser $user, $group_id)
 {
     $planning_permissions_manager = new PlanningPermissionsManager();
     $root_planning = PlanningFactory::build()->getRootPlanning($user, $group_id);
     if ($root_planning) {
         return $planning_permissions_manager->userHasPermissionOnPlanning($root_planning->getId(), $root_planning->getGroupId(), $user, PlanningPermissionsManager::PERM_PRIORITY_CHANGE);
     }
     return false;
 }
Пример #9
0
 /**
  * Get the top most recent milestone (last created artifact in planning tracker)
  *
  * @param User    $user
  * @param Integer $planning_id
  *
  * @return Planning_Milestone
  */
 public function getCurrentMilestone(User $user, $planning_id)
 {
     $planning = $this->planning_factory->getPlanningWithTrackers($planning_id);
     $artifacts = $this->artifact_factory->getOpenArtifactsByTrackerIdUserCanView($user, $planning->getPlanningTrackerId());
     if (count($artifacts) > 0) {
         return $this->getMilestoneFromArtifact(array_shift($artifacts));
     }
     return new Planning_NoMilestone($planning->getPlanningTracker()->getProject(), $planning);
 }
Пример #10
0
 /**
  * Builds a new cross-tracker search view builder.
  * 
  * TODO:
  *   - move to controller (this has nothing to do with routing)
  * 
  * @param Codendi_Request $request
  * 
  * @return Tracker_CrossSearch_ViewBuilder
  */
 protected function getViewBuilder(Codendi_Request $request)
 {
     $form_element_factory = Tracker_FormElementFactory::instance();
     $group_id = $request->get('group_id');
     $user = $request->getCurrentUser();
     $object_god = new TrackerManager();
     $planning_trackers = $this->planning_factory->getPlanningTrackers($group_id, $user);
     $art_link_field_ids = $form_element_factory->getArtifactLinkFieldsOfTrackers($planning_trackers);
     return new Planning_ViewBuilder($form_element_factory, $object_god->getCrossSearch($art_link_field_ids), $object_god->getCriteriaBuilder($user, $planning_trackers));
 }
 /** @return Tracker[] */
 private function keepsTrackersUntilThereIsNoPlanning(array $list_of_trackers)
 {
     $trackers = array();
     foreach ($list_of_trackers as $tracker) {
         if (!$this->planning_factory->getPlanningByPlanningTracker($tracker)) {
             break;
         }
         $trackers[] = $tracker;
     }
     return $trackers;
 }
 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));
         }
     }
 }
Пример #13
0
 public function tracker_event_redirect_after_artifact_creation_or_update($params)
 {
     $this->updateBacklogs($params);
     $requested_planning = $this->extractPlanningAndArtifactFromRequest($params['request']);
     if ($requested_planning) {
         $planning = PlanningFactory::build()->getPlanning($requested_planning['planning_id']);
         if ($planning && $this->requestCanLeaveTheTracker($params['request'])) {
             $this->redirectToPlanning($params, $requested_planning, $planning);
         }
     }
 }
Пример #14
0
 public function __construct(Cardwall_PaneInfo $info, Planning_Milestone $milestone, Cardwall_OnTop_Config $config, PFUser $user, Planning_MilestoneFactory $milestone_factory)
 {
     $this->info = $info;
     $this->milestone = $milestone;
     $this->config = $config;
     $this->user = $user;
     $this->milestone_factory = $milestone_factory;
     $this->artifact_factory = Tracker_ArtifactFactory::instance();
     $this->tracker_form_element_factory = Tracker_FormElementFactory::instance();
     $this->user_manager = UserManager::instance();
     $this->planning_factory = PlanningFactory::build();
 }
 /**
  * Get a list of planning short access defined in a group_id
  *
  * @param PFUser $user     The user who will see the planning
  * @param int  $group_id
  *
  * @return array of Planning_ShortAccess
  */
 public function getPlanningsShortAccess(PFUser $user, $group_id, Planning_MilestoneFactory $milestone_factory, $theme_path)
 {
     $plannings = $this->planning_factory->getPlannings($user, $group_id);
     $short_access = array();
     foreach ($plannings as $planning) {
         if (!$this->thereIsAtLeastOneBacklogTrackerNotDeleted($planning)) {
             $backlog_tracker_names = array();
             foreach ($planning->getBacklogTrackers() as $tracker) {
                 $backlog_tracker_names[] = $tracker->getName();
             }
             throw new Planning_InvalidConfigurationException($GLOBALS['Language']->getText('plugin_agiledashboard', 'planning_invalidconf_deletedtracker', array($planning->getPlanTitle(), implode(',', $backlog_tracker_names))));
         } elseif ($planning->getPlanningTracker()->isDeleted()) {
             throw new Planning_InvalidConfigurationException($GLOBALS['Language']->getText('plugin_agiledashboard', 'planning_invalidconf_deletedtracker', array($planning->getPlanTitle(), $planning->getPlanningTracker()->getName())));
         } else {
             $short_access[] = $this->getShortAccessForPlanning($planning, $user, $milestone_factory, $theme_path, 0);
         }
     }
     if (!empty($short_access)) {
         end($short_access)->setIsLatest();
     }
     return $short_access;
 }
Пример #16
0
 public function activatePlugins()
 {
     $this->activatePlugin('tracker');
     $this->activatePlugin('agiledashboard');
     $this->activatePlugin('cardwall');
     PluginManager::instance()->invalidateCache();
     PluginManager::instance()->loadPlugins();
     $this->tracker_artifact_factory = Tracker_ArtifactFactory::instance();
     $this->tracker_formelement_factory = Tracker_FormElementFactory::instance();
     $this->tracker_factory = TrackerFactory::instance();
     $this->hierarchy_checker = new AgileDashboard_HierarchyChecker(PlanningFactory::build(), new AgileDashboard_KanbanFactory($this->tracker_factory, new AgileDashboard_KanbanDao()), $this->tracker_factory);
     return $this;
 }
 private function filterOutAssignedBacklogItems(AgileDashboard_Milestone_Backlog_IBacklogItemCollection $collection, PFUser $user)
 {
     $artifact_ids = $this->getBacklogItemsArtifactIds($collection);
     if (!$artifact_ids) {
         return $collection;
     }
     $collection->rewind();
     $artifact = $collection->current()->getArtifact();
     $project_id = $artifact->getTracker()->getProject()->getID();
     $plannings = $this->planning_factory->getPlannings($user, $project_id);
     $planning_milestone_tracker_ids = $this->getPlanningMilestoneTrackerIds($plannings);
     if (!$planning_milestone_tracker_ids) {
         return $collection;
     }
     $linked_item_artifacts_ids = $this->artifact_factory->getArtifactIdsLinkedToTrackers($artifact_ids, $planning_milestone_tracker_ids);
     return $this->removeLinkedItemsFromCollection($collection, $linked_item_artifacts_ids);
 }
Пример #18
0
 private function getBacklogStrategyFactory()
 {
     return new AgileDashboard_Milestone_Backlog_BacklogStrategyFactory(new AgileDashboard_BacklogItemDao(), $this->getArtifactFactory(), PlanningFactory::build());
 }
 /**
  * Builds a new PlanningFactory instance.
  *
  * @return PlanningFactory
  */
 private function getPlanningFactory()
 {
     return PlanningFactory::build();
 }
Пример #20
0
 private function areThereConfiguredPlannings()
 {
     return count($this->planning_factory->getPlanningTrackerIdsByGroupId($this->project->getId())) > 0;
 }
 private function canUserPrioritizeBacklog(Planning_ArtifactMilestone $milestone, PFUser $user)
 {
     $artifact_factory = Tracker_ArtifactFactory::instance();
     $milestone_factory = new Planning_MilestoneFactory(PlanningFactory::build(), $artifact_factory, Tracker_FormElementFactory::instance(), TrackerFactory::instance(), new AgileDashboard_Milestone_MilestoneStatusCounter($this->dao, new Tracker_ArtifactDao(), $artifact_factory), new PlanningPermissionsManager(), new AgileDashboard_Milestone_MilestoneDao());
     return $milestone_factory->userCanChangePrioritiesInMilestone($milestone, $user);
 }
Пример #22
0
 private function redirectToAgileDashboard(Tracker_Artifact_Redirect $redirect, array $redirect_params)
 {
     list($planning_id, $artifact_id) = each($redirect_params);
     require_once AGILEDASHBOARD_BASE_DIR . '/Planning/PlanningFactory.class.php';
     $planning = PlanningFactory::build()->getPlanning($planning_id);
     if ($planning) {
         $redirect->base_url = AGILEDASHBOARD_BASE_URL;
         $redirect->query_parameters = array('group_id' => $planning->getGroupId(), 'planning_id' => $planning->getId(), 'action' => 'show', 'aid' => $artifact_id, 'pane' => 'cardwall');
     }
 }
Пример #23
0
 private function redirectToAgileDashboard(array $redirect_params)
 {
     list($planning_id, $artifact_id) = each($redirect_params);
     require_once AGILEDASHBOARD_BASE_DIR . '/Planning/PlanningFactory.class.php';
     $planning = PlanningFactory::build()->getPlanning($planning_id);
     if ($planning) {
         $GLOBALS['Response']->redirect(AGILEDASHBOARD_BASE_URL . '/?' . http_build_query(array('group_id' => $planning->getGroupId(), 'planning_id' => $planning->getId(), 'action' => 'show', 'aid' => $artifact_id, 'pane' => 'cardwall')));
     }
 }
Пример #24
0
 private function getScrumTrackerIds(Project $project)
 {
     $planning_tracker_ids = $this->planning_factory->getPlanningTrackerIdsByGroupId($project->getID());
     $backlog_tracker_ids = $this->planning_factory->getBacklogTrackerIdsByGroupId($project->getID());
     return array_unique(array_merge($planning_tracker_ids, $backlog_tracker_ids));
 }
Пример #25
0
 /**
  * Return the 'Planning' tracker (tracker we should be able to use artifacts to perform search.
  * 
  * This method hard code dependency with agile dashboard and planning stuff.
  * It should be renamed later on when planning definition is clearly defined.
  * 
  * @param Integer $group_id
  * 
  * @return Array of Integer
  */
 private function getPlanningTrackers($group_id, PFUser $user)
 {
     $trackers = array();
     @(include_once dirname(__FILE__) . '/../../../agiledashboard/include/Planning/PlanningFactory.class.php');
     if (class_exists('PlanningFactory')) {
         $planning_factory = new PlanningFactory(new PlanningDao(), $this->getTrackerFactory(), Tracker_FormElementFactory::instance());
         $trackers = $planning_factory->getPlanningTrackers($group_id, $user);
     }
     return $trackers;
 }
Пример #26
0
 private function getPlanning()
 {
     $planning_id = $this->request->get('planning_id');
     return $this->planning_factory->getPlanning($planning_id);
 }
Пример #27
0
 /**
  * Checks the tracker planning id in $planning_parameters is not already used as a planning tracker in one of the
  * plannings of the project with given $group_id.
  * 
  * @param int                $group_id            The project where to search for existing planning trackers
  * @param PlanningParameters $planning_parameters The parameters being validated
  * 
  * @return boolean
  */
 private function trackerIsNotAlreadyUsedAsAPlanningTrackerInProject($group_id, PlanningParameters $planning_parameters)
 {
     $planning_tracker_id = $planning_parameters->planning_tracker_id;
     $project_planning_tracker_ids = $this->factory->getPlanningTrackerIdsByGroupId($group_id);
     return !in_array($planning_tracker_id, $project_planning_tracker_ids);
 }
 private function isTrackerUsedInScrum(Tracker $tracker)
 {
     return count($this->planning_factory->getPlanningsByBacklogTracker($tracker)) > 0 || count($this->planning_factory->getPlanningByPlanningTracker($tracker)) > 0;
 }
Пример #29
0
 public function process(Codendi_Request $request)
 {
     switch ($request->get('action')) {
         case 'toggle_user_autostack_column':
             $display_preferences_controller = new Cardwall_UserPreferences_UserPreferencesController($request);
             $display_preferences_controller->toggleAutostack();
             break;
         case 'toggle_user_display_avatar':
             $display_preferences_controller = new Cardwall_UserPreferences_UserPreferencesController($request);
             $display_preferences_controller->toggleUserDisplay();
             break;
         case 'get-card':
             try {
                 $single_card_builder = new Cardwall_SingleCardBuilder($this->getConfigFactory(), new Cardwall_CardFields(UserManager::instance(), Tracker_FormElementFactory::instance()), Tracker_ArtifactFactory::instance(), PlanningFactory::build());
                 $controller = new Cardwall_CardController($request, $single_card_builder->getSingleCard($request->getCurrentUser(), $request->getValidated('id', 'uint', 0), $request->getValidated('planning_id', 'uint', 0)));
                 $controller->getCard();
             } catch (Exception $exception) {
                 $GLOBALS['Response']->addFeedback(Feedback::ERROR, $exception->getMessage());
                 $GLOBALS['Response']->sendStatusCode(400);
             }
             break;
         default:
             echo 'Hello !';
     }
 }