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)); }
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)); }