Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <tsteur@users.noreply.github.com>2017-11-30 04:47:49 +0300
committerMatthieu Aubry <mattab@users.noreply.github.com>2017-11-30 04:47:49 +0300
commit0309e0b016a1a2458c3ffae0836225fb1a98ee4a (patch)
tree6da8e130dadc29c1260c8c35f2b3e147964311d5 /plugins
parent0595804491ecb8de30a1e1090c31188d8781f4df (diff)
Show message if visitor log shows no data because the data was purged (#12294)
Diffstat (limited to 'plugins')
-rw-r--r--plugins/Live/Visualizations/VisitorLog.php14
-rw-r--r--plugins/Live/lang/en.json1
-rw-r--r--plugins/Live/tests/UI/Live_spec.js13
-rw-r--r--plugins/Live/tests/UI/expected-ui-screenshots/Live_visitor_log_purged.pngbin0 -> 22146 bytes
-rw-r--r--plugins/PrivacyManager/PrivacyManager.php94
-rw-r--r--plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php84
6 files changed, 183 insertions, 23 deletions
diff --git a/plugins/Live/Visualizations/VisitorLog.php b/plugins/Live/Visualizations/VisitorLog.php
index 96ef746cb6..f6c7790f14 100644
--- a/plugins/Live/Visualizations/VisitorLog.php
+++ b/plugins/Live/Visualizations/VisitorLog.php
@@ -9,9 +9,12 @@
namespace Piwik\Plugins\Live\Visualizations;
use Piwik\Common;
+use Piwik\DataTable;
use Piwik\Piwik;
+use Piwik\Plugin;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugin\Visualization;
+use Piwik\Plugins\PrivacyManager\PrivacyManager;
use Piwik\View;
/**
@@ -46,6 +49,17 @@ class VisitorLog extends Visualization
$this->requestConfig->disable_generic_filters = true;
$this->requestConfig->filter_sort_column = false;
+
+ $view = $this;
+ $this->config->filters[] = function (DataTable $table) use ($view) {
+ if (Plugin\Manager::getInstance()->isPluginActivated('PrivacyManager') && PrivacyManager::haveLogsBeenPurged($table)) {
+ $settings = PrivacyManager::getPurgeDataSettings();
+ if (!empty($settings['delete_logs_older_than'])) {
+ $numDaysDelete = $settings['delete_logs_older_than'];
+ $view->config->no_data_message = Piwik::translate('CoreHome_ThereIsNoDataForThisReport') . ' ' . Piwik::translate('Live_VisitorLogNoDataMessagePurged', $numDaysDelete);
+ }
+ }
+ };
}
public function afterGenericFiltersAreAppliedToLoadedDataTable()
diff --git a/plugins/Live/lang/en.json b/plugins/Live/lang/en.json
index 5ce4712ca3..754a7ee13e 100644
--- a/plugins/Live/lang/en.json
+++ b/plugins/Live/lang/en.json
@@ -33,6 +33,7 @@
"TopVisitedPages": "Top visited pages",
"VisitorLog": "Visitor Log",
"VisitorLogDocumentation": "This table shows the latest visits within the selected date range. You can see when a visitor's last visit occurred by hovering over the date of a visit. %1$s If the date range includes today, you can see your visitors real time! %2$s The data displayed here is always live, regardless of whether and how often you are using the archiving cron job.",
+ "VisitorLogNoDataMessagePurged": "Likely the data has been purged because the regular deletion of old visitor logs is enabled and the date for this report is more than %s days old. A super user can change this setting by going to Administration => Privacy.",
"VisitorProfile": "Visitor profile",
"VisitorsInRealTime": "Visitors in Real-time",
"VisitorsLastVisit": "This visitor's last visit was %s days ago.",
diff --git a/plugins/Live/tests/UI/Live_spec.js b/plugins/Live/tests/UI/Live_spec.js
index bea8b18867..334bc80d39 100644
--- a/plugins/Live/tests/UI/Live_spec.js
+++ b/plugins/Live/tests/UI/Live_spec.js
@@ -55,4 +55,17 @@ describe("Live", function () {
page.mouseMove('.visitor-profile-visits li:first-child .visitor-profile-actions .action:first-child', 200);
}, done);
});
+
+ it('should show visitor log purge message when purged and no data', function (done) {
+ expect.screenshot('visitor_log_purged').to.be.captureSelector('.reporting-page', function (page) {
+
+ // Enable development mode to be able to see the UI demo page
+ testEnvironment.overrideConfig('Deletelogs', 'delete_logs_enable', 1);
+ testEnvironment.overrideConfig('Deletelogs', 'delete_logs_older_than', 4000);
+ testEnvironment.save();
+
+ page.load("?module=CoreHome&action=index&idSite=1&period=year&date=2005-01-03#?idSite=1&period=year&date=2005-01-03&category=General_Visitors&subcategory=Live_VisitorLog");
+ page.wait(4000);
+ }, done);
+ });
});
diff --git a/plugins/Live/tests/UI/expected-ui-screenshots/Live_visitor_log_purged.png b/plugins/Live/tests/UI/expected-ui-screenshots/Live_visitor_log_purged.png
new file mode 100644
index 0000000000..ed9573810f
--- /dev/null
+++ b/plugins/Live/tests/UI/expected-ui-screenshots/Live_visitor_log_purged.png
Binary files differ
diff --git a/plugins/PrivacyManager/PrivacyManager.php b/plugins/PrivacyManager/PrivacyManager.php
index b5f9066d7b..e446720cf0 100644
--- a/plugins/PrivacyManager/PrivacyManager.php
+++ b/plugins/PrivacyManager/PrivacyManager.php
@@ -12,6 +12,7 @@ use HTML_QuickForm2_DataSource_Array;
use Piwik\Common;
use Piwik\Config as PiwikConfig;
use Piwik\Container\StaticContainer;
+use Piwik\DataTable;
use Piwik\DataTable\DataTableInterface;
use Piwik\Date;
use Piwik\Db;
@@ -93,29 +94,10 @@ class PrivacyManager extends Plugin
&& (is_null($dataTable)
|| (!empty($dataTable) && $dataTable->getRowsCount() == 0))
) {
- // if range, only look at the first date
- if ($strPeriod == 'range') {
+ $reportDate = self::getReportDate($strPeriod, $strDate);
- $idSite = Common::getRequestVar('idSite', '');
-
- if (intval($idSite) != 0) {
- $site = new Site($idSite);
- $timezone = $site->getTimezone();
- } else {
- $timezone = 'UTC';
- }
-
- $period = new Range('range', $strDate, $timezone);
- $reportDate = $period->getDateStart();
-
- } elseif (Period::isMultiplePeriod($strDate, $strPeriod)) {
-
- // if a multiple period, this function is irrelevant
+ if (empty($reportDate)) {
return false;
-
- } else {
- // otherwise, use the date as given
- $reportDate = Date::factory($strDate);
}
$reportYear = $reportDate->toString('Y');
@@ -130,6 +112,46 @@ class PrivacyManager extends Plugin
}
/**
+ * @param DataTable $dataTable
+ * @param int|null $logsOlderThan If set, it is assumed that log deletion is enabled with the given amount of days
+ * @return bool|void
+ */
+ public static function haveLogsBeenPurged($dataTable, $logsOlderThan = null)
+ {
+ if (!empty($dataTable) && $dataTable->getRowsCount() != 0) {
+ return false;
+ }
+
+ if ($logsOlderThan === null) {
+ $settings = PrivacyManager::getPurgeDataSettings();
+
+ if ($settings['delete_logs_enable'] == 0) {
+ return false;
+ }
+
+ $logsOlderThan = $settings['delete_logs_older_than'];
+ }
+
+ $logsOlderThan = (int) $logsOlderThan;
+
+ $strPeriod = Common::getRequestVar('period', false);
+ $strDate = Common::getRequestVar('date', false);
+
+ if (false === $strPeriod || false === $strDate) {
+ return false;
+ }
+
+ $logsOlderThan = Date::now()->subDay(1 + $logsOlderThan);
+ $reportDate = self::getReportDate($strPeriod, $strDate);
+
+ if (empty($reportDate)) {
+ return false;
+ }
+
+ return $reportDate->isEarlier($logsOlderThan);
+ }
+
+ /**
* @see Piwik\Plugin::registerEvents
*/
public function registerEvents()
@@ -373,6 +395,36 @@ class PrivacyManager extends Plugin
return $result;
}
+ private static function getReportDate($strPeriod, $strDate)
+ {
+ // if range, only look at the first date
+ if ($strPeriod == 'range') {
+
+ $idSite = Common::getRequestVar('idSite', '');
+
+ if (intval($idSite) != 0) {
+ $site = new Site($idSite);
+ $timezone = $site->getTimezone();
+ } else {
+ $timezone = 'UTC';
+ }
+
+ $period = new Range('range', $strDate, $timezone);
+ $reportDate = $period->getDateStart();
+
+ } elseif (Period::isMultiplePeriod($strDate, $strPeriod)) {
+
+ // if a multiple period, this function is irrelevant
+ return false;
+
+ } else {
+ // otherwise, use the date as given
+ $reportDate = Date::factory($strDate);
+ }
+
+ return $reportDate;
+ }
+
/**
* Returns true if a report with the given year & month should be purged or not.
*
diff --git a/plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php b/plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php
index 2b022185a4..7a72882c24 100644
--- a/plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php
+++ b/plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php
@@ -8,6 +8,9 @@
namespace Piwik\Plugins\PrivacyManager\tests\Integration;
+use CpChart\Chart\Data;
+use Piwik\DataTable;
+use Piwik\Date;
use Piwik\Plugins\PrivacyManager\PrivacyManager;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
@@ -18,6 +21,8 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class PrivacyManagerTest extends IntegrationTestCase
{
+ const DELETE_LOGS_OLDER_THAN = 270;
+
/**
* @var PrivacyManager
*/
@@ -29,10 +34,17 @@ class PrivacyManagerTest extends IntegrationTestCase
$this->manager = new PrivacyManager();
\Piwik\Option::set('delete_logs_enable', 1);
- \Piwik\Option::set('delete_logs_older_than', 270);
+ \Piwik\Option::set('delete_logs_older_than', self::DELETE_LOGS_OLDER_THAN);
\Piwik\Option::set('delete_reports_keep_week_reports', 1);
}
+ public function tearDown()
+ {
+ unset($_GET['date']);
+ unset($_GET['period']);
+ parent::tearDown();
+ }
+
public function test_getPurgeDataSettings_shouldUseOnlyConfigValuesIfUIisDisabled()
{
$this->setUIEnabled(false);
@@ -51,12 +63,80 @@ class PrivacyManagerTest extends IntegrationTestCase
$expected = $this->getDefaultPurgeSettings();
$expected['delete_logs_enable'] = 1;
- $expected['delete_logs_older_than'] = 270;
+ $expected['delete_logs_older_than'] = self::DELETE_LOGS_OLDER_THAN;
$expected['delete_reports_keep_week_reports'] = 1;
$this->assertEquals($expected, $settings);
}
+ public function test_haveLogsBeenPurged_whenDateIsRecent()
+ {
+ $this->setUIEnabled(true);
+ $_GET['date'] = Date::now()->subDay(self::DELETE_LOGS_OLDER_THAN - 2)->toString();
+ $_GET['period'] = 'date';
+
+ $this->assertFalse(PrivacyManager::haveLogsBeenPurged($dataTable = null));
+ }
+
+ public function test_haveLogsBeenPurged_whenDateIsPastLogDeleteAndNoDataTableIsGiven()
+ {
+ $this->setUIEnabled(true);
+ $_GET['date'] = Date::now()->subDay(self::DELETE_LOGS_OLDER_THAN + 2)->toString();
+ $_GET['period'] = 'date';
+
+ $this->assertTrue(PrivacyManager::haveLogsBeenPurged($dataTable = null));
+ }
+
+ public function test_haveLogsBeenPurged_whenDateIsPastLogDeleteButLogsAreDisabled()
+ {
+ $this->setUIEnabled(true);
+ \Piwik\Option::set('delete_logs_enable', 0);
+
+ $_GET['date'] = Date::now()->subDay(self::DELETE_LOGS_OLDER_THAN + 1000)->toString();
+ $_GET['period'] = 'date';
+
+ $this->assertFalse(PrivacyManager::haveLogsBeenPurged($dataTable = null));
+ }
+
+ public function test_haveLogsBeenPurged_whenDateIsPastLogDeleteShouldNotBeDeletedIfDataTableHasData()
+ {
+ $this->setUIEnabled(true);
+ $_GET['date'] = Date::now()->subDay(self::DELETE_LOGS_OLDER_THAN + 2)->toString();
+ $_GET['period'] = 'date';
+
+ $dataTable = DataTable::makeFromSimpleArray(array(
+ array('label' => 'myLabel'),
+ array('label' => 'my2ndLabel'),
+ ));
+ $this->assertFalse(PrivacyManager::haveLogsBeenPurged($dataTable));
+ }
+
+ public function test_haveLogsBeenPurged_whenDateIsPastLogDeleteShouldBeDeletedIfDataTableHasNoData()
+ {
+ $this->setUIEnabled(true);
+ $_GET['date'] = Date::now()->subDay(self::DELETE_LOGS_OLDER_THAN + 2)->toString();
+ $_GET['period'] = 'date';
+
+ $dataTable = new DataTable();
+ $this->assertTrue(PrivacyManager::haveLogsBeenPurged($dataTable));
+ }
+
+ public function test_haveLogsBeenPurged_whenPassingManualLogDeletionDateValue_shouldAssumeLogDeletionIsEnabled()
+ {
+ $this->setUIEnabled(true);
+ \Piwik\Option::set('delete_logs_enable', 0);
+
+ $_GET['date'] = Date::now()->subDay(498)->toString();
+ $_GET['period'] = 'date';
+
+ $this->assertFalse(PrivacyManager::haveLogsBeenPurged($dataTable = null, $days = 500));
+
+ $_GET['date'] = Date::now()->subDay(502)->toString();
+ $_GET['period'] = 'date';
+
+ $this->assertTrue(PrivacyManager::haveLogsBeenPurged($dataTable = null, $days = 500));
+ }
+
private function setUIEnabled($enabled)
{
\Piwik\Config::getInstance()->General['enable_delete_old_data_settings_admin'] = $enabled;