mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-13 13:03:20 +00:00

move code to services added "download" report change services to factory added excel lib added prod/report routes (download) cleanup api routes add : allow anonymized (user, fonction, societe... are "-") removed : xls support (memory eating lib) in favor of xlsx add : report download only on "document" and "preview" subdef classes cs : report factory add : restored "site" filter (see todos in src) remove debug, cs todo : doc
196 lines
5.7 KiB
PHP
196 lines
5.7 KiB
PHP
<?php
|
|
/**
|
|
* This file is part of Phraseanet
|
|
*
|
|
* (c) 2005-2016 Alchemy
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
namespace Alchemy\Phrasea\Report\Controller;
|
|
|
|
use Alchemy\Phrasea\Report\Report;
|
|
use Alchemy\Phrasea\Report\ReportConnections;
|
|
use Alchemy\Phrasea\Report\ReportDownloads;
|
|
use Alchemy\Phrasea\Report\ReportFactory;
|
|
use Alchemy\Phrasea\Report\ReportRecords;
|
|
use Doctrine\Common\Collections\ArrayCollection;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\StreamedResponse;
|
|
|
|
|
|
class ProdReportController
|
|
{
|
|
private static $mapFromExtension = [
|
|
'csv' => [
|
|
'contentType' => 'text/csv',
|
|
'format' => Report::FORMAT_CSV,
|
|
],
|
|
'ods' => [
|
|
'contentType' => 'application/vnd.oasis.opendocument.spreadsheet',
|
|
'format' => Report::FORMAT_ODS,
|
|
],
|
|
'xlsx' => [
|
|
'contentType' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
'format' => Report::FORMAT_XLSX,
|
|
],
|
|
];
|
|
|
|
private $reportFactory;
|
|
private $anonymousReport;
|
|
private $acl;
|
|
|
|
private $extension = null;
|
|
|
|
|
|
/**
|
|
* @param ReportFactory $reportFactory
|
|
* @param Bool $anonymousReport
|
|
* @param \ACL $acl
|
|
*/
|
|
public function __construct(ReportFactory $reportFactory, $anonymousReport, \ACL $acl)
|
|
{
|
|
$this->reportFactory = $reportFactory;
|
|
$this->anonymousReport = $anonymousReport;
|
|
$this->acl = $acl;
|
|
}
|
|
|
|
/**
|
|
* route prod/report/connections
|
|
*
|
|
* @param Request $request
|
|
* @param $sbasId
|
|
* @return StreamedResponse
|
|
*/
|
|
public function connectionsAction(Request $request, $sbasId)
|
|
{
|
|
if(!($extension = $request->get('format'))) {
|
|
$extension = 'csv';
|
|
}
|
|
if(!array_key_exists($extension, self::$mapFromExtension)) {
|
|
throw new \InvalidArgumentException(sprintf("bad format \"%s\" for report", $extension));
|
|
}
|
|
$this->extension = $extension;
|
|
|
|
/** @var ReportConnections $report */
|
|
$report = $this->reportFactory->createReport(
|
|
ReportFactory::CONNECTIONS,
|
|
$sbasId,
|
|
[
|
|
'dmin' => $request->get('dmin'),
|
|
'dmax' => $request->get('dmax'),
|
|
'group' => $request->get('group'),
|
|
'anonymize' => $this->anonymousReport,
|
|
]
|
|
);
|
|
|
|
$report->setFormat(self::$mapFromExtension[$this->extension]['format']);
|
|
|
|
$response = new StreamedResponse();
|
|
|
|
$this->setHeadersFromFormat($response, $report);
|
|
|
|
$response->setCallback(function() use($report) {
|
|
$report->render();
|
|
});
|
|
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* route prod/report/downloads
|
|
*
|
|
* @param Request $request
|
|
* @param $sbasId
|
|
* @return StreamedResponse
|
|
*/
|
|
public function downloadsAction(Request $request, $sbasId)
|
|
{
|
|
if(!($extension = $request->get('format'))) {
|
|
$extension = 'csv';
|
|
}
|
|
if(!array_key_exists($extension, self::$mapFromExtension)) {
|
|
throw new \InvalidArgumentException(sprintf("bad format \"%s\" for report", $extension));
|
|
}
|
|
$this->extension = $extension;
|
|
|
|
/** @var ReportDownloads $report */
|
|
$report = $this->reportFactory->createReport(
|
|
ReportFactory::DOWNLOADS,
|
|
$sbasId,
|
|
[
|
|
'dmin' => $request->get('dmin'),
|
|
'dmax' => $request->get('dmax'),
|
|
'group' => $request->get('group'),
|
|
'bases' => $request->get('base'),
|
|
'anonymize' => $this->anonymousReport,
|
|
]
|
|
);
|
|
|
|
$report->setFormat(self::$mapFromExtension[$this->extension]['format']);
|
|
|
|
$response = new StreamedResponse();
|
|
|
|
$this->setHeadersFromFormat($response, $report);
|
|
|
|
$response->setCallback(function() use($report) {
|
|
$report->render();
|
|
});
|
|
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* route prod/report/records
|
|
*
|
|
* @param Request $request
|
|
* @param $sbasId
|
|
* @return StreamedResponse
|
|
*/
|
|
public function recordsAction(Request $request, $sbasId)
|
|
{
|
|
if(!($extension = $request->get('format'))) {
|
|
$extension = 'csv';
|
|
}
|
|
if(!array_key_exists($extension, self::$mapFromExtension)) {
|
|
throw new \InvalidArgumentException(sprintf("bad format \"%s\" for report", $extension));
|
|
}
|
|
$this->extension = $extension;
|
|
|
|
/** @var ReportRecords $report */
|
|
$report = $this->reportFactory->createReport(
|
|
ReportFactory::RECORDS,
|
|
$sbasId,
|
|
[
|
|
'dmin' => $request->get('dmin'),
|
|
'dmax' => $request->get('dmax'),
|
|
'group' => $request->get('group'),
|
|
'base' => $request->get('base'),
|
|
'meta' => $request->get('meta'),
|
|
]
|
|
);
|
|
|
|
$report->setFormat(self::$mapFromExtension[$this->extension]['format']);
|
|
|
|
set_time_limit(600);
|
|
$response = new StreamedResponse();
|
|
|
|
$this->setHeadersFromFormat($response, $report);
|
|
|
|
$response->setCallback(function() use($report) {
|
|
$report->render();
|
|
});
|
|
|
|
return $response;
|
|
}
|
|
|
|
|
|
private function setHeadersFromFormat($response, Report $report)
|
|
{
|
|
$response->headers->set('Content-Type', self::$mapFromExtension[$this->extension]['contentType']);
|
|
$response->headers->set('Content-Disposition', 'attachment;filename="' . $report->getName() . '"');
|
|
$response->headers->set('Cache-Control', 'max-age=0');
|
|
}
|
|
|
|
}
|