Christopher Johnson (WMDE) has submitted this change and it was merged.

Change subject: adds SprintPoints
......................................................................


adds SprintPoints

replaces taskpoints ref calls with a new join query to customfields to retrieve 
points
removes 'in project' check for transactions to improve performance
refactors SumStatusPoints from TasksTable  into SprintPoints
creates subdirs for view organization
adds index constant for customfield filtering (future)
deletes SprintTask

Change-Id: I660007ccc83323eba98d1415f15c9a9a64ff3a4d
---
M src/__phutil_library_map__.php
M src/constants/SprintConstants.php
M src/customfield/SprintTaskStoryPointsField.php
M src/query/SprintQuery.php
M src/storage/SprintBuildStats.php
D src/storage/SprintTask.php
M src/storage/SprintTransaction.php
A src/util/SprintPoints.php
M src/view/SprintBoardTaskCard.php
R src/view/burndown/EventTableView.php
R src/view/burndown/HistoryTableView.php
R src/view/burndown/SprintDataView.php
R src/view/burndown/SprintTableView.php
R src/view/burndown/TasksTableView.php
R src/view/reports/OpenTasksView.php
R src/view/reports/ProjectOpenTasksView.php
R src/view/reports/SprintReportBurndownView.php
R src/view/reports/SprintReportOpenTasksView.php
R src/view/reports/UserOpenTasksView.php
19 files changed, 201 insertions(+), 501 deletions(-)

Approvals:
  Christopher Johnson (WMDE): Verified; Looks good to me, approved



diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
index 1a07ca8..7b4ed80 100644
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -16,11 +16,11 @@
     'BurndownException' => 'exception/BurndownException.php',
     'CeleritySprintResources' => 'celerity/CeleritySprintResources.php',
     'DateIterator' => 'tests/DateIterator.php',
-    'EventTableView' => 'view/EventTableView.php',
-    'HistoryTableView' => 'view/HistoryTableView.php',
-    'OpenTasksView' => 'view/OpenTasksView.php',
+    'EventTableView' => 'view/burndown/EventTableView.php',
+    'HistoryTableView' => 'view/burndown/HistoryTableView.php',
+    'OpenTasksView' => 'view/reports/OpenTasksView.php',
     'PhabricatorFactSprintEngine' => 'fact/PhabricatorFactSprintEngine.php',
-    'ProjectOpenTasksView' => 'view/ProjectOpenTasksView.php',
+    'ProjectOpenTasksView' => 'view/reports/ProjectOpenTasksView.php',
     'SprintApplication' => 'application/SprintApplication.php',
     'SprintApplicationTest' => 'tests/SprintApplicationTest.php',
     'SprintBeginDateField' => 'customfield/SprintBeginDateField.php',
@@ -39,23 +39,23 @@
     'SprintConstants' => 'constants/SprintConstants.php',
     'SprintController' => 'controller/SprintController.php',
     'SprintControllerTest' => 'tests/SprintControllerTest.php',
-    'SprintCustomDateFieldTest' => 'tests/SprintCustomFieldTest.php',
+    'SprintCustomFieldTest' => 'tests/SprintCustomFieldTest.php',
     'SprintDAO' => 'storage/SprintDAO.php',
-    'SprintDataView' => 'view/SprintDataView.php',
+    'SprintDataView' => 'view/burndown/SprintDataView.php',
     'SprintDataViewController' => 'controller/SprintDataViewController.php',
     'SprintDefaultViewCapability' => 
'capability/SprintDefaultViewCapability.php',
     'SprintEndDateField' => 'customfield/SprintEndDateField.php',
     'SprintFactDaemon' => 'fact/SprintFactDaemon.php',
     'SprintFactUpdateIterator' => 'fact/SprintFactUpdateIterator.php',
     'SprintListController' => 'controller/SprintListController.php',
+    'SprintPoints' => 'util/SprintPoints.php',
     'SprintProjectCustomField' => 'customfield/SprintProjectCustomField.php',
     'SprintQuery' => 'query/SprintQuery.php',
     'SprintQueryTest' => 'tests/SprintQueryTest.php',
-    'SprintReportBurndownView' => 'view/SprintReportBurndownView.php',
+    'SprintReportBurndownView' => 'view/reports/SprintReportBurndownView.php',
     'SprintReportController' => 'controller/SprintReportController.php',
-    'SprintReportOpenTasksView' => 'view/SprintReportOpenTasksView.php',
-    'SprintTableView' => 'view/SprintTableView.php',
-    'SprintTask' => 'storage/SprintTask.php',
+    'SprintReportOpenTasksView' => 
'view/reports/SprintReportOpenTasksView.php',
+    'SprintTableView' => 'view/burndown/SprintTableView.php',
     'SprintTaskStoryPointsField' => 
'customfield/SprintTaskStoryPointsField.php',
     'SprintTestCase' => 'tests/SprintTestCase.php',
     'SprintTransaction' => 'storage/SprintTransaction.php',
