public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $nav = $this->buildSideNav('resource');
     $pager = new AphrontPagerView();
     $pager->setURI(new PhutilURI('/drydock/resource/'), 'page');
     $data = id(new DrydockResource())->loadAllWhere('1 = 1 ORDER BY id DESC LIMIT %d, %d', $pager->getOffset(), $pager->getPageSize() + 1);
     $data = $pager->sliceResults($data);
     $phids = mpull($data, 'getOwnerPHID');
     $handles = $this->loadViewerHandles($phids);
     $rows = array();
     foreach ($data as $resource) {
         $rows[] = array($resource->getID(), $resource->getOwnerPHID() ? $handles[$resource->getOwnerPHID()]->renderLink() : null, phutil_escape_html($resource->getType()), DrydockResourceStatus::getNameForStatus($resource->getStatus()), phutil_escape_html(nonempty($resource->getName(), 'Unnamed')), phabricator_datetime($resource->getDateCreated(), $user));
     }
     $table = new AphrontTableView($rows);
     $table->setHeaders(array('ID', 'Owner', 'Type', 'Status', 'Resource', 'Created'));
     $table->setColumnClasses(array('', '', '', '', 'pri wide', 'right'));
     $panel = new AphrontPanelView();
     $panel->setHeader('Drydock Resources');
     $panel->addButton(phutil_render_tag('a', array('href' => '/drydock/resource/allocate/', 'class' => 'green button'), 'Allocate Resource'));
     $panel->appendChild($table);
     $panel->appendChild($pager);
     $nav->appendChild($panel);
     return $this->buildStandardPageResponse($nav, array('title' => 'Resources'));
 }
 public function render()
 {
     $resources = $this->resources;
     $viewer = $this->getUser();
     $view = new PHUIObjectItemListView();
     foreach ($resources as $resource) {
         $name = pht('Resource %d', $resource->getID()) . ': ' . $resource->getName();
         $item = id(new PHUIObjectItemView())->setHref('/drydock/resource/' . $resource->getID() . '/')->setHeader($name);
         $status = DrydockResourceStatus::getNameForStatus($resource->getStatus());
         $item->addAttribute($status);
         switch ($resource->getStatus()) {
             case DrydockResourceStatus::STATUS_PENDING:
                 $item->setBarColor('yellow');
                 break;
             case DrydockResourceStatus::STATUS_OPEN:
                 $item->setBarColor('green');
                 break;
             case DrydockResourceStatus::STATUS_DESTROYED:
                 $item->setBarColor('black');
                 break;
             default:
                 $item->setBarColor('red');
                 break;
         }
         $view->addItem($item);
     }
     return $view;
 }
 private function buildPropertyListView(DrydockResource $resource, PhabricatorActionListView $actions)
 {
     $viewer = $this->getViewer();
     $view = id(new PHUIPropertyListView())->setActionList($actions);
     $status = $resource->getStatus();
     $status = DrydockResourceStatus::getNameForStatus($status);
     $view->addProperty(pht('Status'), $status);
     $until = $resource->getUntil();
     if ($until) {
         $until_display = phabricator_datetime($until, $viewer);
     } else {
         $until_display = phutil_tag('em', array(), pht('Never'));
     }
     $view->addProperty(pht('Expires'), $until_display);
     $view->addProperty(pht('Resource Type'), $resource->getType());
     $view->addProperty(pht('Blueprint'), $viewer->renderHandle($resource->getBlueprintPHID()));
     $attributes = $resource->getAttributes();
     if ($attributes) {
         $view->addSectionHeader(pht('Attributes'), 'fa-list-ul');
         foreach ($attributes as $key => $value) {
             $view->addProperty($key, $value);
         }
     }
     return $view;
 }
 public function render()
 {
     $resources = $this->resources;
     $viewer = $this->getUser();
     $view = new PHUIObjectItemListView();
     foreach ($resources as $resource) {
         $id = $resource->getID();
         $item = id(new PHUIObjectItemView())->setHref("/drydock/resource/{$id}/")->setObjectName(pht('Resource %d', $id))->setHeader($resource->getResourceName());
         $status = DrydockResourceStatus::getNameForStatus($resource->getStatus());
         $item->addAttribute($status);
         switch ($resource->getStatus()) {
             case DrydockResourceStatus::STATUS_PENDING:
                 $item->setStatusIcon('fa-dot-circle-o yellow');
                 break;
             case DrydockResourceStatus::STATUS_ACTIVE:
                 $item->setStatusIcon('fa-dot-circle-o green');
                 break;
             case DrydockResourceStatus::STATUS_DESTROYED:
                 $item->setStatusIcon('fa-times-circle-o black');
                 break;
             default:
                 $item->setStatusIcon('fa-dot-circle-o red');
                 break;
         }
         $view->addItem($item);
     }
     return $view;
 }
 public function buildSearchForm(AphrontFormView $form, PhabricatorSavedQuery $saved)
 {
     $statuses = $saved->getParameter('statuses', array());
     $status_control = id(new AphrontFormCheckboxControl())->setLabel(pht('Status'));
     foreach (DrydockResourceStatus::getAllStatuses() as $status) {
         $status_control->addCheckbox('statuses[]', $status, DrydockResourceStatus::getNameForStatus($status), in_array($status, $statuses));
     }
     $form->appendChild($status_control);
 }
 private function buildPropertyListView(DrydockResource $resource, PhabricatorActionListView $actions)
 {
     $viewer = $this->getViewer();
     $view = id(new PHUIPropertyListView())->setActionList($actions);
     $status = $resource->getStatus();
     $status = DrydockResourceStatus::getNameForStatus($status);
     $view->addProperty(pht('Status'), $status);
     $view->addProperty(pht('Resource Type'), $resource->getType());
     $view->addProperty(pht('Blueprint'), $viewer->renderHandle($resource->getBlueprintPHID()));
     $attributes = $resource->getAttributes();
     if ($attributes) {
         $view->addSectionHeader(pht('Attributes'), 'fa-list-ul');
         foreach ($attributes as $key => $value) {
             $view->addProperty($key, $value);
         }
     }
     return $view;
 }
 /**
  * Sanity checks that the blueprint is implemented properly.
  */
 private function validateAllocatedResource($resource)
 {
     $blueprint = $this->getBlueprintClass();
     if (!$resource instanceof DrydockResource) {
         throw new Exception(pht("Blueprint '%s' is not properly implemented: %s must return an " . "object of type %s or throw, but returned something else.", $blueprint, 'executeAllocateResource()', 'DrydockResource'));
     }
     $current_status = $resource->getStatus();
     $req_status = DrydockResourceStatus::STATUS_OPEN;
     if ($current_status != $req_status) {
         $current_name = DrydockResourceStatus::getNameForStatus($current_status);
         $req_name = DrydockResourceStatus::getNameForStatus($req_status);
         throw new Exception(pht("Blueprint '%s' is not properly implemented: %s must return a %s " . "with status '%s', but returned one with status '%s'.", $blueprint, 'executeAllocateResource()', 'DrydockResource', $req_name, $current_name));
     }
 }
 /**
  * Sanity checks that the blueprint is implemented properly.
  */
 private function validateAllocatedResource($resource)
 {
     $blueprint = $this->getBlueprintClass();
     if (!$resource instanceof DrydockResource) {
         throw new Exception("Blueprint '{$blueprint}' is not properly implemented: " . "executeAllocateResource() must return an object of type " . "DrydockResource or throw, but returned something else.");
     }
     $current_status = $resource->getStatus();
     $req_status = DrydockResourceStatus::STATUS_OPEN;
     if ($current_status != $req_status) {
         $current_name = DrydockResourceStatus::getNameForStatus($current_status);
         $req_name = DrydockResourceStatus::getNameForStatus($req_status);
         throw new Exception("Blueprint '{$blueprint}' is not properly implemented: " . "executeAllocateResource() must return a DrydockResource with " . "status '{$req_name}', but returned one with status " . "'{$current_name}'.");
     }
 }
 protected function buildCustomSearchFields()
 {
     return array(id(new PhabricatorSearchCheckboxesField())->setLabel(pht('Statuses'))->setKey('statuses')->setOptions(DrydockResourceStatus::getStatusMap()));
 }