1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2025-02-02 09:58:24 +01:00

Give data exporters a header row

Summary:
Depends on D18951. Ref T13049. When we export to CSV or plain text, add a header row in the first line of the file to explain what each column means. This often isn't obvious with PHIDs, etc.

JSON has keys and is essentially self-labeling, so don't do anything special.

Test Plan: Exported CSV and text, saw new headers. Exported JSON, no changes.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13049

Differential Revision: https://secure.phabricator.com/D18952
This commit is contained in:
epriestley 2018-01-28 18:32:22 -08:00
parent 213eb8e93d
commit 0de6210808
4 changed files with 35 additions and 5 deletions

View file

@ -454,6 +454,7 @@ final class PhabricatorApplicationSearchController
$field_list = $engine->newExportFieldList(); $field_list = $engine->newExportFieldList();
$field_list = mpull($field_list, null, 'getKey'); $field_list = mpull($field_list, null, 'getKey');
$format->addHeaders($field_list);
for ($ii = 0; $ii < count($objects); $ii++) { for ($ii = 0; $ii < count($objects); $ii++) {
$format->addObject($objects[$ii], $field_list, $export_data[$ii]); $format->addObject($objects[$ii], $field_list, $export_data[$ii]);
} }

View file

@ -23,21 +23,34 @@ final class PhabricatorCSVExportFormat
return 'text/csv'; return 'text/csv';
} }
public function addHeaders(array $fields) {
$headers = mpull($fields, 'getLabel');
$this->addRow($headers);
}
public function addObject($object, array $fields, array $map) { public function addObject($object, array $fields, array $map) {
$values = array(); $values = array();
foreach ($fields as $key => $field) { foreach ($fields as $key => $field) {
$value = $map[$key]; $value = $map[$key];
$value = $field->getTextValue($value); $value = $field->getTextValue($value);
$values[] = $value;
}
$this->addRow($values);
}
private function addRow(array $values) {
$row = array();
foreach ($values as $value) {
if (preg_match('/\s|,|\"/', $value)) { if (preg_match('/\s|,|\"/', $value)) {
$value = str_replace('"', '""', $value); $value = str_replace('"', '""', $value);
$value = '"'.$value.'"'; $value = '"'.$value.'"';
} }
$values[] = $value; $row[] = $value;
} }
$this->rows[] = implode(',', $values); $this->rows[] = implode(',', $row);
} }
public function newFileData() { public function newFileData() {

View file

@ -22,6 +22,10 @@ abstract class PhabricatorExportFormat
abstract public function getMIMEContentType(); abstract public function getMIMEContentType();
abstract public function getFileExtension(); abstract public function getFileExtension();
public function addHeaders(array $fields) {
return;
}
abstract public function addObject($object, array $fields, array $map); abstract public function addObject($object, array $fields, array $map);
abstract public function newFileData(); abstract public function newFileData();

View file

@ -23,17 +23,29 @@ final class PhabricatorTextExportFormat
return 'text/plain'; return 'text/plain';
} }
public function addHeaders(array $fields) {
$headers = mpull($fields, 'getLabel');
$this->addRow($headers);
}
public function addObject($object, array $fields, array $map) { public function addObject($object, array $fields, array $map) {
$values = array(); $values = array();
foreach ($fields as $key => $field) { foreach ($fields as $key => $field) {
$value = $map[$key]; $value = $map[$key];
$value = $field->getTextValue($value); $value = $field->getTextValue($value);
$value = addcslashes($value, "\0..\37\\\177..\377");
$values[] = $value; $values[] = $value;
} }
$this->rows[] = implode("\t", $values); $this->addRow($values);
}
private function addRow(array $values) {
$row = array();
foreach ($values as $value) {
$row[] = addcslashes($value, "\0..\37\\\177..\377");
}
$this->rows[] = implode("\t", $row);
} }
public function newFileData() { public function newFileData() {