@@ -63,8 +63,8 @@
     'SprintUIInterface' => 'controller/SprintUIInterface.php',
     'SprintValidator' => 'util/SprintValidator.php',
     'SprintView' => 'view/SprintView.php',
-    'TasksTableView' => 'view/TasksTableView.php',
-    'UserOpenTasksView' => 'view/UserOpenTasksView.php',
+    'TasksTableView' => 'view/burndown/TasksTableView.php',
+    'UserOpenTasksView' => 'view/reports/UserOpenTasksView.php',
     'ViewController' => 'controller/ViewController.php',
   ),
   'function' => array(),
@@ -91,7 +91,7 @@
     'SprintBuildStatsTest' => 'SprintTestCase',
     'SprintController' => 'PhabricatorController',
     'SprintControllerTest' => 'SprintTestCase',
-    'SprintCustomDateFieldTest' => 'SprintTestCase',
+    'SprintCustomFieldTest' => 'SprintTestCase',
     'SprintDAO' => 'PhabricatorLiskDAO',
     'SprintDataView' => 'SprintView',
     'SprintDataViewController' => 'SprintController',
@@ -109,19 +109,6 @@
     'SprintReportBurndownView' => 'SprintView',
     'SprintReportController' => 'SprintController',
     'SprintReportOpenTasksView' => 'SprintView',
-    'SprintTask' => array(
-      'SprintDAO',
-      'PhabricatorMarkupInterface',
-      'PhabricatorPolicyInterface',
-      'PhabricatorTokenReceiverInterface',
-      'PhabricatorFlaggableInterface',
-      'PhabricatorMentionableInterface',
-      'PhrequentTrackableInterface',
-      'PhabricatorCustomFieldInterface',
-      'PhabricatorDestructibleInterface',
-      'PhabricatorApplicationTransactionInterface',
-      'PhabricatorProjectInterface',
-    ),
     'SprintTaskStoryPointsField' => array(
       'ManiphestCustomField',
       'PhabricatorStandardCustomFieldInterface',
diff --git a/src/constants/SprintConstants.php 
b/src/constants/SprintConstants.php
index f9e2714..4a78fd1 100644
--- a/src/constants/SprintConstants.php
+++ b/src/constants/SprintConstants.php
@@ -7,4 +7,5 @@
   const PHABRICATOR_ROOT_DIR = 'vendor/phabricator/phabricator';
   const LIBPHUTIL_ROOT_DIR = 'vendor/libphutil/libphutil';
   const ROOT_DIR = '/srv/phab';
+  const CUSTOMFIELD_INDEX = 'yERhvoZPNPtM';
 } 
\ No newline at end of file
diff --git a/src/customfield/SprintTaskStoryPointsField.php 
b/src/customfield/SprintTaskStoryPointsField.php
index 123c204..e1cc69f 100644
--- a/src/customfield/SprintTaskStoryPointsField.php
+++ b/src/customfield/SprintTaskStoryPointsField.php
@@ -5,7 +5,8 @@
  */
 
 final class SprintTaskStoryPointsField extends ManiphestCustomField
-  implements PhabricatorStandardCustomFieldInterface {
+  implements
+    PhabricatorStandardCustomFieldInterface {
 
   private $obj;
   private $text_proxy;
diff --git a/src/query/SprintQuery.php b/src/query/SprintQuery.php
index ba493c4..ae8b19a 100644
--- a/src/query/SprintQuery.php
+++ b/src/query/SprintQuery.php
@@ -71,7 +71,6 @@
      return $points;
   }
 
-
   public function getXactions($tasks) {
     $task_phids = mpull($tasks, 'getPHID');
     $xactions = id(new ManiphestTransactionQuery())
@@ -103,6 +102,16 @@
     return $conn;
   }
 
+  public function getCustomFieldObj () {
+    $table = new ManiphestCustomFieldStorage();
+    return $table;
+  }
+
+  public function getCustomFieldConn () {
+    $conn = $this->getCustomFieldObj()->establishConnection('r');
+    return $conn;
+  }
+
   public function getJoins() {
 
     $joins = '';
@@ -110,6 +119,22 @@
       $joins = qsprintf(
           $this->getXactionConn(),
           'JOIN %T t ON x.objectPHID = t.phid
+          JOIN %T p ON p.src = t.phid AND p.type = %d AND p.dst = %s',
+          id(new ManiphestTask())->getTableName(),
+          PhabricatorEdgeConfig::TABLE_NAME_EDGE,
+          PhabricatorProjectObjectHasProjectEdgeType::EDGECONST,
+          $this->project_phid);
+    }
+    return $joins;
+  }
+
+  public function getCustomFieldJoins() {
+
+    $joins = '';
+    if ($this->project_phid) {
+      $joins = qsprintf(
+          $this->getCustomFieldConn(),
+          'JOIN %T t ON f.objectPHID = t.phid
           JOIN %T p ON p.src = t.phid AND p.type = %d AND p.dst = %s',
           id(new ManiphestTask())->getTableName(),
           PhabricatorEdgeConfig::TABLE_NAME_EDGE,
@@ -131,6 +156,18 @@
     return $data;
  }
 
+  public function getTaskData($where) {
+    $task_dao = new ManiphestCustomFieldStorage();
+    $data = queryfx_all(
+        $this->getCustomFieldConn(),
+        'SELECT f.* FROM %T f %Q',
+        $this->getCustomFieldObj()->getTableName(),
+        $this->getCustomFieldJoins());
+
+    $task_data = $task_dao->loadAllFromArray($data);
+    return $task_data;
+  }
+
   public function getEdges ($tasks) {
     // Load all edges of depends and depended on tasks
     $edges = id(new PhabricatorEdgeQuery())
diff --git a/src/storage/SprintBuildStats.php b/src/storage/SprintBuildStats.php
index 5603f0a..7ecfc2f 100644
--- a/src/storage/SprintBuildStats.php
+++ b/src/storage/SprintBuildStats.php
@@ -235,14 +235,4 @@
     }
     return $data;
   }
-
-  public function setTaskOpenStatusSum ($task_open_status_sum, $points) {
-    $task_open_status_sum += $points;
-    return $task_open_status_sum;
-  }
-
-  public function setTaskClosedStatusSum ($task_closed_status_sum, $points) {
-    $task_closed_status_sum += $points;
-    return $task_closed_status_sum;
-  }
 }
