public function generate()
 {
     $title = $this->generateTitle();
     // Prepend or append 'Sprint'
     $title = mt_rand(0, 1) ? $title . ' Sprint' : 'Sprint ' . $title;
     $author = $this->loadPhabrictorUser();
     $authorPHID = $author->getPHID();
     $project = PhabricatorProject::initializeNewProject($author);
     $this->addTransaction(PhabricatorProjectTransaction::TYPE_NAME, $title);
     $this->addTransaction(PhabricatorProjectTransaction::TYPE_ICON, 'fa-briefcase');
     $this->addTransaction(PhabricatorProjectTransaction::TYPE_COLOR, 'blue');
     // $this->addTransaction(
     //   PhabricatorProjectTransaction::TYPE_MEMBERS,
     //   $this->loadMembersWithAuthor($authorPHID));
     $this->addTransaction(PhabricatorTransactions::TYPE_VIEW_POLICY, PhabricatorPolicies::POLICY_PUBLIC);
     $this->addTransaction(PhabricatorTransactions::TYPE_EDIT_POLICY, PhabricatorPolicies::POLICY_PUBLIC);
     $this->addTransaction(PhabricatorTransactions::TYPE_JOIN_POLICY, PhabricatorPolicies::POLICY_PUBLIC);
     // Pick a date to be the start date for the sprint
     // Random between 4 weeks ago and one week from now
     $start = mt_rand(time() - 28 * 24 * 60 * 60, time() + 7 * 24 * 60 * 60);
     $this->xactions[] = id(new ManiphestTransaction())->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD)->setMetadataValue('customfield:key', 'isdc:sprint:startdate')->setOldValue(null)->setNewValue($start);
     // Pick a date to be the end date for the sprint
     // Sprint is between 3 days and 3 weeks long
     $end = $start + mt_rand(3 * 24 * 60 * 60, 21 * 24 * 60 * 60);
     $this->xactions[] = id(new ManiphestTransaction())->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD)->setMetadataValue('customfield:key', 'isdc:sprint:enddate')->setOldValue(null)->setNewValue($end);
     $editor = id(new PhabricatorProjectTransactionEditor())->setActor($author)->setContentSource(PhabricatorContentSource::newConsoleSource())->setContinueOnNoEffect(true)->setContinueOnMissingFields(true)->applyTransactions($project, $this->xactions);
     $project->save();
     // Generate a bunch of tasks created the before the sprint starts
     for ($i = 0, $num = mt_rand(5, 40); $i <= $num; $i++) {
         echo ".";
         $this->generateTask($project, $start, $end);
     }
     return $project;
 }
 protected function newEditableObject()
 {
     $project = PhabricatorProject::initializeNewProject($this->getViewer());
     $milestone = $this->getMilestoneProject();
     if ($milestone) {
         $default_name = pht('Milestone %s', new PhutilNumber($milestone->loadNextMilestoneNumber()));
         $project->setName($default_name);
     }
     return $project;
 }
 public function testProjectPolicyMembership()
 {
     $author = $this->generateNewTestUser();
     $proj_a = PhabricatorProject::initializeNewProject($author)->setName('A')->save();
     $proj_b = PhabricatorProject::initializeNewProject($author)->setName('B')->save();
     $proj_a->setViewPolicy($proj_b->getPHID())->save();
     $proj_b->setViewPolicy($proj_a->getPHID())->save();
     $user = new PhabricatorUser();
     $results = id(new PhabricatorProjectQuery())->setViewer($user)->execute();
     $this->assertEqual(0, count($results));
 }
