first commit
This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file plugins/reports/counter/CounterReportPlugin.php
|
||||
*
|
||||
* Copyright (c) 2014-2022 Simon Fraser University
|
||||
* Copyright (c) 2003-2022 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @class CounterReportPlugin
|
||||
*
|
||||
* @brief Counter report plugin
|
||||
*/
|
||||
|
||||
namespace APP\plugins\reports\counter;
|
||||
|
||||
use APP\core\Application;
|
||||
use APP\core\Services;
|
||||
use APP\notification\NotificationManager;
|
||||
use APP\statistics\StatisticsHelper;
|
||||
use APP\template\TemplateManager;
|
||||
use PKP\notification\PKPNotification;
|
||||
use PKP\plugins\ReportPlugin;
|
||||
|
||||
class CounterReportPlugin extends ReportPlugin
|
||||
{
|
||||
public const COUNTER_CLASS_SUFFIX = '.php';
|
||||
|
||||
/**
|
||||
* @copydoc Plugin::register()
|
||||
*
|
||||
* @param null|mixed $mainContextId
|
||||
*/
|
||||
public function register($category, $path, $mainContextId = null)
|
||||
{
|
||||
$success = parent::register($category, $path, $mainContextId);
|
||||
if ($success) {
|
||||
$this->addLocaleData();
|
||||
}
|
||||
return $success;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see PKPPlugin::getName()
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'CounterReportPlugin';
|
||||
}
|
||||
|
||||
/**
|
||||
* @see PKPPlugin::getDisplayName()
|
||||
*/
|
||||
public function getDisplayName()
|
||||
{
|
||||
return __('plugins.reports.counter');
|
||||
}
|
||||
|
||||
/**
|
||||
* @see PKPPlugin::getDescription()
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return __('plugins.reports.counter.description');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest counter release
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCurrentRelease()
|
||||
{
|
||||
return '4.1';
|
||||
}
|
||||
|
||||
/**
|
||||
* List the valid reports
|
||||
* Must exist in the report path as {Report}_r{release}.php
|
||||
*
|
||||
* @return array multidimentional array release => array( report => reportClassName )
|
||||
*/
|
||||
public function getValidReports()
|
||||
{
|
||||
$reports = [];
|
||||
$prefix = "{$this->getReportPath()}/" . classes\CounterReport::COUNTER_CLASS_PREFIX;
|
||||
$suffix = self::COUNTER_CLASS_SUFFIX;
|
||||
foreach (glob($prefix . '*' . $suffix) as $file) {
|
||||
$report_name = substr($file, strlen($prefix), -strlen($suffix));
|
||||
$report_class_file = substr($file, strlen($prefix), -strlen(self::COUNTER_CLASS_SUFFIX));
|
||||
$reports[$report_name] = $report_class_file;
|
||||
}
|
||||
return $reports;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a COUNTER Reporter Object
|
||||
* Must exist in the report path as {Report}_r{release}.php
|
||||
*
|
||||
* @param string $report Report name
|
||||
* @param string $release release identifier
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function getReporter($report, $release)
|
||||
{
|
||||
$reportClass = '\\APP\\plugins\\reports\\counter\\classes\\reports\\' . classes\CounterReport::COUNTER_CLASS_PREFIX . $report;
|
||||
return class_exists($reportClass) ? new $reportClass($release) : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get classes path for this plugin.
|
||||
*
|
||||
* @return string Path to plugin's classes
|
||||
*/
|
||||
public function getClassPath()
|
||||
{
|
||||
return "{$this->getPluginPath()}/classes";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the report path
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getReportPath()
|
||||
{
|
||||
return "{$this->getClassPath()}/reports";
|
||||
}
|
||||
|
||||
/**
|
||||
* @see ReportPlugin::display()
|
||||
*/
|
||||
public function display($args, $request)
|
||||
{
|
||||
$available = $this->getValidReports();
|
||||
$years = $this->_getYears();
|
||||
if ($request->getUserVar('type')) {
|
||||
$type = (string) $request->getUserVar('type');
|
||||
$errormessage = '';
|
||||
switch ($type) {
|
||||
case 'fetch':
|
||||
// Modern COUNTER Releases
|
||||
// must provide a release, report, and year parameter
|
||||
$release = $request->getUserVar('release');
|
||||
$report = $request->getUserVar('report');
|
||||
$year = $request->getUserVar('year');
|
||||
if ($release && $report && $year) {
|
||||
// release, report and year parameters must be sane
|
||||
if ($release == $this->getCurrentRelease() && isset($available[$report]) && in_array($year, $years)) {
|
||||
// try to get the report
|
||||
$reporter = $this->getReporter($report, $release);
|
||||
if ($reporter) {
|
||||
// default report parameters with a yearlong range
|
||||
$reportItems = $reporter->getReportItems([], ['dateStart' => $year . '-01-01', 'dateEnd' => $year . '-12-31']);
|
||||
if ($reportItems) {
|
||||
$xmlResult = $reporter->createXML($reportItems);
|
||||
if ($xmlResult) {
|
||||
header('content-type: text/xml');
|
||||
header('content-disposition: attachment; filename=counter-' . $release . '-' . $report . '-' . date('Ymd') . '.xml');
|
||||
echo $xmlResult;
|
||||
return;
|
||||
} else {
|
||||
$errormessage = __('plugins.reports.counter.error.noXML');
|
||||
}
|
||||
} else {
|
||||
$errormessage = __('plugins.reports.counter.error.noResults');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// fall through to default case with error message
|
||||
if (!$errormessage) {
|
||||
$errormessage = __('plugins.reports.counter.error.badParameters');
|
||||
}
|
||||
// no break
|
||||
default:
|
||||
if (!$errormessage) {
|
||||
$errormessage = __('plugins.reports.counter.error.badRequest');
|
||||
}
|
||||
$user = $request->getUser();
|
||||
$notificationManager = new NotificationManager();
|
||||
$notificationManager->createTrivialNotification($user->getId(), PKPNotification::NOTIFICATION_TYPE_ERROR, ['contents' => $errormessage]);
|
||||
}
|
||||
}
|
||||
$templateManager = TemplateManager::getManager();
|
||||
krsort($available);
|
||||
$templateManager->assign('pluginName', $this->getName());
|
||||
$templateManager->assign('available', $available);
|
||||
$templateManager->assign('release', $this->getCurrentRelease());
|
||||
$templateManager->assign('years', $years);
|
||||
$templateManager->assign([
|
||||
'breadcrumbs' => [
|
||||
[
|
||||
'id' => 'reports',
|
||||
'name' => __('manager.statistics.reports'),
|
||||
'url' => $request->getRouter()->url($request, null, 'stats', 'reports'),
|
||||
],
|
||||
[
|
||||
'id' => 'counter',
|
||||
'name' => __('plugins.reports.counter')
|
||||
],
|
||||
],
|
||||
'pageTitle', __('plugins.reports.counter')
|
||||
]);
|
||||
$templateManager->display($this->getTemplateResource('index.tpl'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the years for which log entries exist in the DB.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function _getYears()
|
||||
{
|
||||
$filters = [
|
||||
'dateStart' => StatisticsHelper::STATISTICS_EARLIEST_DATE,
|
||||
'dateEnd' => date('Y-m-d', strtotime('yesterday')),
|
||||
'contextIds' => [Application::get()->getRequest()->getContext()->getId()],
|
||||
'assocTypes' => [Application::ASSOC_TYPE_SUBMISSION_FILE]
|
||||
];
|
||||
$metricsQB = Services::get('publicationStats')->getQueryBuilder($filters);
|
||||
$metricsQB = $metricsQB->getSum([StatisticsHelper::STATISTICS_DIMENSION_YEAR]);
|
||||
$metricsQB->orderBy(StatisticsHelper::STATISTICS_DIMENSION_YEAR, StatisticsHelper::STATISTICS_ORDER_ASC);
|
||||
$results = $metricsQB->get()->toArray();
|
||||
$years = array_map(function ($n) {
|
||||
return substr($n, 0, 4);
|
||||
}, array_column($results, 'year'));
|
||||
return $years;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user