diff --git a/src/storage/SprintTask.php b/src/storage/SprintTask.php
deleted file mode 100644
index 2bfa73b..0000000
--- a/src/storage/SprintTask.php
+++ /dev/null
@@ -1,385 +0,0 @@
-<?php
-
-final class SprintTask extends SprintDAO
-    implements
-    PhabricatorMarkupInterface,
-    PhabricatorPolicyInterface,
-    PhabricatorTokenReceiverInterface,
-    PhabricatorFlaggableInterface,
-    PhabricatorMentionableInterface,
-    PhrequentTrackableInterface,
-    PhabricatorCustomFieldInterface,
-    PhabricatorDestructibleInterface,
-    PhabricatorApplicationTransactionInterface,
-    PhabricatorProjectInterface {
-
-  const MARKUP_FIELD_DESCRIPTION = 'markup:desc';
-
-  protected $authorPHID;
-  protected $ownerPHID;
-  protected $ccPHIDs = array();
-
-  protected $status;
-
-  protected $priority;
-  protected $subpriority = 0;
-
-  protected $title = '';
-  protected $originalTitle = '';
-  protected $description = '';
-  protected $originalEmailSource;
-  protected $mailKey;
-  protected $viewPolicy = PhabricatorPolicies::POLICY_USER;
-  protected $editPolicy = PhabricatorPolicies::POLICY_USER;
-
-  protected $attached = array();
-  protected $projectPHIDs = array();
-  private $subscribersNeedUpdate;
-
-  protected $ownerOrdering;
-
-  private $groupByProjectPHID = self::ATTACHABLE;
-  private $customFields = self::ATTACHABLE;
-  private $edgeProjectPHIDs = self::ATTACHABLE;
-
-  public static function initializeNewTask(PhabricatorUser $actor) {
-    $app = id(new PhabricatorApplicationQuery())
-        ->setViewer($actor)
-        ->withClasses(array('PhabricatorManiphestApplication'))
-        ->executeOne();
-
-    $view_policy = $app->getPolicy(ManiphestDefaultViewCapability::CAPABILITY);
-    $edit_policy = $app->getPolicy(ManiphestDefaultEditCapability::CAPABILITY);
-
-    return id(new ManiphestTask())
-        ->setStatus(ManiphestTaskStatus::getDefaultStatus())
-        ->setPriority(ManiphestTaskPriority::getDefaultPriority())
-        ->setAuthorPHID($actor->getPHID())
-        ->setViewPolicy($view_policy)
-        ->setEditPolicy($edit_policy)
-        ->attachProjectPHIDs(array());
-  }
-
-  public function getConfiguration() {
-    return array(
-        self::CONFIG_AUX_PHID => true,
-        self::CONFIG_SERIALIZATION => array(
-            'ccPHIDs' => self::SERIALIZATION_JSON,
-            'attached' => self::SERIALIZATION_JSON,
-            'projectPHIDs' => self::SERIALIZATION_JSON,
-        ),
-        self::CONFIG_COLUMN_SCHEMA => array(
-            'ownerPHID' => 'phid?',
-            'status' => 'text12',
-            'priority' => 'uint32',
-            'title' => 'sort',
-            'originalTitle' => 'text',
-            'description' => 'text',
-            'mailKey' => 'bytes20',
-            'ownerOrdering' => 'text64?',
-            'originalEmailSource' => 'text255?',
-            'subpriority' => 'double',
-
-          // T6203/NULLABILITY
-          // This should not be nullable. It's going away soon anyway.
-            'ccPHIDs' => 'text?',
-
-        ),
-        self::CONFIG_KEY_SCHEMA => array(
-            'key_phid' => null,
-            'phid' => array(
-                'columns' => array('phid'),
-                'unique' => true,
-            ),
-            'priority' => array(
-                'columns' => array('priority', 'status'),
-            ),
-            'status' => array(
-                'columns' => array('status'),
-            ),
-            'ownerPHID' => array(
-                'columns' => array('ownerPHID', 'status'),
-            ),
-            'authorPHID' => array(
-                'columns' => array('authorPHID', 'status'),
-            ),
-            'ownerOrdering' => array(
-                'columns' => array('ownerOrdering'),
-            ),
-            'priority_2' => array(
-                'columns' => array('priority', 'subpriority'),
-            ),
-            'key_dateCreated' => array(
-                'columns' => array('dateCreated'),
-            ),
-            'key_dateModified' => array(
-                'columns' => array('dateModified'),
-            ),
-            'key_title' => array(
-                'columns' => array('title(64)'),
-            ),
-        ),
-    ) + parent::getConfiguration();
-  }
-
-  public function loadDependsOnTaskPHIDs() {
-    return PhabricatorEdgeQuery::loadDestinationPHIDs(
-        $this->getPHID(),
-        PhabricatorEdgeConfig::TYPE_TASK_DEPENDS_ON_TASK);
-  }
-
-  public function loadDependedOnByTaskPHIDs() {
-    return PhabricatorEdgeQuery::loadDestinationPHIDs(
-        $this->getPHID(),
-        PhabricatorEdgeConfig::TYPE_TASK_DEPENDED_ON_BY_TASK);
-  }
-
-  public function getAttachedPHIDs($type) {
-    return array_keys(idx($this->attached, $type, array()));
-  }
-
-  public function generatePHID() {
-    return PhabricatorPHID::generateNewPHID(ManiphestTaskPHIDType::TYPECONST);
-  }
-
-  public function getCCPHIDs() {
-    return array_values(nonempty($this->ccPHIDs, array()));
-  }
-
-  public function getProjectPHIDs() {
-    return $this->assertAttached($this->edgeProjectPHIDs);
-  }
-
-  public function attachProjectPHIDs(array $phids) {
-    $this->edgeProjectPHIDs = $phids;
-    return $this;
-  }
-
-  public function setCCPHIDs(array $phids) {
-    $this->ccPHIDs = array_values($phids);
-    $this->subscribersNeedUpdate = true;
-    return $this;
-  }
-
-  public function setOwnerPHID($phid) {
-    $this->ownerPHID = nonempty($phid, null);
-    $this->subscribersNeedUpdate = true;
-    return $this;
-  }
-
-  public function setTitle($title) {
-    $this->title = $title;
-    if (!$this->getID()) {
-      $this->originalTitle = $title;
-    }
-    return $this;
-  }
-
-  public function getMonogram() {
-    return 'T'.$this->getID();
-  }
-
-  public function attachGroupByProjectPHID($phid) {
-    $this->groupByProjectPHID = $phid;
-    return $this;
-  }
-
-  public function getGroupByProjectPHID() {
-    return $this->assertAttached($this->groupByProjectPHID);
-  }
-
-  public function save() {
-    if (!$this->mailKey) {
-      $this->mailKey = Filesystem::readRandomCharacters(20);
-    }
-
-    $result = parent::save();
-
-    if ($this->subscribersNeedUpdate) {
-      // If we've changed the subscriber PHIDs for this task, update the link
-      // table.
-      ManiphestTaskSubscriber::updateTaskSubscribers($this);
-      $this->subscribersNeedUpdate = false;
-    }
-
-    return $result;
-  }
-
-  public function isClosed() {
-    return ManiphestTaskStatus::isClosedStatus($this->getStatus());
-  }
-
-  public function getPrioritySortVector() {
-    return array(
-        $this->getPriority(),
-        -$this->getSubpriority(),
-        $this->getID(),
-    );
-  }
-
-
-  /* -(  Markup Interface  
)--------------------------------------------------- */
-
-
-  /**
-   * @task markup
-   */
-  public function getMarkupFieldKey($field) {
-    $hash = PhabricatorHash::digest($this->getMarkupText($field));
-    $id = $this->getID();
-    return "maniphest:T{$id}:{$field}:{$hash}";
-  }
-
-
-  /**
-   * @task markup
-   */
-  public function getMarkupText($field) {
-    return $this->getDescription();
-  }
-
-
-  /**
-   * @task markup
-   */
-  public function newMarkupEngine($field) {
-    return PhabricatorMarkupEngine::newManiphestMarkupEngine();
-  }
-
-
-  /**
-   * @task markup
-   */
-  public function didMarkupText(
-      $field,
-      $output,
-      PhutilMarkupEngine $engine) {
-    return $output;
-  }
-
-
-  /**
-   * @task markup
-   */
-  public function shouldUseMarkupCache($field) {
-    return (bool)$this->getID();
-  }
-
-
-  /* -(  Policy Interface  
)--------------------------------------------------- */
-
-
-  public function getCapabilities() {
-    return array(
-        PhabricatorPolicyCapability::CAN_VIEW,
-        PhabricatorPolicyCapability::CAN_EDIT,
-    );
-  }
-
-  public function getPolicy($capability) {
-    switch ($capability) {
-      case PhabricatorPolicyCapability::CAN_VIEW:
-        return $this->getViewPolicy();
-      case PhabricatorPolicyCapability::CAN_EDIT:
-        return $this->getEditPolicy();
-    }
-  }
-
-  public function hasAutomaticCapability($capability, PhabricatorUser $user) {
-    // The owner of a task can always view and edit it.
-    $owner_phid = $this->getOwnerPHID();
-    if ($owner_phid) {
-      $user_phid = $user->getPHID();
-      if ($user_phid == $owner_phid) {
-        return true;
-      }
-    }
-
-    return false;
-  }
-
-  public function describeAutomaticCapability($capability) {
-    return pht('The owner of a task can always view and edit it.');
-  }
-
-
-  /* -(  PhabricatorTokenReceiverInterface  
)---------------------------------- */
-
-
-  public function getUsersToNotifyOfTokenGiven() {
-    // Sort of ambiguous who this was intended for; just let them both know.
-    return array_filter(
-        array_unique(
-            array(
-                $this->getAuthorPHID(),
-                $this->getOwnerPHID(),
-            )));
-  }
-
-
-  /* -(  PhabricatorCustomFieldInterface  
)------------------------------------ */
-
-
-  public function getCustomFieldSpecificationForRole($role) {
-    return PhabricatorEnv::getEnvConfig('maniphest.fields');
-  }
-
-  public function getCustomFieldBaseClass() {
-    return 'ManiphestCustomField';
-  }
-
-  public function getCustomFields() {
-    return $this->assertAttached($this->customFields);
-  }
-
-  public function attachCustomFields(PhabricatorCustomFieldAttachment $fields) 
{
-    $this->customFields = $fields;
-    return $this;
-  }
-
-
-  /* -(  PhabricatorDestructibleInterface  
)----------------------------------- */
-
-
-  public function destroyObjectPermanently(
-      PhabricatorDestructionEngine $engine) {
-
-    $this->openTransaction();
-
-    // TODO: Once this implements PhabricatorTransactionInterface, this
-    // will be handled automatically and can be removed.
-    $xactions = id(new ManiphestTransaction())->loadAllWhere(
-        'objectPHID = %s',
-        $this->getPHID());
-    foreach ($xactions as $xaction) {
-      $engine->destroyObject($xaction);
-    }
-
-    $this->delete();
-    $this->saveTransaction();
-  }
-
-
-  /* -(  PhabricatorApplicationTransactionInterface  
)------------------------- */
-
-
-  public function getApplicationTransactionEditor() {
-    return new ManiphestTransactionEditor();
-  }
-
-  public function getApplicationTransactionObject() {
-    return $this;
-  }
-
-  public function getApplicationTransactionTemplate() {
-    return new ManiphestTransaction();
-  }
-
-  public function willRenderTimeline(
-      PhabricatorApplicationTransactionView $timeline,
-      AphrontRequest $request) {
-
-    return $timeline;
-  }
-
-}
diff --git a/src/storage/SprintTransaction.php 
b/src/storage/SprintTransaction.php
index 91bb187..2603013 100644
--- a/src/storage/SprintTransaction.php
+++ b/src/storage/SprintTransaction.php
@@ -4,6 +4,7 @@
 
   private $viewer;
   private $task_points = array();
