diff options
author | Thomas Steur <tsteur@users.noreply.github.com> | 2017-11-30 04:47:49 +0300 |
---|---|---|
committer | Matthieu Aubry <mattab@users.noreply.github.com> | 2017-11-30 04:47:49 +0300 |
commit | 0309e0b016a1a2458c3ffae0836225fb1a98ee4a (patch) | |
tree | 6da8e130dadc29c1260c8c35f2b3e147964311d5 /plugins | |
parent | 0595804491ecb8de30a1e1090c31188d8781f4df (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.php | 14 | ||||
-rw-r--r-- | plugins/Live/lang/en.json | 1 | ||||
-rw-r--r-- | plugins/Live/tests/UI/Live_spec.js | 13 | ||||
-rw-r--r-- | plugins/Live/tests/UI/expected-ui-screenshots/Live_visitor_log_purged.png | bin | 0 -> 22146 bytes | |||
-rw-r--r-- | plugins/PrivacyManager/PrivacyManager.php | 94 | ||||
-rw-r--r-- | plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php | 84 |
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 Binary files differnew file mode 100644 index 0000000000..ed9573810f --- /dev/null +++ b/plugins/Live/tests/UI/expected-ui-screenshots/Live_visitor_log_purged.png 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; |