diff --git a/lib/Alchemy/Phrasea/Command/Report/AbstractReportCommand.php b/lib/Alchemy/Phrasea/Command/Report/AbstractReportCommand.php
index 94955009f9..af7486430d 100644
--- a/lib/Alchemy/Phrasea/Command/Report/AbstractReportCommand.php
+++ b/lib/Alchemy/Phrasea/Command/Report/AbstractReportCommand.php
@@ -37,7 +37,7 @@ abstract class AbstractReportCommand extends Command
->addOption('email', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY ,'emails to send the report')
->addOption('dmin', null, InputOption::VALUE_REQUIRED, 'minimum date yyyy-mm-dd')
->addOption('dmax', null, InputOption::VALUE_REQUIRED, 'maximum date yyyy-mm-dd, until today if not set')
- ->addOption('range', null, InputOption::VALUE_REQUIRED, "period range until now eg: '10 days', '2 weeks', '6 months', ' 1 year'")
+ ->addOption('range', null, InputOption::VALUE_REQUIRED, "period range until now eg: '10 days', '2 weeks', '6 months', '2 years'")
;
}
diff --git a/lib/Alchemy/Phrasea/Command/Report/DataboxContentCommand.php b/lib/Alchemy/Phrasea/Command/Report/DataboxContentCommand.php
index f55bd5eee3..ebd65f52a9 100644
--- a/lib/Alchemy/Phrasea/Command/Report/DataboxContentCommand.php
+++ b/lib/Alchemy/Phrasea/Command/Report/DataboxContentCommand.php
@@ -17,9 +17,12 @@ class DataboxContentCommand extends AbstractReportCommand
->setDescription('BETA - Get all databox records')
->addOption('collection_id', 'c', InputOption::VALUE_REQUIRED| InputOption::VALUE_IS_ARRAY, 'Distant collection ID in the databox, get all available collection if not defined')
->addOption('field', 'f', InputOption::VALUE_REQUIRED| InputOption::VALUE_IS_ARRAY, 'The field name to include in the report, get all available report field if not defined')
+ ->addOption('permalink', 'p', InputOption::VALUE_REQUIRED, 'the subdefinition name to retrieve permalink if exist')
->setHelp(
"eg: bin/report databox:content --databox_id 2 --email 'admin@alchemy.fr' --dmin '2022-12-01' --dmax '2023-01-01' \n"
+ . "\ \ date filter on the updated_on (moddate of table record)"
+
);
}
@@ -63,6 +66,7 @@ class DataboxContentCommand extends AbstractReportCommand
]
))
->setCollIds($collIds)
+ ->setPermalink($input->getOption('permalink'))
;
}
}
diff --git a/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php b/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php
index 97234991e1..377dd7c6aa 100644
--- a/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php
+++ b/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php
@@ -2,7 +2,6 @@
namespace Alchemy\Phrasea\Command\Report;
-use Alchemy\Phrasea\Report\Report;
use Alchemy\Phrasea\Report\ReportDownloads;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
@@ -20,6 +19,7 @@ class DownloadsCommand extends AbstractReportCommand
->setDescription('BETA - Get all downloads report')
->addOption('type', null, InputOption::VALUE_REQUIRED, 'type of report downloads, if not defined or empty it is for all downloads')
->addOption('collection_id', 'c', InputOption::VALUE_REQUIRED| InputOption::VALUE_IS_ARRAY, 'Distant collection ID in the databox, get all available collection if not defined')
+ ->addOption('permalink', 'p', InputOption::VALUE_REQUIRED, 'the subdefinition name to retrieve permalink if exist, available only for type record and for all downloads type ""')
->setHelp(
"eg: bin/report downloads:all --databox_id 2 --email 'admin@alchemy.fr' --dmin '2022-12-01' --dmax '2023-01-01' --type 'user' \n"
@@ -37,6 +37,7 @@ class DownloadsCommand extends AbstractReportCommand
{
$type = $input->getOption('type');
$collectionIds = $input->getOption('collection_id');
+ $permalink = $input->getOption('permalink');
if (!empty($type) && !in_array($type, self::TYPES)) {
$output->writeln("wrong '--type' option (--help for available value)");
@@ -44,6 +45,12 @@ class DownloadsCommand extends AbstractReportCommand
return 1;
}
+ if (!empty($permalink) && $type == 'user') {
+ $output->writeln("--permalink is not used with type=user ");
+
+ return 1;
+ }
+
$databox = $this->findDbOr404($this->sbasId);
$collIds = [];
@@ -71,6 +78,7 @@ class DownloadsCommand extends AbstractReportCommand
))
->setAppKey($this->container['conf']->get(['main', 'key']))
->setCollIds($collIds)
+ ->setPermalink($permalink)
;
}
}
diff --git a/lib/Alchemy/Phrasea/Report/ReportDownloads.php b/lib/Alchemy/Phrasea/Report/ReportDownloads.php
index 7362632b90..88a616930e 100644
--- a/lib/Alchemy/Phrasea/Report/ReportDownloads.php
+++ b/lib/Alchemy/Phrasea/Report/ReportDownloads.php
@@ -22,6 +22,7 @@ class ReportDownloads extends Report
private $acl;
private $collIds = null;
+ private $permalink = null;
/* those vars will be set once by computeVars() */
private $name = null;
@@ -33,6 +34,11 @@ class ReportDownloads extends Report
public function getColumnTitles()
{
$this->computeVars();
+ // only for group downloads all and download by record
+ if (($this->parms['group'] === null || $this->parms['group'] == 'record') && !empty($this->permalink)) {
+ $this->columnTitles[] = 'permalink_' . $this->permalink;
+ }
+
return $this->columnTitles;
}
@@ -69,11 +75,30 @@ class ReportDownloads extends Report
return $this;
}
+ public function setPermalink($permalink)
+ {
+ $this->permalink = $permalink;
+
+ return $this;
+ }
+
public function getAllRows($callback)
{
$this->computeVars();
$stmt = $this->databox->get_connection()->executeQuery($this->sql, []);
while (($row = $stmt->fetch())) {
+ // only for group downloads all and download by record
+ if (($this->parms['group'] === null || $this->parms['group'] == 'record') && !empty($this->permalink)) {
+ try {
+ $record = $this->databox->get_record($row['record_id']);
+ $permalinkUrl = $record->get_subdef($this->permalink)->get_permalink()->get_url()->__toString();
+ } catch (\Exception $e) {
+ // the record or subdef is not found
+ $permalinkUrl = '';
+ }
+ $row['permalink_' . $this->permalink] = $permalinkUrl;
+ }
+
$callback($row);
}
$stmt->closeCursor();
diff --git a/lib/Alchemy/Phrasea/Report/ReportRecords.php b/lib/Alchemy/Phrasea/Report/ReportRecords.php
index e65c52ac38..5fe8f080f0 100644
--- a/lib/Alchemy/Phrasea/Report/ReportRecords.php
+++ b/lib/Alchemy/Phrasea/Report/ReportRecords.php
@@ -23,11 +23,16 @@ class ReportRecords extends Report
private $sqlColSelect = null;
private $columnTitles = null;
private $keyName = null;
+ private $permalink = null;
public function getColumnTitles()
{
$this->computeVars();
+ if (!empty($this->permalink)) {
+ $this->columnTitles[] = 'permalink_' . $this->permalink;
+ }
+
return $this->columnTitles;
}
@@ -57,6 +62,13 @@ class ReportRecords extends Report
return $this;
}
+ public function setPermalink($permalink)
+ {
+ $this->permalink = $permalink;
+
+ return $this;
+ }
+
public function getAllRows($callback)
{
$this->computeVars();
@@ -71,7 +83,7 @@ class ReportRecords extends Report
$stmt->closeCursor();
if($row && !is_null($row['from']) && !is_null($row['to'])) {
- $sql = "SELECT r.record_id, c.asciiname, r.moddate AS updated_on, r.credate AS created_on, r.mime, r.type, r.originalname,\n"
+ $sql = "SELECT r.record_id, c.asciiname, r.credate AS created_on, r.moddate AS updated_on, r.mime, r.type, r.originalname, r.status, r.sha256, r.uuid,\n"
. $this->sqlColSelect . "\n"
. "FROM (`record` AS `r` LEFT JOIN `coll` AS `c` USING(`coll_id`)) LEFT JOIN `metadatas` AS `m` USING(`record_id`)\n"
. "WHERE " . $this->sqlWhere . "\n"
@@ -82,6 +94,21 @@ class ReportRecords extends Report
$rows = $stmt->fetchAll();
$stmt->closeCursor();
foreach($rows as $row) {
+ if (!empty($this->permalink)) {
+ try {
+ $record = $this->databox->get_record($row['record_id']);
+ $permalinkUrl = $record->get_subdef($this->permalink)->get_permalink()->get_url()->__toString();
+ } catch (\Exception $e) {
+ // the record or subdef is not found
+ $permalinkUrl = '';
+ } catch (\Throwable $e) {
+ // there is no permalink created ???
+ $permalinkUrl = '';
+ }
+
+ $row['permalink_' . $this->permalink] = $permalinkUrl;
+ }
+
$callback($row);
$lastRid = $row['record_id'];
}
@@ -101,7 +128,7 @@ class ReportRecords extends Report
// pivot-like query on metadata fields
$this->sqlColSelect = [];
- $this->columnTitles = ['record_id', 'collection', 'updated_on', 'created_on', 'mime', 'type', 'originalname'];
+ $this->columnTitles = ['record_id', 'collection', 'created_on', 'updated_on', 'mime', 'type', 'originalname', 'status', 'sha256', 'uuid'];
foreach($this->getDatabox()->get_meta_structure() as $field) {
// skip the fields that can't be reported
if(!$field->is_report() || (isset($this->acl) && $field->isBusiness() && !$this->acl->can_see_business_fields($this->getDatabox()))) {