+  private $tasks;
   private $task_statuses = array();
   private $task_in_sprint = array();
 
@@ -12,30 +13,30 @@
     return $this;
   }
 
-  public function buildDailyData($events, $before, $start, $end, $dates, 
$xactions, $project) {
+  public function setTasks ($tasks) {
+    $this->tasks = $tasks;
+    return $this;
+  }
 
-    $query = id(new SprintQuery());
+  public function setTaskPoints ($taskpoints) {
+    $this->taskpoints = $taskpoints;
+    return $this;
+  }
+
+  public function buildDailyData($events, $before, $start, $end, $dates, 
$xactions) {
+
+    $sprintpoints = id(new SprintPoints())
+        ->setTaskPoints($this->taskpoints);
 
     foreach ($events as $event) {
       $date = null;
       $xaction = $xactions[$event['transactionPHID']];
       $xaction_date = $xaction->getDateCreated();
       $task_phid = $xaction->getObjectPHID();
-      $project_phid = $project->getPHID();
 
-      $task = id(new ManiphestTaskQuery())
-          ->setViewer($this->viewer)
-          ->withPHIDs(array($task_phid))
-          ->needProjectPHIDs(true)
-          ->executeOne();
-      $project_phids = $task->getProjectPHIDs();
-
-      if (in_array($project_phid, $project_phids)) {
-        $points = $query->getStoryPointsForTask($task_phid);
+      $points = $sprintpoints->getTaskPoints($task_phid);
 
         $date = phabricator_format_local_time($xaction_date, $this->viewer, 'D 
M j');
-
-
 
         if ($xaction_date < $start) {
 
@@ -102,12 +103,11 @@
           }
         }
       }
-    }
   return $dates;
 }
 
-  public function buildStatArrays($tasks) {
-    foreach ($tasks as $task) {
+  public function buildStatArrays() {
+    foreach ($this->tasks as $task) {
       $this->task_points[$task->getPHID()] = 0;
       $this->task_statuses[$task->getPHID()] = null;
       $this->task_in_sprint[$task->getPHID()] = 0;
diff --git a/src/util/SprintPoints.php b/src/util/SprintPoints.php
new file mode 100644
index 0000000..3b4bad2
--- /dev/null
+++ b/src/util/SprintPoints.php
@@ -0,0 +1,84 @@
+<?php
+
+final class SprintPoints {
+
+private $taskpoints;
+private $task_open_status_sum;
+private $task_closed_status_sum;
+private $tasks;
+
+  public function setTaskPoints ($taskpoints) {
+    $this->taskpoints = $taskpoints;
+    return $this;
+  }
+
+  public function setTasks ($tasks) {
+    $this->tasks = $tasks;
+    return $this;
+  }
+
+  public function getTaskPoints($task_phid) {
+    $taskpoints = mpull($this->taskpoints, null, 'getObjectPHID');
+    if (!empty($taskpoints)) {
+      foreach ($taskpoints as $key=>$value) {
+        if ($key == $task_phid) {
+          $points = $value->getfieldValue();
+        }
+      }
+      if (!isset($points)) {
+        $points = '0';
+      }
+    }
+    return $points;
+  }
+
+  public function getTaskStatus($task) {
+    $status = $task->getStatus();
+    return $status;
+  }
+
+  private function sumPointsbyStatus ($task) {
+    $status = $this->getTaskStatus($task);
+
+    $points = $this->getTaskPoints($task->getPHID());
+
+    if ($status == 'open') {
+      $this->task_open_status_sum = 
$this->setTaskOpenStatusSum($this->task_open_status_sum, $points);
+    } elseif ($status == 'resolved') {
+      $this->task_closed_status_sum = 
$this->setTaskClosedStatusSum($this->task_closed_status_sum, $points);
+    }
+    return;
+  }
+
+  public function setTaskOpenStatusSum ($task_open_status_sum, $points) {
+    $task_open_status_sum += $points;
+    return $task_open_status_sum;
+  }
+
+  public function setTaskClosedStatusSum ($task_closed_status_sum, $points) {
+    $task_closed_status_sum += $points;
+    return $task_closed_status_sum;
+  }
+
+  public function setStatusPoints () {
+    foreach ($this->tasks as $task) {
+      $this->sumPointsbyStatus($task);
+    }
+    return $this;
+  }
+
+  public function getStatusSums() {
+    $this->setStatusPoints();
+    $opensum = $this->getOpenStatusSum();
+    $closedsum = $this->getClosedStatusSum();
+    return array ($opensum, $closedsum);
+  }
+
+  public function getOpenStatusSum() {
+    return $this->task_open_status_sum;
+  }
+
+  public function getClosedStatusSum() {
+    return $this->task_closed_status_sum;
+  }
+}
\ No newline at end of file
diff --git a/src/view/SprintBoardTaskCard.php b/src/view/SprintBoardTaskCard.php
index 8a655ab..00b77dc 100644
--- a/src/view/SprintBoardTaskCard.php
+++ b/src/view/SprintBoardTaskCard.php
@@ -62,8 +62,9 @@
     $task = $this->getTask();
     $task_phid = $task->getPHID();
     $owner = $this->getOwner();
+
     $points = $query->getStoryPointsForTask($task_phid);
-     $can_edit = $this->getCanEdit();
+    $can_edit = $this->getCanEdit();
 
     $color_map = ManiphestTaskPriority::getColorMap();
     $bar_color = idx($color_map, $task->getPriority(), 'grey');
diff --git a/src/view/EventTableView.php b/src/view/burndown/EventTableView.php
similarity index 100%
rename from src/view/EventTableView.php
rename to src/view/burndown/EventTableView.php
diff --git a/src/view/HistoryTableView.php 
b/src/view/burndown/HistoryTableView.php
similarity index 100%
rename from src/view/HistoryTableView.php
rename to src/view/burndown/HistoryTableView.php
diff --git a/src/view/SprintDataView.php b/src/view/burndown/SprintDataView.php
similarity index 84%
rename from src/view/SprintDataView.php
rename to src/view/burndown/SprintDataView.php
index 77b879a..c1a0c72 100644
--- a/src/view/SprintDataView.php
+++ b/src/view/burndown/SprintDataView.php
@@ -13,6 +13,7 @@
   private $project;
   private $viewer;
   private $tasks;
+  private $taskpoints;
   private $events;
   private $xactions;
   private $start;
@@ -37,31 +38,39 @@
   public function render() {
     $query = id(new SprintQuery())
         ->setProject($this->project)
-        ->setViewer($this->viewer);
+        ->setViewer($this->viewer)
+        ->setPHID($this->project->getPHID());
+
+    $this->taskpoints = 
$query->getTaskData(SprintConstants::CUSTOMFIELD_INDEX);
     $tasks = $query->getTasks();
     $this->tasks = mpull($tasks, null, 'getPHID');
 
     $chart = $this->buildC3Chart($query);
+
     $tasks_table_view = id(new TasksTableView())
         ->setProject($this->project)
         ->setViewer($this->viewer)
         ->setRequest($this->request)
         ->setTasks($this->tasks)
+        ->setTaskPoints($this->taskpoints)
         ->setQuery($query);
 
     $tasks_table = $tasks_table_view->buildTasksTable();
-    $pie = $this->buildC3Pie($tasks_table_view);
+    $pie = $this->buildC3Pie();
     $history_table_view = new HistoryTableView();
     $history_table = $history_table_view->buildHistoryTable($this->before);
     $sprint_table_view = new SprintTableView();
-    $sprint_table = $sprint_table_view->buildSprintTable($this->sprint_data, 
$this->before);
+    $sprint_table = $sprint_table_view->buildSprintTable($this->sprint_data,
+        $this->before);
     $event_table_view = id(new EventTableView())
         ->setProject($this->project)
         ->setViewer($this->viewer)
         ->setRequest($this->request);
-    $event_table = $event_table_view->buildEventTable($this->events, 
$this->xactions,
+    $event_table = $event_table_view->buildEventTable($this->events,
+        $this->xactions,
         $this->tasks, $this->start, $this->end);
-    return array($chart, $tasks_table, $pie, $history_table, $sprint_table, 
$event_table);
+    return array($chart, $tasks_table, $pie, $history_table, $sprint_table,
+        $event_table);
   }
 
   private function buildChartDataSet($query) {
@@ -84,9 +93,14 @@
     $this->xactions = mpull($xactions, null, 'getPHID');
 
     $sprint_xaction = id(new SprintTransaction())
-        ->setViewer($this->viewer);
-    $sprint_xaction->buildStatArrays($this->tasks);
-    $dates = $sprint_xaction->buildDailyData($this->events, $this->before, 
$this->start, $this->end, $dates, $this->xactions, $this->project);
+        ->setViewer($this->viewer)
+        ->setTasks($this->tasks)
+        ->setTaskPoints($this->taskpoints);
+
+    $sprint_xaction->buildStatArrays();
+
+    $dates = $sprint_xaction->buildDailyData($this->events, $this->before,
+        $this->start, $this->end, $dates, $this->xactions, $this->project);
 
     $this->sprint_data = $stats->setSprintData($dates, $this->before);
     $data = $stats->buildDataSet($this->sprint_data);
@@ -143,10 +157,13 @@
     return $chart;
   }
 
-  private function buildC3Pie($tasks_table) {
-    $tasks_table->setStatusPoints();
-    $task_open_status_sum = $tasks_table->getOpenStatusSum();
-    $task_closed_status_sum = $tasks_table->getClosedStatusSum();
+  private function buildC3Pie() {
+    $sprintpoints = id(new SprintPoints())
+        ->setTaskPoints($this->taskpoints)
+        ->setTasks($this->tasks);
+
+    list($task_open_status_sum, $task_closed_status_sum) = $sprintpoints
+        ->getStatusSums();
 
     require_celerity_resource('d3', 'sprint');
     require_celerity_resource('c3-css', 'sprint');
diff --git a/src/view/SprintTableView.php 
b/src/view/burndown/SprintTableView.php
similarity index 100%
rename from src/view/SprintTableView.php
rename to src/view/burndown/SprintTableView.php
diff --git a/src/view/TasksTableView.php b/src/view/burndown/TasksTableView.php
similarity index 84%
rename from src/view/TasksTableView.php
rename to src/view/burndown/TasksTableView.php
index 3b3382d..322ade3 100644
--- a/src/view/TasksTableView.php
+++ b/src/view/burndown/TasksTableView.php
@@ -6,8 +6,7 @@
   private $viewer;
   private $request;
   private $tasks;
-  private $task_open_status_sum;
-  private $task_closed_status_sum;
+  private $taskpoints;
   private $query;
 
   public function setProject ($project) {
@@ -21,17 +20,22 @@
   }
 
   public function setRequest ($request) {
-    $this->request =  $request;
+    $this->request = $request;
     return $this;
   }
 
   public function setTasks ($tasks) {
-    $this->tasks =  $tasks;
+    $this->tasks = $tasks;
+    return $this;
+  }
+
+  public function setTaskPoints ($taskpoints) {
+    $this->taskpoints = $taskpoints;
     return $this;
   }
 
   public function setQuery ($query) {
-    $this->query =  $query;
+    $this->query = $query;
     return $this;
   }
 
@@ -117,6 +121,8 @@
   private function buildTasksTree($order, $reverse) {
     $edges = $this->query->getEdges($this->tasks);
     $map = $this->buildTaskMap($edges, $this->tasks);
+    $sprintpoints = id(new SprintPoints())
+        ->setTaskPoints($this->taskpoints);
 
         // We also collect the phids we need to fetch owner information
     $handle_phids = array();
@@ -126,7 +132,6 @@
     }
     $handles = $this->query->getViewerHandles($this->request, $handle_phids);
 
-    // Now we loop through the tasks, and add them to the output
     $output = array();
     $rows = array();
     foreach ($this->tasks as $task) {
@@ -138,7 +143,8 @@
         $blocked = true;
       }
 
-      $points = $this->getTaskPoints($task);
+      $points = $sprintpoints->getTaskPoints($task->getPHID());
+
       $row = $this->addTaskToTree($output, $blocked, $task, $handles, $points);
       list ($task, $cdate, $date_created, $udate, $last_update, $owner_link, 
$numpriority, $priority, $points, $status) = $row[0];
       $row['sort'] = $this->setSortOrder($row, $order, $task, $cdate, $udate, 
$owner_link, $numpriority, $points, $status);
@@ -226,14 +232,6 @@
     return $owner_link;
   }
 
-  private function getTaskPoints($task) {
-    $query = id(new SprintQuery())
-        ->setProject($this->project)
-        ->setViewer($this->viewer);
-    $points = $query->getStoryPointsForTask($task->getPHID());
-    return $points;
-  }
-
   private function getTaskCreatedDate($task) {
     $date_created = $task->getDateCreated();
     return $date_created;
@@ -259,8 +257,8 @@
     $date_created = phabricator_datetime($cdate, $this->viewer);
     $udate = $this->getTaskModifiedDate($task);
     $last_updated = phabricator_datetime($udate, $this->viewer);
-
-    $status = $this->setTaskStatus($task);
+    $sprintpoints = id(new SprintPoints());
+    $status = $sprintpoints->getTaskStatus($task);
 
     $owner_link = $this->setOwnerLink($handles, $task);
     $priority = $this->getPriority($task);
@@ -291,35 +289,4 @@
     return $output;
   }
 
-  private function setTaskStatus($task) {
-    $status = $task->getStatus();
-    return $status;
-  }
-
-  private function sumPointsbyStatus ($task) {
-    $stats = id(new SprintBuildStats());
-    $status = $this->setTaskStatus($task);
-    $points = $this->getTaskPoints($task);
-    if ($status == 'open') {
-      $this->task_open_status_sum = 
$stats->setTaskOpenStatusSum($this->task_open_status_sum, $points);
-    } elseif ($status == 'resolved') {
-      $this->task_closed_status_sum = 
$stats->setTaskClosedStatusSum($this->task_closed_status_sum, $points);
-    }
-    return;
-  }
-
-  public function setStatusPoints () {
-    foreach ($this->tasks as $task) {
-      $this->sumPointsbyStatus($task);
-    }
-   return;
-  }
-
-  public function getOpenStatusSum() {
-    return $this->task_open_status_sum;
-  }
-
-  public function getClosedStatusSum() {
-    return $this->task_closed_status_sum;
-  }
 }
\ No newline at end of file
diff --git a/src/view/OpenTasksView.php b/src/view/reports/OpenTasksView.php
similarity index 100%
rename from src/view/OpenTasksView.php
rename to src/view/reports/OpenTasksView.php
diff --git a/src/view/ProjectOpenTasksView.php 
b/src/view/reports/ProjectOpenTasksView.php
similarity index 100%
rename from src/view/ProjectOpenTasksView.php
rename to src/view/reports/ProjectOpenTasksView.php
diff --git a/src/view/SprintReportBurndownView.php 
b/src/view/reports/SprintReportBurndownView.php
similarity index 100%
rename from src/view/SprintReportBurndownView.php
rename to src/view/reports/SprintReportBurndownView.php
diff --git a/src/view/SprintReportOpenTasksView.php 
b/src/view/reports/SprintReportOpenTasksView.php
similarity index 100%
rename from src/view/SprintReportOpenTasksView.php
rename to src/view/reports/SprintReportOpenTasksView.php
diff --git a/src/view/UserOpenTasksView.php 
b/src/view/reports/UserOpenTasksView.php
similarity index 100%
rename from src/view/UserOpenTasksView.php
rename to src/view/reports/UserOpenTasksView.php

-- 
To view, visit https://gerrit.wikimedia.org/r/181886
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I660007ccc83323eba98d1415f15c9a9a64ff3a4d
Gerrit-PatchSet: 2
Gerrit-Project: phabricator/extensions/Sprint
Gerrit-Branch: master
Gerrit-Owner: Christopher Johnson (WMDE) <[email protected]>
Gerrit-Reviewer: Christopher Johnson (WMDE) <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to