Пример #4
0
function addProject($project_name)
{
    $user = getAdmin();
    $project = PhabricatorProject::initializeNewProject($user);
    $xactions = array();
    # set name
    $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_NAME)->setNewValue($project_name);
    # set members
    $members = array();
    $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', PhabricatorProjectProjectHasMemberEdgeType::EDGECONST)->setNewValue(array('+' => array_fuse($members)));
    $editor = id(new PhabricatorProjectTransactionEditor())->setActor($user)->setContinueOnNoEffect(true)->setContentSourceFromConduitRequest(new ConduitAPIRequest(array()));
    $editor->applyTransactions($project, $xactions);
}
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $this->requireApplicationCapability(ProjectCreateProjectsCapability::CAPABILITY);
     $project = PhabricatorProject::initializeNewProject($user);
     $e_name = true;
     $type_name = PhabricatorProjectTransaction::TYPE_NAME;
     $v_name = $project->getName();
     $validation_exception = null;
     if ($request->isFormPost()) {
         $xactions = array();
         $v_name = $request->getStr('name');
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_name)->setNewValue($v_name);
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', PhabricatorEdgeConfig::TYPE_PROJ_MEMBER)->setNewValue(array('+' => array($user->getPHID() => $user->getPHID())));
         $editor = id(new PhabricatorProjectTransactionEditor())->setActor($user)->setContinueOnNoEffect(true)->setContentSourceFromRequest($request);
         try {
             $editor->applyTransactions($project, $xactions);
             if ($request->isAjax()) {
                 return id(new AphrontAjaxResponse())->setContent(array('phid' => $project->getPHID(), 'name' => $project->getName()));
             } else {
                 return id(new AphrontRedirectResponse())->setURI('/project/view/' . $project->getID() . '/');
             }
         } catch (PhabricatorApplicationTransactionValidationException $ex) {
             $validation_exception = $ex;
             $e_name = $ex->getShortMessage($type_name);
         }
     }
     if ($request->isAjax()) {
         $form = new PHUIFormLayoutView();
     } else {
         $form = new AphrontFormView();
         $form->setUser($user);
     }
     $form->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Name'))->setName('name')->setValue($v_name)->setError($e_name));
     if ($request->isAjax()) {
         $errors = array();
         if ($validation_exception) {
             $errors = mpull($ex->getErrors(), 'getMessage');
         }
         $dialog = id(new AphrontDialogView())->setUser($user)->setWidth(AphrontDialogView::WIDTH_FORM)->setTitle(pht('Create a New Project'))->setErrors($errors)->appendChild($form)->addSubmitButton(pht('Create Project'))->addCancelButton('/project/');
         return id(new AphrontDialogResponse())->setDialog($dialog);
     } else {
         $form->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Create'))->addCancelButton('/project/'));
         $crumbs = $this->buildApplicationCrumbs($this->buildSideNavView());
         $crumbs->addTextCrumb(pht('Create Project'), $this->getApplicationURI() . 'create/');
         $form_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Create New Project'))->setValidationException($validation_exception)->setForm($form);
         return $this->buildApplicationPage(array($crumbs, $form_box), array('title' => pht('Create New Project')));
     }
 }
 protected function execute(ConduitAPIRequest $request)
 {
     $user = $request->getUser();
     $this->requireApplicationCapability(ProjectCreateProjectsCapability::CAPABILITY, $user);
     $project = PhabricatorProject::initializeNewProject($user);
     $type_name = PhabricatorProjectTransaction::TYPE_NAME;
     $members = $request->getValue('members');
     $xactions = array();
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_name)->setNewValue($request->getValue('name'));
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', PhabricatorEdgeConfig::TYPE_PROJ_MEMBER)->setNewValue(array('+' => array_fuse($members)));
     $editor = id(new PhabricatorProjectTransactionEditor())->setActor($user)->setContinueOnNoEffect(true)->setContentSourceFromConduitRequest($request);
     $editor->applyTransactions($project, $xactions);
     return $this->buildProjectInfoDictionary($project);
 }
 public function generate()
 {
     $title = $this->generateTitle();
     $author = $this->loadPhabrictorUser();
     $author_phid = $author->getPHID();
     $project = PhabricatorProject::initializeNewProject($author)->setName($title);
     $this->addTransaction(PhabricatorProjectTransaction::TYPE_NAME, $title);
     $project->attachMemberPHIDs($this->loadMembersWithAuthor($author_phid));
     $this->addTransaction(PhabricatorProjectTransaction::TYPE_STATUS, $this->generateProjectStatus());
     $this->addTransaction(PhabricatorTransactions::TYPE_VIEW_POLICY, PhabricatorPolicies::POLICY_PUBLIC);
     $this->addTransaction(PhabricatorTransactions::TYPE_EDIT_POLICY, PhabricatorPolicies::POLICY_PUBLIC);
     $this->addTransaction(PhabricatorTransactions::TYPE_JOIN_POLICY, PhabricatorPolicies::POLICY_PUBLIC);
     $editor = id(new PhabricatorProjectTransactionEditor())->setActor($author)->setContentSource(PhabricatorContentSource::newConsoleSource())->setContinueOnNoEffect(true)->applyTransactions($project, $this->xactions);
     return $project->save();
 }
 protected function execute(ConduitAPIRequest $request)
 {
     $user = $request->getUser();
     $this->requireApplicationCapability(ProjectCreateProjectsCapability::CAPABILITY, $user);
     $project = PhabricatorProject::initializeNewProject($user);
     $type_name = PhabricatorProjectTransaction::TYPE_NAME;
     $members = $request->getValue('members');
     $xactions = array();
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_name)->setNewValue($request->getValue('name'));
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', PhabricatorProjectProjectHasMemberEdgeType::EDGECONST)->setNewValue(array('+' => array_fuse($members)));
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_ICON)->setNewValue('fa-calendar');
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_COLOR)->setNewValue('green');
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD)->setMetadataValue('customfield:key', 'isdc:sprint:issprint')->setOldValue(null)->setNewValue(1);
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD)->setMetadataValue('customfield:key', 'isdc:sprint:startdate')->setOldValue(null)->setNewValue(strtotime($request->getValue('startdate')));
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD)->setMetadataValue('customfield:key', 'isdc:sprint:enddate')->setOldValue(0)->setNewValue(strtotime($request->getValue('enddate')));
     $editor = id(new PhabricatorProjectTransactionEditor())->setActor($user)->setContinueOnNoEffect(true)->setContentSourceFromConduitRequest($request);
     $editor->applyTransactions($project, $xactions);
     return $this->buildProjectInfoDictionary($project);
 }
 public function generateObject()
 {
     $author = $this->loadRandomUser();
     $project = PhabricatorProject::initializeNewProject($author);
     $xactions = array();
     $xactions[] = $this->newTransaction(PhabricatorProjectTransaction::TYPE_NAME, $this->newProjectTitle());
     $xactions[] = $this->newTransaction(PhabricatorProjectTransaction::TYPE_STATUS, $this->newProjectStatus());
     // Almost always make the author a member.
     $members = array();
     if ($this->roll(1, 20) > 2) {
         $members[] = $author->getPHID();
     }
     // Add a few other members.
     $size = $this->roll(2, 6, -2);
     for ($ii = 0; $ii < $size; $ii++) {
         $members[] = $this->loadRandomUser()->getPHID();
     }
     $xactions[] = $this->newTransaction(PhabricatorTransactions::TYPE_EDGE, array('+' => array_fuse($members)), array('edge:type' => PhabricatorProjectProjectHasMemberEdgeType::EDGECONST));
     $editor = id(new PhabricatorProjectTransactionEditor())->setActor($author)->setContentSource($this->getLipsumContentSource())->setContinueOnNoEffect(true)->applyTransactions($project, $xactions);
     return $project;
 }
 private function createProject(PhabricatorUser $user, PhabricatorProject $parent = null, $is_milestone = false)
 {
     $project = PhabricatorProject::initializeNewProject($user);
     $name = pht('Test Project %d', mt_rand());
     $xactions = array();
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_NAME)->setNewValue($name);
     if ($parent) {
         if ($is_milestone) {
             $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_MILESTONE)->setNewValue($parent->getPHID());
         } else {
             $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_PARENT)->setNewValue($parent->getPHID());
         }
     }
     $this->applyTransactions($project, $user, $xactions);
     return $project;
 }
 private function createProject(PhabricatorUser $user, PhabricatorProject $parent = null, $is_milestone = false)
 {
     $project = PhabricatorProject::initializeNewProject($user);
     $name = pht('Test Project %d', mt_rand());
     $xactions = array();
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_NAME)->setNewValue($name);
     if ($parent) {
         if ($is_milestone) {
             $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_MILESTONE)->setNewValue($parent->getPHID());
         } else {
             $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_PARENT)->setNewValue($parent->getPHID());
         }
     }
     $this->applyTransactions($project, $user, $xactions);
     // Force these values immediately; they are normally updated by the
     // index engine.
     if ($parent) {
         if ($is_milestone) {
             $parent->setHasMilestones(1)->save();
         } else {
             $parent->setHasSubprojects(1)->save();
         }
     }
     return $project;
 }
 private function createProject(PhabricatorUser $user)
 {
     $project = PhabricatorProject::initializeNewProject($user);
     $project->setName(pht('Test Project %d', mt_rand()));
     $project->save();
     return $project;
 }
 private function createProject(PhabricatorUser $viewer)
 {
     $project = PhabricatorProject::initializeNewProject($viewer);
     $project->setName('Test Project ' . mt_rand());
     return $project;
 }
 protected function newEditableObject()
 {
     return PhabricatorProject::initializeNewProject($this->getViewer());
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     if ($this->id) {
         $id = $request->getURIData('id');
         $is_new = false;
         $project = id(new PhabricatorProjectQuery())->setViewer($viewer)->withIDs(array($this->id))->needSlugs(true)->needImages(true)->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne();
         if (!$project) {
             return new Aphront404Response();
         }
     } else {
         $is_new = true;
         $this->requireApplicationCapability(ProjectCreateProjectsCapability::CAPABILITY);
         $project = PhabricatorProject::initializeNewProject($viewer);
     }
     $field_list = PhabricatorCustomField::getObjectFields($project, PhabricatorCustomField::ROLE_EDIT);
     $field_list->setViewer($viewer)->readFieldsFromStorage($project);
     $e_name = true;
     $e_slugs = false;
     $e_edit = null;
     $v_name = $project->getName();
     $project_slugs = $project->getSlugs();
     $project_slugs = mpull($project_slugs, 'getSlug', 'getSlug');
     $v_primary_slug = $project->getPrimarySlug();
     unset($project_slugs[$v_primary_slug]);
     $v_slugs = $project_slugs;
     $v_color = $project->getColor();
     $v_icon = $project->getIcon();
     $v_locked = $project->getIsMembershipLocked();
     $validation_exception = null;
     if ($request->isFormPost()) {
         $e_name = null;
         $e_slugs = null;
         $v_name = $request->getStr('name');
         $v_slugs = $request->getStrList('slugs');
         $v_view = $request->getStr('can_view');
         $v_edit = $request->getStr('can_edit');
         $v_join = $request->getStr('can_join');
         $v_color = $request->getStr('color');
         $v_icon = $request->getStr('icon');
         $v_locked = $request->getInt('is_membership_locked', 0);
         $type_name = PhabricatorProjectTransaction::TYPE_NAME;
         $type_slugs = PhabricatorProjectTransaction::TYPE_SLUGS;
         $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY;
         $type_icon = PhabricatorProjectTransaction::TYPE_ICON;
         $type_color = PhabricatorProjectTransaction::TYPE_COLOR;
         $type_locked = PhabricatorProjectTransaction::TYPE_LOCKED;
         $xactions = array();
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_name)->setNewValue($v_name);
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_slugs)->setNewValue($v_slugs);
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)->setNewValue($v_view);
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_edit)->setNewValue($v_edit);
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_JOIN_POLICY)->setNewValue($v_join);
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_icon)->setNewValue($v_icon);
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_color)->setNewValue($v_color);
         $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType($type_locked)->setNewValue($v_locked);
         $xactions = array_merge($xactions, $field_list->buildFieldTransactionsFromRequest(new PhabricatorProjectTransaction(), $request));
         $editor = id(new PhabricatorProjectTransactionEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true);
         if ($is_new) {
             $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', PhabricatorProjectProjectHasMemberEdgeType::EDGECONST)->setNewValue(array('+' => array($viewer->getPHID() => $viewer->getPHID())));
         }
         try {
             $editor->applyTransactions($project, $xactions);
             if ($request->isAjax()) {
                 return id(new AphrontAjaxResponse())->setContent(array('phid' => $project->getPHID(), 'name' => $project->getName()));
             }
             $redirect_uri = $this->getApplicationURI('profile/' . $project->getID() . '/');
             return id(new AphrontRedirectResponse())->setURI($redirect_uri);
         } catch (PhabricatorApplicationTransactionValidationException $ex) {
             $validation_exception = $ex;
             $e_name = $ex->getShortMessage($type_name);
             $e_slugs = $ex->getShortMessage($type_slugs);
             $e_edit = $ex->getShortMessage($type_edit);
             $project->setViewPolicy($v_view);
             $project->setEditPolicy($v_edit);
             $project->setJoinPolicy($v_join);
         }
     }
     if ($is_new) {
         $header_name = pht('Create a New Project');
         $title = pht('Create Project');
     } else {
         $header_name = pht('Edit Project');
         $title = pht('Edit Project');
     }
     $policies = id(new PhabricatorPolicyQuery())->setViewer($viewer)->setObject($project)->execute();
     $v_slugs = implode(', ', $v_slugs);
     $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Name'))->setName('name')->setValue($v_name)->setError($e_name));
     $field_list->appendFieldsToForm($form);
     $shades = PhabricatorProjectIcon::getColorMap();
     if ($is_new) {
         $icon_uri = $this->getApplicationURI('icon/');
     } else {
         $icon_uri = $this->getApplicationURI('icon/' . $project->getID() . '/');
     }
     $icon_display = PhabricatorProjectIcon::renderIconForChooser($v_icon);
     list($can_lock, $lock_message) = $this->explainApplicationCapability(ProjectCanLockProjectsCapability::CAPABILITY, pht('You can update the Lock Project setting.'), pht('You can not update the Lock Project setting.'));
     $form->appendChild(id(new AphrontFormChooseButtonControl())->setLabel(pht('Icon'))->setName('icon')->setDisplayValue($icon_display)->setButtonText(pht('Choose Icon...'))->setChooseURI($icon_uri)->setValue($v_icon))->appendChild(id(new AphrontFormSelectControl())->setLabel(pht('Color'))->setName('color')->setValue($v_color)->setOptions($shades));
     if (!$is_new) {
         $form->appendChild(id(new AphrontFormStaticControl())->setLabel(pht('Primary Hashtag'))->setCaption(pht('The primary hashtag is derived from the name.'))->setValue($v_primary_slug));
     }
     $form->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Additional Hashtags'))->setCaption(pht('Specify a comma-separated list of additional hashtags.'))->setName('slugs')->setValue($v_slugs)->setError($e_slugs))->appendChild(id(new AphrontFormPolicyControl())->setUser($viewer)->setName('can_view')->setPolicyObject($project)->setPolicies($policies)->setCapability(PhabricatorPolicyCapability::CAN_VIEW))->appendChild(id(new AphrontFormPolicyControl())->setUser($viewer)->setName('can_edit')->setPolicyObject($project)->setPolicies($policies)->setCapability(PhabricatorPolicyCapability::CAN_EDIT)->setError($e_edit))->appendChild(id(new AphrontFormPolicyControl())->setUser($viewer)->setName('can_join')->setCaption(pht('Users who can edit a project can always join a project.'))->setPolicyObject($project)->setPolicies($policies)->setCapability(PhabricatorPolicyCapability::CAN_JOIN))->appendChild(id(new AphrontFormCheckboxControl())->setLabel(pht('Lock Project'))->setDisabled(!$can_lock)->addCheckbox('is_membership_locked', 1, pht('Prevent members from leaving this project.'), $v_locked)->setCaption($lock_message));
     if ($request->isAjax()) {
         $errors = array();
         if ($validation_exception) {
             $errors = mpull($ex->getErrors(), 'getMessage');
         }
         $dialog = id(new AphrontDialogView())->setUser($viewer)->setWidth(AphrontDialogView::WIDTH_FULL)->setTitle($header_name)->setErrors($errors)->appendForm($form)->addSubmitButton($title)->addCancelButton('/project/');
         return id(new AphrontDialogResponse())->setDialog($dialog);
     }
     $form->appendChild(id(new AphrontFormSubmitControl())->addCancelButton($this->getApplicationURI())->setValue(pht('Save')));
     $form_box = id(new PHUIObjectBoxView())->setHeaderText($title)->setValidationException($validation_exception)->setForm($form);
     if (!$is_new) {
         $nav = $this->buildIconNavView($project);
         $nav->selectFilter("details/{$id}/");
         $nav->appendChild($form_box);
     } else {
         $nav = array($form_box);
     }
     return $this->buildApplicationPage($nav, array('title' => $title));
 }