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:
authorsgiehl <stefan@piwik.org>2015-12-25 21:47:55 +0300
committersgiehl <stefan@piwik.org>2015-12-25 21:47:55 +0300
commitb22dee447834c12f1095ba8ecf356970b2312dbf (patch)
tree46a966716922f3d44734929486c43a26d37230f7
parent72fa5107adcdbe1f4b8850f89c95dd3d5f5e6f4a (diff)
parent611316e743d17d819b511d008da0e80e6425b686 (diff)
Merge branch 'master' into 3.0
Conflicts: core/Version.php plugins/CoreConsole/Commands/ManagePlugin.php plugins/CoreHome/angularjs/siteselector/siteselector.directive.js plugins/CoreHome/javascripts/corehome.js plugins/Ecommerce/Menu.php plugins/Events/Events.php plugins/Goals/Goals.php plugins/Live/templates/index.twig plugins/UserCountryMap/UserCountryMap.php plugins/UsersManager/stylesheets/usersManager.less plugins/VisitsSummary/Controller.php plugins/VisitsSummary/Reports/Get.php tests/UI/expected-ui-screenshots
-rw-r--r--.gitmodules4
-rw-r--r--CHANGELOG.md11
-rw-r--r--README.md27
-rw-r--r--composer.json3
-rw-r--r--composer.lock56
-rw-r--r--config/environment/test.php11
-rw-r--r--config/global.ini.php4
-rw-r--r--core/Access.php20
-rw-r--r--core/Common.php2
-rw-r--r--core/DataAccess/LogQueryBuilder.php26
-rw-r--r--core/DataAccess/Model.php9
-rw-r--r--core/DataArray.php2
-rw-r--r--core/Date.php1
-rw-r--r--core/Db.php30
-rw-r--r--core/FrontController.php6
-rw-r--r--core/Metrics/Formatter.php2
-rw-r--r--core/Period.php9
-rw-r--r--core/Piwik.php7
-rw-r--r--core/Plugin/ControllerAdmin.php1
-rw-r--r--core/Plugin/Manager.php1
-rw-r--r--core/SettingsPiwik.php6
-rw-r--r--core/Tracker/ScheduledTasksRunner.php1
-rw-r--r--core/Tracker/Visitor.php6
-rw-r--r--core/Updates/0.2.10.php4
-rw-r--r--core/Updates/0.2.27.php2
-rw-r--r--core/Updates/1.5-b1.php11
-rw-r--r--core/Url.php57
-rw-r--r--core/testMinimumPhpVersion.php2
-rw-r--r--js/piwik.js5
-rw-r--r--lang/fr.json6
-rw-r--r--lang/hu.json71
-rw-r--r--lang/ko.json1
-rw-r--r--lang/nb.json58
m---------libs/PiwikTracker0
-rw-r--r--libs/PiwikTracker/PiwikTracker.php19
m---------misc/log-analytics0
-rw-r--r--piwik.js20
-rw-r--r--plugins/API/Controller.php1
-rw-r--r--plugins/API/RowEvolution.php1
-rw-r--r--plugins/API/lang/ko.json2
-rw-r--r--plugins/API/lang/nb.json12
-rw-r--r--plugins/API/tests/Integration/RssRendererTest.php1
-rw-r--r--plugins/Actions/Actions.php1
-rw-r--r--plugins/Actions/Metrics.php2
-rw-r--r--plugins/Actions/Reports/GetEntryPageUrls.php2
-rw-r--r--plugins/Actions/Reports/GetExitPageUrls.php1
-rw-r--r--plugins/Actions/Reports/GetPageTitles.php1
-rw-r--r--plugins/Actions/lang/cs.json3
-rw-r--r--plugins/Actions/lang/el.json3
-rw-r--r--plugins/Actions/lang/fr.json4
-rw-r--r--plugins/Actions/lang/hu.json6
-rw-r--r--plugins/Actions/lang/it.json3
-rw-r--r--plugins/Actions/lang/ko.json3
-rw-r--r--plugins/Actions/lang/nb.json6
-rw-r--r--plugins/Actions/lang/pt-br.json3
-rwxr-xr-xplugins/Annotations/Controller.php1
-rw-r--r--plugins/Annotations/lang/nb.json10
m---------plugins/AnonymousPiwikUsageMeasurement0
-rw-r--r--plugins/BulkTracking/Tracker/Handler.php1
-rw-r--r--plugins/BulkTracking/tests/Integration/TrackerTest.php1
-rw-r--r--plugins/Contents/Columns/ContentTarget.php1
-rw-r--r--plugins/Contents/lang/fr.json5
-rw-r--r--plugins/Contents/lang/nb.json8
-rw-r--r--plugins/CoreAdminHome/Commands/SetConfig.php97
-rw-r--r--plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php176
-rw-r--r--plugins/CoreAdminHome/lang/cs.json4
-rw-r--r--plugins/CoreAdminHome/lang/el.json4
-rw-r--r--plugins/CoreAdminHome/lang/en.json2
-rw-r--r--plugins/CoreAdminHome/lang/fr.json4
-rw-r--r--plugins/CoreAdminHome/lang/hu.json13
-rw-r--r--plugins/CoreAdminHome/lang/it.json4
-rw-r--r--plugins/CoreAdminHome/lang/nb.json70
-rw-r--r--plugins/CoreAdminHome/lang/pt-br.json4
-rw-r--r--plugins/CoreAdminHome/lang/ru.json3
-rw-r--r--plugins/CoreAdminHome/templates/trackingCodeGenerator.twig2
-rw-r--r--plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php2
-rw-r--r--plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php3
-rw-r--r--plugins/CoreAdminHome/tests/Integration/SetConfigTest.php194
-rw-r--r--plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php165
-rw-r--r--plugins/CoreConsole/Commands/GenerateDimension.php1
-rw-r--r--plugins/CoreConsole/Commands/GitPull.php1
-rw-r--r--plugins/CoreHome/Columns/Metrics/ActionsPerVisit.php1
-rw-r--r--plugins/CoreHome/Columns/UserId.php1
-rw-r--r--plugins/CoreHome/Columns/VisitTotalTime.php1
-rw-r--r--plugins/CoreHome/Tracker/VisitRequestProcessor.php5
-rw-r--r--plugins/CoreHome/angularjs/siteselector/siteselector-model.service.js8
-rw-r--r--plugins/CoreHome/angularjs/siteselector/siteselector.directive.js7
-rw-r--r--plugins/CoreHome/images/favicon.pngbin0 -> 18085 bytes
-rwxr-xr-xplugins/CoreHome/javascripts/corehome.js59
-rw-r--r--plugins/CoreHome/lang/fr.json6
-rw-r--r--plugins/CoreHome/lang/hu.json3
-rw-r--r--plugins/CoreHome/lang/nb.json2
-rw-r--r--plugins/CoreHome/templates/_favicon.twig2
-rw-r--r--plugins/CoreHome/tests/Integration/Column/UserIdTest.php2
-rw-r--r--plugins/CoreHome/tests/Integration/CoreHomeTest.php1
-rw-r--r--plugins/CoreHome/tests/Unit/CoreHomeTest.php1
-rw-r--r--plugins/CorePluginsAdmin/Marketplace.php1
-rw-r--r--plugins/CorePluginsAdmin/lang/nb.json44
-rw-r--r--plugins/CoreUpdater/CoreUpdater.php2
-rw-r--r--plugins/CoreUpdater/lang/nb.json12
m---------plugins/CustomAlerts0
m---------plugins/CustomDimensions0
-rw-r--r--plugins/CustomVariables/lang/fr.json13
-rw-r--r--plugins/DBStats/lang/nb.json10
-rw-r--r--plugins/Dashboard/lang/nb.json19
-rw-r--r--plugins/Dashboard/stylesheets/widget.less24
-rw-r--r--plugins/Dashboard/templates/_widgetFactoryTemplate.twig24
-rw-r--r--plugins/DevicePlugins/lang/en.json2
-rw-r--r--plugins/DevicePlugins/lang/nb.json8
-rw-r--r--plugins/DevicesDetection/DevicesDetection.php1
-rw-r--r--plugins/DevicesDetection/images/browsers/CC.gifbin0 -> 435 bytes
-rw-r--r--plugins/DevicesDetection/lang/nb.json12
-rw-r--r--plugins/Ecommerce/lang/nb.json1
-rw-r--r--plugins/Events/Events.php33
-rw-r--r--plugins/Events/stylesheets/datatable.less7
-rw-r--r--plugins/Feedback/lang/nb.json4
-rw-r--r--plugins/Goals/Goals.php1
-rw-r--r--plugins/Goals/lang/nb.json5
-rw-r--r--plugins/Goals/tests/Integration/APITest.php1
-rw-r--r--plugins/ImageGraph/StaticGraph.php1
-rw-r--r--plugins/ImageGraph/lang/nb.json6
-rw-r--r--plugins/Insights/lang/nb.json12
-rw-r--r--plugins/Installation/FormFirstWebsiteSetup.php1
-rw-r--r--plugins/Installation/Installation.php2
-rw-r--r--plugins/Installation/lang/de.json2
-rw-r--r--plugins/Installation/lang/nb.json30
-rw-r--r--plugins/Installation/templates/layout.twig2
-rw-r--r--plugins/LanguagesManager/Commands/TranslationBase.php1
-rw-r--r--plugins/LanguagesManager/lang/nb.json3
-rw-r--r--plugins/Live/.gitignore1
-rw-r--r--plugins/Live/API.php11
-rw-r--r--plugins/Live/Model.php4
-rw-r--r--plugins/Live/Visitor.php1
-rw-r--r--plugins/Live/VisitorProfile.php5
-rw-r--r--plugins/Live/lang/nb.json12
-rw-r--r--plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php53
-rw-r--r--plugins/Live/tests/System/ApiCounterTest.php (renamed from plugins/Live/tests/System/APITest.php)6
-rw-r--r--plugins/Live/tests/System/ApiTest.php75
-rw-r--r--plugins/Live/tests/System/expected/test___Live.getVisitorProfile.xml1061
-rw-r--r--plugins/Live/tests/System/expected/test_higherLimit__Live.getVisitorProfile.xml2061
-rw-r--r--plugins/Login/Controller.php29
-rw-r--r--plugins/Login/lang/en.json3
-rw-r--r--plugins/Login/lang/hu.json10
-rw-r--r--plugins/Login/lang/nb.json10
-rw-r--r--plugins/MobileAppMeasurable/lang/hu.json7
-rw-r--r--plugins/MobileMessaging/lang/nb.json2
-rw-r--r--plugins/Morpheus/stylesheets/uibase/_headerMessage.less2
-rwxr-xr-xplugins/MultiSites/API.php1
-rw-r--r--plugins/MultiSites/Controller.php3
-rw-r--r--plugins/MultiSites/lang/nb.json6
-rw-r--r--plugins/Overlay/lang/nb.json2
-rw-r--r--plugins/PrivacyManager/lang/nb.json2
-rw-r--r--plugins/Provider/lang/ko.json4
-rw-r--r--plugins/Provider/lang/nb.json7
m---------plugins/QueuedTracking0
-rw-r--r--plugins/Referrers/Columns/Base.php97
-rw-r--r--plugins/Referrers/Columns/Campaign.php2
-rw-r--r--plugins/Referrers/Columns/Keyword.php2
-rw-r--r--plugins/Referrers/Columns/ReferrerName.php2
-rw-r--r--plugins/Referrers/Columns/ReferrerType.php2
-rw-r--r--plugins/Referrers/Columns/ReferrerUrl.php2
-rw-r--r--plugins/Referrers/Columns/Website.php2
-rw-r--r--plugins/Referrers/Social.php2
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php100
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php3
-rw-r--r--plugins/Referrers/tests/System/ApiTest.php53
-rw-r--r--plugins/Referrers/tests/Unit/ReferrersTest.php1
-rw-r--r--plugins/Resolution/lang/hu.json2
-rw-r--r--plugins/Resolution/lang/nb.json4
-rw-r--r--plugins/SEO/lang/nb.json1
-rw-r--r--plugins/ScheduledReports/API.php1
-rw-r--r--plugins/ScheduledReports/Controller.php1
-rw-r--r--plugins/ScheduledReports/Model.php1
-rw-r--r--plugins/ScheduledReports/lang/ko.json10
-rw-r--r--plugins/ScheduledReports/lang/nb.json18
-rw-r--r--plugins/ScheduledReports/tests/Integration/ApiTest.php1
m---------plugins/SecurityInfo0
-rw-r--r--plugins/SegmentEditor/API.php1
-rw-r--r--plugins/SegmentEditor/SegmentEditor.php2
-rw-r--r--plugins/SegmentEditor/lang/de.json1
-rw-r--r--plugins/SegmentEditor/lang/fr.json7
-rw-r--r--plugins/SegmentEditor/lang/nb.json2
-rw-r--r--plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php1
-rw-r--r--plugins/SitesManager/Controller.php1
-rw-r--r--plugins/SitesManager/lang/en.json4
-rw-r--r--plugins/SitesManager/lang/nb.json56
-rw-r--r--plugins/SitesManager/templates/_displayJavascriptCode.twig2
-rw-r--r--plugins/SitesManager/templates/siteWithoutData.twig24
-rw-r--r--plugins/SitesManager/tests/Integration/SitesManagerTest.php1
m---------plugins/TasksTimetable0
-rw-r--r--plugins/Transitions/API.php1
-rw-r--r--plugins/Transitions/lang/nb.json8
-rw-r--r--plugins/UserCountry/Columns/Latitude.php1
-rw-r--r--plugins/UserCountry/Columns/Longitude.php1
-rw-r--r--plugins/UserCountry/UserCountry.php1
-rw-r--r--plugins/UserCountry/functions.php1
-rw-r--r--plugins/UserCountryMap/UserCountryMap.php4
-rw-r--r--plugins/UserCountryMap/javascripts/realtime-map.js20
-rw-r--r--plugins/UserCountryMap/javascripts/visitor-map.js12
-rw-r--r--plugins/UserCountryMap/lang/nb.json3
-rw-r--r--plugins/UserCountryMap/stylesheets/realtime-map.less4
-rw-r--r--plugins/UserLanguage/Reports/Base.php1
-rw-r--r--plugins/UserLanguage/lang/nb.json3
-rw-r--r--plugins/UsersManager/.gitignore1
-rw-r--r--plugins/UsersManager/API.php58
-rw-r--r--plugins/UsersManager/Controller.php8
-rw-r--r--plugins/UsersManager/UserAccessFilter.php183
-rw-r--r--plugins/UsersManager/UsersManager.php3
-rw-r--r--plugins/UsersManager/javascripts/giveViewAccess.js176
-rw-r--r--plugins/UsersManager/javascripts/usersManager.js3
-rw-r--r--plugins/UsersManager/lang/en.json6
-rw-r--r--plugins/UsersManager/lang/nb.json35
-rw-r--r--plugins/UsersManager/stylesheets/usersManager.less17
-rw-r--r--plugins/UsersManager/templates/index.twig24
-rw-r--r--plugins/UsersManager/tests/Fixtures/ManyUsers.php69
-rw-r--r--plugins/UsersManager/tests/Integration/UserAccessFilterTest.php322
-rw-r--r--plugins/UsersManager/tests/Integration/UserPreferencesTest.php1
-rw-r--r--plugins/UsersManager/tests/Integration/UsersManagerTest.php46
-rw-r--r--plugins/UsersManager/tests/System/ApiTest.php76
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_adminaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml12
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_viewaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml12
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml12
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_viewaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_adminaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml12
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml12
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_adminaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml12
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_viewaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_adminaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_superuseraccess.xml9
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_viewaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_adminaccess.xml9
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_superuseraccess.xml9
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_viewaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml8
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml12
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_viewaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_adminaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_superuseraccess.xml18
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_viewaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_adminaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml21
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_viewaccess.xml4
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml23
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml84
-rw-r--r--plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_viewaccess.xml4
-rw-r--r--plugins/VisitFrequency/lang/hu.json7
-rw-r--r--plugins/VisitFrequency/lang/nb.json21
-rw-r--r--plugins/VisitTime/API.php1
-rw-r--r--plugins/VisitTime/lang/nb.json11
-rw-r--r--plugins/VisitorInterest/lang/nb.json2
-rw-r--r--plugins/VisitsSummary/Reports/Get.php1
-rw-r--r--plugins/VisitsSummary/lang/nb.json7
-rw-r--r--plugins/WebsiteMeasurable/lang/nb.json3
-rw-r--r--plugins/Widgetize/lang/nb.json1
-rw-r--r--tests/PHPUnit/Framework/Mock/FakeAccess.php20
-rwxr-xr-xtests/PHPUnit/Framework/TestCase/SystemTestCase.php70
-rw-r--r--tests/PHPUnit/Framework/TestRequest/Response.php1
-rw-r--r--tests/PHPUnit/Integration/AccessTest.php13
-rw-r--r--tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php7
-rw-r--r--tests/PHPUnit/Integration/DbTest.php29
-rw-r--r--tests/PHPUnit/Integration/SegmentTest.php142
-rwxr-xr-xtests/PHPUnit/System/TrackGoalsAllowMultipleConversionsPerVisitTest.php12
-rwxr-xr-xtests/PHPUnit/System/TrackGoalsOneConversionPerVisitTest.php64
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_week.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_year.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml250
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__VisitsSummary.get_year.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_month.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_week.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_year.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_month.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_week.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_year.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml6
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml6
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml6
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getAction_day.xml6
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getCategory_day.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getName_day.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_month.xml54
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_range.xml78
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_month.xml54
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_range.xml78
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_month.xml6
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_range.xml6
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_month.xml54
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_range.xml78
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_month.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_range.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getCustomVariables_month.xml44
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getUsagesOfSlots.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicePlugins.getPlugin_month.xml6
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrand_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserEngines_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml24
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserVersions_month.xml26
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml26
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getModel_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsFamilies_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsVersions_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getType_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Goals.getDaysToConversion_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Goals.getMetrics_month.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Goals.getVisitsUntilConversion_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Goals.get_month.xml16
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml290
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getAll_month.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getOne_month.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Referrers.getReferrerType_month.xml18
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getConfiguration_month.xml22
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getResolution_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml28
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getContinent_month.xml18
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml24
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getNumberOfDistinctCountries_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml25
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguageCode_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguage_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getByDayOfWeek_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerLocalTime_month.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerServerTime_month.xml18
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_range.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_range.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_range.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_range.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getActions_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getBounceCount_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getUniqueVisitors_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisitsConverted_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisits_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.get_month.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml72
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs_withEnhancedAndLast7__MultiSites.getAll_month.xml20
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml5
-rw-r--r--tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml5
-rw-r--r--tests/PHPUnit/System/expected/test_trackGoals_allowMultipleConversionsPerVisit__Goals.get_day.xml15
-rw-r--r--tests/PHPUnit/System/expected/test_trackGoals_allowMultipleConversionsPerVisit_withLogLinkVisitActionSegment__Goals.get_day.xml15
-rw-r--r--tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit__Goals.get_day.xml15
-rw-r--r--tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit_withLogLinkVisitActionAndLogVisitSegment__Goals.get_day.xml15
-rw-r--r--tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit_withLogLinkVisitActionSegment__Goals.get_day.xml15
-rw-r--r--tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData__Goals.get_week.xml21
-rw-r--r--tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData_withLogLinkVisitActionSegment__Goals.get_day.xml15
-rw-r--r--tests/PHPUnit/Unit/Period/WeekTest.php1
m---------tests/UI/expected-ui-screenshots0
-rw-r--r--tests/UI/specs/UsersManager_spec.js110
-rw-r--r--tests/resources/access-logs/fake_logs_enable_all.log2
382 files changed, 8108 insertions, 1278 deletions
diff --git a/.gitmodules b/.gitmodules
index 8a6eb61371..cd126ab986 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -53,10 +53,6 @@
# Note: when you add a submodule that SHOULD be left in the packaged release such as the few submodules below,
# then you MUST add these submodules names in the SUBMODULES_PACKAGED_WITH_CORE variable in:
# https://github.com/piwik/piwik-package/blob/master/scripts/build-package.sh
-[submodule "libs/PiwikTracker"]
- path = libs/PiwikTracker
- url = https://github.com/piwik/piwik-php-tracker.git
- branch = master
[submodule "misc/log-analytics"]
path = misc/log-analytics
url = https://github.com/piwik/piwik-log-analytics.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 96e4d5361d..d4ee119df7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -43,6 +43,7 @@ This is a changelog for Piwik platform developers. All changes for our HTTP API'
### New features
* New segment `actionType` lets you segment all actions of a given type, eg. `actionType==events` or `actionType==downloads`. Action types values are: `pageviews`, `contents`, `sitesearches`, `events`, `outlinks`, `downloads`
+ * The JavaScript Tracker method `PiwikTracker.setDomains()` can now handle paths. This means when setting eg `_paq.push(['setDomains, '*.piwik.org/website1'])` all link that goes to the same domain `piwik.org` but to any other path than `website1/*` will be treated as outlink.
### Internal change
* When generating a new plugin skeleton via `generate:plugin` command, plugin name must now contain only letters and numbers.
@@ -54,6 +55,16 @@ This is a changelog for Piwik platform developers. All changes for our HTTP API'
* Add your own SMS/Text provider by creating a new class in the `SMSProvider` directory of your plugin. The class has to extend `Piwik\Plugins\MobileMessaging\SMSProvider` and implement the required methods.
* Segments can now be composed by a union of multiple segments. To do this set an array of segments that shall be used for that segment `$segment->setUnionOfSegments(array('outlinkUrl', 'downloadUrl'))` instead of defining a SQL column.
+### Deprecations
+ * The method `DB::tableExists` was un-used and has been removed.
+
+### New commands
+ * New command `config:set` lets you set INI config options from the command line. This command can be used for convenience or for automation.
+
+### Breaking changes
+ * In Administration > Websites, for each website, there is a checkbox "Only track visits and actions when the action URL starts with one of the above URLs". In Piwik 2.14.0, any action URL starting with one of the Alias URLs or starting with a subdomain of the Alias URL would be tracked. As of Piwik 2.15.0, when this checkbox is enabled, it may track less data: action URLs on an Alias URL subdomain will not be tracked anymore (you must specify each sub-domain as Alias URL).
+
+
## Piwik 2.15.0
### New commands
diff --git a/README.md b/README.md
index 977bcfb922..0b01769e0e 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,18 @@
# Piwik - piwik.org
+[![Latest Stable Version](https://poser.pugx.org/piwik/piwik/v/stable)](https://packagist.org/packages/piwik/piwik)
+[![Latest Unstable Version](https://poser.pugx.org/piwik/piwik/v/unstable)](https://packagist.org/packages/piwik/piwik)
+[![Total Downloads](https://poser.pugx.org/piwik/piwik/downloads)](https://packagist.org/packages/piwik/piwik)
+[![License](https://poser.pugx.org/piwik/piwik/license)](https://packagist.org/packages/piwik/piwik)
+
+## Code Status
+
+[![Build Status](https://travis-ci.org/piwik/piwik.svg?branch=master)](https://travis-ci.org/piwik/piwik)
+[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/piwik/piwik.svg)](https://scrutinizer-ci.com/g/piwik/piwik?branch=master)
+[![Code Coverage](https://scrutinizer-ci.com/g/piwik/piwik/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/piwik/piwik/?branch=master)
+[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/piwik/piwik.svg)](http://isitmaintained.com/project/piwik/piwik "Average time to resolve an issue")
+[![Percentage of issues still open](http://isitmaintained.com/badge/open/piwik/piwik.svg)](http://isitmaintained.com/project/piwik/piwik "Percentage of issues still open")
+
## Description
Piwik is the leading Free/Libre open analytics platform.
@@ -93,17 +106,3 @@ What makes Piwik unique from the competition:
Custom Variables, Email Reports, Custom Segment Editor, Geo Location, Real time maps, and more!
Documentation and more info on http://piwik.org
-
-
-## Code Status
-The Piwik project uses an ever-expanding comprehensive set of thousands of unit and integration tests and dozens of system [tests](https://github.com/piwik/piwik/tree/master/tests),
- running on the hosted distributed continuous integration platform Travis-CI.
-
-Build status (master branch) [![Build Status](https://travis-ci.org/piwik/piwik.svg?branch=master)](https://travis-ci.org/piwik/piwik)
-
-Code Coverage: [![Code Coverage](https://scrutinizer-ci.com/g/piwik/piwik/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/piwik/piwik/?branch=master)
-
-Latest Version: [![Latest version](https://img.shields.io/github/release/piwik/piwik.svg?style=flat-square)](https://packagist.org/packages/piwik/piwik)
-
-Issue tracker metrics: [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/piwik/piwik.svg)](http://isitmaintained.com/project/piwik/piwik "Average time to resolve an issue") - [![Percentage of issues still open](http://isitmaintained.com/badge/open/piwik/piwik.svg)](http://isitmaintained.com/project/piwik/piwik "Percentage of issues still open")
-
diff --git a/composer.json b/composer.json
index 8bcd8c8f27..fe3ca31419 100644
--- a/composer.json
+++ b/composer.json
@@ -55,7 +55,8 @@
"pear/pear_exception": "~1.0.0",
"piwik/referrer-spam-blacklist": "~1.0",
"piwik/searchengine-and-social-list": "~1.0",
- "tecnickcom/tcpdf": "~6.0"
+ "tecnickcom/tcpdf": "~6.0",
+ "piwik/piwik-php-tracker": "^1.0"
},
"require-dev": {
"aws/aws-sdk-php": "2.7.1",
diff --git a/composer.lock b/composer.lock
index 2a53020e14..263c85b4ab 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "ab862f8d87513f76161fb7aed61b226a",
+ "hash": "09112ef01f28686b387148c407503c7c",
+ "content-hash": "ff9b83524f413ac80daad8eb47099042",
"packages": [
{
"name": "container-interop/container-interop",
@@ -299,6 +300,7 @@
"phpdoc",
"reflection"
],
+ "abandoned": "php-di/phpdoc-reader",
"time": "2014-08-21 08:20:45"
},
{
@@ -822,16 +824,16 @@
},
{
"name": "piwik/device-detector",
- "version": "3.4.2",
+ "version": "3.4.5",
"source": {
"type": "git",
"url": "https://github.com/piwik/device-detector.git",
- "reference": "fcb61cc9e669653febdce2cd1a1f0833b569fbb6"
+ "reference": "367970e87a1b6a8feb30d339621af357dc8ab898"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/piwik/device-detector/zipball/fcb61cc9e669653febdce2cd1a1f0833b569fbb6",
- "reference": "fcb61cc9e669653febdce2cd1a1f0833b569fbb6",
+ "url": "https://api.github.com/repos/piwik/device-detector/zipball/367970e87a1b6a8feb30d339621af357dc8ab898",
+ "reference": "367970e87a1b6a8feb30d339621af357dc8ab898",
"shasum": ""
},
"require": {
@@ -869,7 +871,7 @@
"parser",
"useragent"
],
- "time": "2015-09-09 20:28:18"
+ "time": "2015-12-17 22:27:21"
},
{
"name": "piwik/ini",
@@ -937,6 +939,46 @@
"time": "2014-10-23 03:30:23"
},
{
+ "name": "piwik/piwik-php-tracker",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/piwik/piwik-php-tracker.git",
+ "reference": "ac3e26bb3e2c8a428ccbf6ca663c2ef37fa47a5e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/piwik/piwik-php-tracker/zipball/ac3e26bb3e2c8a428ccbf6ca663c2ef37fa47a5e",
+ "reference": "ac3e26bb3e2c8a428ccbf6ca663c2ef37fa47a5e",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "."
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "The Piwik Team",
+ "email": "hello@piwik.org",
+ "homepage": "http://piwik.org/the-piwik-team/"
+ }
+ ],
+ "description": "PHP Client for Piwik Analytics Tracking API",
+ "homepage": "http://piwik.org",
+ "keywords": [
+ "analytics",
+ "piwik",
+ "tracker"
+ ],
+ "time": "2015-11-11 02:55:37"
+ },
+ {
"name": "piwik/referrer-spam-blacklist",
"version": "1.0.6",
"source": {
@@ -1509,7 +1551,7 @@
"performance",
"profiling"
],
- "time": "2014-08-28 17:34:52"
+ "time": "2015-02-26 14:37:51"
},
{
"name": "guzzle/guzzle",
diff --git a/config/environment/test.php b/config/environment/test.php
index 8174e8b057..702bebaef0 100644
--- a/config/environment/test.php
+++ b/config/environment/test.php
@@ -40,9 +40,16 @@ return array(
'Piwik\Access' => DI\decorate(function ($previous, ContainerInterface $c) {
$testUseMockAuth = $c->get('test.vars.testUseMockAuth');
if ($testUseMockAuth) {
+ $idSitesAdmin = $c->get('test.vars.idSitesAdminAccess');
$access = new FakeAccess();
- FakeAccess::$superUser = true;
- FakeAccess::$superUserLogin = 'superUserLogin';
+ if (!empty($idSitesAdmin)) {
+ FakeAccess::$superUser = false;
+ FakeAccess::$idSitesAdmin = $idSitesAdmin;
+ FakeAccess::$identity = 'adminUserLogin';
+ } else {
+ FakeAccess::$superUser = true;
+ FakeAccess::$superUserLogin = 'superUserLogin';
+ }
return $access;
} else {
return $previous;
diff --git a/config/global.ini.php b/config/global.ini.php
index aad0fd3381..00de6ff173 100644
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -654,6 +654,10 @@ create_new_visit_when_campaign_changes = 1
; absent before, but is present now.
create_new_visit_when_website_referrer_changes = 0
+; ONLY CHANGE THIS VALUE WHEN YOU DO NOT USE PIWIK ARCHIVING, SINCE THIS COULD CAUSE PARTIALLY MISSING ARCHIVE DATA
+; Whether to force a new visit at midnight for every visitor. Default 1.
+create_new_visit_after_midnight = 1
+
; maximum length of a Page Title or a Page URL recorded in the log_action.name table
page_maximum_length = 1024;
diff --git a/core/Access.php b/core/Access.php
index 6d3ee4c32b..881810bfca 100644
--- a/core/Access.php
+++ b/core/Access.php
@@ -336,19 +336,29 @@ class Access
}
/**
- * If the user doesn't have an ADMIN access for at least one website, throws an exception
+ * Returns `true` if the current user has admin access to at least one site.
*
- * @throws \Piwik\NoAccessException
+ * @return bool
*/
- public function checkUserHasSomeAdminAccess()
+ public function isUserHasSomeAdminAccess()
{
if ($this->hasSuperUserAccess()) {
- return;
+ return true;
}
$idSitesAccessible = $this->getSitesIdWithAdminAccess();
- if (count($idSitesAccessible) == 0) {
+ return count($idSitesAccessible) > 0;
+ }
+
+ /**
+ * If the user doesn't have an ADMIN access for at least one website, throws an exception
+ *
+ * @throws \Piwik\NoAccessException
+ */
+ public function checkUserHasSomeAdminAccess()
+ {
+ if (!$this->isUserHasSomeAdminAccess()) {
throw new NoAccessException(Piwik::translate('General_ExceptionPrivilegeAtLeastOneWebsite', array('admin')));
}
}
diff --git a/core/Common.php b/core/Common.php
index 85120c97fa..f1d0c3f64b 100644
--- a/core/Common.php
+++ b/core/Common.php
@@ -559,7 +559,7 @@ class Common
list($usec, $sec) = explode(" ", microtime());
$seed = ((float)$sec + (float)$usec) * 100000;
- mt_srand($seed);
+ mt_srand((int) $seed);
for ($i = 0; $i < $length; $i++) {
$rand_key = mt_rand(0, strlen($chars) - 1);
diff --git a/core/DataAccess/LogQueryBuilder.php b/core/DataAccess/LogQueryBuilder.php
index c491b934ce..b0f2b73ad0 100644
--- a/core/DataAccess/LogQueryBuilder.php
+++ b/core/DataAccess/LogQueryBuilder.php
@@ -22,6 +22,8 @@ class LogQueryBuilder
$from = array($from);
}
+ $fromInitially = $from;
+
if (!$segmentExpression->isEmpty()) {
$segmentExpression->parseSubExpressionsIntoSqlExpressions($from);
$segmentSql = $segmentExpression->getSql();
@@ -33,7 +35,16 @@ class LogQueryBuilder
$joinWithSubSelect = $joins['joinWithSubSelect'];
$from = $joins['sql'];
- if ($joinWithSubSelect) {
+ // hack for https://github.com/piwik/piwik/issues/9194#issuecomment-164321612
+ $useSpecialConversionGroupBy = (!empty($segmentSql)
+ && strpos($groupBy, 'log_conversion.idgoal') !== false
+ && $fromInitially == array('log_conversion')
+ && strpos($from, 'log_link_visit_action') !== false);
+
+ if ($useSpecialConversionGroupBy) {
+ $innerGroupBy = "CONCAT(log_conversion.idvisit, '_' , log_conversion.idgoal, '_', log_conversion.buster)";
+ $sql = $this->buildWrappedSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit, $innerGroupBy);
+ } elseif ($joinWithSubSelect) {
$sql = $this->buildWrappedSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit);
} else {
$sql = $this->buildSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit);
@@ -239,10 +250,11 @@ class LogQueryBuilder
* @param string $groupBy
* @param string $orderBy
* @param string $limit
+ * @param null|string $innerGroupBy If given, this inner group by will be used. If not, we try to detect one
* @throws Exception
* @return string
*/
- private function buildWrappedSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit)
+ private function buildWrappedSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit, $innerGroupBy = null)
{
$matchTables = "(log_visit|log_conversion_item|log_conversion|log_action)";
preg_match_all("/". $matchTables ."\.[a-z0-9_\*]+/", $select, $matches);
@@ -253,12 +265,20 @@ class LogQueryBuilder
. "Please use a table prefix.");
}
+ preg_match_all("/". $matchTables . "/", $from, $matchesFrom);
+
$innerSelect = implode(", \n", $neededFields);
$innerFrom = $from;
$innerWhere = $where;
$innerLimit = $limit;
- $innerGroupBy = "log_visit.idvisit";
+
+ if (!isset($innerGroupBy) && in_array('log_visit', $matchesFrom[1])) {
+ $innerGroupBy = "log_visit.idvisit";
+ } elseif (!isset($innerGroupBy)) {
+ throw new Exception('Cannot use subselect for join as no group by rule is specified');
+ }
+
$innerOrderBy = "NULL";
if ($innerLimit && $orderBy) {
// only When LIMITing we can apply to the inner query the same ORDER BY as the parent query
diff --git a/core/DataAccess/Model.php b/core/DataAccess/Model.php
index 4213cd2039..ba04962ff4 100644
--- a/core/DataAccess/Model.php
+++ b/core/DataAccess/Model.php
@@ -281,7 +281,14 @@ class Model
public function deletePreviousArchiveStatus($numericTable, $archiveId, $doneFlag)
{
- $dbLockName = "deletePreviousArchiveStatus.$numericTable.$archiveId";
+ $tableWithoutLeadingPrefix = $numericTable;
+ $lenNumericTableWithoutPrefix = strlen('archive_numeric_MM_YYYY');
+
+ if (strlen($numericTable) >= $lenNumericTableWithoutPrefix) {
+ $tableWithoutLeadingPrefix = substr($numericTable, strlen($numericTable) - $lenNumericTableWithoutPrefix);
+ // we need to make sure lock name is less than 64 characters see https://github.com/piwik/piwik/issues/9131
+ }
+ $dbLockName = "rmPrevArchiveStatus.$tableWithoutLeadingPrefix.$archiveId";
// without advisory lock here, the DELETE would acquire Exclusive Lock
$this->acquireArchiveTableLock($dbLockName);
diff --git a/core/DataArray.php b/core/DataArray.php
index 1be1942312..4f3757303b 100644
--- a/core/DataArray.php
+++ b/core/DataArray.php
@@ -265,7 +265,7 @@ class DataArray
Metrics::INDEX_EVENT_NB_HITS => 0,
Metrics::INDEX_EVENT_NB_HITS_WITH_VALUE => 0,
Metrics::INDEX_EVENT_SUM_EVENT_VALUE => 0,
- Metrics::INDEX_EVENT_MIN_EVENT_VALUE => 0,
+ Metrics::INDEX_EVENT_MIN_EVENT_VALUE => false,
Metrics::INDEX_EVENT_MAX_EVENT_VALUE => 0,
);
}
diff --git a/core/Date.php b/core/Date.php
index cbbe866708..be009fe54b 100644
--- a/core/Date.php
+++ b/core/Date.php
@@ -12,7 +12,6 @@ namespace Piwik;
use Exception;
use Piwik\Container\StaticContainer;
use Piwik\Intl\Data\Provider\DateTimeFormatProvider;
-use Piwik\Plugins\LanguagesManager\LanguagesManager;
/**
* Utility class that wraps date/time related PHP functions. Using this class can
diff --git a/core/Db.php b/core/Db.php
index f7eae8c8b2..a4b114d634 100644
--- a/core/Db.php
+++ b/core/Db.php
@@ -91,6 +91,17 @@ class Db
}
/**
+ * For tests only.
+ * @param $connection
+ * @ignore
+ * @internal
+ */
+ public static function setDatabaseObject($connection)
+ {
+ self::$connection = $connection;
+ }
+
+ /**
* Connects to the database.
*
* Shouldn't be called directly, use {@link get()} instead.
@@ -621,26 +632,20 @@ class Db
}
/**
- * Returns `true` if a table in the database, `false` if otherwise.
- *
- * @param string $tableName The name of the table to check for. Must be prefixed.
- * @return bool
- */
- public static function tableExists($tableName)
- {
- return self::query("SHOW TABLES LIKE ?", $tableName)->rowCount() > 0;
- }
-
- /**
* Attempts to get a named lock. This function uses a timeout of 1s, but will
* retry a set number of times.
*
* @param string $lockName The lock name.
* @param int $maxRetries The max number of times to retry.
* @return bool `true` if the lock was obtained, `false` if otherwise.
+ * @throws \Exception if Lock name is too long
*/
public static function getDbLock($lockName, $maxRetries = 30)
{
+ if (strlen($lockName) > 64) {
+ throw new \Exception('DB lock name has to be 64 characters or less for MySQL 5.7 compatibility.');
+ }
+
/*
* the server (e.g., shared hosting) may have a low wait timeout
* so instead of a single GET_LOCK() with a 30 second timeout,
@@ -652,7 +657,8 @@ class Db
$db = self::get();
while ($maxRetries > 0) {
- if ($db->fetchOne($sql, array($lockName)) == '1') {
+ $result = $db->fetchOne($sql, array($lockName));
+ if ($result == '1') {
return true;
}
$maxRetries--;
diff --git a/core/FrontController.php b/core/FrontController.php
index e276ed53e7..40f8f38155 100644
--- a/core/FrontController.php
+++ b/core/FrontController.php
@@ -395,7 +395,7 @@ class FrontController extends Singleton
} catch (Exception $ex) {
}
$logoUrl = $logoUrl ?: 'plugins/Morpheus/images/logo-header.png';
- $faviconUrl = $faviconUrl ?: 'plugins/CoreHome/images/favicon.ico';
+ $faviconUrl = $faviconUrl ?: 'plugins/CoreHome/images/favicon.png';
$page = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/maintenance.tpl');
$page = str_replace('%logoUrl%', $logoUrl, $page);
@@ -418,10 +418,6 @@ class FrontController extends Singleton
if (Common::isPhpCliMode()) {
return;
}
- // Only enable this feature after Piwik is already installed
- if (!SettingsPiwik::isPiwikInstalled()) {
- return;
- }
// proceed only when force_ssl = 1
if (!SettingsPiwik::isHttpsForced()) {
return;
diff --git a/core/Metrics/Formatter.php b/core/Metrics/Formatter.php
index d62db65f31..078edb2339 100644
--- a/core/Metrics/Formatter.php
+++ b/core/Metrics/Formatter.php
@@ -8,9 +8,7 @@
namespace Piwik\Metrics;
use Piwik\Common;
-use Piwik\Container\StaticContainer;
use Piwik\DataTable;
-use Piwik\Intl\Data\Provider\CurrencyDataProvider;
use Piwik\NumberFormatter;
use Piwik\Piwik;
use Piwik\Plugin\Metric;
diff --git a/core/Period.php b/core/Period.php
index aecf6362bf..0abd1f4ba3 100644
--- a/core/Period.php
+++ b/core/Period.php
@@ -349,10 +349,12 @@ abstract class Period
);
$offset = strlen($format);
+ // replace string literals encapsulated by ' with same country of *
+ $cleanedFormat = preg_replace_callback('/(\'[^\']+\')/', array($this, 'replaceWithStars'), $format);
// search for first duplicate date field
foreach ($intervalTokens AS $tokens) {
- if (preg_match_all('/[' . implode('|', $tokens) . ']+/', $format, $matches, PREG_OFFSET_CAPTURE) &&
+ if (preg_match_all('/[' . implode('|', $tokens) . ']+/', $cleanedFormat, $matches, PREG_OFFSET_CAPTURE) &&
count($matches[0]) > 1 && $offset > $matches[0][1][1]
) {
$offset = $matches[0][1][1];
@@ -362,6 +364,11 @@ abstract class Period
return array(substr($format, 0, $offset), substr($format, $offset));
}
+ private function replaceWithStars($matches)
+ {
+ return str_repeat("*", strlen($matches[0]));
+ }
+
protected function getRangeFormat($short = false)
{
$maxDifference = 'D';
diff --git a/core/Piwik.php b/core/Piwik.php
index 9545cff6c8..89b1d6ce87 100644
--- a/core/Piwik.php
+++ b/core/Piwik.php
@@ -394,12 +394,7 @@ class Piwik
*/
public static function isUserHasSomeAdminAccess()
{
- try {
- self::checkUserHasSomeAdminAccess();
- return true;
- } catch (Exception $e) {
- return false;
- }
+ return Access::getInstance()->isUserHasSomeAdminAccess();
}
/**
diff --git a/core/Plugin/ControllerAdmin.php b/core/Plugin/ControllerAdmin.php
index 1ee1b33ad7..7c8a1be211 100644
--- a/core/Plugin/ControllerAdmin.php
+++ b/core/Plugin/ControllerAdmin.php
@@ -10,7 +10,6 @@ namespace Piwik\Plugin;
use Piwik\Config as PiwikConfig;
use Piwik\Config;
-use Piwik\Date;
use Piwik\Development;
use Piwik\Menu\MenuAdmin;
use Piwik\Menu\MenuTop;
diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php
index c3974937a0..63a3e0aaaf 100644
--- a/core/Plugin/Manager.php
+++ b/core/Plugin/Manager.php
@@ -18,7 +18,6 @@ use Piwik\Container\StaticContainer;
use Piwik\EventDispatcher;
use Piwik\Filesystem;
use Piwik\Log;
-use Piwik\Option;
use Piwik\Piwik;
use Piwik\Plugin;
use Piwik\PluginDeactivatedException;
diff --git a/core/SettingsPiwik.php b/core/SettingsPiwik.php
index 23e3b883fd..7a50263e39 100644
--- a/core/SettingsPiwik.php
+++ b/core/SettingsPiwik.php
@@ -310,7 +310,7 @@ class SettingsPiwik
$fetched = "ERROR fetching: " . $e->getMessage();
}
// this will match when Piwik not installed yet, or favicon not customised
- $expectedStringAlt = 'plugins/CoreHome/images/favicon.ico';
+ $expectedStringAlt = 'plugins/CoreHome/images/favicon.png';
// this will match when Piwik is installed and favicon has been customised
$expectedString = 'misc/user/';
@@ -427,6 +427,10 @@ class SettingsPiwik
*/
public static function isHttpsForced()
{
+ if (!SettingsPiwik::isPiwikInstalled()) {
+ // Only enable this feature after Piwik is already installed
+ return false;
+ }
return Config::getInstance()->General['force_ssl'] == 1;
}
diff --git a/core/Tracker/ScheduledTasksRunner.php b/core/Tracker/ScheduledTasksRunner.php
index c8e8b89ce3..6c1f230b60 100644
--- a/core/Tracker/ScheduledTasksRunner.php
+++ b/core/Tracker/ScheduledTasksRunner.php
@@ -12,7 +12,6 @@ namespace Piwik\Tracker;
use Piwik\CliMulti;
use Piwik\Common;
use Piwik\Option;
-use Piwik\Piwik;
use Piwik\Tracker;
class ScheduledTasksRunner
diff --git a/core/Tracker/Visitor.php b/core/Tracker/Visitor.php
index 2619c98987..40e027b26f 100644
--- a/core/Tracker/Visitor.php
+++ b/core/Tracker/Visitor.php
@@ -9,7 +9,6 @@
namespace Piwik\Tracker;
use Piwik\Config;
-use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Tracker;
use Piwik\Tracker\Visit\VisitProperties;
@@ -49,6 +48,11 @@ class Visitor
return $this->visitorKnown === true;
}
+ public function isNewVisit()
+ {
+ return !$this->isVisitorKnown();
+ }
+
private function setIsVisitorKnown($isVisitorKnown)
{
return $this->visitorKnown = $isVisitorKnown;
diff --git a/core/Updates/0.2.10.php b/core/Updates/0.2.10.php
index a08a715313..a7ae47c5ac 100644
--- a/core/Updates/0.2.10.php
+++ b/core/Updates/0.2.10.php
@@ -29,7 +29,7 @@ class Updates_0_2_10 extends Updates
)' => 1050,
// 0.1.7 [463]
- 'ALTER IGNORE TABLE `' . Common::prefixTable('log_visit') . '`
+ 'ALTER TABLE `' . Common::prefixTable('log_visit') . '`
CHANGE `location_provider` `location_provider` VARCHAR( 100 ) DEFAULT NULL' => 1054,
// 0.1.7 [470]
@@ -45,7 +45,7 @@ class Updates_0_2_10 extends Updates
CHANGE `message` `message` TEXT' => 1054,
// 0.2.2 [489]
- 'ALTER IGNORE TABLE `' . Common::prefixTable('site') . '`
+ 'ALTER TABLE `' . Common::prefixTable('site') . '`
CHANGE `feedburnerName` `feedburnerName` VARCHAR( 100 ) DEFAULT NULL' => 1054,
);
}
diff --git a/core/Updates/0.2.27.php b/core/Updates/0.2.27.php
index bef3bca6c4..b18ea37eef 100644
--- a/core/Updates/0.2.27.php
+++ b/core/Updates/0.2.27.php
@@ -24,7 +24,7 @@ class Updates_0_2_27 extends Updates
'ALTER TABLE `' . Common::prefixTable('log_visit') . '`
ADD `visit_goal_converted` VARCHAR( 1 ) NOT NULL AFTER `visit_total_time`' => 1060,
// 0.2.27 [826]
- 'ALTER IGNORE TABLE `' . Common::prefixTable('log_visit') . '`
+ 'ALTER TABLE `' . Common::prefixTable('log_visit') . '`
CHANGE `visit_goal_converted` `visit_goal_converted` TINYINT(1) NOT NULL' => 1060,
'CREATE TABLE `' . Common::prefixTable('goal') . "` (
diff --git a/core/Updates/1.5-b1.php b/core/Updates/1.5-b1.php
index 16a9ec655c..e481d1e84a 100644
--- a/core/Updates/1.5-b1.php
+++ b/core/Updates/1.5-b1.php
@@ -19,6 +19,8 @@ class Updates_1_5_b1 extends Updates
{
public function getMigrationQueries(Updater $updater)
{
+ $logConversionTable = Common::prefixTable('log_conversion');
+
return array(
'CREATE TABLE `' . Common::prefixTable('log_conversion_item') . '` (
idsite int(10) UNSIGNED NOT NULL,
@@ -38,21 +40,22 @@ class Updates_1_5_b1 extends Updates
INDEX index_idsite_servertime ( idsite, server_time )
) DEFAULT CHARSET=utf8 ' => 1050,
- 'ALTER IGNORE TABLE `' . Common::prefixTable('log_visit') . '`
+ 'ALTER TABLE `' . Common::prefixTable('log_visit') . '`
ADD visitor_days_since_order SMALLINT(5) UNSIGNED NOT NULL AFTER visitor_days_since_last,
ADD visit_goal_buyer TINYINT(1) NOT NULL AFTER visit_goal_converted' => 1060,
- 'ALTER IGNORE TABLE `' . Common::prefixTable('log_conversion') . '`
+ 'ALTER TABLE `' . $logConversionTable . '`
ADD visitor_days_since_order SMALLINT(5) UNSIGNED NOT NULL AFTER visitor_days_since_first' => 1060,
- 'ALTER IGNORE TABLE `' . Common::prefixTable('log_conversion') . '`
+ 'ALTER TABLE `' . $logConversionTable . '`
ADD idorder varchar(100) default NULL AFTER buster,
ADD items SMALLINT UNSIGNED DEFAULT NULL,
ADD revenue_subtotal float default NULL,
ADD revenue_tax float default NULL,
ADD revenue_shipping float default NULL,
ADD revenue_discount float default NULL,
- ADD UNIQUE KEY unique_idsite_idorder (idsite, idorder),
MODIFY idgoal int(10) NOT NULL' => 1060,
+ 'ALTER TABLE `' . Common::prefixTable('log_conversion') . '`
+ ADD UNIQUE KEY unique_idsite_idorder (idsite, idorder)' => 1061,
);
}
diff --git a/core/Url.php b/core/Url.php
index cacf76ad06..a86978286a 100644
--- a/core/Url.php
+++ b/core/Url.php
@@ -176,20 +176,10 @@ class Url
*/
public static function getCurrentScheme()
{
- try {
- $assume_secure_protocol = @Config::getInstance()->General['assume_secure_protocol'];
- } catch (Exception $e) {
- $assume_secure_protocol = false;
- }
- if ($assume_secure_protocol) {
- return 'https';
- }
- if( (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] === true))
- || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')){
-
+ if (self::isPiwikConfiguredToAssumeSecureConnection()) {
return 'https';
}
- return 'http';
+ return self::getCurrentSchemeFromRequestHeader();
}
/**
@@ -686,4 +676,47 @@ class Url
{
return array('localhost', '127.0.0.1', '::1', '[::1]');
}
+
+
+ /**
+ * @return bool
+ */
+ public static function isSecureConnectionAssumedByPiwikButNotForcedYet()
+ {
+ $isSecureConnectionLikelyNotUsed = Url::isSecureConnectionLikelyNotUsed();
+ $hasSessionCookieSecureFlag = ProxyHttp::isHttps();
+ $isSecureConnectionAssumedByPiwikButNotForcedYet = Url::isPiwikConfiguredToAssumeSecureConnection() && !SettingsPiwik::isHttpsForced();
+
+ return $isSecureConnectionLikelyNotUsed
+ && $hasSessionCookieSecureFlag
+ && $isSecureConnectionAssumedByPiwikButNotForcedYet;
+ }
+
+ /**
+ * @return string
+ */
+ protected static function getCurrentSchemeFromRequestHeader()
+ {
+ if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] === true))
+ || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
+ ) {
+
+ return 'https';
+ }
+ return 'http';
+ }
+
+ protected static function isSecureConnectionLikelyNotUsed()
+ {
+ return Url::getCurrentSchemeFromRequestHeader() == 'http';
+ }
+
+ /**
+ * @return bool
+ */
+ protected static function isPiwikConfiguredToAssumeSecureConnection()
+ {
+ $assume_secure_protocol = @Config::getInstance()->General['assume_secure_protocol'];
+ return (bool) $assume_secure_protocol;
+ }
}
diff --git a/core/testMinimumPhpVersion.php b/core/testMinimumPhpVersion.php
index 707d0e1615..31649f3117 100644
--- a/core/testMinimumPhpVersion.php
+++ b/core/testMinimumPhpVersion.php
@@ -127,7 +127,7 @@ if (!function_exists('Piwik_GetErrorMessagePage')) {
}
if (empty($faviconUrl)) {
- $faviconUrl = "plugins/CoreHome/images/favicon.ico";
+ $faviconUrl = "plugins/CoreHome/images/favicon.png";
}
if ($optionalTrace) {
diff --git a/js/piwik.js b/js/piwik.js
index 344e5436e9..773b38bf8d 100644
--- a/js/piwik.js
+++ b/js/piwik.js
@@ -5000,8 +5000,9 @@ if (typeof Piwik !== 'object') {
browserFeatures.cookie = hasCookies();
}
- // screen resolution
- browserFeatures.res = screenAlias.width * devicePixelRatio + 'x' + screenAlias.height * devicePixelRatio;
+ var width = parseInt(screenAlias.width, 10) * devicePixelRatio;
+ var height = parseInt(screenAlias.height, 10) * devicePixelRatio;
+ browserFeatures.res = parseInt(width, 10) + 'x' + parseInt(height, 10);
}
/*<DEBUG>*/
diff --git a/lang/fr.json b/lang/fr.json
index c43d588f4b..d4139d5e5f 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -264,8 +264,11 @@
"OperationIsNot": "N'est pas",
"OperationLessThan": "Plus petit que",
"OperationNotEquals": "Est différent",
+ "OperationStartsWith": "Commence par",
+ "OperationEndsWith": "Se termine par",
"OptionalSmtpPort": "Optionnel. Par défaut à 25 pour non chiffré et TLS SMTP, et 465 pour du SMTP SSL.",
"Options": "Options",
+ "Or": "ou",
"OrCancel": "ou %s Annuler %s",
"Others": "Autres",
"Outlink": "Lien sortant",
@@ -356,6 +359,9 @@
"TotalRatioTooltip": "C'est %1$s de %2$s %3$s.",
"TotalRevenue": "Total des recettes",
"TotalVisitsPageviewsActionsRevenue": "(Total : %s visites, %s pages vues, %s actions, %s revenu)",
+ "TrackingScopeAction": "Action",
+ "TrackingScopePage": "Page",
+ "TrackingScopeVisit": "Visite",
"TransitionsRowActionTooltip": "Visualisez ce que les visiteurs ont fait après avoir visité cette page",
"TransitionsRowActionTooltipTitle": "Ouvrir les transitions",
"TranslatorName": "<a href=\"http:\/\/microsofttouch.fr\/default\/b\/vincent\/default.aspx\">Vincent BIRET<\/a>, <a href=\"http:\/\/www.ludovicevrard.com\">Ludovic Evrard<\/a>, Daniel Castronovo",
diff --git a/lang/hu.json b/lang/hu.json
index bf63f7e950..19265c78ec 100644
--- a/lang/hu.json
+++ b/lang/hu.json
@@ -1,11 +1,17 @@
{
"General": {
+ "12HourClock": "12 órás formátum",
+ "24HourClock": "24 órás formátum",
"AbandonedCarts": "Otthagyott bevásárlókosarak",
"AboutPiwikX": "Piwik %s verzióinformáció",
"Action": "Akció",
"Actions": "Akciók",
+ "Add": "Hozzáad",
+ "All": "Mind",
"AllWebsitesDashboard": "Weboldal-összesítő vezérlőpult",
+ "And": "és",
"API": "API",
+ "Apply": "Alkalmaz",
"ArchivingInlineHelp": "Közepes és nagy forgalmú weboldalak esetén ajánlott letiltani a böngészővel való megnyitás által előidézett archiválást. Ehelyett ajánlott egy cron job beállítása, mely óránként feldolgozza a Piwik jelentéseket.",
"ArchivingTriggerDescription": "Nagyobb, Piwik-et használó weboldalak esetén ajánlott. A jelentések automatikus feldolgozásához %segy cron job belállítása%s is szükséges.",
"AuthenticationMethodSmtp": "SMTP autentikációs módszer",
@@ -13,6 +19,7 @@
"AveragePrice": "Átlagár",
"AverageQuantity": "Átlagmennyiség",
"BackToPiwik": "Vissza a Piwik-hez",
+ "Broken": "Sérült",
"BrokenDownReportDocumentation": "Több jelentésre van lebontva, melyek szikravonalakként jelennek meg a lap alján. A grafikonok kinagyíthatóak egyébként a megfelelő jelentésre kattintva.",
"Cancel": "Mégse",
"ChangePassword": "Jelszó megváltoztatása",
@@ -23,8 +30,10 @@
"ChooseWebsite": "Válassz weboldalt",
"ClickHere": "Kattints ide további információért.",
"Close": "Bezárás",
+ "ClickToSearch": "Kattintson a kereséshez",
"ColumnActionsPerVisit": "Akciók\/látogatás",
"ColumnActionsPerVisitDocumentation": "Különböző akciók átlagos száma (mint például weblapok megtekintése, fájlok letöltése, kimenő linkekre klikkelés), melyeket a látogatások során végrehajtottak.",
+ "ColumnAverageGenerationTime": "Átl. lekérdezési idő",
"ColumnAverageTimeOnPage": "Weblapon töltött átlagos idő",
"ColumnAverageTimeOnPageDocumentation": "A látogató által ezen a weblapon töltött idő átlaga (csak a weblapon, és nem a webhely egészén).",
"ColumnAvgTimeOnSite": "Átlagidő az oldalon",
@@ -35,12 +44,14 @@
"ColumnBouncesDocumentation": "Látogatások száma, mely ezen a weblapon kezdődött és végződött. Ez azt jelenti, hogy a látogató elhagyta a webhelyet, miután megtekintette ezt a weblapot.",
"ColumnConversionRate": "Konverziós arány",
"ColumnConversionRateDocumentation": "Látogatások százaléka, mely során egy cél teljesült, konverzió történt.",
+ "ColumnDestinationPage": "Céloldal",
"ColumnEntrances": "Belépések",
"ColumnEntrancesDocumentation": "Látogatások száma, mely ezen a weblapon kezdődött.",
"ColumnExitRate": "Elhagyási arány",
"ColumnExitRateDocumentation": "Látogatásoknak mekkora százalékában hagyták el a webhelyet ennek a weblapnak a megtekintése után.",
"ColumnExits": "Kilépések",
"ColumnExitsDocumentation": "Látogatások száma, mely ezen a weblapon végződött.",
+ "ColumnGenerationTime": "Generálási idő",
"ColumnKeyword": "Kulcsszó",
"ColumnLabel": "Címke",
"ColumnMaxActions": "Egy látogatás maximális akciói",
@@ -210,12 +221,17 @@
"SmtpPort": "SMTP szerver port",
"SmtpServerAddress": "SMTP szerver címe",
"SmtpUsername": "SMTP felhasználói név",
+ "Source": "Forrás",
"Subtotal": "Részösszeg",
+ "Summary": "Összesítés",
"Table": "Táblázat",
"TagCloud": "Címkefelhő",
"Tax": "Adó",
"Total": "Összesítve",
"TotalRevenue": "Teljes bevétel",
+ "TrackingScopeAction": "Akció",
+ "TrackingScopePage": "Oldal",
+ "TrackingScopeVisit": "Látogatás",
"TranslatorName": "József Jároli, Viktor Horvath & Mr. Balu, KardiWeb",
"UniquePurchases": "Egyedi vásárlások",
"Unknown": "Ismeretlen",
@@ -237,6 +253,7 @@
"Visitors": "Látogatók",
"VisitsWith": "Látogatások ezzel: %s",
"VisitorSettings": "Látogatók adatai",
+ "VisitType": "Látogatás típusa",
"VisitTypeExample": "Például azoknak a látogatóknak a kiválasztására, akik visszatértek a weboldalra, köztük azok, akik vásároltak valamit a korábbi látogatásaik során, az API lekérés ezt tartalmazná: %s",
"Warning": "Figyelmeztetés",
"WarningFileIntegrityNoManifest": "A fájlintegritás-ellenőrzés nem hajtható végre, mivel hiányzik a manifest.inc.php fájl.",
@@ -244,10 +261,64 @@
"WarningPasswordStored": "%sFigyelmeztetés:%s Ez a jelszó eltárolásra kerül a konfigurációs fájlban, így bárki láthatja, aki hozzáfér a fájlhoz.",
"Website": "Weboldal",
"Weekly": "Heti",
+ "WeeklyReport": "heti",
+ "WeeklyReports": "Heti jelentések",
+ "WellDone": "Szép munka!",
"Widgets": "Modulok",
+ "Widget": "Modulok",
+ "YearlyReport": "évente",
"YearsDays": "%1$s év %2$s nap",
"Yes": "Igen",
"YouMustBeLoggedIn": "A funkció eléréséhez be kell lépnie.",
"YourChangesHaveBeenSaved": "Változtatások elmentve."
+ },
+ "Mobile": {
+ "AboutPiwikMobile": "Piwik Mobile-ról",
+ "AccessUrlLabel": "Piwik elérési url",
+ "Account": "Profil",
+ "Accounts": "Profilok",
+ "AddAccount": "Profil hozzádása",
+ "AddPiwikDemo": "Piwik Demo hozzáadása",
+ "Advanced": "Haladó",
+ "AnonymousAccess": "Névtelen elérés",
+ "AnonymousTracking": "Névtelen követés",
+ "ChooseHttpTimeout": "Válasszon HTTP időtúllépési értéket",
+ "ChooseMetric": "Válasszon metrikát",
+ "ChooseReport": "Válasszon jelentést",
+ "ChooseSegment": "Válasszon szegmenst",
+ "ConfirmRemoveAccount": "El akarja távolítani azt a profilt?",
+ "DefaultReportDate": "Jelentés dátuma",
+ "EmailUs": "Email visszajelzés",
+ "EnableGraphsLabel": "Grafikonok megjelenítése",
+ "EvolutionGraph": "Történelmi grafikon",
+ "NavigationBack": "Vissza",
+ "NetworkError": "Hálózati hiba",
+ "NetworkErrorWithStatusCodeShort": "Hálózati hiba: %s",
+ "NetworkNotReachable": "Hálózat nem elérhető",
+ "NoDataShort": "Nincs adat",
+ "NoPiwikAccount": "Nincs Piwik profilja?",
+ "NoReportsShort": "Nincsenek jelentések",
+ "NoVisitorFound": "Nem található látogató",
+ "NoVisitorsShort": "Nincsenek látogatók",
+ "NoWebsiteFound": "Nem található weboldal",
+ "NoWebsitesShort": "Nincsenek weboldalak",
+ "PullDownToRefresh": "Húzza le a frissítéshez...",
+ "PossibleSslError": "Valószínűsíthető SSL tanúsítvány hiba",
+ "IgnoreSslError": "SSL hiba figyelmen kívül hagyása",
+ "RatingDontRemindMe": "Ne értesítsen engem",
+ "RatingNotNow": "Ne most",
+ "RatingNow": "OK, értékelem most",
+ "ReleaseToRefresh": "Elengedés a frissítéshez",
+ "Reloading": "Frissítés...",
+ "RequestTimedOutShort": "Időtúllépési hiba"
+ },
+ "RowEvolution": {
+ "AvailableMetrics": "Elérhető metrikák",
+ "CompareRows": "Adatok összehasonlítása",
+ "ComparingRecords": "%s sorok összehasonlítása",
+ "Documentation": "Válassza ki a megjelenítendő metrikákat, amelyeket szeretne megtekinteni nagy evolúciós grafikonon. A shift billentyű nyomvatartásával több metrika egyidejűleg megjelenthető.",
+ "MetricBetweenText": "%s-től %s-ig",
+ "PickAnotherRow": "Válasszon egy mások sort az összehasonlításhoz",
+ "PickARow": "Válasszon egy sort az összehasonlításhoz"
}
} \ No newline at end of file
diff --git a/lang/ko.json b/lang/ko.json
index 29cbaff91b..c8c9b8aea8 100644
--- a/lang/ko.json
+++ b/lang/ko.json
@@ -282,6 +282,7 @@
"Remove": "제거",
"Report": "보고서",
"ReportGeneratedFrom": "이 보고서는 %s의 데이터를 사용하여 생성되었습니다.",
+ "ReportRatioTooltip": "'%1$s'은 %5$s에서 %4$s %3$s번으로 %2$s에 해당한다.",
"Reports": "보고서",
"ReportsContainingTodayWillBeProcessedAtMostEvery": "보고서 아카이브를 몇 초에 한 번씩 수행",
"RearchiveTimeIntervalOnlyForTodayReports": "이것은 오늘의 보고서(혹은 오늘이 포함된 기간)에만 영향을 줍니다.",
diff --git a/lang/nb.json b/lang/nb.json
index 11f1f9e3cb..1508538983 100644
--- a/lang/nb.json
+++ b/lang/nb.json
@@ -21,7 +21,7 @@
"AveragePrice": "Gjennomsnittlig pris",
"AverageQuantity": "Gjennomsnittlig antall",
"BackToPiwik": "Tilbake til Piwik",
- "Broken": "Oppdelt",
+ "Broken": "Brutt",
"BrokenDownReportDocumentation": "Den er delt opp i forskjellige rapporter som vises i minigrafer (sparklines) på bunnen av siden. Du kan forstørre grafene ved å klikke på den rapporten du ønsker å se.",
"Cancel": "Avbryt",
"CannotUnzipFile": "Kan ikke pakke opp filen %1$s: %2$s",
@@ -40,7 +40,7 @@
"ColumnAverageGenerationTime": "Gj.snitt. genereringstid",
"ColumnAverageGenerationTimeDocumentation": "Den gjennomsnittlige tiden det tok å generere siden. Dette måltallet inkluderer tiden det tok tjeneren å generere siden, pluss tiden det den besøkende å laste ned svar fra tjeneren. Et lavere gjennomsnitt betyr et raskere nettsted for dine besøkende!",
"ColumnAverageTimeOnPage": "Gj.snitt. tid på side",
- "ColumnAverageTimeOnPageDocumentation": "Den gjennomsnittlige tiden besøkende tilbrakte på denne siden (bare siden, ikke hele nettstedet).",
+ "ColumnAverageTimeOnPageDocumentation": "Den gjennomsnittlige tiden besøkere tilbrakte på denne siden (bare siden, ikke hele nettstedet).",
"ColumnAvgTimeOnSite": "Gj.snitt. tid på nettstedet",
"ColumnAvgTimeOnSiteDocumentation": "Gjennomsnittlig varighet for et besøk.",
"ColumnBounceRate": "Sprettfrekvens",
@@ -61,27 +61,27 @@
"ColumnLabel": "Type",
"ColumnMaxActions": "Maksimalt antall handlinger under ett besøk",
"ColumnNbActions": "Handlinger",
- "ColumnNbActionsDocumentation": "Antallet handlinger utført av dine besøkende. Handlinger kan være sidevisninger, interne nettstedsøk, nedlastinger eller utlenker.",
- "ColumnNbUniqVisitors": "Unike besøkende",
- "ColumnNbUniqVisitorsDocumentation": "Antallet unike besøkende som kommer til nettstedet ditt. Hver bruker blir telt bare en gang selv om han besøker nettstedet flere ganger om dagen.",
+ "ColumnNbActionsDocumentation": "Antallet handlinger utført av dine besøkere. Handlinger kan være sidevisninger, interne nettstedsøk, nedlastinger eller utlenker.",
+ "ColumnNbUniqVisitors": "Unike besøkere",
+ "ColumnNbUniqVisitorsDocumentation": "Antallet unike besøkere som kommer til nettstedet ditt. Hver bruker blir telt bare en gang selv om han besøker nettstedet flere ganger om dagen.",
"ColumnNbUsers": "Brukere",
"ColumnNbUsersDocumentation": "Antall brukere som er logget inn på nettstedet ditt. Det er antallet unike aktive brukere som har en bruker-ID satt (via sporsingskodefunksjonen «setUserId»).",
"ColumnNbVisits": "Besøk",
- "ColumnNbVisitsDocumentation": "Hvis en besøkende kommer til nettstedet ditt for første gang eller han besøker nettstedet mer enn 30 minutter etter hans siste sidevisning, så vil det bli registrert som et nytt besøk.",
+ "ColumnNbVisitsDocumentation": "Hvis en besøker kommer til nettstedet ditt for første gang eller han besøker nettstedet mer enn 30 minutter etter hans siste sidevisning, så vil det bli registrert som et nytt besøk.",
"ColumnPageBounceRateDocumentation": "Prosentandelen av besøk som startet på denne siden og forlot nettstedet med en gang.",
"ColumnPageviews": "Sidevisninger",
"ColumnPageviewsDocumentation": "Antallet ganger denne siden har vært besøkt.",
"ColumnPercentageVisits": "% besøk",
"ColumnRevenue": "Inntekter",
- "ColumnSumVisitLength": "Total tid brukt av besøkende (i sekunder)",
+ "ColumnSumVisitLength": "Total tid brukt av besøkere (i sekunder)",
"ColumnTotalPageviews": "Sidevisninger totalt",
"ColumnUniqueEntrances": "Unike innganger",
"ColumnUniqueExits": "Unike utganger",
"ColumnUniquePageviews": "Unike sidevisninger",
"ColumnUniquePageviewsDocumentation": "Antall besøk som inkluderte denne siden. Hvis en side ble vist flere ganger i løpet av et besøk, telles det bare som en gang.",
- "ColumnValuePerVisit": "Verdi per besøk",
+ "ColumnValuePerVisit": "Inntekter per besøk",
"ColumnViewedAfterSearch": "Klikket i søkeresultat",
- "ColumnViewedAfterSearchDocumentation": "Antallet ganger denne siden var besøkt etter at en besøkende gjorde et søk på nettstedet ditt og klikket på denne siden i søkeresultatene.",
+ "ColumnViewedAfterSearchDocumentation": "Antallet ganger denne siden var besøkt etter at en besøker gjorde et søk på nettstedet ditt og klikket på denne siden i søkeresultatene.",
"ColumnVisitDuration": "Besøksvarighet (i sekunder)",
"ColumnVisitsWithConversions": "Besøk med konvertering",
"ConfigFileIsNotWritable": "Konfigurasjonsfilen for Piwik %s er ikke skrivbar. Noen av endringene dine blir kanskje ikke lagret. %s Endre rettighetene for filen slik at den er skrivbar.",
@@ -138,7 +138,7 @@
"EvolutionSummaryGeneric": "%1$s i %2$s sammenlignet med %3$s i %4$s. Utvikling: %5$s",
"ExceptionContactSupportGeneric": "Hvis du fortsatt har dette problemet, %skontakt din Piwik-administrator%s for assistanse.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Bruker må enten være en superbruker eller brukeren «%s» selv.",
- "ExceptionConfigurationFileNotFound": "Klarte ikke finne konfigurasjonsfilen {%s}.",
+ "ExceptionConfigurationFileNotFound": "Klarte ikke finne eller lese konfigurasjonsfilen {%s}.",
"ExceptionConfigurationFileNotFound2": "Hvis filen eksisterer, vennligst sjekk at %s er lesbar for brukeren «%s».",
"ExceptionDatabaseVersion": "Din %1$s versjon er %2$s, men Piwik krever minst %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Din Piwik-kodebase kjører den gamle versjonen %1$s, og vi har oppdaget at din Piwik-database allerede har blitt oppgradert til den nyere versjonen %2$s.",
@@ -154,11 +154,11 @@
"ExceptionInvalidRendererFormat": "Format «%s» for rendering er ikke gyldig. Prøv en av følgende istedenfor: %s.",
"ExceptionInvalidReportRendererFormat": "Rapportformat «%s» er ikke gyldig. Prøv en av følgende istedenfor: %s.",
"ExceptionInvalidStaticGraphType": "Statisk graftype «%s» er ikke gyldig. Prøv en av følgende istedenfor: %s.",
- "ExceptionInvalidToken": "Token er ikke gyldig.",
+ "ExceptionInvalidToken": "Autentiseringsnøkkel er ikke gyldig.",
"ExceptionLanguageFileNotFound": "Fant ikke språkfilen «%s».",
"ExceptionMethodNotFound": "Metoden «%s» eksisterer ikke eller er ikke tilgjengelig i modulen «%s».",
"ExceptionMissingFile": "Mangler fil: %s",
- "ExceptionNonceMismatch": "Klarte ikke å verifisere sikkerhetstoken i dette skjemaet.",
+ "ExceptionNonceMismatch": "Klarte ikke å verifisere autentiseringsnøkkelen i dette skjemaet.",
"ExceptionPrivilege": "Du har ikke tilgang til denne ressursen siden den krever «%s»-tilgang.",
"ExceptionPrivilegeAccessWebsite": "Du har ikke tilgang til denne ressursen siden den krever «%s»-tilgang for nettstedet med id = %d.",
"ExceptionPrivilegeAtLeastOneWebsite": "Du har ikke tilgang til denne ressursen siden den krever «%s»-tilgang for minst ett av nettstedene.",
@@ -186,7 +186,7 @@
"Goal": "Mål",
"GoTo": "Gå til %s",
"GraphHelp": "Mer informasjon om visning av grafikk i Piwik",
- "HelloUser": "Hallo, %s!",
+ "HelloUser": "Hei, %s!",
"Help": "Hjelp",
"HelpTranslatePiwik": "Kanskje du vil %1$shjelpe oss å forbedre Piwik-oversettelser%2$s?",
"Hide": "skjul",
@@ -198,7 +198,7 @@
"InvalidDateRange": "Ugyldig datointervall, prøv igjen",
"InvalidResponse": "De mottatte dataene er ugyldige.",
"IP": "IP",
- "JsTrackingTag": "JavaScript-sporingskoden",
+ "JsTrackingTag": "JavaScript-sporingskode",
"Language": "Språk",
"LastDays": "Siste %s dager (inkludert i dag)",
"LastDaysShort": "Siste %s dager",
@@ -264,8 +264,11 @@
"OperationIsNot": "Er ikke",
"OperationLessThan": "Mindre enn",
"OperationNotEquals": "Ikke lik",
+ "OperationStartsWith": "Starter med",
+ "OperationEndsWith": "Slutter med",
"OptionalSmtpPort": "Valgfritt. Standard er 25 for ukryptert og TLS SMTP, og 465 for SSL SMTP.",
"Options": "Alternativer",
+ "Or": "eller",
"OrCancel": "eller %s avbryt %s",
"Others": "Andre",
"Outlink": "Utlenke",
@@ -289,13 +292,13 @@
"Plugins": "Utvidelser",
"PoweredBy": "Drevet av",
"Previous": "Forrige",
- "PreviousDays": "Forrige %s dager (ikke inkludert i dag)",
- "PreviousDaysShort": "Forrige %s dager",
+ "PreviousDays": "Siste %s dager (ikke inkludert i dag)",
+ "PreviousDaysShort": "Siste %s dager",
"Price": "Pris",
"ProductConversionRate": "Produktets konverteringsrate",
- "ProductRevenue": "Produktets inntjening",
- "Measurable": "Målbart",
- "Measurables": "Målbare",
+ "ProductRevenue": "Produktets inntekter",
+ "Measurable": "Område",
+ "Measurables": "Områder",
"PurchasedProducts": "Kjøpte produkter",
"Quantity": "Antall",
"RangeReports": "Tilpassede datointervaller",
@@ -316,7 +319,7 @@
"ReportsWillBeProcessedAtMostEveryHour": "Rapporter vil derfor prosesseres som mest hver time.",
"RequestTimedOut": "En dataforespørsel til %s fikk tidsavbrudd. Prøv igjen.",
"Required": "%s påkrevd",
- "ReturningVisitor": "Tilbakevendende besøkende",
+ "ReturningVisitor": "Tilbakevendende besøkere",
"ReturningVisitorAllVisits": "Vis alle besøk",
"RowEvolutionRowActionTooltip": "Se hvordan måltallet for raden endret seg over tid",
"RowEvolutionRowActionTooltipTitle": "Åpne radutvikling",
@@ -354,11 +357,14 @@
"TimeOnPage": "Tid på side",
"Total": "Totalt",
"TotalRatioTooltip": "Dette er %1$s av alle %2$s %3$s.",
- "TotalRevenue": "Total inntjening",
+ "TotalRevenue": "Totale inntekter",
"TotalVisitsPageviewsActionsRevenue": "(Totalt: %s besøk, %s sidevisninger, %s handlinger, %s inntekter)",
- "TransitionsRowActionTooltip": "Se hva besøkende gjorde før og etter å ha sett denne siden",
+ "TrackingScopeAction": "Handling",
+ "TrackingScopePage": "Side",
+ "TrackingScopeVisit": "Besøk",
+ "TransitionsRowActionTooltip": "Se hva besøkere gjorde før og etter å ha sett denne siden",
"TransitionsRowActionTooltipTitle": "Åpne overganger",
- "TranslatorName": "Hans Fredrik Nordhaug",
+ "TranslatorName": "Hans Fredrik Nordhaug, Peter Holme Obrestad",
"UniquePurchases": "Unike kjøp",
"Unknown": "Ukjent",
"Upload": "Last opp",
@@ -451,8 +457,8 @@
"NoDataShort": "Ingen data",
"NoPiwikAccount": "Ingen Piwik-konto?",
"NoReportsShort": "Ingen rapporter",
- "NoVisitorFound": "Ingen besøkende funnet",
- "NoVisitorsShort": "Ingen besøkende",
+ "NoVisitorFound": "Ingen besøkere funnet",
+ "NoVisitorsShort": "Ingen besøkere",
"NoWebsiteFound": "Ingen nettside funnet",
"NoWebsitesShort": "Ingen nettsteder",
"PullDownToRefresh": "Trekk ned for å oppdatere...",
@@ -487,7 +493,7 @@
"CompareRows": "Sammenlign oppføringer",
"ComparingRecords": "Sammenligner %s rader",
"Documentation": "Klikk måltallet for å vise det i den store utviklingsgrafen. Bruk SHIFT-klikk for å vise flere måltall på en gang.",
- "MetricBetweenText": "mellom %s og %s",
+ "MetricBetweenText": "fra %s til %s",
"MetricChangeText": "%s endring i perioden",
"MetricMinMax": "%1$s rangert mellom %2$s og %3$s i perioden",
"MetricsFor": "Måltall for %s",
diff --git a/libs/PiwikTracker b/libs/PiwikTracker
deleted file mode 160000
-Subproject ac3e26bb3e2c8a428ccbf6ca663c2ef37fa47a5
diff --git a/libs/PiwikTracker/PiwikTracker.php b/libs/PiwikTracker/PiwikTracker.php
new file mode 100644
index 0000000000..f5b6fad9aa
--- /dev/null
+++ b/libs/PiwikTracker/PiwikTracker.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+// PiwikTracker.php is now managed by composer. To prevent breaking existing
+// code, this file has been left as a redirect to its new location in the
+// vendor directory.
+if (!class_exists('PiwikTracker')) {
+ require_once __DIR__ . '/../../vendor/piwik/piwik-php-tracker/PiwikTracker.php';
+}
+
+if (PiwikTracker::VERSION !== 1) {
+ throw new Exception("Expected PiwikTracker in libs/PiwikTracker/PiwikTracker.php to be version 1 for keeping backward compatibility.");
+}
diff --git a/misc/log-analytics b/misc/log-analytics
-Subproject aa600c9a20049db05443c1ebd69f68190870247
+Subproject f0d8d9722962275ff72316904d82a35bc78930c
diff --git a/piwik.js b/piwik.js
index e16b81c991..72f7bf39d9 100644
--- a/piwik.js
+++ b/piwik.js
@@ -52,15 +52,15 @@ if(!ax(cB)&&cz.wasContentTargetAttrReplaced){S.setAnyAttribute(cz,n.CONTENT_TARG
for(cz=0;cz<cA.length;cz++){if(!n.isNodeVisible(cA[cz])){cA.splice(cz,1);cz--}}if(!cA||!cA.length){return[]}return bZ(cA)}function ak(cB,cz,cA){var cC=n.buildImpressionRequestParams(cB,cz,cA);return bU(cC,null,"contentImpression")}function cu(cC,cA){if(!cC){return}var cz=n.findParentContentNode(cC);var cB=n.buildContentBlock(cz);if(!cB){return}if(!cA){cA="Unknown"}return ar(cA,cB.name,cB.piece,cB.target)}function ca(cA,cC,cz,cB){return"e_c="+m(cA)+"&e_a="+m(cC)+(y(cz)?"&e_n="+m(cz):"")+(y(cB)?"&e_v="+m(cB):"")}function ad(cB,cD,cz,cC,cE){if(String(cB).length===0||String(cD).length===0){return false}var cA=bU(ca(cB,cD,cz,cC),cE,"event");ba(cA,bd)}function bC(cz,cC,cA,cD){var cB=bU("search="+m(cz)+(cC?"&search_cat="+m(cC):"")+(y(cA)?"&search_count="+cA:""),cD,"sitesearch");ba(cB,bd)}function ce(cz,cC,cB){var cA=bU("idgoal="+cz+(cC?"&revenue="+cC:""),cB,"goal");ba(cA,bd)}function cl(cC,cz,cG,cF,cB){var cE=cz+"="+m(bv(cC));var cA=bW(cB,"click",cC);if(cA){cE+="&"+cA}var cD=bU(cE,cG,"link");ba(cD,(cF?0:bd),cF)
}function bm(cA,cz){if(cA!==""){return cA+cz.charAt(0).toUpperCase()+cz.slice(1)}return cz}function bK(cE){var cD,cz,cC=["","webkit","ms","moz"],cB;if(!aQ){for(cz=0;cz<cC.length;cz++){cB=cC[cz];if(Object.prototype.hasOwnProperty.call(w,bm(cB,"hidden"))){if(w[bm(cB,"visibilityState")]==="prerender"){cD=true}break}}}if(cD){X(w,cB+"visibilitychange",function cA(){w.removeEventListener(cB+"visibilitychange",cA,false);cE()});return}cE()}function an(cz){if(w.readyState==="complete"){cz()}else{if(I.addEventListener){I.addEventListener("load",cz)}else{if(I.attachEvent){I.attachEvent("onLoad",cz)}}}}function aO(cA){var cz=false;if(w.attachEvent){cz=w.readyState==="complete"}else{cz=w.readyState!=="loading"}if(cz){cA()}else{if(w.addEventListener){w.addEventListener("DOMContentLoaded",cA)}else{if(w.attachEvent){w.attachEvent("onreadystatechange",cA)}}}}function b5(cz){var cA=ct(cz);if(cA&&cA.type){cA.href=j(cA.href);cl(cA.href,cA.type,undefined,null,cz)}}function bY(){return w.all&&!w.addEventListener
}function cg(cz){var cB=cz.which;var cA=(typeof cz.button);if(!cB&&cA!=="undefined"){if(bY()){if(cz.button&1){cB=1}else{if(cz.button&2){cB=3}else{if(cz.button&4){cB=2}}}}else{if(cz.button===0||cz.button==="0"){cB=1}else{if(cz.button&1){cB=2}else{if(cz.button&2){cB=3}}}}}return cB}function bn(cz){switch(cg(cz)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function aD(cz){return cz.target||cz.srcElement}function ag(cz){return function(cC){cC=cC||I.event;var cB=bn(cC);var cD=aD(cC);if(cC.type==="click"){var cA=false;if(cz&&cB==="middle"){cA=true}if(cD&&!cA){b5(cD)}}else{if(cC.type==="mousedown"){if(cB==="middle"&&cD){au=cB;a7=cD}else{au=a7=null}}else{if(cC.type==="mouseup"){if(cB===au&&cD===a7){b5(cD)}au=a7=null}else{if(cC.type==="contextmenu"){b5(cD)}}}}}}function aa(cA,cz){X(cA,"click",ag(cz),false);if(cz){X(cA,"mouseup",ag(cz),false);X(cA,"mousedown",ag(cz),false);X(cA,"contextmenu",ag(cz),false)}}function a8(cA){if(!Z){Z=true;var cB,cz=aC(a6,"ignore"),cC=w.links;if(cC){for(cB=0;
-cB<cC.length;cB++){if(!cz.test(cC[cB].className)){aa(cC[cB],cA)}}}}}function av(cB,cD,cE){if(bI){return true}bI=true;var cF=false;var cC,cA;function cz(){cF=true}an(function(){function cG(cI){setTimeout(function(){if(!bI){return}cF=false;cE.trackVisibleContentImpressions();cG(cI)},cI)}function cH(cI){setTimeout(function(){if(!bI){return}if(cF){cF=false;cE.trackVisibleContentImpressions()}cH(cI)},cI)}if(cB){cC=["scroll","resize"];for(cA=0;cA<cC.length;cA++){if(w.addEventListener){w.addEventListener(cC[cA],cz)}else{I.attachEvent("on"+cC[cA],cz)}}cH(100)}if(cD&&cD>0){cD=parseInt(cD,10);cG(cD)}})}function aK(cD,cF){var cE=bN(cD);var cC=bN(cF);if(!cE||cE==="/"||!cC||cC==="/"){return}var cB=A(cD);if(ab(cB,"/")){return}if(cm(cE,"/")){cE=aP(cE,1)}var cG=cE.split("/");var cA;for(cA=2;cA<cG.length;cA++){var cz=cG.slice(0,cA).join("/");if(ab(cB,cz)){cE=cz;break}}if(!aF(cC,cE)){return}return cE}function b3(){var cA,cB,cC={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"},cz=I.devicePixelRatio||1;
-if(!((new RegExp("MSIE")).test(e.userAgent))){if(e.mimeTypes&&e.mimeTypes.length){for(cA in cC){if(Object.prototype.hasOwnProperty.call(cC,cA)){cB=e.mimeTypes[cC[cA]];cq[cA]=(cB&&cB.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&y(e.javaEnabled)&&e.javaEnabled()){cq.java="1"}if(r(I.GearsFactory)){cq.gears="1"}cq.cookie=by()}cq.res=M.width*cz+"x"+M.height*cz}b3();aR();ao();return{getVisitorId:function(){return aA().uuid},getVisitorInfo:function(){return b9()},getAttributionInfo:function(){return bg()},getAttributionCampaignName:function(){return bg()[0]},getAttributionCampaignKeyword:function(){return bg()[1]},getAttributionReferrerTimestamp:function(){return bg()[2]},getAttributionReferrerUrl:function(){return bg()[3]},setTrackerUrl:function(cz){ai=cz},getTrackerUrl:function(){return ai},getSiteId:function(){return bz},setSiteId:function(cz){bw(cz)},setUserId:function(cz){if(!y(cz)||!cz.length){return}a5=cz;bi=bA(a5).substr(0,16)},getUserId:function(){return a5},setCustomData:function(cz,cA){if(L(cz)){Y=cz
-}else{if(!Y){Y={}}Y[cz]=cA}},getCustomData:function(){return Y},setCustomRequestProcessing:function(cz){bE=cz},appendToTrackingUrl:function(cz){cj=cz},getRequest:function(cz){return bU(cz)},addPlugin:function(cz,cA){a[cz]=cA},setCustomDimension:function(cz,cA){cz=parseInt(cz,10);if(cz>0){if(!y(cA)){cA=""}if(!o(cA)){cA=String(cA)}aV[cz]=cA}},getCustomDimension:function(cz){cz=parseInt(cz,10);if(cz>0&&Object.prototype.hasOwnProperty.call(aV,cz)){return aV[cz]}},deleteCustomDimension:function(cz){cz=parseInt(cz,10);if(cz>0){delete aV[cz]}},setCustomVariable:function(cA,cz,cD,cB){var cC;if(!y(cB)){cB="visit"}if(!y(cz)){return}if(!y(cD)){cD=""}if(cA>0){cz=!o(cz)?String(cz):cz;cD=!o(cD)?String(cD):cD;cC=[cz.slice(0,a1),cD.slice(0,a1)];if(cB==="visit"||cB===2){b2();at[cA]=cC}else{if(cB==="page"||cB===3){bp[cA]=cC}else{if(cB==="event"){bO[cA]=cC}}}}},getCustomVariable:function(cA,cB){var cz;if(!y(cB)){cB="visit"}if(cB==="page"||cB===3){cz=bp[cA]}else{if(cB==="event"){cz=bO[cA]}else{if(cB==="visit"||cB===2){b2();
-cz=at[cA]}}}if(!y(cz)||(cz&&cz[0]==="")){return false}return cz},deleteCustomVariable:function(cz,cA){if(this.getCustomVariable(cz,cA)){this.setCustomVariable(cz,"","",cA)}},storeCustomVariablesInCookie:function(){bk=true},setLinkTrackingTimer:function(cz){bd=cz},setDownloadExtensions:function(cz){if(o(cz)){cz=cz.split("|")}cp=cz},addDownloadExtensions:function(cA){var cz;if(o(cA)){cA=cA.split("|")}for(cz=0;cz<cA.length;cz++){cp.push(cA[cz])}},removeDownloadExtensions:function(cB){var cA,cz=[];if(o(cB)){cB=cB.split("|")}for(cA=0;cA<cp.length;cA++){if(B(cB,cp[cA])===-1){cz.push(cp[cA])}}cp=cz},setDomains:function(cz){ae=o(cz)?[cz]:cz;var cB=false,cA;for(cA in ae){if(Object.prototype.hasOwnProperty.call(ae,cA)&&b4(cf,A(String(ae[cA])))){cB=true;if(!aY){var cC=aK(ae[cA],bh);if(cC){this.setCookiePath(cC)}break}}}if(!cB){ae.push(cf)}},setIgnoreClasses:function(cz){a6=o(cz)?[cz]:cz},setRequestMethod:function(cz){cs=cz||bL},setRequestContentType:function(cz){bX=cz||am},setReferrerUrl:function(cz){aW=cz
-},setCustomUrl:function(cz){aG=bo(bh,cz)},setDocumentTitle:function(cz){aS=cz},setAPIUrl:function(cz){bc=cz},setDownloadClasses:function(cz){bf=o(cz)?[cz]:cz},setLinkClasses:function(cz){aJ=o(cz)?[cz]:cz},setCampaignNameKey:function(cz){bT=o(cz)?[cz]:cz},setCampaignKeywordKey:function(cz){bb=o(cz)?[cz]:cz},discardHashTag:function(cz){bj=cz},setCookieNamePrefix:function(cz){aT=cz;at=bq()},setCookieDomain:function(cz){var cA=A(cz);if(a3(cA)){ch=cA;aR()}},setCookiePath:function(cz){aY=cz;aR()},setVisitorCookieTimeout:function(cz){b7=cz*1000},setSessionCookieTimeout:function(cz){bR=cz*1000},setReferralCookieTimeout:function(cz){co=cz*1000},setConversionAttributionFirstReferrer:function(cz){a2=cz},disableCookies:function(){aU=true;cq.cookie="0";if(bz){aj()}},deleteCookies:function(){aj()},setDoNotTrack:function(cA){var cz=e.doNotTrack||e.msDoNotTrack;cb=cA&&(cz==="yes"||cz==="1");if(cb){this.disableCookies()}},addListener:function(cA,cz){aa(cA,cz)},enableLinkTracking:function(cz){cr=true;if(q){a8(cz)
-}else{G.push(function(){a8(cz)})}},enableJSErrorTracking:function(){if(cd){return}cd=true;var cz=I.onerror;I.onerror=function(cE,cC,cB,cD,cA){bK(function(){var cF="JavaScript Errors";var cG=cC+":"+cB;if(cD){cG+=":"+cD}ad(cF,cG,cE)});if(cz){return cz(cE,cC,cB,cD,cA)}return false}},disablePerformanceTracking:function(){aE=false},setGenerationTimeMs:function(cz){bP=parseInt(cz,10)},enableHeartBeatTimer:function(cz){cz=Math.max(cz,1);aH=(cz||15)*1000;if(ci!==null){cx()}},killFrame:function(){if(I.location!==I.top.location){I.top.location=I.location}},redirectFile:function(cz){if(I.location.protocol==="file:"){I.location=cz}},setCountPreRendered:function(cz){aQ=cz},trackGoal:function(cz,cB,cA){bK(function(){ce(cz,cB,cA)})},trackLink:function(cA,cz,cC,cB){bK(function(){cl(cA,cz,cC,cB)})},trackPageView:function(cz,cA){bD=[];if(C(bz)){bK(function(){O(ai,bc,bz)})}else{bK(function(){bt(cz,cA)})}},trackAllContentImpressions:function(){if(C(bz)){return}bK(function(){aO(function(){var cz=n.findContentNodes();
-var cA=bZ(cz);cw(cA,bd)})})},trackVisibleContentImpressions:function(cz,cA){if(C(bz)){return}if(!y(cz)){cz=true}if(!y(cA)){cA=750}av(cz,cA,this);bK(function(){an(function(){var cB=n.findContentNodes();var cC=aL(cB);cw(cC,bd)})})},trackContentImpression:function(cB,cz,cA){if(C(bz)){return}if(!cB){return}cz=cz||"Unknown";bK(function(){var cC=ak(cB,cz,cA);ba(cC,bd)})},trackContentImpressionsWithinNode:function(cz){if(C(bz)||!cz){return}bK(function(){if(bI){an(function(){var cA=n.findContentNodesWithinNode(cz);var cB=aL(cA);cw(cB,bd)})}else{aO(function(){var cA=n.findContentNodesWithinNode(cz);var cB=bZ(cA);cw(cB,bd)})}})},trackContentInteraction:function(cB,cC,cz,cA){if(C(bz)){return}if(!cB||!cC){return}cz=cz||"Unknown";bK(function(){var cD=ar(cB,cC,cz,cA);ba(cD,bd)})},trackContentInteractionNode:function(cA,cz){if(C(bz)||!cA){return}bK(function(){var cB=cu(cA,cz);ba(cB,bd)})},logAllContentBlocksOnPage:function(){var cA=n.findContentNodes();var cz=n.collectContent(cA);if(console!==undefined&&console&&console.log){console.log(cz)
-}},trackEvent:function(cA,cC,cz,cB,cD){bK(function(){ad(cA,cC,cz,cB,cD)})},trackSiteSearch:function(cz,cB,cA,cC){bK(function(){bC(cz,cB,cA,cC)})},setEcommerceView:function(cC,cz,cB,cA){if(!y(cB)||!cB.length){cB=""}else{if(cB instanceof Array){cB=JSON2.stringify(cB)}}bp[5]=["_pkc",cB];if(y(cA)&&String(cA).length){bp[2]=["_pkp",cA]}if((!y(cC)||!cC.length)&&(!y(cz)||!cz.length)){return}if(y(cC)&&cC.length){bp[3]=["_pks",cC]}if(!y(cz)||!cz.length){cz=""}bp[4]=["_pkn",cz]},addEcommerceItem:function(cD,cz,cB,cA,cC){if(cD.length){ck[cD]=[cD,cz,cB,cA,cC]}},trackEcommerceOrder:function(cz,cD,cC,cB,cA,cE){bs(cz,cD,cC,cB,cA,cE)},trackEcommerceCartUpdate:function(cz){a0(cz)}}}function x(){return{push:T}}function b(ad,ac){var ae={};var aa,ab;for(aa=0;aa<ac.length;aa++){var Y=ac[aa];ae[Y]=1;for(ab=0;ab<ad.length;ab++){if(ad[ab]&&ad[ab][0]){var Z=ad[ab][0];if(Y===Z){T(ad[ab]);delete ad[ab];if(ae[Z]>1){if(console!==undefined&&console&&console.error){console.error("The method "+Z+' is registered more than once in "paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')
-}}ae[Z]++}}}}return ad}X(I,"beforeunload",U,false);p();Date.prototype.getTimeAlias=Date.prototype.getTime;N=new F();var t=["disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"];_paq=b(_paq,t);for(v=0;v<_paq.length;v++){if(_paq[v]){T(_paq[v])}}_paq=new x();d={addPlugin:function(Y,Z){a[Y]=Z},getTracker:function(Y,Z){if(!y(Z)){Z=this.getAsyncTracker().getSiteId()}if(!y(Y)){Y=this.getAsyncTracker().getTrackerUrl()}return new F(Y,Z)},getAsyncTracker:function(){return N}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return d})}return d}())}if(window&&window.piwikAsyncInit){window.piwikAsyncInit()}(function(){var a=(typeof AnalyticsTracker);if(a==="undefined"){AnalyticsTracker=Piwik}}());if(typeof piwik_log!=="function"){piwik_log=function(b,f,d,g){function a(h){try{if(window["piwik_"+h]){return window["piwik_"+h]}}catch(i){}return}var c,e=Piwik.getTracker(d,f);e.setDocumentTitle(b);e.setCustomData(g);
-c=a("tracker_pause");if(c){e.setLinkTrackingTimer(c)}c=a("download_extensions");if(c){e.setDownloadExtensions(c)}c=a("hosts_alias");if(c){e.setDomains(c)}c=a("ignore_classes");if(c){e.setIgnoreClasses(c)}e.trackPageView();if(a("install_tracker")){piwik_track=function(i,k,j,h){e.setSiteId(k);e.setTrackerUrl(j);e.trackLink(i,h)};e.enableLinkTracking()}};
+cB<cC.length;cB++){if(!cz.test(cC[cB].className)){aa(cC[cB],cA)}}}}}function av(cB,cD,cE){if(bI){return true}bI=true;var cF=false;var cC,cA;function cz(){cF=true}an(function(){function cG(cI){setTimeout(function(){if(!bI){return}cF=false;cE.trackVisibleContentImpressions();cG(cI)},cI)}function cH(cI){setTimeout(function(){if(!bI){return}if(cF){cF=false;cE.trackVisibleContentImpressions()}cH(cI)},cI)}if(cB){cC=["scroll","resize"];for(cA=0;cA<cC.length;cA++){if(w.addEventListener){w.addEventListener(cC[cA],cz)}else{I.attachEvent("on"+cC[cA],cz)}}cH(100)}if(cD&&cD>0){cD=parseInt(cD,10);cG(cD)}})}function aK(cD,cF){var cE=bN(cD);var cC=bN(cF);if(!cE||cE==="/"||!cC||cC==="/"){return}var cB=A(cD);if(ab(cB,"/")){return}if(cm(cE,"/")){cE=aP(cE,1)}var cG=cE.split("/");var cA;for(cA=2;cA<cG.length;cA++){var cz=cG.slice(0,cA).join("/");if(ab(cB,cz)){cE=cz;break}}if(!aF(cC,cE)){return}return cE}function b3(){var cB,cD,cE={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"},cA=I.devicePixelRatio||1;
+if(!((new RegExp("MSIE")).test(e.userAgent))){if(e.mimeTypes&&e.mimeTypes.length){for(cB in cE){if(Object.prototype.hasOwnProperty.call(cE,cB)){cD=e.mimeTypes[cE[cB]];cq[cB]=(cD&&cD.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&y(e.javaEnabled)&&e.javaEnabled()){cq.java="1"}if(r(I.GearsFactory)){cq.gears="1"}cq.cookie=by()}var cC=parseInt(M.width,10)*cA;var cz=parseInt(M.height,10)*cA;cq.res=parseInt(cC,10)+"x"+parseInt(cz,10)}b3();aR();ao();return{getVisitorId:function(){return aA().uuid},getVisitorInfo:function(){return b9()},getAttributionInfo:function(){return bg()},getAttributionCampaignName:function(){return bg()[0]},getAttributionCampaignKeyword:function(){return bg()[1]},getAttributionReferrerTimestamp:function(){return bg()[2]},getAttributionReferrerUrl:function(){return bg()[3]},setTrackerUrl:function(cz){ai=cz},getTrackerUrl:function(){return ai},getSiteId:function(){return bz},setSiteId:function(cz){bw(cz)},setUserId:function(cz){if(!y(cz)||!cz.length){return
+}a5=cz;bi=bA(a5).substr(0,16)},getUserId:function(){return a5},setCustomData:function(cz,cA){if(L(cz)){Y=cz}else{if(!Y){Y={}}Y[cz]=cA}},getCustomData:function(){return Y},setCustomRequestProcessing:function(cz){bE=cz},appendToTrackingUrl:function(cz){cj=cz},getRequest:function(cz){return bU(cz)},addPlugin:function(cz,cA){a[cz]=cA},setCustomDimension:function(cz,cA){cz=parseInt(cz,10);if(cz>0){if(!y(cA)){cA=""}if(!o(cA)){cA=String(cA)}aV[cz]=cA}},getCustomDimension:function(cz){cz=parseInt(cz,10);if(cz>0&&Object.prototype.hasOwnProperty.call(aV,cz)){return aV[cz]}},deleteCustomDimension:function(cz){cz=parseInt(cz,10);if(cz>0){delete aV[cz]}},setCustomVariable:function(cA,cz,cD,cB){var cC;if(!y(cB)){cB="visit"}if(!y(cz)){return}if(!y(cD)){cD=""}if(cA>0){cz=!o(cz)?String(cz):cz;cD=!o(cD)?String(cD):cD;cC=[cz.slice(0,a1),cD.slice(0,a1)];if(cB==="visit"||cB===2){b2();at[cA]=cC}else{if(cB==="page"||cB===3){bp[cA]=cC}else{if(cB==="event"){bO[cA]=cC}}}}},getCustomVariable:function(cA,cB){var cz;
+if(!y(cB)){cB="visit"}if(cB==="page"||cB===3){cz=bp[cA]}else{if(cB==="event"){cz=bO[cA]}else{if(cB==="visit"||cB===2){b2();cz=at[cA]}}}if(!y(cz)||(cz&&cz[0]==="")){return false}return cz},deleteCustomVariable:function(cz,cA){if(this.getCustomVariable(cz,cA)){this.setCustomVariable(cz,"","",cA)}},storeCustomVariablesInCookie:function(){bk=true},setLinkTrackingTimer:function(cz){bd=cz},setDownloadExtensions:function(cz){if(o(cz)){cz=cz.split("|")}cp=cz},addDownloadExtensions:function(cA){var cz;if(o(cA)){cA=cA.split("|")}for(cz=0;cz<cA.length;cz++){cp.push(cA[cz])}},removeDownloadExtensions:function(cB){var cA,cz=[];if(o(cB)){cB=cB.split("|")}for(cA=0;cA<cp.length;cA++){if(B(cB,cp[cA])===-1){cz.push(cp[cA])}}cp=cz},setDomains:function(cz){ae=o(cz)?[cz]:cz;var cB=false,cA;for(cA in ae){if(Object.prototype.hasOwnProperty.call(ae,cA)&&b4(cf,A(String(ae[cA])))){cB=true;if(!aY){var cC=aK(ae[cA],bh);if(cC){this.setCookiePath(cC)}break}}}if(!cB){ae.push(cf)}},setIgnoreClasses:function(cz){a6=o(cz)?[cz]:cz
+},setRequestMethod:function(cz){cs=cz||bL},setRequestContentType:function(cz){bX=cz||am},setReferrerUrl:function(cz){aW=cz},setCustomUrl:function(cz){aG=bo(bh,cz)},setDocumentTitle:function(cz){aS=cz},setAPIUrl:function(cz){bc=cz},setDownloadClasses:function(cz){bf=o(cz)?[cz]:cz},setLinkClasses:function(cz){aJ=o(cz)?[cz]:cz},setCampaignNameKey:function(cz){bT=o(cz)?[cz]:cz},setCampaignKeywordKey:function(cz){bb=o(cz)?[cz]:cz},discardHashTag:function(cz){bj=cz},setCookieNamePrefix:function(cz){aT=cz;at=bq()},setCookieDomain:function(cz){var cA=A(cz);if(a3(cA)){ch=cA;aR()}},setCookiePath:function(cz){aY=cz;aR()},setVisitorCookieTimeout:function(cz){b7=cz*1000},setSessionCookieTimeout:function(cz){bR=cz*1000},setReferralCookieTimeout:function(cz){co=cz*1000},setConversionAttributionFirstReferrer:function(cz){a2=cz},disableCookies:function(){aU=true;cq.cookie="0";if(bz){aj()}},deleteCookies:function(){aj()},setDoNotTrack:function(cA){var cz=e.doNotTrack||e.msDoNotTrack;cb=cA&&(cz==="yes"||cz==="1");
+if(cb){this.disableCookies()}},addListener:function(cA,cz){aa(cA,cz)},enableLinkTracking:function(cz){cr=true;if(q){a8(cz)}else{G.push(function(){a8(cz)})}},enableJSErrorTracking:function(){if(cd){return}cd=true;var cz=I.onerror;I.onerror=function(cE,cC,cB,cD,cA){bK(function(){var cF="JavaScript Errors";var cG=cC+":"+cB;if(cD){cG+=":"+cD}ad(cF,cG,cE)});if(cz){return cz(cE,cC,cB,cD,cA)}return false}},disablePerformanceTracking:function(){aE=false},setGenerationTimeMs:function(cz){bP=parseInt(cz,10)},enableHeartBeatTimer:function(cz){cz=Math.max(cz,1);aH=(cz||15)*1000;if(ci!==null){cx()}},killFrame:function(){if(I.location!==I.top.location){I.top.location=I.location}},redirectFile:function(cz){if(I.location.protocol==="file:"){I.location=cz}},setCountPreRendered:function(cz){aQ=cz},trackGoal:function(cz,cB,cA){bK(function(){ce(cz,cB,cA)})},trackLink:function(cA,cz,cC,cB){bK(function(){cl(cA,cz,cC,cB)})},trackPageView:function(cz,cA){bD=[];if(C(bz)){bK(function(){O(ai,bc,bz)})}else{bK(function(){bt(cz,cA)
+})}},trackAllContentImpressions:function(){if(C(bz)){return}bK(function(){aO(function(){var cz=n.findContentNodes();var cA=bZ(cz);cw(cA,bd)})})},trackVisibleContentImpressions:function(cz,cA){if(C(bz)){return}if(!y(cz)){cz=true}if(!y(cA)){cA=750}av(cz,cA,this);bK(function(){an(function(){var cB=n.findContentNodes();var cC=aL(cB);cw(cC,bd)})})},trackContentImpression:function(cB,cz,cA){if(C(bz)){return}if(!cB){return}cz=cz||"Unknown";bK(function(){var cC=ak(cB,cz,cA);ba(cC,bd)})},trackContentImpressionsWithinNode:function(cz){if(C(bz)||!cz){return}bK(function(){if(bI){an(function(){var cA=n.findContentNodesWithinNode(cz);var cB=aL(cA);cw(cB,bd)})}else{aO(function(){var cA=n.findContentNodesWithinNode(cz);var cB=bZ(cA);cw(cB,bd)})}})},trackContentInteraction:function(cB,cC,cz,cA){if(C(bz)){return}if(!cB||!cC){return}cz=cz||"Unknown";bK(function(){var cD=ar(cB,cC,cz,cA);ba(cD,bd)})},trackContentInteractionNode:function(cA,cz){if(C(bz)||!cA){return}bK(function(){var cB=cu(cA,cz);ba(cB,bd)})
+},logAllContentBlocksOnPage:function(){var cA=n.findContentNodes();var cz=n.collectContent(cA);if(console!==undefined&&console&&console.log){console.log(cz)}},trackEvent:function(cA,cC,cz,cB,cD){bK(function(){ad(cA,cC,cz,cB,cD)})},trackSiteSearch:function(cz,cB,cA,cC){bK(function(){bC(cz,cB,cA,cC)})},setEcommerceView:function(cC,cz,cB,cA){if(!y(cB)||!cB.length){cB=""}else{if(cB instanceof Array){cB=JSON2.stringify(cB)}}bp[5]=["_pkc",cB];if(y(cA)&&String(cA).length){bp[2]=["_pkp",cA]}if((!y(cC)||!cC.length)&&(!y(cz)||!cz.length)){return}if(y(cC)&&cC.length){bp[3]=["_pks",cC]}if(!y(cz)||!cz.length){cz=""}bp[4]=["_pkn",cz]},addEcommerceItem:function(cD,cz,cB,cA,cC){if(cD.length){ck[cD]=[cD,cz,cB,cA,cC]}},trackEcommerceOrder:function(cz,cD,cC,cB,cA,cE){bs(cz,cD,cC,cB,cA,cE)},trackEcommerceCartUpdate:function(cz){a0(cz)}}}function x(){return{push:T}}function b(ad,ac){var ae={};var aa,ab;for(aa=0;aa<ac.length;aa++){var Y=ac[aa];ae[Y]=1;for(ab=0;ab<ad.length;ab++){if(ad[ab]&&ad[ab][0]){var Z=ad[ab][0];
+if(Y===Z){T(ad[ab]);delete ad[ab];if(ae[Z]>1){if(console!==undefined&&console&&console.error){console.error("The method "+Z+' is registered more than once in "paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}}ae[Z]++}}}}return ad}X(I,"beforeunload",U,false);p();Date.prototype.getTimeAlias=Date.prototype.getTime;N=new F();var t=["disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"];_paq=b(_paq,t);for(v=0;v<_paq.length;v++){if(_paq[v]){T(_paq[v])}}_paq=new x();d={addPlugin:function(Y,Z){a[Y]=Z},getTracker:function(Y,Z){if(!y(Z)){Z=this.getAsyncTracker().getSiteId()}if(!y(Y)){Y=this.getAsyncTracker().getTrackerUrl()}return new F(Y,Z)},getAsyncTracker:function(){return N}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return d})}return d
+}())}if(window&&window.piwikAsyncInit){window.piwikAsyncInit()}(function(){var a=(typeof AnalyticsTracker);if(a==="undefined"){AnalyticsTracker=Piwik}}());if(typeof piwik_log!=="function"){piwik_log=function(b,f,d,g){function a(h){try{if(window["piwik_"+h]){return window["piwik_"+h]}}catch(i){}return}var c,e=Piwik.getTracker(d,f);e.setDocumentTitle(b);e.setCustomData(g);c=a("tracker_pause");if(c){e.setLinkTrackingTimer(c)}c=a("download_extensions");if(c){e.setDownloadExtensions(c)}c=a("hosts_alias");if(c){e.setDomains(c)}c=a("ignore_classes");if(c){e.setIgnoreClasses(c)}e.trackPageView();if(a("install_tracker")){piwik_track=function(i,k,j,h){e.setSiteId(k);e.setTrackerUrl(j);e.trackLink(i,h)};e.enableLinkTracking()}};
/*! @license-end */
}; \ No newline at end of file
diff --git a/plugins/API/Controller.php b/plugins/API/Controller.php
index 3f5f96d9de..5a15c6dbe7 100644
--- a/plugins/API/Controller.php
+++ b/plugins/API/Controller.php
@@ -13,7 +13,6 @@ use Piwik\API\Proxy;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\Config;
-use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Url;
diff --git a/plugins/API/RowEvolution.php b/plugins/API/RowEvolution.php
index 711a48316c..b8afec8e39 100644
--- a/plugins/API/RowEvolution.php
+++ b/plugins/API/RowEvolution.php
@@ -12,7 +12,6 @@ use Exception;
use Piwik\API\DataTableManipulator\LabelFilter;
use Piwik\API\DataTablePostProcessor;
use Piwik\API\Request;
-use Piwik\API\ResponseBuilder;
use Piwik\Common;
use Piwik\DataTable;
use Piwik\DataTable\Filter\CalculateEvolutionFilter;
diff --git a/plugins/API/lang/ko.json b/plugins/API/lang/ko.json
index 2f04051378..b64a0e4b5b 100644
--- a/plugins/API/lang/ko.json
+++ b/plugins/API/lang/ko.json
@@ -4,6 +4,8 @@
"KeepTokenSecret": "token_auth는 외부 로그인을 위한 비밀키입니다. %s 절대로 공유하지 마세요 %s!",
"LoadedAPIs": "성공적으로 %s API를 불러옴",
"MoreInformation": "Piwik API에 대한 자세한 내용은 %sIntroduction to Piwik API %s 문서와 %sPiwik API Reference%s 문서를 참조하세요.",
+ "PluginDescription": "Piwik 내 모든 데이터는 간단한 API를 통해서 접근할 수 있습니다. 이 플러그인은 웹 분석 데이터를 xml, json, php, csv 등의 형태로 받을 수 있는 웹 서비스 진입로입니다.",
+ "ReportingApiReference": "API 레퍼런스 보고",
"TopLinkTooltip": "JSON, XML 등의 간단한 API를 통해 프로그래밍 방식으로 웹 로그 분석 데이터에 접근할 수 있습니다.",
"UserAuthentication": "사용자 인증",
"UsingTokenAuth": "%s 스크립트 (crontab 등)에서 요청 데이터를 얻고 싶다면 %s는 API를 호출하는 URL (인증 필요)에 매개 변수 %s를 추가해야합니다.",
diff --git a/plugins/API/lang/nb.json b/plugins/API/lang/nb.json
index cd56984f85..c659502646 100644
--- a/plugins/API/lang/nb.json
+++ b/plugins/API/lang/nb.json
@@ -1,7 +1,15 @@
{
"API": {
- "LoadedAPIs": "Lastet %s API",
+ "GenerateVisits": "Hvis du ikke har data for i dag kan du først generere noe data med utvidelsen %s. Du kan aktivere %s, så klikker du på «Besøksgenerator»-menyen i Piwik admin.",
+ "KeepTokenSecret": "Denne token_auth er like hemmelig som ditt brukernavn og passord. %sIkke del den!%s",
+ "LoadedAPIs": "Lastet %s API-er",
+ "MoreInformation": "For mer informasjon om Piwik API-er, vennligst se på %s Introduction to Piwik API %s og %s Piwik API Reference %s.",
+ "PluginDescription": "Alle data i Piwik er tilgjengelig gjennom enkle API-er. Denne utvidelsen er web-tjenestens inngangspunkt, som du kan kalle opp for å få ut dine data i xml, json, php, csv, etc.",
+ "ReportingApiReference": "Referanse for rapporterings-API",
+ "TopLinkTooltip": "Få tilgang til dine analysedata programmatisk gjennom en enkel API i json, xml, etc.",
"UserAuthentication": "Brukerautentisering",
- "Glossary": "Ordliste"
+ "UsingTokenAuth": "Hvis du vil %s spørre etter data i et script, en crontab, etc. %s må du legge til parameteret %s til API-spørringer som krever autentisering.",
+ "Glossary": "Ordliste",
+ "LearnAboutCommonlyUsedTerms": "Lær mer om vanlige termer for å få mest mulig ut av Piwik Analytics: %s og %s."
}
} \ No newline at end of file
diff --git a/plugins/API/tests/Integration/RssRendererTest.php b/plugins/API/tests/Integration/RssRendererTest.php
index daf73d5a8c..555e3f6bcd 100644
--- a/plugins/API/tests/Integration/RssRendererTest.php
+++ b/plugins/API/tests/Integration/RssRendererTest.php
@@ -8,7 +8,6 @@
namespace Piwik\Plugins\API\tests\Integration;
-use Piwik\Access;
use Piwik\DataTable;
use Piwik\Plugins\API\Renderer\Rss;
use Piwik\Tests\Framework\Fixture;
diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php
index b42ccf2539..38ccbc229c 100644
--- a/plugins/Actions/Actions.php
+++ b/plugins/Actions/Actions.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\Actions;
use Piwik\ArchiveProcessor;
-use Piwik\Common;
use Piwik\Db;
use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines;
use Piwik\Site;
diff --git a/plugins/Actions/Metrics.php b/plugins/Actions/Metrics.php
index 006fd6043d..d7aa94fc80 100644
--- a/plugins/Actions/Metrics.php
+++ b/plugins/Actions/Metrics.php
@@ -11,9 +11,7 @@ namespace Piwik\Plugins\Actions;
use Piwik\DataTable;
use Piwik\Metrics as PiwikMetrics;
use Piwik\Piwik;
-use Piwik\RankingQuery;
use Piwik\Tracker\Action;
-use Piwik\Plugins\Actions\Actions\ActionSiteSearch;
/**
* Class encapsulating logic to process Day/Period Archiving for the Actions reports
diff --git a/plugins/Actions/Reports/GetEntryPageUrls.php b/plugins/Actions/Reports/GetEntryPageUrls.php
index c934c7ab10..dfeeb8cf04 100644
--- a/plugins/Actions/Reports/GetEntryPageUrls.php
+++ b/plugins/Actions/Reports/GetEntryPageUrls.php
@@ -8,10 +8,8 @@
*/
namespace Piwik\Plugins\Actions\Reports;
-use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
-use Piwik\API\Request;
use Piwik\Plugins\Actions\Columns\EntryPageUrl;
use Piwik\Plugins\Actions\Columns\Metrics\AveragePageGenerationTime;
use Piwik\Plugins\Actions\Columns\Metrics\AverageTimeOnPage;
diff --git a/plugins/Actions/Reports/GetExitPageUrls.php b/plugins/Actions/Reports/GetExitPageUrls.php
index f46ac478cd..bc4d29782d 100644
--- a/plugins/Actions/Reports/GetExitPageUrls.php
+++ b/plugins/Actions/Reports/GetExitPageUrls.php
@@ -8,7 +8,6 @@
*/
namespace Piwik\Plugins\Actions\Reports;
-use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
use Piwik\API\Request;
diff --git a/plugins/Actions/Reports/GetPageTitles.php b/plugins/Actions/Reports/GetPageTitles.php
index 0c70086611..ed1846ddd6 100644
--- a/plugins/Actions/Reports/GetPageTitles.php
+++ b/plugins/Actions/Reports/GetPageTitles.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\Actions\Reports;
use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
use Piwik\API\Request;
-use Piwik\Common;
use Piwik\Plugins\Actions\Columns\PageTitle;
use Piwik\Plugins\Actions\Columns\Metrics\AveragePageGenerationTime;
use Piwik\Plugins\Actions\Columns\Metrics\AverageTimeOnPage;
diff --git a/plugins/Actions/lang/cs.json b/plugins/Actions/lang/cs.json
index 5b63d05d60..77c1aabb5b 100644
--- a/plugins/Actions/lang/cs.json
+++ b/plugins/Actions/lang/cs.json
@@ -61,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Stránky po hledání na stránce",
"WidgetSearchCategories": "Vyhledávání kategorií",
"WidgetSearchKeywords": "Klíčová slova hledané stránky",
- "WidgetSearchNoResultKeywords": "Hledaná Klíčová slova bez výsledku hledání"
+ "WidgetSearchNoResultKeywords": "Hledaná Klíčová slova bez výsledku hledání",
+ "ActionType": "Typ akce"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/el.json b/plugins/Actions/lang/el.json
index a495f92138..5efdf4a061 100644
--- a/plugins/Actions/lang/el.json
+++ b/plugins/Actions/lang/el.json
@@ -61,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Σελίδες που Ακολουθούν μια Αναζήτηση Ιστοσελίδας",
"WidgetSearchCategories": "Κατηγορίες Αναζήτησης",
"WidgetSearchKeywords": "Λέξεις-κλειδιά Αναζήτησης Ιστοσελίδας",
- "WidgetSearchNoResultKeywords": "Λέξεις-κλειδιά Χωρίς Αποτελέσματα"
+ "WidgetSearchNoResultKeywords": "Λέξεις-κλειδιά Χωρίς Αποτελέσματα",
+ "ActionType": "Τύπος Ενέργειας"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/fr.json b/plugins/Actions/lang/fr.json
index 261b0e9016..5778686435 100644
--- a/plugins/Actions/lang/fr.json
+++ b/plugins/Actions/lang/fr.json
@@ -2,6 +2,7 @@
"Actions": {
"AvgGenerationTimeTooltip": "Moyenne basée sur %s entrée(s) sur %s entre %s et %s",
"ColumnClickedURL": "URL cliquées",
+ "ColumnActionURL": "URL d'action",
"ColumnClicks": "Clics",
"ColumnClicksDocumentation": "Nombre de clics sur ce lien.",
"ColumnDownloadURL": "URL de téléchargement",
@@ -60,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Pages après une recherche",
"WidgetSearchCategories": "Catégories de recherche",
"WidgetSearchKeywords": "Mot-clés recherchés sur le site",
- "WidgetSearchNoResultKeywords": "Mots-clés sans résultats"
+ "WidgetSearchNoResultKeywords": "Mots-clés sans résultats",
+ "ActionType": "Type d'action"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/hu.json b/plugins/Actions/lang/hu.json
index 728fe6abd5..da97381cb1 100644
--- a/plugins/Actions/lang/hu.json
+++ b/plugins/Actions/lang/hu.json
@@ -1,6 +1,7 @@
{
"Actions": {
"ColumnClickedURL": "Kattintott URL",
+ "ColumnActionURL": "Akció URL",
"ColumnClicks": "Kattintások",
"ColumnClicksDocumentation": "Erre a linkre történt kattintások száma.",
"ColumnDownloadURL": "Letöltött URL",
@@ -11,6 +12,7 @@
"ColumnNoResultKeyword": "Kulcszó keresőtalálat nélkül",
"ColumnPageName": "Weblap címe",
"ColumnPagesPerSearch": "Kereső találati oldalak",
+ "ColumnPagesPerSearchDocumentation": "Látogatók keresni fognak az ön weboldalán és néha rákattintanak a \"következő\" gombra a további találatok miatt. Ez az átlagosan megtekintett keresési találatok száma erre a kulcsszóra.",
"ColumnPageURL": "Weblap URL-je",
"ColumnSearchCategory": "Kategória keresés",
"ColumnSearches": "Keresések",
@@ -40,6 +42,8 @@
"WidgetPagesExit": "Kilépési lapok",
"WidgetPageTitles": "Oldalak címe",
"WidgetSearchCategories": "Keresés kategóriák",
- "WidgetSearchKeywords": "Oldal keresés kulcsszavak"
+ "WidgetSearchKeywords": "Oldal keresés kulcsszavak",
+ "WidgetSearchNoResultKeywords": "Kulcsszavak, melyekre nincs találat",
+ "ActionType": "Akció típusa"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/it.json b/plugins/Actions/lang/it.json
index d727a00bbc..f65519415f 100644
--- a/plugins/Actions/lang/it.json
+++ b/plugins/Actions/lang/it.json
@@ -61,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Pagine risultanti da una Ricerca sul Sito",
"WidgetSearchCategories": "Categorie di Ricerca",
"WidgetSearchKeywords": "Parole Chiave di Ricerca sul Sito",
- "WidgetSearchNoResultKeywords": "Parole Chiave di Ricerca senza risultati"
+ "WidgetSearchNoResultKeywords": "Parole Chiave di Ricerca senza risultati",
+ "ActionType": "Tipo di Azione"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/ko.json b/plugins/Actions/lang/ko.json
index fa9f7d2257..34288ee774 100644
--- a/plugins/Actions/lang/ko.json
+++ b/plugins/Actions/lang/ko.json
@@ -60,6 +60,7 @@
"WidgetPageUrlsFollowingSearch": "페이지별 사이트 검색",
"WidgetSearchCategories": "검색 카테고리",
"WidgetSearchKeywords": "사이트 검색어",
- "WidgetSearchNoResultKeywords": "검색 결과 없음"
+ "WidgetSearchNoResultKeywords": "검색 결과 없음",
+ "ActionType": "활동 종류"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/nb.json b/plugins/Actions/lang/nb.json
index 18ab7471b9..80e5c25863 100644
--- a/plugins/Actions/lang/nb.json
+++ b/plugins/Actions/lang/nb.json
@@ -2,6 +2,7 @@
"Actions": {
"AvgGenerationTimeTooltip": "Gjennomsnitt basert på %s treff %s mellom %s og %s",
"ColumnClickedURL": "Klikket URL",
+ "ColumnActionURL": "Handlings-URL",
"ColumnClicks": "Klikk",
"ColumnClicksDocumentation": "Antall klikk på denne lenken",
"ColumnDownloadURL": "Nedlastings-URL",
@@ -27,7 +28,7 @@
"ColumnUniqueOutlinks": "Unike utlenker",
"DownloadsReportDocumentation": "I denne rapporten kan du se hvilke filer de besøkende har lastet ned. %s Hva Piwik teller som en nedlasting, er klikket på en nedlastingslink. Om nedlastingen ble fullført eller ikke er ikke kjent for Piwik.",
"EntryPagesReportDocumentation": "Denne rapporten inneholder informasjon om inngangssidene som ble brukt i løpet av den angitte perioden. En inngangsside er den første siden en bruker ser i løpet av besøket. %s Inngangs-URLen vises som en mappestruktur.",
- "EntryPageTitles": "Inngangssidetitler",
+ "EntryPageTitles": "Titler på inngangssider",
"EntryPageTitlesReportDocumentation": "Denne rapporten inneholder informasjon om titler på inngangssider som ble brukt i løpet av den angitte perioden.",
"ExitPagesReportDocumentation": "Denne rapporten inneholder informasjon om utgangssidene som ble brukt i den angitte perioden. En utgangsside er den siste siden en bruker ser i løpet av besøket. %s Utgangs-URLene vises som en mappestruktur.",
"ExitPageTitles": "Titler på utgangssider",
@@ -60,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Sider som følger etter et nettstedssøk",
"WidgetSearchCategories": "Søkekategorier",
"WidgetSearchKeywords": "Nøkkelord for sidesøk",
- "WidgetSearchNoResultKeywords": "Nøkkelord uten resultater"
+ "WidgetSearchNoResultKeywords": "Nøkkelord uten resultater",
+ "ActionType": "Handlingstype"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/pt-br.json b/plugins/Actions/lang/pt-br.json
index 41d3f88a93..533814d0ec 100644
--- a/plugins/Actions/lang/pt-br.json
+++ b/plugins/Actions/lang/pt-br.json
@@ -61,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Seguintes páginas contêm uma pesquisa no site",
"WidgetSearchCategories": "Categorias de busca",
"WidgetSearchKeywords": "Busca local por Palavras-Chave",
- "WidgetSearchNoResultKeywords": "Palavras-Chave de Pesquisas Sem Resultados"
+ "WidgetSearchNoResultKeywords": "Palavras-Chave de Pesquisas Sem Resultados",
+ "ActionType": "Tipo de Ação"
}
} \ No newline at end of file
diff --git a/plugins/Annotations/Controller.php b/plugins/Annotations/Controller.php
index 2572864a80..86859bd37f 100755
--- a/plugins/Annotations/Controller.php
+++ b/plugins/Annotations/Controller.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\Annotations;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\Date;
-use Piwik\Piwik;
use Piwik\View;
/**
diff --git a/plugins/Annotations/lang/nb.json b/plugins/Annotations/lang/nb.json
index d3f2e68ed4..f06b977ee7 100644
--- a/plugins/Annotations/lang/nb.json
+++ b/plugins/Annotations/lang/nb.json
@@ -6,11 +6,17 @@
"ClickToDelete": "Klikk for å slette denne merknaden.",
"ClickToEdit": "Klikk for å redigere denne merknaden.",
"ClickToEditOrAdd": "Klikk for å redigere eller legge til en ny merknad.",
+ "ClickToStarOrUnstar": "Klikk for å merke eller ikke merke denne merknaden som favoritt.",
"CreateNewAnnotation": "Opprett en ny merknad...",
"EnterAnnotationText": "Skriv inn merknad...",
"HideAnnotationsFor": "Skjul merknader for %s...",
- "IconDescHideNotes": "Skjul notater for denne datoperioden.",
+ "IconDesc": "Se merknader for dette datoområdet.",
+ "IconDescHideNotes": "Skjul merknader for denne datoperioden.",
+ "InlineQuickHelp": "Du kan lage merknader for å markere spesielle hendelser (som et nytt blogginnlegg eller et redesign), for å bruke i dataanalyser eller for å lagre det du mener er viktig.",
"LoginToAnnotate": "Logg inn for å opprette en merknad.",
- "ViewAndAddAnnotations": "Vis og legg til merknader for %s..."
+ "NoAnnotations": "Det er ingen merknader i dette datoområdet.",
+ "PluginDescription": "Lar deg knytte merknader til ulike datoer for å huske endringer på ditt nettsted, lagre tanker du gjør om dine data og dele dine tanker med kollegaer. Ved å merke dine data vil du være sikker på å huske hvorfor dine data ser ut som de gjør.",
+ "ViewAndAddAnnotations": "Vis og legg til merknader for %s...",
+ "YouCannotModifyThisNote": "Du kan ikke redigere denne merknaden fordi du ikke laget den, eller du har ikke admintilgang for dette nettstedet."
}
} \ No newline at end of file
diff --git a/plugins/AnonymousPiwikUsageMeasurement b/plugins/AnonymousPiwikUsageMeasurement
-Subproject 5ba37193bba2be01df462b61c724c212657c449
+Subproject 3b0da5dac2714339e6d8539b8a16c56fa22a872
diff --git a/plugins/BulkTracking/Tracker/Handler.php b/plugins/BulkTracking/Tracker/Handler.php
index 9c1d23c961..c68667f062 100644
--- a/plugins/BulkTracking/Tracker/Handler.php
+++ b/plugins/BulkTracking/Tracker/Handler.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\BulkTracking\Tracker;
-use Piwik\Archiver\Request;
use Piwik\AuthResult;
use Piwik\Container\StaticContainer;
use Piwik\Exception\InvalidRequestParameterException;
diff --git a/plugins/BulkTracking/tests/Integration/TrackerTest.php b/plugins/BulkTracking/tests/Integration/TrackerTest.php
index a872b0524c..cc51d0a851 100644
--- a/plugins/BulkTracking/tests/Integration/TrackerTest.php
+++ b/plugins/BulkTracking/tests/Integration/TrackerTest.php
@@ -15,7 +15,6 @@ use Piwik\Plugins\BulkTracking\tests\Framework\TestCase\BulkTrackingTestCase;
use Piwik\Plugins\BulkTracking\Tracker\Handler;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tracker;
-use Piwik\Translate;
use Piwik\Tests\Framework\Mock\Tracker\RequestSet;
class TestIntegrationTracker extends Tracker {
diff --git a/plugins/Contents/Columns/ContentTarget.php b/plugins/Contents/Columns/ContentTarget.php
index 5f6bd47e54..26c7a0d7a2 100644
--- a/plugins/Contents/Columns/ContentTarget.php
+++ b/plugins/Contents/Columns/ContentTarget.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\Contents\Columns;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugins\Actions\Segment;
-use Piwik\Plugins\Contents\Actions\ActionContent;
use Piwik\Tracker\Action;
use Piwik\Tracker\Request;
diff --git a/plugins/Contents/lang/fr.json b/plugins/Contents/lang/fr.json
index 1f7eb2d875..4f6faad1e1 100644
--- a/plugins/Contents/lang/fr.json
+++ b/plugins/Contents/lang/fr.json
@@ -8,6 +8,9 @@
"ContentName": "Nom du contenu",
"ContentPiece": "Partie du contenu",
"ContentTarget": "Cible du contenu",
- "Contents": "Contenus"
+ "Contents": "Contenus",
+ "InteractionsMetricDocumentation": "Nombre de fois où un bloc de contenu a subi une interaction (ex un click sur une bannière ou sur une publicité).",
+ "ImpressionsMetricDocumentation": "Le nombre de fois qu'un bloc de contenu tel qu'une bannière ou une publicité a été affiché sur la page.",
+ "InteractionRateMetricDocumentation": "Le ratio entre les impressions de contenu et les interactions."
}
} \ No newline at end of file
diff --git a/plugins/Contents/lang/nb.json b/plugins/Contents/lang/nb.json
index 0c9816242b..e1eed4ab18 100644
--- a/plugins/Contents/lang/nb.json
+++ b/plugins/Contents/lang/nb.json
@@ -1,10 +1,16 @@
{
"Contents": {
+ "PluginDescription": "Innholds- og bannersporing lar deg måle ytelsen (visninger, klikk, CTR) til deler av innholdet på dine sider (banner-annonser, bilder, eller hva som helst).",
+ "Impressions": "Visninger",
"Interactions": "Interaksjoner",
"Interaction": "Interaksjon",
+ "InteractionRate": "Interaksjonsrate",
"ContentName": "Innholdsnavn",
"ContentPiece": "Innholdsdel",
"ContentTarget": "Innholdsmål",
- "Contents": "Innhold"
+ "Contents": "Innhold",
+ "InteractionsMetricDocumentation": "Antall ganger en innholdsdel ble interagert med (f.eks. et klikk på en banner eller annonse).",
+ "ImpressionsMetricDocumentation": "Antall ganger en innholdsdel, som en banner eller annonse, ble vist på en side.",
+ "InteractionRateMetricDocumentation": "Ratioen mellom visninger og interaksjoner."
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/Commands/SetConfig.php b/plugins/CoreAdminHome/Commands/SetConfig.php
new file mode 100644
index 0000000000..49b1925fd3
--- /dev/null
+++ b/plugins/CoreAdminHome/Commands/SetConfig.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreAdminHome\Commands;
+
+use Piwik\Config;
+use Piwik\Plugin\ConsoleCommand;
+use Piwik\Plugins\CoreAdminHome\Commands\SetConfig\ConfigSettingManipulation;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class SetConfig extends ConsoleCommand
+{
+ protected function configure()
+ {
+ $this->setName('config:set');
+ $this->setDescription('Set one or more config settings in the file config/config.ini.php');
+ $this->addArgument('assignment', InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
+ "List of config setting assignments, eg, Section.key=1 or Section.array_key[]=value");
+ $this->addOption('section', null, InputOption::VALUE_REQUIRED, 'The section the INI config setting belongs to.');
+ $this->addOption('key', null, InputOption::VALUE_REQUIRED, 'The name of the INI config setting.');
+ $this->addOption('value', null, InputOption::VALUE_REQUIRED, 'The value of the setting. (Not JSON encoded)');
+ $this->setHelp("This command can be used to set INI config settings on a Piwik instance.
+
+You can set config values two ways, via --section, --key, --value or by command arguments.
+
+To use --section, --key, --value, simply supply those options. You can only set one setting this way, and you cannot
+append to arrays.
+
+To use arguments, supply one or more arguments in the following format: Section.config_setting_name=\"value\"
+'Section' is the name of the section, 'config_setting_name' the name of the setting and 'value' is the value.
+NOTE: 'value' must be JSON encoded, so Section.config_setting_name=\"value\" would work but
+Section.config_setting_name=value would not.
+
+To append to an array setting, supply an argument like this: Section.config_setting_name[]=\"value to append\"
+
+To reset an array setting, supply an argument like this: Section.config_setting_name=[]
+Resetting an array will not work if the array has default values in global.ini.php (such as, [log] log_writers).
+In this case the values in global.ini.php will be used, since there is no way to explicitly set an
+array setting to empty in INI config.
+
+Use the --piwik-domain option to specify which instance to modify.
+
+");
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $section = $input->getOption('section');
+ $key = $input->getOption('key');
+ $value = $input->getOption('value');
+
+ $manipulations = $this->getAssignments($input);
+
+ $isSingleAssignment = !empty($section) && !empty($key) && $value !== false;
+ if ($isSingleAssignment) {
+ $manipulations[] = new ConfigSettingManipulation($section, $key, $value);
+ }
+
+ if (empty($manipulations)) {
+ throw new \InvalidArgumentException("Nothing to assign. Add assignments as arguments or use the "
+ . "--section, --key and --value options.");
+ }
+
+ $config = Config::getInstance();
+ foreach ($manipulations as $manipulation) {
+ $manipulation->manipulate($config);
+
+ $output->writeln("<info>Setting [{$manipulation->getSectionName()}] {$manipulation->getName()} = {$manipulation->getValueString()}</info>");
+ }
+
+ $config->forceSave();
+
+ $this->writeSuccessMessage($output, array("Done."));
+ }
+
+ /**
+ * @return ConfigSettingManipulation[]
+ */
+ private function getAssignments(InputInterface $input)
+ {
+ $assignments = $input->getArgument('assignment');
+
+ $result = array();
+ foreach ($assignments as $assignment) {
+ $result[] = ConfigSettingManipulation::make($assignment);
+ }
+ return $result;
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php b/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php
new file mode 100644
index 0000000000..e13fa3baa6
--- /dev/null
+++ b/plugins/CoreAdminHome/Commands/SetConfig/ConfigSettingManipulation.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreAdminHome\Commands\SetConfig;
+
+use Piwik\Config;
+
+/**
+ * Representation of a INI config manipulation operation. Only supports two types
+ * of manipulations: appending to a config array and assigning a config value.
+ */
+class ConfigSettingManipulation
+{
+ /**
+ * @var string
+ */
+ private $sectionName;
+
+ /**
+ * @var string
+ */
+ private $name;
+
+ /**
+ * @var string
+ */
+ private $value;
+
+ /**
+ * @var bool
+ */
+ private $isArrayAppend;
+
+ /**
+ * @param string $sectionName
+ * @param string $name
+ * @param string $value
+ * @param bool $isArrayAppend
+ */
+ public function __construct($sectionName, $name, $value, $isArrayAppend = false)
+ {
+ $this->sectionName = $sectionName;
+ $this->name = $name;
+ $this->value = $value;
+ $this->isArrayAppend = $isArrayAppend;
+ }
+
+ /**
+ * Performs the INI config manipulation.
+ *
+ * @param Config $config
+ * @throws \Exception if trying to append to a non-array setting value or if trying to set an
+ * array value to a non-array setting
+ */
+ public function manipulate(Config $config)
+ {
+ if ($this->isArrayAppend) {
+ $this->appendToArraySetting($config);
+ } else {
+ $this->setSingleConfigValue($config);
+ }
+ }
+
+ private function setSingleConfigValue(Config $config)
+ {
+ $sectionName = $this->sectionName;
+ $section = $config->$sectionName;
+
+ if (isset($section[$this->name])
+ && is_array($section[$this->name])
+ && !is_array($this->value)
+ ) {
+ throw new \Exception("Trying to set non-array value to array setting " . $this->getSettingString() . ".");
+ }
+
+ $section[$this->name] = $this->value;
+ $config->$sectionName = $section;
+ }
+
+ private function appendToArraySetting(Config $config)
+ {
+ $sectionName = $this->sectionName;
+ $section = $config->$sectionName;
+
+ if (isset($section[$this->name])
+ && !is_array($section[$this->name])
+ ) {
+ throw new \Exception("Trying to append to non-array setting value " . $this->getSettingString() . ".");
+ }
+
+ $section[$this->name][] = $this->value;
+ $config->$sectionName = $section;
+ }
+
+ /**
+ * Creates a ConfigSettingManipulation instance from a string like:
+ *
+ * `SectionName.setting_name=value`
+ *
+ * or
+ *
+ * `SectionName.setting_name[]=value`
+ *
+ * The value must be JSON so `="string"` will work but `=string` will not.
+ *
+ * @param string $assignment
+ * @return self
+ */
+ public static function make($assignment)
+ {
+ if (!preg_match('/^([a-zA-Z0-9_]+)\.([a-zA-Z0-9_]+)(\[\])?=(.*)/', $assignment, $matches)) {
+ throw new \InvalidArgumentException("Invalid assignment string '$assignment': expected section.name=value or section.name[]=value");
+ }
+
+ $section = $matches[1];
+ $name = $matches[2];
+ $isAppend = !empty($matches[3]);
+
+ $value = json_decode($matches[4], $isAssoc = true);
+ if ($value === null) {
+ throw new \InvalidArgumentException("Invalid assignment string '$assignment': could not parse value as JSON");
+ }
+
+ return new self($section, $name, $value, $isAppend);
+ }
+
+ private function getSettingString()
+ {
+ return "[{$this->sectionName}] {$this->name}";
+ }
+
+ /**
+ * @return string
+ */
+ public function getSectionName()
+ {
+ return $this->sectionName;
+ }
+
+ /**
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * @return string
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * @return boolean
+ */
+ public function isArrayAppend()
+ {
+ return $this->isArrayAppend;
+ }
+
+ /**
+ * @return string
+ */
+ public function getValueString()
+ {
+ return json_encode($this->value);
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/cs.json b/plugins/CoreAdminHome/lang/cs.json
index 136ef9770a..57836e1ade 100644
--- a/plugins/CoreAdminHome/lang/cs.json
+++ b/plugins/CoreAdminHome/lang/cs.json
@@ -87,6 +87,8 @@
"YouAreOptedOut": "Aktuálně jste vyloučeni.",
"YouMayOptOut": "Zde se můžete zakázat uložení cookie s identifikačním číslem přiděleným vašemu počítači a tím zamezit provozovateli této webové stránky shromažďovat a analyzovat statistické údaje.",
"YouMayOptOutBis": "Pokud jste se rozhodli že ne, klikněte na přiložený odkaz pro uložení deaktivačního cookie ve svém prohlížeči.",
- "OptingYouOut": "Vylučování, prosím čekejte..."
+ "OptingYouOut": "Vylučování, prosím čekejte...",
+ "ProtocolNotDetectedCorrectly": "Nyní si prohlížíte Piwik zabezpečeným SSL spojením za použití HTTPS, ale Piwik na serveru detekoval pouze nezabezpečené připojení.",
+ "ProtocolNotDetectedCorrectlySolution": "Abyste zajistili, že bude Piwik získávat a poskytovat obsah přes bezpečné HTTPS spojení, můžete upravit váš soubor %s a buď nastavit proxy, nebo přidat řádek %s pod sekci %s. %sDozvědět se více%s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/el.json b/plugins/CoreAdminHome/lang/el.json
index c906ae46f5..d75db959fa 100644
--- a/plugins/CoreAdminHome/lang/el.json
+++ b/plugins/CoreAdminHome/lang/el.json
@@ -87,6 +87,8 @@
"YouAreOptedOut": "Δεν καταγράφεστε",
"YouMayOptOut": "Μπορείτε να επιλέξετε να μην έχετε μοναδικό αριθμό ταυτοποίησης στατιστικών ιστού στον υπολογιστή σας για να αποφύγετε την ενσωμάτωση και την ανάλυση των συλλεχθέντων δεδομένων σε αυτή την ιστοσελίδα.",
"YouMayOptOutBis": "Για να κάνετε αυτή την επιλογή, πατήστε παρακάτω για να λάβετε ένα cookie απενεργοποιήσης.",
- "OptingYouOut": "Συμπερίληψη εκτός λίστας, παρακαλώ περιμένετε..."
+ "OptingYouOut": "Συμπερίληψη εκτός λίστας, παρακαλώ περιμένετε...",
+ "ProtocolNotDetectedCorrectly": "Αυτή τη στιγμή χρησιμοποιείτε το Piwik πάνω από ασφαλή σύνδεση (με χρήση https), αλλά το Piwik εντοπίζει μόνο μη ασφαλή σύνδεση στον διακομιστή αυτό.",
+ "ProtocolNotDetectedCorrectlySolution": "Για να βεβαιωθείτε ότι το Piwik κάνει αιτήσεις και εξυπηρετεί το περιεχόμενο πάνω από HTTPS, μπορείτε να τροποποιήσετε το αρχείο %s και να παραμετροποιήσετε τις ρυθμίσεις του διαμεσολαβητή ή να προσθέσετε την %s κάτω από το τμήμα %s. %sΔείτε περισσότερα%s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/en.json b/plugins/CoreAdminHome/lang/en.json
index 25a85f6475..5be7675fb9 100644
--- a/plugins/CoreAdminHome/lang/en.json
+++ b/plugins/CoreAdminHome/lang/en.json
@@ -24,7 +24,7 @@
"JavaScriptTracking": "JavaScript Tracking",
"JSTracking_CampaignKwdParam": "Campaign Keyword parameter",
"JSTracking_CampaignNameParam": "Campaign Name parameter",
- "JSTracking_CodeNote": "Make sure this code is on every page of your website before the %1$s tag.",
+ "JSTracking_CodeNoteBeforeClosingHead": "Make sure this code is on every page of your website. We recommend to paste it immediately before the closing %1$s tag.",
"JSTracking_CustomCampaignQueryParam": "Use custom query parameter names for the campaign name & keyword",
"JSTracking_CustomCampaignQueryParamDesc": "Note: %1$sPiwik will automatically detect Google Analytics parameters.%2$s",
"JSTracking_DisableCookies": "Disable all tracking cookies",
diff --git a/plugins/CoreAdminHome/lang/fr.json b/plugins/CoreAdminHome/lang/fr.json
index 4b7eede7cf..c64231fe81 100644
--- a/plugins/CoreAdminHome/lang/fr.json
+++ b/plugins/CoreAdminHome/lang/fr.json
@@ -87,6 +87,8 @@
"YouAreOptedOut": "Vous n'êtes actuellement pas suivi(e).",
"YouMayOptOut": "Vous pouvez choisir ici de NE PAS autoriser le suivi de votre ordinateur via un cookie lui assignant un numéro d'identification unique. Notre outil d'analyse web n'enregistrera pas l'activité de votre ordinateur.",
"YouMayOptOutBis": "Pour faire ce choix et installer un cookie d'exclusion, veuillez cliquer ci-dessous.",
- "OptingYouOut": "Désinscription en cours, merci de patienter..."
+ "OptingYouOut": "Désinscription en cours, merci de patienter...",
+ "ProtocolNotDetectedCorrectly": "Vous visualisez actuellement Piwik au travers d'une connection SSL sécurisé (utilisant HTTPS), mais Piwik n'est pas parvenu à détecter une connexion non sécurisée pour le serveur.",
+ "ProtocolNotDetectedCorrectlySolution": "Afin de vous assurer que Piwik demande et sever votre contenu de manière sécurisée au travers du protocole HTTPS, vous devriez éditer votre fichier %s et configuration vos paramètres de proxy ou bien vous pouvez ajouter la ligne %s sous la section %s %sEn savoir plus%s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/hu.json b/plugins/CoreAdminHome/lang/hu.json
index ebfb6e8fe3..77e333c9b2 100644
--- a/plugins/CoreAdminHome/lang/hu.json
+++ b/plugins/CoreAdminHome/lang/hu.json
@@ -1,8 +1,10 @@
{
"CoreAdminHome": {
+ "AddNewTrustedHost": "Új megbízható host hozzáadása",
"Administration": "Adminisztráció",
"ArchivingSettings": "Archiválási beállítások",
"BrandingSettings": "Arculat beállítások",
+ "ReleaseChannel": "Release csatorna",
"ClickHereToOptIn": "Kattintson ide a bekapcsoláshoz.",
"ClickHereToOptOut": "Kattintson ide a kikapcsoláshoz.",
"CustomLogoFeedbackInfo": "A Piwik logó konfigurálása esetén érdekes lehet a felső menüben található %s link eltávolítása is. Ehhez a %sBővítmények%s oldalon ki kell kapcsolni a Feedback bővítményt.",
@@ -55,17 +57,23 @@
"MenuDevelopment": "Fejlesztés",
"OptOutComplete": "Követés kikapcsolva; a látogatások semmilyen statisztikában nem fognak szerepelni.",
"OptOutCompleteBis": "Megjegyzés: abban az esetben, ha a követést tiltó süti törlődik, más számítógépről vagy böngészőből látogatja meg a weboldalt, a követést ismét le kell tiltania.",
+ "OptOutDntFound": "Ön nem lekövethető, mert a böngészője azt jelzni, hogy ön ezt nem kívánta. Ez az állapot nem fog addig változni, amíg le nem tiltja a 'Do Not Track' funkciót.",
"OptOutExplanation": "A Piwik tiszteletben tartja a magánéletet Internet. Annak érdekében, hogy látogatóinak lehetősége legyen a követés kikapcsolására, helyezze el az alábbi HTML kódot például egy Adatvédelmi Tájékoztató oldalon.",
"OptOutExplanationBis": "Az alábbi kód egy Iframet tartalmazó link, ahol a látogatók ki tudják kapcsolni a követést. Ehhez a Piwik egy követést letiltő sütit helyez el a böngészőben. %s Kattintson ide%s az iFrame tartalmának megtekintéséhez.",
"OptOutForYourVisitors": "Piwik követés letiltása látogatók által",
"PiwikIsInstalledAt": "Piwik telepítve itt:",
+ "PersonalPluginSettings": "Személyes bővítmény beállítások",
"PluginSettingChangeNotAllowed": "Önnek nincs jogosultsága a(z) \"%s\" beállítás módosításához a(z) \"%s\" bővítményben",
"PluginSettingReadNotAllowed": "Önnek nincs jogosultséga a(z) \"%s\" beállítás megtekintéséhez a(z) \"%s\" bővítményben",
+ "PluginSettings": "Bővítmény beállítások",
"PluginSettingsIntro": "Itt módosíthatók a harmadik féltől származó bővítmények beállításai:",
"PluginSettingsValueNotAllowed": "A(z) \"%s\" mező értéke a(z) \"%s\" bővítményben érvénytelen",
"PluginSettingsSaveFailed": "A bővítmény beállítások mentése sikertelen",
+ "SendPluginUpdateCommunication": "Küldjön egy emailt, mikor egy bővítmény frissítés elérhetővé válik",
"SendPluginUpdateCommunicationHelp": "Az adminisztrátorok emailben értesülnek ha egy bővítményhez frissítés érhető el.",
"StableReleases": "Ha a Piwik fontos része a vállalkozásának, javasoljuk, hogy a legfrissebb stabil kiadást használja. Ha a legfrissebb béte kiadást használja és hibát talál vagy javaslata van, kérjük %skattintson ide%s.",
+ "LtsReleases": "LTS (Hosszútávú támogatás) kiadások csak biztonsági és hibajavítási frissítéseket kapnak",
+ "SystemPluginSettings": "Rendszer bővítmény beállításai",
"TrackAGoal": "Cél követése",
"TrackingCode": "Követőkód",
"TrustedHostConfirm": "Biztosan meg akarja változtatni a megbízható Piwik hosztnevet?",
@@ -77,6 +85,9 @@
"YouAreOptedIn": "A követés jelenleg be van kapcsolva.",
"YouAreOptedOut": "A követés jelenleg ki van kapcsolva.",
"YouMayOptOut": "Lehetőség van a számítógépen tárolt egyedi azonosító süti letiltására, hogy a látogatás ne szerepeljen semmilyen statisztikában.",
- "YouMayOptOutBis": "Az alábbi kapcsoló segítségével engedélyezhető a követő süti használata."
+ "YouMayOptOutBis": "Az alábbi kapcsoló segítségével engedélyezhető a követő süti használata.",
+ "OptingYouOut": "Kiléptetés alatt, kis türelmet...",
+ "ProtocolNotDetectedCorrectly": "Jelenleg biztonságos SSL kapcsolat van ön és a Piwik között (https használatával), de a Piwik csak nem biztonságos kapcsolatot tudott észlelni.",
+ "ProtocolNotDetectedCorrectlySolution": "Hogy biztos minden kérés és kiszolgálás HTTPS-en keresztül biztonságosan történjen, szerkeszteni kell a %s fájlt és ellenőrizni a proxy beállításokat vagy hozzá kell adni a %s sort, lentebb a %s szekcióban. %sTovábbi információk%s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/it.json b/plugins/CoreAdminHome/lang/it.json
index d453a6252c..8b508a2c23 100644
--- a/plugins/CoreAdminHome/lang/it.json
+++ b/plugins/CoreAdminHome/lang/it.json
@@ -87,6 +87,8 @@
"YouAreOptedOut": "Al momento non hai accettato il programma (opt-out).",
"YouMayOptOut": "Puoi scegliere di non avere un cookie univoco di identificazione per web analytics assegnato al tuo computer al fine di evitare l'aggregazione e l'analisi dei dati raccolti su questo sito web.",
"YouMayOptOutBis": "Per fare questa scelta, clicca qui di seguito per ricevere un cookie di opt-out.",
- "OptingYouOut": "Sto acquisendo la tua rinuncia, attendi..."
+ "OptingYouOut": "Sto acquisendo la tua rinuncia, attendi...",
+ "ProtocolNotDetectedCorrectly": "Al momento stai guardando Piwik tramite una connessione sicura SSL (uso di https) ma Piwik ha potuto rilevare sul server solo una connessione non protetta.",
+ "ProtocolNotDetectedCorrectlySolution": "Per assicurarti che Piwik richieda e offra con sicurezza il tuo contenuto tramite HTTPS, puoi modificare il file %s e configurare le impostazioni del proxy, o puoi aggiungere la riga %s sotto la sezione %s. %sLeggi di più%s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/nb.json b/plugins/CoreAdminHome/lang/nb.json
index cb4c8f07e1..7e394aca3f 100644
--- a/plugins/CoreAdminHome/lang/nb.json
+++ b/plugins/CoreAdminHome/lang/nb.json
@@ -11,7 +11,7 @@
"CustomLogoHelpText": "Du kan tilpasse Piwik-logoen som vises i brukergrensesnittet og i e-postrapporter.",
"DevelopmentProcess": "Selv om vår %sutviklingsprosess%s inkluderer tusener av automatiske testser, spiller betatestere en viktig rolle for å at vi skal kunne etterleve vårt mål om å ikke ha noen feil.",
"EmailServerSettings": "Innstillinger for e-posttjener",
- "ForBetaTestersOnly": "Kun for beta testere",
+ "ForBetaTestersOnly": "Kun for beta-testere",
"ImageTracking": "Bildesporing",
"ImageTrackingIntro1": "Når en bruker har deaktivert JavaScript, eller når JavaScript ikke kan brukes, kan du bruke en bildesporingslenke for å spore besøkere.",
"ImageTrackingIntro2": "Generer lenken under og kopier den genererte HTML-koden til ditt nettsted. Hvis du bruker dette som en fallback for JavaScript-sporing, kan du bruke %1$s-tagger rundt koden.",
@@ -22,29 +22,73 @@
"InvalidPluginsWarning": "De følgende utvidelsene er ikke kompatible med %1$s og kunne ikke lastes inn: %2$s.",
"InvalidPluginsYouCanUninstall": "Du kan oppdatere eller avinstallere disse utvidelsene på %1$sAdministrer utvidelser%2$s-siden.",
"JavaScriptTracking": "JavaScript-sporing",
+ "JSTracking_CampaignKwdParam": "Nøkkelordparameter for kampanje",
+ "JSTracking_CampaignNameParam": "Navneparameter for kampanje",
+ "JSTracking_CodeNote": "Forsikre deg om at koden brukes på alle sider på ditt nettsted før %1$s-taggen.",
+ "JSTracking_CustomCampaignQueryParam": "Bruk tilpassede spørreparameternavn for kampanjens navn og nøkkelord",
+ "JSTracking_CustomCampaignQueryParamDesc": "Merk: %1$sPiwik vil automatisk oppdage Google Analytics-parametere.%2$s",
+ "JSTracking_DisableCookies": "Deaktiver alle sporingskapsler (cookies)",
+ "JSTracking_DisableCookiesDesc": "Deaktiver alle førstparts datakapsler (cookies). Eksisterende Piwik-datakapsler for dette nettstedet vil bli slettet ved neste sidevisning.",
"JSTracking_EnableDoNotTrack": "Aktiver klientside DoNotTrack-gjenkjenning",
- "LogoUpload": "Velg en logo for å laste opp",
+ "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Merk: Server-side DoNotTrack-støtte har blitt aktivert, så dette valget vil ikke ha noen effekt.",
+ "JSTracking_EnableDoNotTrackDesc": "Slik at sporing ikke vil bli sendt hvis besøkere ikke vil bli sporet.",
+ "JSTracking_GroupPageTitlesByDomain": "Sett inn nettstedsdomenet foran sidetittelen når sporingen skjer",
+ "JSTracking_GroupPageTitlesByDomainDesc1": "Så hvis noen besøker «Om oss»-siden på blogg.%1$s, vil det bli lagret som «blogg \/ Om oss». Dette er den enkleste måten å få en oversikt over trafikk etter subdomene.",
+ "JSTracking_MergeAliases": "I «Utlenker»-rapporten, skjul klikk til kjente alias-URLer for",
+ "JSTracking_MergeAliasesDesc": "Slik at klikk på lenker til Alias-URLer (f.eks. %s) ikke vil telle som «Utlenker».",
+ "JSTracking_MergeSubdomains": "Spor besøkere på tvers av alle subdomenene til",
+ "JSTracking_MergeSubdomainsDesc": "Slik at hvis noen besøker %1$s og %2$s, vil de bli regnet som én unik besøker.",
+ "JSTracking_PageCustomVars": "Spor en tilpasset variabel for hver sidevisning",
+ "JSTracking_PageCustomVarsDesc": "For eksempel, med variabelnavnet «Kategori» og verdien «Rapporter».",
+ "JSTracking_VisitorCustomVars": "Spor tilpassede variabler for denne besøkeren",
+ "JSTracking_VisitorCustomVarsDesc": "Dor eksempel, med variabelnavnet «Type» og verdien «Kunde».",
+ "JSTrackingIntro1": "Du kan spore besøkere til ditt nettsted på flere ulike måter. Den anbefalte måten å gjøre det er via JavaScript. For å bruke denne metoden må du forsikre deg om at alle nettsider på ditt nettsted har en JavaScript-kode, som du kan generere her.",
+ "JSTrackingIntro2": "Når du har JavaScript-sporingskoden for ditt nettsted, kopier og lim den inn på alle nettsteder som du vil spore med Piwik.",
+ "JSTrackingIntro3": "For de fleste nettsteder, blogger, CMS-er og liknende kan du bruke allerede eksisterende utvidelser for å gjøre den tekniske jobben for deg. (Se vår %1$sliste med utvidelser som integrerer Piwik%2$s.) Hvis det ikke eksisterer noen utvidelser kan du redigere ditt nettsteds maler og legge til koden i «footer»-filen.",
+ "JSTrackingIntro4": "Hvis du ikke vil bruke JavaScript for å spore besøkere, %1$skan du generere en bildesporingslenke nedenfor%2$s.",
+ "JSTrackingIntro5": "Hvis du vil gjøre mer enn å spore sidevisninger, vennligst sjekk ut %1$sPiwik JavaScript Tracking documentation%2$s for en liste med tilgjengelige funksjoner. Ved å bruke disse funksjonene kan du spore mål, tilpassede variabler, e-handelsordre, forlatte handlevogner og mer.",
+ "LogoNotWriteableInstruction": "For å bruke din egen logo istedenfor Piwik-logoen, gi skriverettigheter til denne mappen: %1$s Piwik trenger skrivetilgang for dine logoer som er lagret i filene %2$s.",
+ "FileUploadDisabled": "Opplasting avfiler er ikke aktivert i din PHP-konfigurasjon. For å laste opp din egen logo, vennligst sett %s i php.ini og restart din webserver.",
+ "LogoUpload": "Velg en logo å laste opp",
"FaviconUpload": "Velg et favicon å laste opp",
+ "LogoUploadHelp": "Vennligst last opp en fil i %s-formatet med en minimumshøyde på %s piksler.",
"MenuDiagnostic": "Diagnostikk",
"MenuGeneralSettings": "Generelle innstillinger",
"MenuManage": "Administrer",
"MenuDevelopment": "Utvikling",
- "OptOutForYourVisitors": "Piwik «opt-out» for dine besøkende",
+ "OptOutComplete": "Opt-out ferdig; dine besøk til dette nettstedet vil ikke spores av webstatistikkverktøyet.",
+ "OptOutCompleteBis": "Merk at hvis du sletter dine datakapsler (cookies), sletter denne opt-out-kapselen, eller hvis du endrer datamaskin eller nettleser, er du nødt til å gjennomføre denne prosedyren igjen.",
+ "OptOutDntFound": "Du spores ikke siden din nettleser rapporterer at du ikke vil det. Dette er en innstilling i din nettleser, så du vil ikke være i stand til å delta før du deaktiverer «Ikke spor meg»-funksjonen.",
+ "OptOutExplanation": "Piwik er dedikert til å gi personvern på Internett. For å gi dine besøkere valget om å ikke bli sporet, kan du legge til følgende HTML-kode på en av nettstedssider, for eksempel på personvern-siden.",
+ "OptOutExplanationBis": "Denne koden vil vise en iframe med en lenke for dine besøkere slik at de kan velge å ikke bli sporet av Piwik ved å sette en opt-out-cookie i sine nettlesere. %s Klikk her%s for å vise innholdet som vil vises i iframen.",
+ "OptOutForYourVisitors": "Piwik opt-out for dine besøkende",
"PiwikIsInstalledAt": "Piwik er installert på",
- "PersonalPluginSettings": "Personlige innstillinger for tillegg",
- "PluginSettings": "Innstillinger for tillegg",
- "PluginSettingsIntro": "Her kan du endre innstillinger for følgende tredjeparts tillegg:",
- "PluginSettingsSaveFailed": "Klarte ikke lagre innstillinger for tillegg",
- "SystemPluginSettings": "Systeminnstillinger for tillegg",
+ "PersonalPluginSettings": "Personlige innstillinger for utvidelser",
+ "PluginSettingChangeNotAllowed": "Du har ikke tillatelse til å endre verdien på innstillingen «%s» i utvidelsen «%s»",
+ "PluginSettingReadNotAllowed": "Du har ikke tillatelse til å lese verdien av innstillingen «%s» i utvidelsen «%s»",
+ "PluginSettings": "Innstillinger for utvidelser",
+ "PluginSettingsIntro": "Her kan du endre innstillinger for følgende 3. parts utvidelser:",
+ "PluginSettingsValueNotAllowed": "Verdien for feltet «%s» i utvidelsen «%s» er ikke tillatt",
+ "PluginSettingsSaveFailed": "Klarte ikke å lagre innstillinger for utvidelser",
+ "SendPluginUpdateCommunication": "Send en e-post når en oppdatering for en utvidelse er tilgjengelig",
+ "SendPluginUpdateCommunicationHelp": "En e-post vil bli sendt til superbrukere når det er en ny versjon tilgjengelig for en utvidelse.",
+ "StableReleases": "Hvis Piwik er en kritisk del av din forretning anbefaler vi at du bruker den nyeste stabile versjonen. Hvis du bruker den nyeste betaen og du finner en feil eller har et forbedringsforslag, vennligst %sse her%s.",
+ "LtsReleases": "LTS(Long Term Support – langsiktig støtte)-versjoner får kun sikkerhets- og feilrettinger.",
+ "SystemPluginSettings": "Systeminnstillinger for utvidelser",
"TrackAGoal": "Spor et mål",
"TrackingCode": "Sporingskode",
+ "TrustedHostConfirm": "Er du sikker på at du vil endre betrodd vertsnavn for Piwik?",
"TrustedHostSettings": "Betrodd Piwik-vertsnavn",
"UpdateSettings": "Oppdater innstillinger",
- "UseCustomLogo": "Bruk en tilpasset logo",
+ "UseCustomLogo": "Bruk din egen logo",
"ValidPiwikHostname": "Gyldig Piwik-vertsnavn",
- "YouAreOptedIn": "Du deltar i analysegrunnlaget",
- "YouAreOptedOut": "Du deltar ikke i analysegrunnlaget",
- "YouMayOptOut": "Du kan velge å ikke få tildelt en unik id for nettanalyse slik at du ikke blir en del av analysegrunnlaget",
- "YouMayOptOutBis": "Hvis du ikke ønsker å delta, klikk under for å motta en blank informasjonskapsel så du ikke registreres."
+ "WithOptionalRevenue": "med valgfri inntjening",
+ "YouAreOptedIn": "Du deltar i analysegrunnlaget.",
+ "YouAreOptedOut": "Du deltar ikke i analysegrunnlaget.",
+ "YouMayOptOut": "Du kan velge å ikke få tildelt en unik ID for nettanalyse på din datamaskin, slik at din aktivitet ikke spores på dette nettstedet.",
+ "YouMayOptOutBis": "Hvis du ønsker at din aktivitet ikke lagres, klikk under for å motta en blank informasjonskapsel, så vil du unngå å bli registrert.",
+ "OptingYouOut": "Forhindrer at du registreres, vennligst vent...",
+ "ProtocolNotDetectedCorrectly": "Du ser nå Piwik på en sikker SSL-tilkobling (med HTTPS), men Piwik kan kun se en ikke-sikker tilkobling til serveren.",
+ "ProtocolNotDetectedCorrectlySolution": "For å forsikre deg om at Piwik mottar sikre spørringer og leverer innhold over HTTPS, kan du redigere din %s-fil og enten konfigurere dine proxy-innstillinger, eller du kan legge inn linjen %s under seksjonen %s. %sLær mer%s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/pt-br.json b/plugins/CoreAdminHome/lang/pt-br.json
index dd8298be31..5547265a7c 100644
--- a/plugins/CoreAdminHome/lang/pt-br.json
+++ b/plugins/CoreAdminHome/lang/pt-br.json
@@ -87,6 +87,8 @@
"YouAreOptedOut": "Você optou por sair.",
"YouMayOptOut": "Você pode optar por não ter um único número de identificação web analytics de cookie atribuído ao seu computador para evitar a agregação e análise dos dados coletados neste site.",
"YouMayOptOutBis": "Para fazer essa escolha, clique abaixo para receber um cookie de opt-out.",
- "OptingYouOut": "Optando por sair, por favor aguarde ..."
+ "OptingYouOut": "Optando por sair, por favor aguarde ...",
+ "ProtocolNotDetectedCorrectly": "Você está visualizando o Piwik atualmente através de uma conexão SSL segura (utilizando https), mas o Piwik só pode detectar uma conexão não segura no servidor.",
+ "ProtocolNotDetectedCorrectlySolution": "Para certificar-se que o Piwik solicita e serve o seu conteúdo de forma segura através de HTTPS, você pode editar seu arquivo %s e configurar as configurações de proxy; ou, você pode adicionar a linha %s abaixo da seção %s. %sSaiba mais%s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/ru.json b/plugins/CoreAdminHome/lang/ru.json
index 1b8ce035f9..83aaa6059a 100644
--- a/plugins/CoreAdminHome/lang/ru.json
+++ b/plugins/CoreAdminHome/lang/ru.json
@@ -65,6 +65,7 @@
"PluginSettingsIntro": "Здесь вы можете изменить настройки для следующих плагинов:",
"PluginSettingsValueNotAllowed": "Значение для поля \"%s\" в плагине \"%s\" не разрешено",
"PluginSettingsSaveFailed": "Ошибка при сохранении настроек плагина",
+ "SendPluginUpdateCommunication": "Отправить email с уведомлением, когда для плагина будет доступна новая версия",
"SendPluginUpdateCommunicationHelp": "Письмо будет отправлено суперпользователю когда будет доступна новая версия плагина.",
"StableReleases": "Если Piwik является важной частью вашего бизнеса, мы рекомендуем использовать последнюю стабильную версию. Если вы используете последнюю бета версию, и вы нашли ошибку или есть предложение, пожалуйста, %sперейдите по ссылке%s.",
"SystemPluginSettings": "Системные настройки плагинов",
@@ -78,7 +79,7 @@
"WithOptionalRevenue": "с дополнительным доходом",
"YouAreOptedIn": "Статистика о вас собирается.",
"YouAreOptedOut": "Вы отказались от сбора статистических данных.",
- "YouMayOptOut": "Вы можете отказаться от уникального cookie, привязанному к вашему браузеру, и идентифицирующего вас в системе аналикити данного сайта, тем самым отказавшись от любого сбора сведений о вас и их анализа на данном сайте.",
+ "YouMayOptOut": "Вы можете отказаться от уникального cookie, привязанному к вашему браузеру, и идентифицирующего вас в системе аналитики данного сайта, тем самым отказавшись от любого сбора сведений о вас и их анализа на данном сайте.",
"YouMayOptOutBis": "Снимите галочку и получите исключающий cookie для отказа сбора данных."
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig b/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig
index 6d66695552..787ff4aba7 100644
--- a/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig
+++ b/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig
@@ -175,7 +175,7 @@
<div id="javascript-output-section">
<h3>{{ 'General_JsTrackingTag'|translate }}</h3>
- <p>{{ 'CoreAdminHome_JSTracking_CodeNote'|translate("&lt;/body&gt;")|raw }}</p>
+ <p>{{ 'CoreAdminHome_JSTracking_CodeNoteBeforeClosingHead'|translate("&lt;/head&gt;")|raw }}</p>
<div id="javascript-text">
<textarea class="codeblock"> </textarea>
diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php
index 7c474d9c8b..6b47e946a5 100644
--- a/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php
@@ -7,12 +7,10 @@
*/
namespace Piwik\Plugins\CoreAdminHome\tests\Integration\Commands;
-use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\DataAccess\RawLogDao;
use Piwik\Tests\Fixtures\ManySitesImportedLogs;
use Piwik\Tests\Framework\TestCase\ConsoleCommandTestCase;
-use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Symfony\Component\Console\Helper\QuestionHelper;
/**
diff --git a/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php b/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php
index ca56f3b026..05e07ea7f4 100644
--- a/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php
@@ -10,9 +10,8 @@ namespace Piwik\Plugins\CoreAdminHome\tests\Integration;
use Piwik\Common;
use Piwik\Console;
use Piwik\Db;
-use Piwik\Plugin\Manager as PluginManager;
use Piwik\Plugins\CoreAdminHome\tests\Fixture\DuplicateActions;
-use Piwik\Plugins\QueuedTracking\tests\Framework\TestCase\IntegrationTestCase;
+use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Symfony\Component\Console\Tester\ApplicationTester;
/**
diff --git a/plugins/CoreAdminHome/tests/Integration/SetConfigTest.php b/plugins/CoreAdminHome/tests/Integration/SetConfigTest.php
new file mode 100644
index 0000000000..bd1ed5e618
--- /dev/null
+++ b/plugins/CoreAdminHome/tests/Integration/SetConfigTest.php
@@ -0,0 +1,194 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreAdminHome\tests\Integration\Commands;
+
+use Interop\Container\ContainerInterface;
+use Piwik\Application\Kernel\GlobalSettingsProvider;
+use Piwik\Config;
+use Piwik\Tests\Framework\TestCase\ConsoleCommandTestCase;
+use Piwik\Url;
+
+/**
+ * @group CoreAdminHome
+ * @group CoreAdminHome_Integration
+ */
+class SetConfigTest extends ConsoleCommandTestCase
+{
+ const TEST_CONFIG_PATH = '/tmp/test.config.ini.php';
+
+ public static function setUpBeforeClass()
+ {
+ self::removeTestConfigFile();
+
+ parent::setUpBeforeClass();
+ }
+
+ public function setUp()
+ {
+ self::removeTestConfigFile();
+
+ parent::setUp();
+ }
+
+ public function test_Command_SucceedsWhenOptionsUsed()
+ {
+ $code = $this->applicationTester->run(array(
+ 'command' => 'config:set',
+ '--section' => 'MySection',
+ '--key' => 'setting',
+ '--value' => 'myvalue',
+ '-vvv' => false,
+ ));
+
+ $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+
+ $config = $this->makeNewConfig();
+ $this->assertEquals(array('setting' => 'myvalue'), $config->MySection);
+
+ $this->assertContains('Setting [MySection] setting = "myvalue"', $this->applicationTester->getDisplay());
+ }
+
+ /**
+ * @dataProvider getInvalidArgumentsForTest
+ */
+ public function test_Command_FailsWhenInvalidArgumentsUsed($invalidArgument)
+ {
+ $code = $this->applicationTester->run(array(
+ 'command' => 'config:set',
+ 'assignment' => array($invalidArgument),
+ '-vvv' => false,
+ ));
+
+ $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+ $this->assertContains('Invalid assignment string', $this->applicationTester->getDisplay());
+ }
+
+ public function getInvalidArgumentsForTest()
+ {
+ return array(
+ array("garbage"),
+ array("ab&cd.ghi=23"),
+ array("section.value = 34"),
+ array("section.value = notjson"),
+ array("section.array[0]=23"),
+ );
+ }
+
+ public function test_Command_SucceedsWhenArgumentsUsed()
+ {
+ $config = Config::getInstance();
+ $config->General['trusted_hosts'] = array('www.trustedhost.com');
+ $config->MySection['other_array_value'] = array('1', '2');
+ $config->forceSave();
+
+ $code = $this->applicationTester->run(array(
+ 'command' => 'config:set',
+ 'assignment' => array(
+ 'General.action_url_category_delimiter="+"',
+ 'General.trusted_hosts[]="www.trustedhost2.com"',
+ 'MySection.array_value=["abc","def"]',
+ 'MySection.object_value={"abc":"def"}',
+ 'MySection.other_array_value=[]',
+ ),
+ '-vvv' => false,
+ ));
+
+ $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+
+ $config = self::makeNewConfig(); // create a new config instance so we read what's in the file
+
+ $this->assertEquals('+', $config->General['action_url_category_delimiter']);
+ $this->assertEquals(array('www.trustedhost.com', 'www.trustedhost2.com'), $config->General['trusted_hosts']);
+ $this->assertEquals(array('abc', 'def'), $config->MySection['array_value']);
+ $this->assertEquals(array('def'), $config->MySection['object_value']);
+ $this->assertArrayNotHasKey('other_array_value', $config->MySection);
+
+ $this->assertContains("Done.", $this->applicationTester->getDisplay());
+ }
+
+ /**
+ * @dataProvider getOptionsForSettingValueToZeroTests
+ */
+ public function test_Command_SucceedsWhenSettingValueToZero($options)
+ {
+ $config = Config::getInstance();
+ $config->Tracker['debug'] = 1;
+ $config->forceSave();
+
+ $code = $this->applicationTester->run($options);
+
+ $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+
+ $config = self::makeNewConfig();
+
+ $this->assertEquals(0, $config->Tracker['debug']);
+ $this->assertContains("Done.", $this->applicationTester->getDisplay());
+ }
+
+ public function getOptionsForSettingValueToZeroTests()
+ {
+ return array(
+ array(
+ array(
+ 'command' => 'config:set',
+ '--section' => 'Tracker',
+ '--key' => 'debug',
+ '--value' => 0,
+ ),
+ ),
+ array(
+ array(
+ 'command' => 'config:set',
+ 'assignment' => array(
+ 'Tracker.debug=0',
+ ),
+ ),
+ ),
+ );
+ }
+
+ private static function getTestConfigFilePath()
+ {
+ return PIWIK_INCLUDE_PATH . self::TEST_CONFIG_PATH;
+ }
+
+ public static function provideContainerConfigBeforeClass()
+ {
+ return array(
+ // use a config instance that will save to a test INI file
+ 'Piwik\Config' => function (ContainerInterface $c) {
+ /** @var GlobalSettingsProvider $actualGlobalSettingsProvider */
+ $actualGlobalSettingsProvider = $c->get('Piwik\Application\Kernel\GlobalSettingsProvider');
+
+ $config = SetConfigTest::makeNewConfig();
+
+ // copy over sections required for tests
+ $config->tests = $actualGlobalSettingsProvider->getSection('tests');
+ $config->database = $actualGlobalSettingsProvider->getSection('database');
+ $config->database_tests = $actualGlobalSettingsProvider->getSection('database_tests');
+
+ return $config;
+ },
+ );
+ }
+
+ private static function makeNewConfig()
+ {
+ $settings = new GlobalSettingsProvider(null, SetConfigTest::getTestConfigFilePath());
+ return new Config($settings);
+ }
+
+ private static function removeTestConfigFile()
+ {
+ $configPath = self::getTestConfigFilePath();
+ if (file_exists($configPath)) {
+ unlink($configPath);
+ }
+ }
+}
diff --git a/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php b/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php
new file mode 100644
index 0000000000..88a5d0c79c
--- /dev/null
+++ b/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreAdminHome\tests\Unit\Commands\SetConfig;
+
+use Piwik\Config;
+use Piwik\Plugins\CoreAdminHome\Commands\SetConfig\ConfigSettingManipulation;
+
+// phpunit mocks can't return references, so we need a manual one
+class DumbMockConfig extends \Piwik\Config
+{
+ /**
+ * @var array
+ */
+ public $mockConfigData;
+
+ public function __construct()
+ {
+ // empty
+ }
+
+ public function &__get($sectionName)
+ {
+ if (!isset($this->mockConfigData[$sectionName])) {
+ $this->mockConfigData[$sectionName] = array();
+ }
+
+ $result =& $this->mockConfigData[$sectionName];
+ return $result;
+ }
+
+ public function __set($sectionName, $section)
+ {
+ $this->mockConfigData[$sectionName] = $section;
+ }
+}
+
+/**
+ * @group CoreAdminHome
+ * @group CoreAdminHome_Unit
+ */
+class ConfigSettingManipulationTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @var Config
+ */
+ private $mockConfig;
+
+ protected function setUp()
+ {
+ $this->mockConfig = new DumbMockConfig();
+ $this->mockConfigData = array();
+ }
+
+ /**
+ * @dataProvider getTestDataForMake
+ */
+ public function test_make_CreatesCorrectManipulation($assignmentString, $expectedSectionName, $expectedSettingName,
+ $expectedSettingValue, $expectedIsArrayAppend)
+ {
+ $manipulation = ConfigSettingManipulation::make($assignmentString);
+
+ $this->assertEquals($expectedSectionName, $manipulation->getSectionName());
+ $this->assertEquals($expectedSettingName, $manipulation->getName());
+ $this->assertEquals($expectedSettingValue, $manipulation->getValue());
+ $this->assertEquals($expectedIsArrayAppend, $manipulation->isArrayAppend());
+ }
+
+ public function getTestDataForMake()
+ {
+ return array(
+ // normal assign
+ array("General.myconfig=0", "General", "myconfig", 0, false),
+
+ // array append
+ array("General.myconfig444[]=5", "General", "myconfig444", 5, true),
+
+ // assign array
+ array("1General1.2config2=[\"abc\",\"def\"]", "1General1", "2config2", array('abc', 'def'), false),
+
+ // assign string
+ array("MySection.value=\"ghi\"", "MySection", "value", "ghi", false),
+
+ // assign boolean
+ array("MySection.value=false", "MySection", "value", false, false),
+ array("MySection.value=true", "MySection", "value", true, false),
+ );
+ }
+
+ /**
+ * @dataProvider getFailureTestDataForMake
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Invalid assignment string
+ */
+ public function test_make_ThrowsWhenInvalidAssignmentStringSupplied($assignmentString)
+ {
+ ConfigSettingManipulation::make($assignmentString);
+ }
+
+ public function getFailureTestDataForMake()
+ {
+ return array(
+ array("General&.value=1"),
+ array("General.val&*ue=12"),
+ array("General.value=[notjson]"),
+ array("General.value=notjson"),
+ array("General.array[abc]=\"def\""),
+ );
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Trying to append to non-array setting value
+ */
+ public function test_manipulate_ThrowsIfAppendingNonArraySetting()
+ {
+ $this->mockConfig->mockConfigData['General']['config'] = "5";
+
+ $manipulation = new ConfigSettingManipulation("General", "config", "10", true);
+ $manipulation->manipulate($this->mockConfig);
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Trying to set non-array value to array setting
+ */
+ public function test_manipulate_ThrowsIfAssigningNonArrayValue_ToArraySetting()
+ {
+ $this->mockConfig->mockConfigData['General']['config'] = array("5");
+
+ $manipulation = new ConfigSettingManipulation("General", "config", "10", false);
+ $manipulation->manipulate($this->mockConfig);
+ }
+
+ /**
+ * @dataProvider getTestDataForManipulate
+ */
+ public function test_manipulate_CorrectlyManipulatesConfig($sectionName, $name, $value, $isArrayAppend, $expectedConfig)
+ {
+ $manipulation = new ConfigSettingManipulation($sectionName, $name, $value, $isArrayAppend);
+ $manipulation->manipulate($this->mockConfig);
+
+ $this->assertEquals($expectedConfig, $this->mockConfig->mockConfigData);
+ }
+
+ public function getTestDataForManipulate()
+ {
+ return array(
+ // normal assign (string, int, array, bool)
+ array("Section", "config_setting", "stringvalue", false, array("Section" => array("config_setting" => "stringvalue"))),
+ array("Section", "config_setting", 25, false, array("Section" => array("config_setting" => 25))),
+ array("Section", "config_setting", array('a' => 'b'), false, array("Section" => array("config_setting" => array('a' => 'b')))),
+ array("Section", "config_setting", false, false, array("Section" => array("config_setting" => false))),
+
+ // array append
+ array("Section", "config_setting", "value", true, array("Section" => array("config_setting" => array('value')))),
+ array("Section", "config_setting", array(1,2), true, array("Section" => array("config_setting" => array(array(1,2))))),
+ );
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreConsole/Commands/GenerateDimension.php b/plugins/CoreConsole/Commands/GenerateDimension.php
index 248adc8486..900b6c0533 100644
--- a/plugins/CoreConsole/Commands/GenerateDimension.php
+++ b/plugins/CoreConsole/Commands/GenerateDimension.php
@@ -12,7 +12,6 @@ namespace Piwik\Plugins\CoreConsole\Commands;
use Piwik\Common;
use Piwik\DbHelper;
use Piwik\Plugin\Report;
-use Piwik\Translate;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
diff --git a/plugins/CoreConsole/Commands/GitPull.php b/plugins/CoreConsole/Commands/GitPull.php
index e69c13bf10..aefbd18d69 100644
--- a/plugins/CoreConsole/Commands/GitPull.php
+++ b/plugins/CoreConsole/Commands/GitPull.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\CoreConsole\Commands;
-use Piwik\Development;
use Piwik\Plugin\ConsoleCommand;
use Piwik\SettingsPiwik;
use Symfony\Component\Console\Input\InputInterface;
diff --git a/plugins/CoreHome/Columns/Metrics/ActionsPerVisit.php b/plugins/CoreHome/Columns/Metrics/ActionsPerVisit.php
index 0ced958086..ef2aaa1514 100644
--- a/plugins/CoreHome/Columns/Metrics/ActionsPerVisit.php
+++ b/plugins/CoreHome/Columns/Metrics/ActionsPerVisit.php
@@ -10,7 +10,6 @@ namespace Piwik\Plugins\CoreHome\Columns\Metrics;
use Piwik\DataTable\Row;
use Piwik\Piwik;
use Piwik\Plugin\ProcessedMetric;
-use Piwik\Translate;
/**
* The average number of actions per visit. Calculated as:
diff --git a/plugins/CoreHome/Columns/UserId.php b/plugins/CoreHome/Columns/UserId.php
index a611ca8def..4534dac531 100644
--- a/plugins/CoreHome/Columns/UserId.php
+++ b/plugins/CoreHome/Columns/UserId.php
@@ -12,7 +12,6 @@ use Piwik\Cache;
use Piwik\DataTable;
use Piwik\DataTable\Map;
use Piwik\Metrics;
-use Piwik\Period\Range;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
diff --git a/plugins/CoreHome/Columns/VisitTotalTime.php b/plugins/CoreHome/Columns/VisitTotalTime.php
index 22afceb6a5..54b8a7ab43 100644
--- a/plugins/CoreHome/Columns/VisitTotalTime.php
+++ b/plugins/CoreHome/Columns/VisitTotalTime.php
@@ -12,7 +12,6 @@ use Piwik\Config;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\CoreHome\Segment;
use Piwik\Tracker\Action;
-use Piwik\Tracker\GoalManager;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
diff --git a/plugins/CoreHome/Tracker/VisitRequestProcessor.php b/plugins/CoreHome/Tracker/VisitRequestProcessor.php
index e4e5a2ddf8..019965a958 100644
--- a/plugins/CoreHome/Tracker/VisitRequestProcessor.php
+++ b/plugins/CoreHome/Tracker/VisitRequestProcessor.php
@@ -10,6 +10,7 @@ namespace Piwik\Plugins\CoreHome\Tracker;
use Piwik\Common;
use Piwik\Date;
+use Piwik\Config;
use Piwik\EventDispatcher;
use Piwik\Exception\UnexpectedWebsiteFoundException;
use Piwik\Tracker\Cache;
@@ -154,7 +155,9 @@ class VisitRequestProcessor extends RequestProcessor
}
$wasLastActionYesterday = $this->wasLastActionNotToday($visitProperties, $request);
- if ($wasLastActionYesterday) {
+ $forceNewVisitAtMidnight = (bool) Config::getInstance()->Tracker['create_new_visit_after_midnight'];
+
+ if ($wasLastActionYesterday && $forceNewVisitAtMidnight) {
Common::printDebug("Visitor detected, but last action was yesterday...");
return true;
diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector-model.service.js b/plugins/CoreHome/angularjs/siteselector/siteselector-model.service.js
index 1ded7cf69a..48f7bf2419 100644
--- a/plugins/CoreHome/angularjs/siteselector/siteselector-model.service.js
+++ b/plugins/CoreHome/angularjs/siteselector/siteselector-model.service.js
@@ -19,6 +19,7 @@
hasMultipleWebsites : false,
isLoading : false,
firstSiteName : '',
+ onlySitesWithAdminAccess: false,
updateWebsitesList: updateWebsitesList,
searchSite: searchSite,
loadSite: loadSite,
@@ -81,8 +82,13 @@
return limitPromise.then(function (response) {
var limit = response.value;
+ var methodToCall = 'SitesManager.getPatternMatchSites';
+ if (model.onlySitesWithAdminAccess) {
+ methodToCall = 'SitesManager.getSitesWithAdminAccess';
+ }
+
model.currentRequest = piwikApi.fetch({
- method: 'SitesManager.getPatternMatchSites',
+ method: methodToCall,
limit: limit,
pattern: term
});
diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js
index 40996d2b57..06033fbd30 100644
--- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js
+++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js
@@ -13,7 +13,7 @@
* <div piwik-siteselector
* show-selected-site="true" show-all-sites-item="true" switch-site-on-select="true"
* all-sites-location="top|bottom" all-sites-text="test" show-selected-site="true"
- * show-all-sites-item="true">
+ * show-all-sites-item="true" only-sites-with-admin-access="true">
*
* Within a form
* <div piwik-siteselector input-name="siteId">
@@ -37,7 +37,8 @@
allSitesText: $filter('translate')('General_MultiSitesSummary'),
showSelectedSite: 'false',
showAllSitesItem: 'true',
- switchSiteOnSelect: 'true'
+ switchSiteOnSelect: 'true',
+ onlySitesWithAdminAccess: 'false'
};
return {
@@ -46,6 +47,7 @@
showSelectedSite: '=',
showAllSitesItem: '=',
switchSiteOnSelect: '=',
+ onlySitesWithAdminAccess: '=',
inputName: '@name',
allSitesText: '@',
allSitesLocation: '@'
@@ -63,6 +65,7 @@
return function (scope, element, attrs, ngModel) {
scope.selectedSite = {id: attrs.siteid, name: attrs.sitename};
+ scope.model.onlySitesWithAdminAccess = scope.onlySitesWithAdminAccess;
if (ngModel) {
ngModel.$setViewValue(scope.selectedSite);
diff --git a/plugins/CoreHome/images/favicon.png b/plugins/CoreHome/images/favicon.png
new file mode 100644
index 0000000000..9bf27d8b92
--- /dev/null
+++ b/plugins/CoreHome/images/favicon.png
Binary files differ
diff --git a/plugins/CoreHome/javascripts/corehome.js b/plugins/CoreHome/javascripts/corehome.js
index 7b14515538..4526c9ec71 100755
--- a/plugins/CoreHome/javascripts/corehome.js
+++ b/plugins/CoreHome/javascripts/corehome.js
@@ -126,6 +126,65 @@
handleSectionToggle(this, 'inline', !$(this).is(':checked'));
});
+ //
+ // reports by dimension list behavior
+ //
+
+ // when a report dimension is clicked, load the appropriate report
+ var currentWidgetLoading = null;
+ $('body').on('click', '.reportDimension', function (e) {
+ var view = $(this).closest('.reportsByDimensionView'),
+ report = $('.dimensionReport', view),
+ loading = $('.loadingPiwik', view);
+
+ // make this dimension the active one
+ $('.activeDimension', view).removeClass('activeDimension');
+ $(this).addClass('activeDimension');
+
+ // hide the visible report & show the loading elem
+ report.hide();
+ loading.show();
+
+ // load the report using the data-url attribute (which holds the URL to the report)
+ var widgetParams = broadcast.getValuesFromUrl($(this).attr('data-url'));
+ for (var key in widgetParams) {
+ widgetParams[key] = decodeURIComponent(widgetParams[key]);
+ }
+
+ var widgetUniqueId = widgetParams.module + widgetParams.action;
+ currentWidgetLoading = widgetUniqueId;
+
+ var ajaxRequest = new ajaxHelper();
+ ajaxRequest.addParams(widgetParams, 'get');
+ ajaxRequest.setCallback(function (response) {
+ // if the widget that was loaded was not for the latest clicked link, do nothing w/ the response
+ if (widgetUniqueId != currentWidgetLoading) {
+ return;
+ }
+
+ loading.hide();
+ report.css('display', 'inline-block').html($(response));
+
+ // scroll to report
+ piwikHelper.lazyScrollTo(report, 400);
+ });
+ ajaxRequest.setErrorCallback(function (deferred, status) {
+ if (status == 'abort' || !deferred || deferred.status < 400 || deferred.status >= 600) {
+ return;
+ }
+
+ loading.hide();
+
+ var errorMessage = _pk_translate('General_ErrorRequest', ['', '']);
+ if ($('#loadingError').html()) {
+ errorMessage = $('#loadingError').html();
+ }
+
+ report.css('display', 'inline-block').html('<div class="dimensionLoadingError">' + errorMessage + '</div>');
+ });
+ ajaxRequest.setFormat('html');
+ ajaxRequest.send(false);
+ });
});
}(jQuery));
diff --git a/plugins/CoreHome/lang/fr.json b/plugins/CoreHome/lang/fr.json
index c63eb35c23..95d1b7ba2f 100644
--- a/plugins/CoreHome/lang/fr.json
+++ b/plugins/CoreHome/lang/fr.json
@@ -49,6 +49,10 @@
"ClickRowToExpandOrContract": "Cliquez sur cette rangée pour afficher ou masquer le sous-tableau",
"UndoPivotBySubtable": "Ce rapport a été pivoté %s Annuler le pivot",
"PivotBySubtable": "Ce rapport n'a pas été pivoté %s Pivoter par %s",
- "Segments": "Segments"
+ "QuickAccessTitle": "Recherchez %s. Raccourci : pressez \"f\" pour rechercher.",
+ "MenuEntries": "Entrées de menu",
+ "Segments": "Segments",
+ "AdblockIsMaybeUsed": "Dans le cas où vous utiliseriez un bloqueur de publicités, veuillez le désactiver pour ce site afin de vous assurer que Piwik fonctionne correctement.",
+ "ChangeCurrentWebsite": "Choisir un site web, site couramment sélectionné : %s"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/hu.json b/plugins/CoreHome/lang/hu.json
index b2e3e238db..921823e414 100644
--- a/plugins/CoreHome/lang/hu.json
+++ b/plugins/CoreHome/lang/hu.json
@@ -6,6 +6,7 @@
"PageOf": "%1$s — %2$s",
"ShowJSCode": "Mutasd a JavaScript kódot a beillesztéshez",
"ThereIsNoDataForThisReport": "Nincs adat ehhez a jelentéshez.",
- "WebAnalyticsReports": "Webanalitikai jelentések"
+ "WebAnalyticsReports": "Webanalitikai jelentések",
+ "Segments": "Szegmensek"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/nb.json b/plugins/CoreHome/lang/nb.json
index 33cc4649d0..18676eed7b 100644
--- a/plugins/CoreHome/lang/nb.json
+++ b/plugins/CoreHome/lang/nb.json
@@ -32,7 +32,7 @@
"PageOf": "%1$s av %2$s",
"PeriodRange": "Periode",
"ReportGeneratedOn": "Rapport generert %s",
- "ReportGeneratedXAgo": "Rapport generert %s siden",
+ "ReportGeneratedXAgo": "Rapport generert for %s siden",
"SharePiwikLong": "Hei! Jeg har nettopp funnet et bra stykke fri programvare: Piwik!\n\nPiwik lar deg spore besøkende på ditt nettsted gratis. Du bør definitivt prøve det ut.",
"SharePiwikShort": "Piwik! Gratis og åpen kildekode for nettstatistikk. Du eier dataene.",
"ShareThis": "Del dette",
diff --git a/plugins/CoreHome/templates/_favicon.twig b/plugins/CoreHome/templates/_favicon.twig
index 8464b76579..d1fd157ed2 100644
--- a/plugins/CoreHome/templates/_favicon.twig
+++ b/plugins/CoreHome/templates/_favicon.twig
@@ -1,5 +1,5 @@
{% if isCustomLogo and customFavicon is defined and customFavicon %}
<link rel="shortcut icon" href="{{ customFavicon }}"/>
{% else %}
- <link rel="shortcut icon" href="plugins/CoreHome/images/favicon.ico"/>
+ <link rel="shortcut icon" href="plugins/CoreHome/images/favicon.png"/>
{% endif %} \ No newline at end of file
diff --git a/plugins/CoreHome/tests/Integration/Column/UserIdTest.php b/plugins/CoreHome/tests/Integration/Column/UserIdTest.php
index 70715a4dc2..738a9f13f7 100644
--- a/plugins/CoreHome/tests/Integration/Column/UserIdTest.php
+++ b/plugins/CoreHome/tests/Integration/Column/UserIdTest.php
@@ -8,12 +8,10 @@
namespace Piwik\Plugins\CoreHome\tests\Integration\Column;
-use Piwik\Access;
use Piwik\Cache;
use Piwik\DataAccess\ArchiveTableCreator;
use Piwik\Db;
use Piwik\Metrics;
-use Piwik\Plugin\Manager;
use Piwik\Plugins\CoreHome\Columns\UserId;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\Mock\FakeAccess;
diff --git a/plugins/CoreHome/tests/Integration/CoreHomeTest.php b/plugins/CoreHome/tests/Integration/CoreHomeTest.php
index b04c98df64..c93e6d129b 100644
--- a/plugins/CoreHome/tests/Integration/CoreHomeTest.php
+++ b/plugins/CoreHome/tests/Integration/CoreHomeTest.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\CoreHome\tests\Integration;
use Piwik\Piwik;
-use Piwik\Plugins\CoreHome\CoreHome;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
/**
diff --git a/plugins/CoreHome/tests/Unit/CoreHomeTest.php b/plugins/CoreHome/tests/Unit/CoreHomeTest.php
index e40f7bf5d3..2936cd860d 100644
--- a/plugins/CoreHome/tests/Unit/CoreHomeTest.php
+++ b/plugins/CoreHome/tests/Unit/CoreHomeTest.php
@@ -8,7 +8,6 @@
namespace Piwik\Plugins\CoreHome\tests\Unit;
-use Piwik\Piwik;
use Piwik\Plugins\CoreHome\CoreHome;
/**
diff --git a/plugins/CorePluginsAdmin/Marketplace.php b/plugins/CorePluginsAdmin/Marketplace.php
index b46d1932e4..5fcd51641d 100644
--- a/plugins/CorePluginsAdmin/Marketplace.php
+++ b/plugins/CorePluginsAdmin/Marketplace.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\CorePluginsAdmin;
use Piwik\Date;
-use Piwik\Piwik;
use Piwik\Plugin\Dependency as PluginDependency;
/**
diff --git a/plugins/CorePluginsAdmin/lang/nb.json b/plugins/CorePluginsAdmin/lang/nb.json
index 3f17ad3526..73c5446a7e 100644
--- a/plugins/CorePluginsAdmin/lang/nb.json
+++ b/plugins/CorePluginsAdmin/lang/nb.json
@@ -1,12 +1,12 @@
{
"CorePluginsAdmin": {
- "ActionActivatePlugin": "Aktiver tillegg",
+ "ActionActivatePlugin": "Aktiver utvidelse",
"ActionActivateTheme": "Aktiver tema",
"ActionInstall": "Installer",
"ActionUninstall": "Avinstaller",
- "Activate": "Slå på",
- "Activated": "Påslått",
- "Active": "På",
+ "Activate": "Aktiver",
+ "Activated": "Aktivert",
+ "Active": "Aktiv",
"Activity": "Aktivitet",
"AuthorHomepage": "Forfatterens hjemmeside",
"Authors": "Forfattere",
@@ -14,52 +14,52 @@
"ByXDevelopers": "av %s utviklere",
"CannotInstall": "Kan ikke installere (hjelp)",
"Changelog": "Endringslogg",
- "ChangeSettingsPossible": "Du kan endre %sinnstillingene%s for dette tillegget.",
- "Deactivate": "Slå av",
+ "ChangeSettingsPossible": "Du kan endre %sinnstillingene%s for denne utvidelsen.",
+ "Deactivate": "Deaktiver",
"Developer": "Utvikler",
"History": "Historikk",
- "Inactive": "Av",
+ "Inactive": "Deaktivert",
"InstallingPlugin": "Installerer %s",
- "InstallNewPlugins": "Installer nye tillegg",
+ "InstallNewPlugins": "Installer nye utvidelser",
"LastUpdated": "Sist oppdatert",
- "PluginsExtendPiwik": "Tillegg kan utvide eller begrense funksjonaliteten i Piwik.",
- "OncePluginIsInstalledYouMayActivateHere": "Når et tillegg har blitt installert, kan du slå det av eller på her.",
+ "PluginsExtendPiwik": "Utvidelser kan utvide eller begrense funksjonaliteten i Piwik.",
+ "OncePluginIsInstalledYouMayActivateHere": "Når en utvidelse har blitt installert, kan du slå den av eller på her.",
"Marketplace": "Markedsplass",
"MenuPlatform": "Platform",
"MissingRequirementsNotice": "Vennligst oppdater %1$s %2$s til en nyere versjon, %1$s %3$s er påkrevd.",
"MissingRequirementsPleaseInstallNotice": "Vennligst installer %1$s %2$s da dette er påkrevd av %3$s.",
"NewVersion": "ny versjon",
- "NoPluginsFound": "Ingen tillegg funnet",
+ "NoPluginsFound": "Ingen utvidelser funnet",
"NoThemesFound": "Ingen temaer funnet",
"NoZipFileSelected": "Vennligst velg en ZIP-fil.",
"NumDownloadsLatestVersion": "Siste versjon: %s nedlastinger",
"NumUpdatesAvailable": "%s oppdatering(er) tilgjengelig",
"OriginCore": "Kjerne",
"OriginThirdParty": "Tredjepart",
- "PluginHomepage": "Hjemmeside for tillegg",
+ "PluginHomepage": "Hjemmeside for utvidelse",
"PluginKeywords": "Nøkkelord",
"PluginNotCompatibleWith": "%1$s utvidelse ikke kompatibel med %2$s.",
"PluginRequirement": "%1$s krever %2$s.",
- "PluginsManagement": "Administrasjon av tillegg",
+ "PluginsManagement": "Administrasjon av utvidelser",
"PluginVersionInfo": "%1$s fra %2$s",
"Screenshots": "Skjermbilder",
- "SortByAlpha": "Alpha",
- "SortByNewest": "Nyeste",
- "SortByPopular": "Populær",
+ "SortByAlpha": "alpha",
+ "SortByNewest": "nyeste",
+ "SortByPopular": "populære",
"Status": "Status",
- "StepDownloadingPluginFromMarketplace": "Laster ned tillegg fra markedsplassen",
+ "StepDownloadingPluginFromMarketplace": "Laster ned utvidelse fra markedsplassen",
"StepThemeSuccessfullyUpdated": "Du har oppdatert temaet %1$s %2$s.",
- "StepUnzippingPlugin": "Pakker ut tillegg",
+ "StepUnzippingPlugin": "Pakker ut utvidelse",
"StepUnzippingTheme": "Pakker ut tema",
"SuccessfullyActicated": "Du har aktivert <strong>%s<\/strong>.",
"Support": "Støtte",
- "TeaserExtendPiwik": "Utvid Piwik med tillegg og tema",
- "TeaserExtendPiwikByPlugin": "Utvid Piwik ved å installere ett nytt tillegg",
+ "TeaserExtendPiwik": "Utvid Piwik med utvidelser og temaer",
+ "TeaserExtendPiwikByPlugin": "Utvid Piwik ved å installere en ny utvidelse",
"TeaserExtendPiwikByTheme": "Nyt et annet design ved å installere et nytt tema",
"TeaserExtendPiwikByUpload": "Utvid Piwik ved å laste opp en ZIP-fil",
"Theme": "Tema",
- "Themes": "Tema",
- "ThemesManagement": "Håndtere tema",
+ "Themes": "Temaer",
+ "ThemesManagement": "Håndtere temaer",
"Updated": "Oppdatert",
"UpdatingPlugin": "Oppdaterer %s",
"UploadZipFile": "Last opp ZIP-fil",
diff --git a/plugins/CoreUpdater/CoreUpdater.php b/plugins/CoreUpdater/CoreUpdater.php
index 737017d048..77298402fe 100644
--- a/plugins/CoreUpdater/CoreUpdater.php
+++ b/plugins/CoreUpdater/CoreUpdater.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\CoreUpdater;
use Exception;
-use Piwik\Access;
use Piwik\API\ResponseBuilder;
use Piwik\Common;
use Piwik\Filesystem;
@@ -17,7 +16,6 @@ use Piwik\FrontController;
use Piwik\Piwik;
use Piwik\UpdateCheck;
use Piwik\Updater as PiwikCoreUpdater;
-use Piwik\UpdaterErrorException;
use Piwik\Version;
/**
diff --git a/plugins/CoreUpdater/lang/nb.json b/plugins/CoreUpdater/lang/nb.json
index ba150b74a5..7a65b4e3d5 100644
--- a/plugins/CoreUpdater/lang/nb.json
+++ b/plugins/CoreUpdater/lang/nb.json
@@ -17,14 +17,19 @@
"ExceptionAlreadyLatestVersion": "Din Piwik versjon %s er siste utgave.",
"ExceptionArchiveEmpty": "Tomt arkiv.",
"ExceptionArchiveIncompatible": "Inkompatibelt arkiv: %s",
- "ExceptionArchiveIncomplete": "Arkivet er ikke komplett - noen file mangler (f.eks. %s).",
+ "ExceptionArchiveIncomplete": "Arkivet er ikke komplett: noen filer mangler (f.eks. %s).",
"FeedbackRequest": "Del gjerne dine ideer og forslag med Piwik-laget her:",
- "HelpMessageContent": "Sjekk %1$s Piwik FAQ-en %2$s som prøver å forklare de mest vanlige feil under oppdatering. %3$s Spør din systemadministrator - vedkommende kan kanskje hjelpe deg med feilen som antakelig har sammenheng med din tjener eller MySQL-installasjon.",
+ "HelpMessageContent": "Sjekk %1$s Piwik FAQ-en %2$s som prøver å forklare de mest vanlige feilene under oppdatering. %3$s Spør din systemadministrator – vedkommende kan kanskje hjelpe deg med feilen som antakelig har sammenheng med din tjener eller MySQL-installasjon.",
"HelpMessageIntroductionWhenError": "Over vises feilmeldingen. Den bør hjelpe deg med å forklare årsaken, men hvis du trenger mer hjelp, vennligst:",
"HelpMessageIntroductionWhenWarning": "Oppdateringen er fullført, men det var noen småproblemer under prossessen. Les beskrivelsene over for mer informasjon. For videre hjelp:",
"HighTrafficPiwikServerEnableMaintenance": "Hvis du administrerer en Piwik-tjener for et nettsted med høy trafikk, anbefaler vi at du %smidlertidig slår av sporing av besøkende og setter Piwik-brukergrensesnittet i vedlikeholdsmodus%s.",
"IncompatbilePluginsWillBeDisabledInfo": "Merk: Noen tillegg er ikke kompatible med Piwik %s. De blir deaktivert når du oppgraderer:",
"InstallingTheLatestVersion": "Installerer siste versjon.",
+ "LatestBetaRelease": "Siste beta-versjon",
+ "LatestStableRelease": "Siste stabile versjon",
+ "Latest2XStableRelease": "Siste stabile 2.X",
+ "Latest2XBetaRelease": "Siste 2.X beta",
+ "LtsSupportVersion": "Version med langsiktig støtte",
"MajorUpdateWarning1": "Dette er en stor oppdatering! Det vil ta lengre tid enn vanlig.",
"MajorUpdateWarning2": "Følgende råd er spesielt viktig for store installasjoner.",
"NoteForLargePiwikInstances": "Viktig merknad for store Piwik-installasjoner",
@@ -50,7 +55,10 @@
"UpdateSuccessTitle": "Piwik ble korrekt oppdatert!",
"UpdateErrorTitle": "Feil ved oppdatering",
"ThankYouUpdatePiwik": "Takk for at du bruker Piwik og holder den oppdatert!",
+ "PostUpdateMessage": "Piwik vil alltid være gratis å laste ned og bruke, men det trenger din fortsatte støtte for å vokse og bli bedre.",
+ "PostUpdateSupport": "Hvis du trenger hjelp til å bruke Piwik, kan du få støtte fra utviklerne:",
"EnterpriseSolutions": "Bedriftsløsninger",
+ "CloudHosting": "Cloud-hosting",
"Updating": "Oppdaterer",
"UpdateUsingHttpsFailed": "Klarte ikke laste ned siste versjon av Piwik over en sikker HTTPS-forbindelse på grunn av følgende feil:",
"UpdateUsingHttpsFailedHelp": "Hvorfor gikk det ikke? Nedlasting av siste versjon av Piwik (over sikker HTTPS-forbindelse) kan gå galt av flere grunner, for eksempel på grunn nettverksfeil, for lav hastighet eller feil systemkonfigurasjon. Merk at det også kan være at din tjener er målet for et MITM-angrep og noen prøver å erstatte oppdateringen med en skadelig versjon av Piwik.",
diff --git a/plugins/CustomAlerts b/plugins/CustomAlerts
-Subproject 013821049089ae8d16f67e0a1b6c6525cb88a5a
+Subproject 1262e24e29fc2e725d064c77af2592c3e5216a5
diff --git a/plugins/CustomDimensions b/plugins/CustomDimensions
-Subproject 5027b250120c8ecccb25d82e50fe99351412298
+Subproject 4d35b0241557f7bb76c47e0f4c425aae17a5e34
diff --git a/plugins/CustomVariables/lang/fr.json b/plugins/CustomVariables/lang/fr.json
index 6e69edacde..25113643f0 100644
--- a/plugins/CustomVariables/lang/fr.json
+++ b/plugins/CustomVariables/lang/fr.json
@@ -6,6 +6,17 @@
"CustomVariablesReportDocumentation": "Ce rapport contient des informations à propos de vos Variables Personnalisées. Cliquez sur un nom de variable pour voir la répartition de la valeur. %s Pour plus d'informations à propos des variables personnalisées en général, lisez la %s documentation sur les variables personnalisées sur piwik.org%s",
"PluginDescription": "Les variables personnalisées sont des paires (nom, valeur) que vous pouvez assigner en utilisant l'API Javascript aux visiteurs ou n'importe quelle de leur action. Piwik rapportera ensuite le nombre de visites, pages, conversions pour chacune de ces noms et valeurs personnalisés. Voir les variables personnalisées détaillées pour chaque utilisateur et action dans le journal visiteur. <br \/>Nécessite d'utiliser la fonctionnalité <a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">Ecommerce Analytics<\/a> !",
"ScopePage": "Étendue page",
- "ScopeVisit": "Étendue visite"
+ "ScopeVisit": "Étendue visite",
+ "ManageDescription": "Cette vue d'ensemble affiche tous les emplacements de variables personnalisées et leur utilisation pour le site web \"%s\". Les noms dans chacun des emplacements sont ordonnés par le nombre de fois qu'elles ont été utilisées au total.",
+ "ScopeX": "Etendue %s",
+ "Index": "Index",
+ "Usages": "Usages",
+ "Unused": "Inutilisé",
+ "CreateNewSlot": "Augmenter le nombre d'emplacement de variables personnalisées disponibles",
+ "UsageDetails": "%s visites et %s actions depuis la création de ce site web.",
+ "CreatingCustomVariableTakesTime": "La création de nouveaux emplacement de variable personnalisée peut prendre du temps dépendamment de la taille de votre base de données. De ce fait il est possible d'effectuer cela uniquement via une commande qui doit être exécutée dans la console.",
+ "CurrentAvailableCustomVariables": "Pour l'instant vous pouvez utiliser jusqu'à %s Variables personnalisées par site.",
+ "ToCreateCustomVarExecute": "Pour créer un nouvel emplacement de variable personnalisée exécutez la commande suivante dans votre installation de Piwik :",
+ "SlotsReportIsGeneratedOverTime": "Les données pour ce rapport vont être peuplées avec le temps. Il se peut que cela prenne un jour ou deux pour voir des informations et quelques semaines avant que le rapport ne soit précis."
}
} \ No newline at end of file
diff --git a/plugins/DBStats/lang/nb.json b/plugins/DBStats/lang/nb.json
index 1f212409ee..ec26cb0837 100644
--- a/plugins/DBStats/lang/nb.json
+++ b/plugins/DBStats/lang/nb.json
@@ -2,14 +2,20 @@
"DBStats": {
"DatabaseUsage": "Databasebruk",
"DataSize": "Datastørrelse",
- "DBSize": "DB størrelse",
+ "DBSize": "DB-størrelse",
"EstimatedSize": "Estimert størrelse",
"IndexSize": "Indeksstørrelse",
"LearnMore": "For å lære mer om hvordan Piwik behandler data og hvordan få Piwik til å virke bra for nettsteder med medium og høy trafikk, les dokumentasjonen %s.",
"MainDescription": "Piwik lagrer all din statistikk i MySQL-databasen. Akkurat nå bruker Piwik-tabellene %s.",
+ "MetricDataByYear": "Måledatatabeller etter år",
+ "MetricTables": "Måletdatatabeller",
"OtherTables": "Andre tabeller",
+ "PluginDescription": "Gir deg detaljerte rapporter om MySQL-databasebruk. Tilgjengelig for superbrukere under Diagnostikk.",
+ "ReportDataByYear": "Rapporttabeller etter år",
+ "ReportTables": "Rapporttabeller",
"RowCount": "Antall rader",
"Table": "Tabell",
- "TotalSize": "Total størrelse"
+ "TotalSize": "Total størrelse",
+ "TrackerTables": "Sporingstabeller"
}
} \ No newline at end of file
diff --git a/plugins/Dashboard/lang/nb.json b/plugins/Dashboard/lang/nb.json
index 33c458d7a0..0519a3d9cd 100644
--- a/plugins/Dashboard/lang/nb.json
+++ b/plugins/Dashboard/lang/nb.json
@@ -1,19 +1,36 @@
{
"Dashboard": {
- "AddPreviewedWidget": "Legg til forhåndsvist element til min oversikt.",
+ "AddAWidget": "Legg til widget",
+ "AddPreviewedWidget": "Klikk for å legge til widget i oversikt",
"ChangeDashboardLayout": "Tilpass oversiktspanel",
"CopyDashboardToUser": "Kopier oversiktspanel til bruker",
"CreateNewDashboard": "Ny oversikt",
"Dashboard": "Oversikt",
+ "DashboardCopied": "Gjeldende oversikt ble kopiert til valgt bruker.",
+ "DashboardEmptyNotification": "Din oversikt inneholder ikke noen widgeter. Start ved å legge til noen widgeter eller bare gjenopprett oversikten til å bruke standardwidgetene.",
+ "DashboardName": "Navn på oversikt:",
"DashboardOf": "Oversikt for %s",
+ "DefaultDashboard": "Standard oversikt – Bruker standardwidgetene og -kolonnelayout",
"DeleteWidgetConfirm": "Er du sikker på at du vil fjerne dette elementet fra din oversikt?",
+ "EmptyDashboard": "Tøm oversikt – Velg dine favorittwidgeter",
"LoadingWidget": "Laster element, vennligst vent ...",
"ManageDashboard": "Administrer oversikt",
"Maximise": "Maksimer",
"Minimise": "Minimer",
+ "NotUndo": "Du vil ikke være i stand til å angre denne handlingen.",
+ "PluginDescription": "Din webstatistikkoversikt. Tilpass din oversikt ved å legge til nye widgeter, dra og slipp dem der du vil ha dem, og endre oversiktens kolonnelayout. Hver bruker kan administrere sine egne tilpassede oversikter.",
+ "RemoveDashboard": "Fjern oversikt",
+ "RemoveDashboardConfirm": "Er du sikker på at du vil fjerne oversikten «%s»?",
+ "RemoveDefaultDashboardNotPossible": "Standardoversikten kan ikke slettes",
"RenameDashboard": "Gi nytt navn på oversiktspanelet",
"ResetDashboard": "Nullstill oversikt",
+ "ResetDashboardConfirm": "Er du sikker på at du vil gjenopprette oversiktlayouten til standardwidgetene?",
+ "SelectDashboardLayout": "Vennligst veld ny oversiktslayout",
"SelectWidget": "Velg hvilket element som du vil legge til oversiktspanelet.",
+ "SetAsDefaultWidgets": "Bruk som standardwidgeter",
+ "SetAsDefaultWidgetsConfirm": "Er du sikker på at du vil sette dette widgetutvalget og kolonnelayouten som standardmal?",
+ "SetAsDefaultWidgetsConfirmHelp": "Dette widgetutvalget og kolonnelayouten vil bli brukt når brukere lager nye oversikter, eller når funksjonen \"%s\" brukes.",
+ "TopLinkTooltip": "Vis webstatistikkrapporter for %s.",
"WidgetNotFound": "Finner ikke element",
"WidgetPreview": "Forhåndsvisning av element"
}
diff --git a/plugins/Dashboard/stylesheets/widget.less b/plugins/Dashboard/stylesheets/widget.less
index 558da41ab9..09357f7784 100644
--- a/plugins/Dashboard/stylesheets/widget.less
+++ b/plugins/Dashboard/stylesheets/widget.less
@@ -45,18 +45,24 @@
.button {
margin: 16px 8px 0 0;
opacity: 0.8;
- visibility: hidden;
- display:none;
cursor: pointer;
float: right;
}
- }
- // TODO those 2 should probably be simplified eventually...
- .widgetTop:hover .button {
- visibility: visible;
- }
- .widgetTop.widgetTopHover .button {
- display:block;
+ .buttons {
+ float: right;
+ position: absolute;
+ padding-left: 50px;
+ right: 8px;
+ display: none;
+ background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, @theme-color-widget-title-background 45px);
+ background: -webkit-linear-gradient(left,rgba(255,255,255,0) 0%, @theme-color-widget-title-background 45px);
+ background: linear-gradient(to right, rgba(255,255,255,0) 0%, @theme-color-widget-title-background 45px);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='@{theme-color-widget-title-background}',GradientType=1 );
+ }
+
+ &:hover .buttons {
+ display:block;
+ }
}
.widgetText {
diff --git a/plugins/Dashboard/templates/_widgetFactoryTemplate.twig b/plugins/Dashboard/templates/_widgetFactoryTemplate.twig
index 05e979f8da..4c24631dcc 100644
--- a/plugins/Dashboard/templates/_widgetFactoryTemplate.twig
+++ b/plugins/Dashboard/templates/_widgetFactoryTemplate.twig
@@ -1,17 +1,19 @@
<div id="widgetTemplate" style="display:none;">
<div class="widget">
<div class="widgetTop">
- <div class="button" id="close">
- <span class="icon-close" title="{{ 'General_Close'|translate }}"></span>
- </div>
- <div class="button" id="maximise">
- <span class="icon-fullscreen" title="{{ 'Dashboard_Maximise'|translate }}"></span>
- </div>
- <div class="button" id="minimise">
- <span class="icon-minimise" title="{{ 'Dashboard_Minimise'|translate }}"></span>
- </div>
- <div class="button" id="refresh">
- <span class="icon-reload" title="{{ 'General_Refresh'|translate }}"></span>
+ <div class="buttons">
+ <div class="button" id="close">
+ <span class="icon-close" title="{{ 'General_Close'|translate }}"></span>
+ </div>
+ <div class="button" id="maximise">
+ <span class="icon-fullscreen" title="{{ 'Dashboard_Maximise'|translate }}"></span>
+ </div>
+ <div class="button" id="minimise">
+ <span class="icon-minimise" title="{{ 'Dashboard_Minimise'|translate }}"></span>
+ </div>
+ <div class="button" id="refresh">
+ <span class="icon-reload" title="{{ 'General_Refresh'|translate }}"></span>
+ </div>
</div>
<h3 class="widgetName">{% if widgetName is defined %}{{ widgetName }}{% endif %}
<div class="widgetNameOffScreen">
diff --git a/plugins/DevicePlugins/lang/en.json b/plugins/DevicePlugins/lang/en.json
index 92be744c9a..59bb8dcb06 100644
--- a/plugins/DevicePlugins/lang/en.json
+++ b/plugins/DevicePlugins/lang/en.json
@@ -3,7 +3,7 @@
"BrowserWithNoPluginsEnabled": "%1$s with no plugins enabled",
"BrowserWithPluginsEnabled": "%1$s with plugins %2$s enabled",
"PluginDescription": "Reports the list of plugins that are supported in visitors browsers.",
- "PluginDetectionDoesNotWorkInIE": "Note: Plugins detection doesn't work in Internet Explorer. This report is only based on non-IE browsers.",
+ "PluginDetectionDoesNotWorkInIE": "Note: Plugins detection doesn't work in Internet Explorer before 11. This report is only based on non-IE browsers and newer versions of IE.",
"WidgetPlugins": "Browser Plugins",
"WidgetPluginsDocumentation": "This report shows which browser plugins your visitors had enabled. This information might be important for choosing the right way to deliver your content."
}
diff --git a/plugins/DevicePlugins/lang/nb.json b/plugins/DevicePlugins/lang/nb.json
index cc3a85a97e..efddb7fda5 100644
--- a/plugins/DevicePlugins/lang/nb.json
+++ b/plugins/DevicePlugins/lang/nb.json
@@ -1,6 +1,10 @@
{
"DevicePlugins": {
- "BrowserWithPluginsEnabled": "%1$s med tillegg %2$s aktivert",
- "WidgetPlugins": "Liste over tillegg"
+ "BrowserWithNoPluginsEnabled": "%1$s uten noen aktiverte utvidelser",
+ "BrowserWithPluginsEnabled": "%1$s med utvidelsene %2$s aktivert",
+ "PluginDescription": "Rapporter med lister av utvidelser som er støttet i besøkeres nettlesere.",
+ "PluginDetectionDoesNotWorkInIE": "Merk: Utvidelsesdeteksjon fungerer ikke i Internet Explorer. Denne rapporten er kun basert på ikke-IE-nettlesere.",
+ "WidgetPlugins": "Liste over utvidelser",
+ "WidgetPluginsDocumentation": "Denne rapporten viser hvilke utvidelser som dine besøkere har aktivert. Denne informasjonen kan være nyttig for velge riktig måte å presentere ditt innhold."
}
} \ No newline at end of file
diff --git a/plugins/DevicesDetection/DevicesDetection.php b/plugins/DevicesDetection/DevicesDetection.php
index 2fd7b59fd2..ffebe3b37c 100644
--- a/plugins/DevicesDetection/DevicesDetection.php
+++ b/plugins/DevicesDetection/DevicesDetection.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\DevicesDetection;
use Piwik\ArchiveProcessor;
use Piwik\Db;
-use Piwik\Piwik;
require_once PIWIK_INCLUDE_PATH . '/plugins/DevicesDetection/functions.php';
diff --git a/plugins/DevicesDetection/images/browsers/CC.gif b/plugins/DevicesDetection/images/browsers/CC.gif
new file mode 100644
index 0000000000..36e362e891
--- /dev/null
+++ b/plugins/DevicesDetection/images/browsers/CC.gif
Binary files differ
diff --git a/plugins/DevicesDetection/lang/nb.json b/plugins/DevicesDetection/lang/nb.json
index ab047482bb..e6121d82b4 100644
--- a/plugins/DevicesDetection/lang/nb.json
+++ b/plugins/DevicesDetection/lang/nb.json
@@ -1,6 +1,7 @@
{
"DevicesDetection": {
- "BrowserEngine": "Nettleser",
+ "BrowserEngine": "Nettlesermotor",
+ "BrowserEngineDocumentation": "Denne rapporten viser dine besøkeres nettlesere brutt ned etter nettlesermotorer. %s den viktigste informasjonen for web-utviklere er hva slags rendering-motor som besøkere bruker. Oppføringen inneholder navnene til motoren fulgt av den mest kjente nettleseren som bruker den motoren.",
"BrowserEngines": "Nettlesermotorer",
"BrowserFamily": "Nettleserfamilie",
"Browsers": "Nettlesere",
@@ -11,7 +12,9 @@
"Software": "Programvare",
"ColumnBrowser": "Nettleser",
"ColumnOperatingSystem": "Operativsystem",
+ "ColumnOperatingSystemVersion": "Operativsystemversjon",
"Console": "Konsoll",
+ "dataTableLabelBrands": "Merke",
"dataTableLabelModels": "Modell",
"dataTableLabelSystemVersion": "Operativsystem-versjon",
"dataTableLabelTypes": "Type",
@@ -21,16 +24,21 @@
"DeviceModel": "Enhetsmodell",
"DevicesDetection": "Besøkendes enheter",
"DeviceType": "Enhetstype",
+ "FeaturePhone": "Smarttelefon",
"OperatingSystemFamilies": "Operativsystem-familier",
"OperatingSystemFamily": "Operativsystemfamilie",
"OperatingSystems": "Operativsystem",
"OperatingSystemVersions": "Operativsystem-versjoner",
"PluginDescription": "Gir utvidet informasjon om brukers enheter, som merke (produsent), modell (enhetsversjon), enhetstype (TV, konsoll, smarttelefon, osv) og mer.",
+ "SmartDisplay": "Smart display",
"Smartphone": "Smarttelefon",
"PortableMediaPlayer": "Bærbar mediespiller",
"Devices": "Enheter",
"Tablet": "Nettbrett",
+ "Phablet": "Phablet",
"TV": "TV",
- "WidgetBrowsers": "Besøkendes nettlesere"
+ "UserAgent": "Bruker-agent",
+ "WidgetBrowsers": "Besøkendes nettlesere",
+ "WidgetBrowsersDocumentation": "Denne rapporten inneholder informasjon om hva slags nettleser som dine besøkere bruker. Alle nettleserversjoner er opplistet separat."
}
} \ No newline at end of file
diff --git a/plugins/Ecommerce/lang/nb.json b/plugins/Ecommerce/lang/nb.json
index 2ff242e0e4..9870bddf7b 100644
--- a/plugins/Ecommerce/lang/nb.json
+++ b/plugins/Ecommerce/lang/nb.json
@@ -1,5 +1,6 @@
{
"Ecommerce": {
+ "PluginDescription": "E-handel lar deg spore nåt brukere legger til produkter til handlevogner og når de konverterer til et e-salg. Spor også visninger av produkter og produktkategorier, i tillegg til forlatte handlevogner.",
"Sales": "Salg",
"SalesBy": "Salg etter %s",
"SalesAdjective": "Salg %s"
diff --git a/plugins/Events/Events.php b/plugins/Events/Events.php
index d18bb32f05..06a7b5b081 100644
--- a/plugins/Events/Events.php
+++ b/plugins/Events/Events.php
@@ -9,10 +9,12 @@
namespace Piwik\Plugins\Events;
use Piwik\Common;
+use Piwik\DataTable;
use Piwik\Piwik;
use Piwik\Plugin\Report;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugin\Reports;
+use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable\AllColumns;
class Events extends \Piwik\Plugin
{
@@ -25,7 +27,8 @@ class Events extends \Piwik\Plugin
'Metrics.getDefaultMetricDocumentationTranslations' => 'addMetricDocumentationTranslations',
'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
'ViewDataTable.configure' => 'configureViewDataTable',
- 'Live.getAllVisitorDetails' => 'extendVisitorDetails'
+ 'Live.getAllVisitorDetails' => 'extendVisitorDetails',
+ 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
);
}
@@ -146,9 +149,30 @@ class Events extends \Piwik\Plugin
}
$view->config->show_flatten_table = true;
- $view->config->show_table_all_columns = false;
$view->requestConfig->filter_sort_column = 'nb_events';
+ if ($view->isViewDataTableId(AllColumns::ID)) {
+ $view->config->filters[] = function (DataTable $table) use ($view) {
+ $columsToDisplay = array('label');
+
+ $columns = $table->getColumns();
+ if (in_array('nb_visits', $columns)) {
+ $columsToDisplay[] = 'nb_visits';
+ }
+
+ if (in_array('nb_uniq_visitors', $columns)) {
+ $columsToDisplay[] = 'nb_uniq_visitors';
+ }
+
+ $view->config->columns_to_display = array_merge($columsToDisplay, array('nb_events', 'sum_event_value', 'avg_event_value', 'min_event_value', 'max_event_value'));
+
+ if (!in_array($view->requestConfig->filter_sort_column, $view->config->columns_to_display)) {
+ $view->requestConfig->filter_sort_column = 'nb_events';
+ }
+ };
+ $view->config->show_pivot_by_subtable = false;
+ }
+
$labelTranslation = $this->getColumnTranslation($apiMethod);
$view->config->addTranslation('label', $labelTranslation);
$view->config->addTranslations($this->getMetricTranslations());
@@ -235,4 +259,9 @@ class Events extends \Piwik\Plugin
{
return Common::getRequestVar('secondaryDimension', false, 'string');
}
+
+ public function getStylesheetFiles(&$stylesheets)
+ {
+ $stylesheets[] = "plugins/Events/stylesheets/datatable.less";
+ }
}
diff --git a/plugins/Events/stylesheets/datatable.less b/plugins/Events/stylesheets/datatable.less
new file mode 100644
index 0000000000..d06692119d
--- /dev/null
+++ b/plugins/Events/stylesheets/datatable.less
@@ -0,0 +1,7 @@
+div[data-report="Events.getAaction"].dataTableVizAllColumns,
+div[data-report="Events.getName"].dataTableVizAllColumns,
+div[data-report="Events.getCategory"].dataTableVizAllColumns {
+ .dataTableWrapper {
+ width:1000px;
+ }
+} \ No newline at end of file
diff --git a/plugins/Feedback/lang/nb.json b/plugins/Feedback/lang/nb.json
index e91b551943..360ea76c03 100644
--- a/plugins/Feedback/lang/nb.json
+++ b/plugins/Feedback/lang/nb.json
@@ -4,8 +4,8 @@
"IWantTo": "Jeg vil:",
"LearnWaysToParticipate": "Lær om alle måtene du kan %s bidra%s",
"ManuallySendEmailTo": "Send meldingen manuelt til",
- "RateFeatureThankYouTitle": "Takk for at du rangerer '%s'!",
- "RateFeatureTitle": "Liker du '%s' funksjonen? Vennligst ranger og legg igjen en kommentar",
+ "RateFeatureThankYouTitle": "Takk for at du rangerer «%s»!",
+ "RateFeatureTitle": "Liker du funksjonen «%s»? Vennligst ranger den og legg igjen en kommentar",
"SendFeedback": "Send tilbakemelding",
"ThankYou": "Takk for at du hjelper oss å lage Piwik bedre!",
"TopLinkTooltip": "Fortell oss hva du synes eller be om profesjonell støtte.",
diff --git a/plugins/Goals/Goals.php b/plugins/Goals/Goals.php
index 609d98c419..5dc6f1aaeb 100644
--- a/plugins/Goals/Goals.php
+++ b/plugins/Goals/Goals.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\Goals;
use Piwik\ArchiveProcessor;
-use Piwik\Common;
use Piwik\Db;
use Piwik\Piwik;
use Piwik\Plugin\Report;
diff --git a/plugins/Goals/lang/nb.json b/plugins/Goals/lang/nb.json
index 7f2eea1237..ef41f48b6a 100644
--- a/plugins/Goals/lang/nb.json
+++ b/plugins/Goals/lang/nb.json
@@ -19,7 +19,7 @@
"Download": "Last ned en fil",
"Ecommerce": "E-handel",
"EcommerceAndGoalsMenu": "E-handel og mål",
- "EcommerceLog": "E-handel logg",
+ "EcommerceLog": "E-handelslogg",
"EcommerceOverview": "E-handeloversikt",
"Filename": "filnavn",
"GoalConversion": "Målkonvertering",
@@ -33,13 +33,14 @@
"GoalX": "Mål %s",
"IsExactly": "er akuratt %s",
"Manually": "manuelt",
+ "NewGoalIntro": "Sporing av målkonvertering er en av de mest effektive måtene å måle og forbedre dine forretningsmål.",
"Optional": "(valgfritt)",
"PageTitle": "Sidetittel",
"Pattern": "Mønster",
"ProductCategory": "Produktkategori",
"ProductName": "Produktnavn",
"Products": "Produkter",
- "ProductSKU": "Produkt SKU",
+ "ProductSKU": "Produkt-SKU",
"UpdateGoal": "Oppdater mål",
"URL": "URL",
"ViewAndEditGoals": "Vis og rediger mål",
diff --git a/plugins/Goals/tests/Integration/APITest.php b/plugins/Goals/tests/Integration/APITest.php
index a55498f7f8..913bebf0a6 100644
--- a/plugins/Goals/tests/Integration/APITest.php
+++ b/plugins/Goals/tests/Integration/APITest.php
@@ -8,7 +8,6 @@
namespace Piwik\Plugins\Goals\tests\Integration;
-use Piwik\Access;
use Piwik\Piwik;
use Piwik\Plugins\Goals\API;
use Piwik\Tests\Framework\Fixture;
diff --git a/plugins/ImageGraph/StaticGraph.php b/plugins/ImageGraph/StaticGraph.php
index e70e4f8fbe..3cd7b738ee 100644
--- a/plugins/ImageGraph/StaticGraph.php
+++ b/plugins/ImageGraph/StaticGraph.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\ImageGraph;
-use Exception;
use pData;
use pImage;
use Piwik\Container\StaticContainer;
diff --git a/plugins/ImageGraph/lang/nb.json b/plugins/ImageGraph/lang/nb.json
new file mode 100644
index 0000000000..eb83d1fc9e
--- /dev/null
+++ b/plugins/ImageGraph/lang/nb.json
@@ -0,0 +1,6 @@
+{
+ "ImageGraph": {
+ "ColumnOrdinateMissing": "Kolonnen «%s» ble ikke funnet i denne rapporten. Prøv %s",
+ "PluginDescription": "Generer statiske PNG-grafebilder for alle dine datarapporter."
+ }
+} \ No newline at end of file
diff --git a/plugins/Insights/lang/nb.json b/plugins/Insights/lang/nb.json
index 53bb501e52..967feeb49e 100644
--- a/plugins/Insights/lang/nb.json
+++ b/plugins/Insights/lang/nb.json
@@ -1,16 +1,16 @@
{
"Insights": {
"ControlComparedToDescription": "Vekst sammenlignet med",
- "DayComparedToPreviousDay": "forrige dag",
+ "DayComparedToPreviousDay": "dagen før",
"DayComparedToPreviousWeek": "samme dag i forrige uke",
- "DayComparedToPreviousYear": "samme dag i foregående år",
+ "DayComparedToPreviousYear": "samme dag året før",
"Filter": "Filter",
"FilterOnlyNew": "Bare nye",
- "MonthComparedToPreviousMonth": "forrige måned",
+ "MonthComparedToPreviousMonth": "måneden før",
"MonthComparedToPreviousYear": "samme måned året før",
- "TitleRowChangeDetails": "'%1$s' endret fra %2$s (%3$s) til %4$s (%5$s) %6$s.",
- "WeekComparedToPreviousWeek": "forrige uke",
+ "TitleRowChangeDetails": "«%1$s» endret fra %2$s (%3$s) til %4$s (%5$s) %6$s.",
+ "WeekComparedToPreviousWeek": "uken før",
"WidgetCategory": "Innsikt",
- "YearComparedToPreviousYear": "forrige år"
+ "YearComparedToPreviousYear": "året før"
}
} \ No newline at end of file
diff --git a/plugins/Installation/FormFirstWebsiteSetup.php b/plugins/Installation/FormFirstWebsiteSetup.php
index a542d6b534..50c7f0989f 100644
--- a/plugins/Installation/FormFirstWebsiteSetup.php
+++ b/plugins/Installation/FormFirstWebsiteSetup.php
@@ -12,7 +12,6 @@ namespace Piwik\Plugins\Installation;
use HTML_QuickForm2_DataSource_Array;
use HTML_QuickForm2_Factory;
use HTML_QuickForm2_Rule;
-use Piwik\Log;
use Piwik\Access;
use Piwik\Piwik;
use Piwik\Plugins\SitesManager\API;
diff --git a/plugins/Installation/Installation.php b/plugins/Installation/Installation.php
index 47602c8543..59a0b02e64 100644
--- a/plugins/Installation/Installation.php
+++ b/plugins/Installation/Installation.php
@@ -9,13 +9,11 @@
namespace Piwik\Plugins\Installation;
use Piwik\API\Request;
-use Piwik\API\ResponseBuilder;
use Piwik\Common;
use Piwik\Config;
use Piwik\FrontController;
use Piwik\Piwik;
use Piwik\Plugins\Installation\Exception\DatabaseConnectionFailedException;
-use Piwik\Translate;
use Piwik\View as PiwikView;
/**
diff --git a/plugins/Installation/lang/de.json b/plugins/Installation/lang/de.json
index 440e1af1f7..22aef987eb 100644
--- a/plugins/Installation/lang/de.json
+++ b/plugins/Installation/lang/de.json
@@ -49,7 +49,7 @@
"RestartWebServer": "Nach dieser Änderung müssen Sie den Webserver neu starten.",
"ReusingTables": "Tabellen werden wiederverwendet",
"PiwikOrgNewsletter": "Wichtige Piwik Community Updates per Mail zukommen lassen",
- "PiwikProNewsletter": "Lassen Sie mir Informationen über %sPiwik PRO%s Dienstleistungen und Angebote zukommen.",
+ "PiwikProNewsletter": "Lassen Sie mir Informationen über Dienstleistungen und Angebote von %sPiwik PRO GmbH%s zukommen.",
"SeeBelowForMoreInfo": "Unterhalb können Sie weitere Informationen finden.",
"SetupWebsite": "Website hinzufügen",
"SetupWebsiteError": "Beim Hinzufügen der Website ist ein Fehler aufgetreten",
diff --git a/plugins/Installation/lang/nb.json b/plugins/Installation/lang/nb.json
index fcc75d8190..3def7c1d73 100644
--- a/plugins/Installation/lang/nb.json
+++ b/plugins/Installation/lang/nb.json
@@ -9,7 +9,7 @@
"DatabaseCreation": "Databaseopprettelse",
"DatabaseErrorConnect": "Klarte ikke koble til databasetjeneren",
"DatabaseServerVersion": "Databasetjener-versjon",
- "DatabaseSetup": "Databaseinnstillinger",
+ "DatabaseSetup": "Databaseoppsett",
"DatabaseSetupAdapter": "Adapter",
"DatabaseSetupDatabaseName": "Databasenavn",
"DatabaseSetupLogin": "Brukernavn",
@@ -56,23 +56,34 @@
"SetupWebSiteName": "Nettstedsnavn",
"SetupWebsiteSetupSuccess": "Nettstedet %s ble opprettet.",
"SetupWebSiteURL": "Nettsteds-URL",
+ "SiteSetup": "Vennligst sett opp det første nettstedet du vil spore og analysere med Piwik:",
+ "SiteSetupFootnote": "Merk: når Piwik-installasjonen er ferdig kan du legge til flere nettsteder som du kan spore!",
"SuperUser": "Superbruker",
+ "SuperUserLogin": "Innlogging for superbruker",
+ "SuperUserSetupError": "Det skjedde en feil når superbrukeren skulle legges til",
"SuperUserSetupSuccess": "Superbruker ble opprettet!",
"SystemCheck": "Systemsjekk",
+ "SystemCheckAutoUpdateHelp": "Merk: Piwiks énklikksoppdatering krever skriverettigheter til Piwik-mappen og dens innhold.",
+ "SystemCheckCreateFunctionHelp": "Piwik bruker anonyme funksjoner for callbacks.",
"SystemCheckDatabaseExtensions": "MySQL-utvidelser",
"SystemCheckDatabaseHelp": "Piwik krever enten mysqli utvidelsen eller både PDO og pdo_mysql utvidelsene.",
+ "SystemCheckDebugBacktraceHelp": "View::factory vil ikke være i stand til å lage visninger for calling-modulen.",
"SystemCheckError": "En feil oppstod - må fikses før du kan fortsette",
"SystemCheckEvalHelp": "Kreves av HTML QuickForm og Smarty templating system.",
"SystemCheckExtensions": "Andre nødvendige utvidelser",
"SystemCheckFileIntegrity": "Filintegritet",
"SystemCheckFunctions": "Nødvendige funksjoner",
+ "SystemCheckFunctionHelp": "Du må aktivere denne innebygde funksjonen.",
"SystemCheckGDFreeType": "GD > 2.x + Freetype (grafikk)",
"SystemCheckGDHelp": "Mindre grafiske elementer vil ikke fungere som ønsket.",
+ "SystemCheckGlobHelp": "Denne innebygde funksjonen har blitt deaktivert på din server. Piwik vil prøve å emulere denne funksjonen, men kan støte på flere sikkerhetsrestriksjoner. Funksjonaliteten kan bli påvirket.",
"SystemCheckGzcompressHelp": "Du må aktivere zlib utvidelsen og gzcompress-funksjonen.",
"SystemCheckGzuncompressHelp": "Du må aktivere zlib utvidelsen og gzuncompress-funksjonen.",
"SystemCheckIconvHelp": "Du må konfigurere og bygge PHP på nytt med iconv-støtte aktivert, --with-iconv.",
+ "SystemCheckJsonHelp": "php5-json-utvidelsen kreves for at Piwik skal kunne lese og skrive JSON-data.",
"SystemCheckMailHelp": "Tilbakemeldinger og \"Glemt passord\"-meldinger kan ikke sendes uten mail().",
"SystemCheckMbstring": "mbstring",
+ "SystemCheckMbstringHelp": "mbstring-utvidelsen kreves for å håndtere multibyte-tegn i brukergrensesnittet og API-svar. Sjekk også at mbstring.func_overload er satt til «0» i php.ini.",
"SystemCheckMemoryLimit": "Minnegrense",
"SystemCheckMemoryLimitHelp": "På et høyt trafikkert nettsted, kan arkiveringsprossessen kreve mer minne enn det som nå er tillatt.<br \/>Se på memory_limit i din php.ini fil hvis nødvendig.",
"SystemCheckOpenURL": "Åpne URL",
@@ -80,8 +91,10 @@
"SystemCheckOtherExtensions": "Andre utvidelser",
"SystemCheckOtherFunctions": "Andre funksjoner",
"SystemCheckPageSpeedDisabled": "PageSpeed deaktivert",
+ "SystemCheckPageSpeedWarn": "Vi anbefaler å deaktivere PageSpeed-modulen i din webserver %s: PageSpeed har blitt rapportert å forårsake flere feil i Piwik.",
"SystemCheckPackHelp": "pack()-funksjonen er nødvendig for å spore besøkende i Piwik.",
"SystemCheckParseIniFileHelp": "Denne innebygde funksjonen har blitt deaktivert på verten. Piwik vil forsøke å etterligne denne funksjonen, men kan møte ytterligere sikkerhetsbegrensninger. Sporingsytelsen vil også bli påvirket.",
+ "SystemCheckPdoAndMysqliHelp": "På en GNU\/Linux-server kan du kompilere php med følgende valg: %1$s I din php.ini, legg til følgende linjer: %2$s",
"SystemCheckPhp": "PHP-versjon",
"SystemCheckPhpPdoAndMysqli": "Mer informasjon om: %1$sPHP PDO%2$s og %3$sMYSQLI%4$s.",
"SystemCheckSplHelp": "Du må konfigurere og bygge PHP på nytt med Standard PHP Library (SPL) aktivert.",
@@ -90,12 +103,22 @@
"SystemCheckSummaryThereWereErrors": "Å nei! Piwik har oppdaget noen %1$skritiske problemer%2$s med ditt Piwik-oppsett. %3$sDisse problemene bør fikses umiddelbart.%4$s",
"SystemCheckSummaryThereWereWarnings": "Det er noen problemer med systemet ditt. Piwik vil kjøre, men du kan oppleve noen mindre problemer.",
"SystemCheckTimeLimitHelp": "På en høyt trafikkert webside, kan arkiveringsprossessen kreve mer tid enn det som nå er tillatt.<br \/>Se på max_execution_time i din php.ini fil hvis nødvendig.",
+ "SystemCheckTracker": "Tracker-status",
+ "SystemCheckTrackerHelp": "GET-spørringen til piwik.php feilet. Prøv å hviteliste denne URLen fra HTTP Authentication og deaktiver mod_security (du må kanskje spørre din webadmin). For mer informasjon om feilen, fjekk din webservers feillogg.",
+ "SystemCheckWarnDomHelp": "Du bør aktivere «dom»-utvidelsen (ved å installere «php-dom»- og\/eller «php-xml»-pakken).",
"SystemCheckWarning": "Piwik vil virke normalt, men noen tjenester vil kanskje mangle",
+ "SystemCheckWarnJsonHelp": "Du bør aktivere «json»-utvidelsen (ved å installere «php-json»-pakken) for bedre ytelse.",
+ "SystemCheckWarnLibXmlHelp": "Du bør aktivere «libxml»-utvidelsen (ved å installere «php-libxml»-pakken) siden det kreves av andre kjerneutvidelser i PHP.",
+ "SystemCheckWarnSimpleXMLHelp": "Du bør aktivere «SimpleXML»-utvidelsen (ved å installere «php-simplexml»- og\/eller «php-xml»-pakken).",
"SystemCheckWinPdoAndMysqliHelp": "På en Windows-server kan du legge til følgende linjer i php.ini: %s",
"SystemCheckWriteDirs": "Kataloger med skrivetilgang",
"SystemCheckWriteDirsHelp": "For å fikse denne feilen på ditt Linux-system, prøv å skriv inn følgende kommando(er)",
"SystemCheckZlibHelp": "Du må konfigurere og bygge PHP på nytt med zlib-støtte aktivert, --with-zlib.",
+ "SystemCheckCronArchiveProcess": "Cron-arkivering",
+ "SystemCheckCronArchiveProcessCLI": "Administrer prosesser via CLI",
+ "SystemCheckPhpSetting": "For å forhindre noen kritiske feil, må du sette følgende i din php.ini-fil: %s",
"SystemCheckUpdateHttps": "Oppdater over HTTPS",
+ "SystemCheckUpdateHttpsNotSupported": "Piwik kan ikke bruke HTTPS for å oppdatere, det vil falle tilbake til en usikker HTTP-oppdatering. Sjekk at CURL eller allow_url_fopen er støttet og at openssl PHP-utvidelsen er installert: http:\/\/piwik.org\/faq\/troubleshooting\/faq_177\/.",
"NotSupported": "støttes ikke",
"Tables": "Oppretter tabellene",
"TablesCreatedSuccess": "Tabellene ble vellykket opprettet!",
@@ -106,9 +129,12 @@
"TablesUpdatedSuccess": "Databasen er oppdatert fra %1$s til %2$s!",
"TablesWarningHelp": "Enten velg å bruke de eksisterende tabellene eller velg en ren installasjon for å slette all eksisterende data i databasen.",
"TablesWithSameNamesFound": "Noen %1$s tabeller i databasen din %2$s har samme navn som de tabellene Piwik prøver å opprette",
+ "Timezone": "Nettstedets tidssone",
+ "WeHopeYouWillEnjoyPiwik": "Vi håper at du vil like å bruke Piwik like mye som vi liker å lage det.",
"Welcome": "Velkommen!",
"WelcomeHelp": "<p>Piwik er åpen kildekode nettstatistikk-programvare som gjør det enkelt å finne informasjonen du ønsker om dine besøkende.<\/p><p>Denne prossessen er delt opp i %s lette steg og vil ta ca 5 minutter.<\/p>",
"WelcomeToCommunity": "Velkommen til Piwik-fellesskapet!",
- "CannotConnectToDb": "Kan ikke koble til databasen"
+ "CannotConnectToDb": "Kan ikke koble til databasen",
+ "CannotConnectToDbResolvingExplanation": "Dette kan være en midlertidig feil, prøv å %1$slaste inn siden på nytt%2$s. Hvis problemet vedvarer, vennligst kontakt din Piwik-administrator."
}
} \ No newline at end of file
diff --git a/plugins/Installation/templates/layout.twig b/plugins/Installation/templates/layout.twig
index 1399f1c180..ba331db0a7 100644
--- a/plugins/Installation/templates/layout.twig
+++ b/plugins/Installation/templates/layout.twig
@@ -9,7 +9,7 @@
<link rel="stylesheet" type="text/css" href="index.php?module=Installation&action=getBaseCss"/>
<link rel="stylesheet" type="text/css" href="plugins/Installation/stylesheets/installation.css"/>
- <link rel="shortcut icon" href="plugins/CoreHome/images/favicon.ico"/>
+ <link rel="shortcut icon" href="plugins/CoreHome/images/favicon.png"/>
<script type="text/javascript" src="libs/bower_components/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="libs/bower_components/jquery-ui/ui/minified/jquery-ui.min.js"></script>
diff --git a/plugins/LanguagesManager/Commands/TranslationBase.php b/plugins/LanguagesManager/Commands/TranslationBase.php
index 0f1b72bef4..880b1b4b61 100644
--- a/plugins/LanguagesManager/Commands/TranslationBase.php
+++ b/plugins/LanguagesManager/Commands/TranslationBase.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\LanguagesManager\Commands;
use Piwik\Development;
use Piwik\Plugin\ConsoleCommand;
-use Piwik\Translate;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
diff --git a/plugins/LanguagesManager/lang/nb.json b/plugins/LanguagesManager/lang/nb.json
index fbe1e317b4..fa75d0876d 100644
--- a/plugins/LanguagesManager/lang/nb.json
+++ b/plugins/LanguagesManager/lang/nb.json
@@ -1,5 +1,6 @@
{
"LanguagesManager": {
- "AboutPiwikTranslations": "Om Piwik-oversettelser"
+ "AboutPiwikTranslations": "Om Piwik-oversettelser",
+ "TranslationSearch": "Oversettelsessøk"
}
} \ No newline at end of file
diff --git a/plugins/Live/.gitignore b/plugins/Live/.gitignore
new file mode 100644
index 0000000000..c8c9480010
--- /dev/null
+++ b/plugins/Live/.gitignore
@@ -0,0 +1 @@
+tests/System/processed/*xml \ No newline at end of file
diff --git a/plugins/Live/API.php b/plugins/Live/API.php
index 9d02eac3ee..788f1d5c19 100644
--- a/plugins/Live/API.php
+++ b/plugins/Live/API.php
@@ -198,12 +198,19 @@ class API extends \Piwik\Plugin\API
* @param int $idSite Site ID
* @param bool|false|string $visitorId The ID of the visitor whose profile to retrieve.
* @param bool|false|string $segment
+ * @param bool|false|int $limitVisits
* @return array
*/
- public function getVisitorProfile($idSite, $visitorId = false, $segment = false)
+ public function getVisitorProfile($idSite, $visitorId = false, $segment = false, $limitVisits = false)
{
Piwik::checkUserHasViewAccess($idSite);
+ if ($limitVisits === false) {
+ $limitVisits = VisitorProfile::VISITOR_PROFILE_MAX_VISITS_TO_SHOW;
+ } else {
+ $limitVisits = (int) $limitVisits;
+ }
+
if ($visitorId === false) {
$visitorId = $this->getMostRecentVisitorId($idSite, $segment);
}
@@ -220,7 +227,7 @@ class API extends \Piwik\Plugin\API
}
$profile = new VisitorProfile($idSite);
- $result = $profile->makeVisitorProfile($visits, $visitorId, $segment);
+ $result = $profile->makeVisitorProfile($visits, $visitorId, $segment, $limitVisits);
/**
* Triggered in the Live.getVisitorProfile API method. Plugins can use this event
diff --git a/plugins/Live/Model.php b/plugins/Live/Model.php
index 8f7087405e..2152aee43a 100644
--- a/plugins/Live/Model.php
+++ b/plugins/Live/Model.php
@@ -86,7 +86,7 @@ class Model
'goal' as type,
goal.name as goalName,
goal.idgoal as goalId,
- goal.revenue as revenue,
+ log_conversion.revenue as revenue,
log_conversion.idlink_va,
log_conversion.idlink_va as goalPageId,
log_conversion.server_time as serverTimePretty,
@@ -493,4 +493,4 @@ class Model
}
return array($whereBind, $where);
}
-} \ No newline at end of file
+}
diff --git a/plugins/Live/Visitor.php b/plugins/Live/Visitor.php
index fa7be4dd63..1525bfa5cf 100644
--- a/plugins/Live/Visitor.php
+++ b/plugins/Live/Visitor.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\Live;
use Piwik\Common;
-use Piwik\DataAccess\LogAggregator;
use Piwik\DataTable\Filter\ColumnDelete;
use Piwik\Date;
use Piwik\Db;
diff --git a/plugins/Live/VisitorProfile.php b/plugins/Live/VisitorProfile.php
index 58201a3f9f..20dca4b726 100644
--- a/plugins/Live/VisitorProfile.php
+++ b/plugins/Live/VisitorProfile.php
@@ -38,10 +38,11 @@ class VisitorProfile
* @param $visits
* @param $visitorId
* @param $segment
+ * @param $numLastVisits
* @return array
* @throws Exception
*/
- public function makeVisitorProfile(DataTable $visits, $visitorId, $segment)
+ public function makeVisitorProfile(DataTable $visits, $visitorId, $segment, $numLastVisits)
{
$this->initVisitorProfile();
@@ -75,7 +76,7 @@ class VisitorProfile
$this->handleAdjacentVisitorIds($visits, $visitorId, $segment);
// use N most recent visits for last_visits
- $visits->deleteRowsOffset(self::VISITOR_PROFILE_MAX_VISITS_TO_SHOW);
+ $visits->deleteRowsOffset($numLastVisits);
$this->profile['lastVisits'] = $visits;
diff --git a/plugins/Live/lang/nb.json b/plugins/Live/lang/nb.json
index 001bbdc8e4..2d82e3aa63 100644
--- a/plugins/Live/lang/nb.json
+++ b/plugins/Live/lang/nb.json
@@ -8,18 +8,18 @@
"LastHours": "Siste %s timer",
"LastMinutes": "Siste %s minutter",
"LastVisit": "Siste besøk",
- "LinkVisitorLog": "Vis detaljert logg over besøkende",
- "NbVisitor": "1 besøkende",
- "NbVisitors": "%s besøkende",
- "NextVisitor": "Neste besøkende",
- "PreviousVisitor": "Forrige besøkende",
+ "LinkVisitorLog": "Vis detaljert logg over besøkere",
+ "NbVisitor": "1 besøker",
+ "NbVisitors": "%s besøkere",
+ "NextVisitor": "Neste besøker",
+ "PreviousVisitor": "Forrige besøker",
"RealTimeVisitorCount": "Besøkstall i sanntid",
"Referrer_URL": "Henvisnings-URL",
"ShowMap": "vis kart",
"SimpleRealTimeWidget_Message": "%s og %s i de siste %s",
"ViewVisitorProfile": "Vis besøksprofil",
"VisitedPages": "Besøkte sider",
- "VisitorLog": "Logg over besøkende",
+ "VisitorLog": "Logg over besøkere",
"VisitorProfile": "Besøksprofil",
"VisitorsInRealTime": "Besøkende i sanntid",
"VisitsFrom": "%1$s%2$s besøk%3$s fra",
diff --git a/plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php b/plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php
new file mode 100644
index 0000000000..0c8428cf67
--- /dev/null
+++ b/plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Plugins\Live\tests\Fixtures;
+
+use Piwik\Date;
+use Piwik\Tests\Framework\Fixture;
+
+/**
+ * Generates many visits for the same visitor
+ */
+class ManyVisitsOfSameVisitor extends Fixture
+{
+ public $dateTime = '2010-02-01 11:22:33';
+ public $idSite = 1;
+
+ public function setUp()
+ {
+ if (!self::siteCreated($idSite = 1)) {
+ self::createWebsite($this->dateTime);
+ }
+
+ $this->trackVisits();
+ }
+
+ public function tearDown()
+ {
+ // empty
+ }
+
+ private function trackVisits()
+ {
+ $t = self::getTracker($this->idSite, $this->dateTime, $defaultInit = true);
+ $t->setTokenAuth(self::getTokenAuth());
+ $t->enableBulkTracking();
+
+ for ($numVisits = 0; $numVisits <= 30; $numVisits++) {
+ $t->setForceNewVisit();
+ $t->setUrl('http://example.org/my/dir/page' . ($numVisits % 4));
+
+ $visitDateTime = Date::factory($this->dateTime)->addDay($numVisits)->getDatetime();
+ $t->setForceVisitDateTime($visitDateTime);
+
+ self::assertTrue($t->doTrackPageView('incredible title ' . ($numVisits % 3)));
+ }
+
+ self::checkBulkTrackingResponse($t->doBulkTrack());
+ }
+} \ No newline at end of file
diff --git a/plugins/Live/tests/System/APITest.php b/plugins/Live/tests/System/ApiCounterTest.php
index 098e7615c5..f957b09608 100644
--- a/plugins/Live/tests/System/APITest.php
+++ b/plugins/Live/tests/System/ApiCounterTest.php
@@ -12,17 +12,17 @@ use Piwik\Date;
use Piwik\Db;
use Piwik\Plugins\Goals\API as GoalsApi;
use Piwik\Plugins\Live\API;
-use Piwik\Access;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
/**
* @group Live
- * @group APITest
+ * @group ApiTest
+ * @group Api
* @group Plugins
*/
-class APITest extends SystemTestCase
+class ApiCounterTest extends SystemTestCase
{
/**
* @var API
diff --git a/plugins/Live/tests/System/ApiTest.php b/plugins/Live/tests/System/ApiTest.php
new file mode 100644
index 0000000000..52185f119f
--- /dev/null
+++ b/plugins/Live/tests/System/ApiTest.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\Live\tests\System;
+
+use Piwik\Plugins\Live\tests\Fixtures\ManyVisitsOfSameVisitor;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * @group Live
+ * @group ApiTest
+ * @group Api
+ * @group Plugins
+ */
+class ApiTest extends SystemTestCase
+{
+ /**
+ * @var ManyVisitsOfSameVisitor
+ */
+ public static $fixture = null; // initialized below class definition
+
+ /**
+ * @dataProvider getApiForTesting
+ */
+ public function testApi($api, $params)
+ {
+ $this->runApiTests($api, $params);
+ }
+
+ public function getApiForTesting()
+ {
+ $api = array(
+ 'Live.getVisitorProfile',
+ );
+
+ $apiToTest = array();
+ $apiToTest[] = array($api,
+ array(
+ 'idSite' => 1,
+ 'date' => self::$fixture->dateTime,
+ 'periods' => array('day'),
+ 'testSuffix' => ''
+ )
+ );
+ $apiToTest[] = array($api,
+ array(
+ 'idSite' => 1,
+ 'date' => self::$fixture->dateTime,
+ 'periods' => array('day'),
+ 'otherRequestParameters' => array('limitVisits' => 20),
+ 'testSuffix' => 'higherLimit'
+ )
+ );
+
+ return $apiToTest;
+ }
+
+ public static function getOutputPrefix()
+ {
+ return '';
+ }
+
+ public static function getPathToTestDirectory()
+ {
+ return dirname(__FILE__);
+ }
+
+}
+
+ApiTest::$fixture = new ManyVisitsOfSameVisitor(); \ No newline at end of file
diff --git a/plugins/Live/tests/System/expected/test___Live.getVisitorProfile.xml b/plugins/Live/tests/System/expected/test___Live.getVisitorProfile.xml
new file mode 100644
index 0000000000..25b150b17b
--- /dev/null
+++ b/plugins/Live/tests/System/expected/test___Live.getVisitorProfile.xml
@@ -0,0 +1,1061 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <totalVisits>31</totalVisits>
+ <totalVisitDuration>0</totalVisitDuration>
+ <totalActions>31</totalActions>
+ <totalSearches>0</totalSearches>
+ <totalPageViewsWithTiming>0</totalPageViewsWithTiming>
+ <totalGoalConversions>0</totalGoalConversions>
+ <totalConversionsByGoal>
+ </totalConversionsByGoal>
+ <hasLatLong>0</hasLatLong>
+ <searches>
+ </searches>
+ <continents>
+ <row>
+ <continent>eur</continent>
+ <nb_visits>1</nb_visits>
+ <prettyName>Europe</prettyName>
+ </row>
+ <row>
+ <continent>unk</continent>
+ <nb_visits>30</nb_visits>
+ <prettyName>Unknown</prettyName>
+ </row>
+ </continents>
+ <countries>
+ <row>
+ <country>fr</country>
+ <nb_visits>1</nb_visits>
+ <flag>plugins/UserCountry/images/flags/fr.png</flag>
+ <prettyName>France</prettyName>
+ </row>
+ <row>
+ <country>xx</country>
+ <nb_visits>30</nb_visits>
+ <flag>plugins/UserCountry/images/flags/xx.png</flag>
+ <prettyName>Unknown</prettyName>
+ </row>
+ </countries>
+ <totalVisitDurationPretty>0s</totalVisitDurationPretty>
+ <firstVisit>
+
+
+ <daysAgo>2148</daysAgo>
+ <referrerType>direct</referrerType>
+ <referralSummary>Direct Entry</referralSummary>
+ </firstVisit>
+ <lastVisit>
+
+
+ <daysAgo>2118</daysAgo>
+ <referrerType>direct</referrerType>
+ <referralSummary>Direct Entry</referralSummary>
+ </lastVisit>
+ <visitsAggregated>31</visitsAggregated>
+
+
+ <lastVisits>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>31</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page2</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>6</pageIdAction>
+
+ <pageId>31</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>30</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page1</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>4</pageIdAction>
+
+ <pageId>30</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>29</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>2</pageIdAction>
+
+ <pageId>29</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>28</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page3</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+ <pageId>28</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>27</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page2</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>6</pageIdAction>
+
+ <pageId>27</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>26</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page1</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>4</pageIdAction>
+
+ <pageId>26</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>25</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>2</pageIdAction>
+
+ <pageId>25</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>24</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page3</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+ <pageId>24</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>23</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page2</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>6</pageIdAction>
+
+ <pageId>23</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>22</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page1</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>4</pageIdAction>
+
+ <pageId>22</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ </lastVisits>
+ <userId>0</userId>
+</result> \ No newline at end of file
diff --git a/plugins/Live/tests/System/expected/test_higherLimit__Live.getVisitorProfile.xml b/plugins/Live/tests/System/expected/test_higherLimit__Live.getVisitorProfile.xml
new file mode 100644
index 0000000000..c5e105bab3
--- /dev/null
+++ b/plugins/Live/tests/System/expected/test_higherLimit__Live.getVisitorProfile.xml
@@ -0,0 +1,2061 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <totalVisits>31</totalVisits>
+ <totalVisitDuration>0</totalVisitDuration>
+ <totalActions>31</totalActions>
+ <totalSearches>0</totalSearches>
+ <totalPageViewsWithTiming>0</totalPageViewsWithTiming>
+ <totalGoalConversions>0</totalGoalConversions>
+ <totalConversionsByGoal>
+ </totalConversionsByGoal>
+ <hasLatLong>0</hasLatLong>
+ <searches>
+ </searches>
+ <continents>
+ <row>
+ <continent>eur</continent>
+ <nb_visits>1</nb_visits>
+ <prettyName>Europe</prettyName>
+ </row>
+ <row>
+ <continent>unk</continent>
+ <nb_visits>30</nb_visits>
+ <prettyName>Unknown</prettyName>
+ </row>
+ </continents>
+ <countries>
+ <row>
+ <country>fr</country>
+ <nb_visits>1</nb_visits>
+ <flag>plugins/UserCountry/images/flags/fr.png</flag>
+ <prettyName>France</prettyName>
+ </row>
+ <row>
+ <country>xx</country>
+ <nb_visits>30</nb_visits>
+ <flag>plugins/UserCountry/images/flags/xx.png</flag>
+ <prettyName>Unknown</prettyName>
+ </row>
+ </countries>
+ <totalVisitDurationPretty>0s</totalVisitDurationPretty>
+ <firstVisit>
+
+
+ <daysAgo>2148</daysAgo>
+ <referrerType>direct</referrerType>
+ <referralSummary>Direct Entry</referralSummary>
+ </firstVisit>
+ <lastVisit>
+
+
+ <daysAgo>2118</daysAgo>
+ <referrerType>direct</referrerType>
+ <referralSummary>Direct Entry</referralSummary>
+ </lastVisit>
+ <visitsAggregated>31</visitsAggregated>
+
+
+ <lastVisits>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>31</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page2</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>6</pageIdAction>
+
+ <pageId>31</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>30</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page1</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>4</pageIdAction>
+
+ <pageId>30</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>29</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>2</pageIdAction>
+
+ <pageId>29</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>28</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page3</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+ <pageId>28</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>27</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page2</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>6</pageIdAction>
+
+ <pageId>27</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>26</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page1</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>4</pageIdAction>
+
+ <pageId>26</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>25</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>2</pageIdAction>
+
+ <pageId>25</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>24</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page3</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+ <pageId>24</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>23</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page2</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>6</pageIdAction>
+
+ <pageId>23</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>22</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page1</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>4</pageIdAction>
+
+ <pageId>22</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>21</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>2</pageIdAction>
+
+ <pageId>21</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>20</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page3</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+ <pageId>20</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>19</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page2</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>6</pageIdAction>
+
+ <pageId>19</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>18</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page1</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>4</pageIdAction>
+
+ <pageId>18</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>17</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>2</pageIdAction>
+
+ <pageId>17</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>16</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page3</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+ <pageId>16</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>15</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page2</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>6</pageIdAction>
+
+ <pageId>15</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>14</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page1</url>
+ <pageTitle>incredible title 1</pageTitle>
+ <pageIdAction>4</pageIdAction>
+
+ <pageId>14</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>13</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>2</pageIdAction>
+
+ <pageId>13</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>12</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page3</url>
+ <pageTitle>incredible title 2</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+ <pageId>12</pageId>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/unknown.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/UNK.gif</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/UNK.gif</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/flash.gif</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/DevicePlugins/images/plugins/java.gif</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+
+
+
+
+
+ </row>
+ </lastVisits>
+ <userId>0</userId>
+</result> \ No newline at end of file
diff --git a/plugins/Login/Controller.php b/plugins/Login/Controller.php
index bb9e5da77b..74a546d01b 100644
--- a/plugins/Login/Controller.php
+++ b/plugins/Login/Controller.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\Login;
use Exception;
-use Piwik\Auth as AuthInterface;
use Piwik\Common;
use Piwik\Config;
use Piwik\Container\StaticContainer;
@@ -216,7 +215,32 @@ class Controller extends \Piwik\Plugin\Controller
protected function getMessageExceptionNoAccess()
{
$message = Piwik::translate('Login_InvalidNonceOrHeadersOrReferrer', array('<a href="?module=Proxy&action=redirect&url=' . urlencode('http://piwik.org/faq/how-to-install/#faq_98') . '" target="_blank">', '</a>'));
- // Should mention trusted_hosts or link to FAQ
+
+ $message .= $this->getMessageExceptionNoAccessWhenInsecureConnectionMayBeUsed();
+
+ return $message;
+ }
+
+ /**
+ * The Session cookie is set to a secure cookie, when SSL is mis-configured, it can cause the PHP session cookie ID to change on each page view.
+ * Indicate to user how to solve this particular use case by forcing secure connections.
+ *
+ * @return string
+ */
+ protected function getMessageExceptionNoAccessWhenInsecureConnectionMayBeUsed()
+ {
+ $message = '';
+ if(Url::isSecureConnectionAssumedByPiwikButNotForcedYet()) {
+ $message = '<br/><br/>' . Piwik::translate('Login_InvalidNonceSSLMisconfigured',
+ array(
+ '<a href="?module=Proxy&action=redirect&url=' . urlencode('<a href="http://piwik.org/faq/how-to/faq_91/">') . '">',
+ '</a>',
+ 'config/config.ini.php',
+ '<pre>force_ssl=1</pre>',
+ '<pre>[General]</pre>',
+ )
+ );
+ }
return $message;
}
@@ -224,7 +248,6 @@ class Controller extends \Piwik\Plugin\Controller
* Reset password action. Stores new password as hash and sends email
* to confirm use.
*
- * @param none
*/
function resetPassword()
{
diff --git a/plugins/Login/lang/en.json b/plugins/Login/lang/en.json
index 3164a4bbcd..ad7d3524f0 100644
--- a/plugins/Login/lang/en.json
+++ b/plugins/Login/lang/en.json
@@ -5,6 +5,7 @@
"ExceptionInvalidSuperUserAccessAuthenticationMethod": "A user with Super User access cannot be authenticated using the '%s' mechanism.",
"ExceptionPasswordMD5HashExpected": "The password parameter is expected to be a MD5 hash of the password.",
"InvalidNonceOrHeadersOrReferrer": "Form security failed. Please reload the form and check that your cookies are enabled. If you use a proxy server, you must %s configure Piwik to accept the proxy header%s that forwards the Host header. Also, check that your Referrer header is sent correctly.",
+ "InvalidNonceSSLMisconfigured": "Also, you may %1$s force Piwik to use a secure connection%2$s: in your config file %3$s set %4$s below section %5$s",
"InvalidOrExpiredToken": "Token is invalid or has expired.",
"InvalidUsernameEmail": "Invalid username or e-mail address.",
"LogIn": "Sign in",
@@ -20,4 +21,4 @@
"RememberMe": "Remember Me",
"ResetPasswordInstructions": "Enter a new password for your account."
}
-} \ No newline at end of file
+}
diff --git a/plugins/Login/lang/hu.json b/plugins/Login/lang/hu.json
index ef1db04e77..045fe68e62 100644
--- a/plugins/Login/lang/hu.json
+++ b/plugins/Login/lang/hu.json
@@ -1,15 +1,23 @@
{
"Login": {
+ "ConfirmationLinkSent": "A megerősítő link továbbításra került postafiókjába. Kérjük ellenőrizze e-mailjeit és kattintson a linkre a jelszóváltoztatás megerősítéséhez.",
"ContactAdmin": "Lehetséges ok: talán a szolgáltatód tiltja a mail() funkciót. <br \/> Kérjük, lépj kapcsolatba a Piwik adminisztrátoroddal.",
+ "ExceptionInvalidSuperUserAccessAuthenticationMethod": "Egy felhasználó, akor Szuper felhasználó szinttel rendelkezik, nem használhatja a %s belépési mechanizmust.",
"ExceptionPasswordMD5HashExpected": "A jelszóparaméternek egyeznie kellene a jelszó MD5 hash értékével.",
+ "InvalidNonceOrHeadersOrReferrer": "Űrlap biztonsági probléma. Kérjük töltse újra az űrlapot és ellenőrizze, hogy a sütik engedélyezve vannak-e. Amennyiben proxy szervert használ, akkor engedélyezni kell %s a Piwik-nek, hogy elfogadja a proxy fejléceket %s, amelyek visszamutatnak a hoszt fejlécére. Ezen felül ellenőrizze, hogy a Hivatkozó fejléc helyesen lett-e elküldve.",
"InvalidOrExpiredToken": "A kód érvénytelen vagy lejárt.",
"InvalidUsernameEmail": "Helytelen felhasználói név és\/vagy e-mail cím",
"LogIn": "Bejelentkezés",
"LoginOrEmail": "Felhasználói név vagy e-mail cím",
"LoginPasswordNotCorrect": "Felhasználói név\/jelszó páros nem megfelelő",
"LostYourPassword": "Elfelejtetted jelszavad?",
+ "MailPasswordChangeBody": "Üdv %1$s,\n\nJelsző visszaállítási kérelem érkezett innen: %2$s. A jelszóváltoztatás megerősítéséhez és a bejelentkezéshez kattintson a következő linkre:\n\n%3$s\n\nMegjegyzés: Ez a link elévül 24 órán belül.\nKöszönjük, hogy Piwik-et használ!",
+ "MailTopicPasswordChange": "Jelszóváltoztatás megerősítése",
+ "PasswordChanged": "Jelszómódosítás sikeres.",
"PasswordRepeat": "Jelszó (ismét)",
"PasswordsDoNotMatch": "Nem egyeznek a jelszavak",
- "RememberMe": "Megjegyzés"
+ "PluginDescription": "Hitelesítés felhasználónévvel és jelszóval, illetve tartalmaz jelszó visszaállítási funkciót. A hitelesítési metódus lecserélhető másik bejelentkezési bővítményre, mint például a LoginLdap, amely elérhető az Árúházban.",
+ "RememberMe": "Megjegyzés",
+ "ResetPasswordInstructions": "Adjon meg egy új jelszavat profiljához."
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/nb.json b/plugins/Login/lang/nb.json
index 0717afab2e..45385fbc4f 100644
--- a/plugins/Login/lang/nb.json
+++ b/plugins/Login/lang/nb.json
@@ -1,16 +1,22 @@
{
"Login": {
+ "ConfirmationLinkSent": "En bekreftelseslenke har blitt sendt til din innboks. Sjekk din e-post og besøk denne lenken for å autorisere din forespørsel om å endre passord.",
"ContactAdmin": "Mulig grunn: Din tjener har kanskje deaktivert mail()-funksjonen. <br \/>Kontakt din Piwik administrator.",
- "InvalidOrExpiredToken": "Token er ugyldig eller har utløpt.",
+ "ExceptionInvalidSuperUserAccessAuthenticationMethod": "En bruker med superbrukertilgang kan ikke autentiseres med «%s»-mekanismen.",
+ "ExceptionPasswordMD5HashExpected": "Passordparameteret er forventet å være en MD5-hash av passordet.",
+ "InvalidNonceOrHeadersOrReferrer": "Skjemasikkerhet feilet. Vennligst last inn skjemaet på nytt og sjekk at datakapsler er aktivert. Hvis du bruker en proxy-server må du %s konfigurere Piwik til å akseptere proxy-headere %s som sender videre Host-headeren. Sjekk også at Referrer-headeren sendes uten feil.",
+ "InvalidOrExpiredToken": "Autentiseringsnøkkelen er ugyldig eller har utløpt.",
"InvalidUsernameEmail": "Feil brukernavn og\/eller epost-adresse.",
"LogIn": "Logg inn",
"LoginOrEmail": "Brukernavn eller e-post",
- "LoginPasswordNotCorrect": "Brukernavn og passord er ikke korrekt",
+ "LoginPasswordNotCorrect": "Feil kombinasjon av brukernavn og passord.",
"LostYourPassword": "Glemt passord?",
+ "MailPasswordChangeBody": "Hei %1$s,\n\nDet ble mottatt en forespørsel om å tilbakestille passordet fra %2$s. For å bekrefte denne passordendringen slik at du kan logge inn på nytt, klikk på denne lenken:\n\n%3$s\n\nMerk: denne nøkkelen er kun gyldig i 24 timer.\n\nOg takk for at du bruker Piwik!",
"MailTopicPasswordChange": "Bekreft passordendring",
"PasswordChanged": "Passordet er endret.",
"PasswordRepeat": "Passord (gjenta)",
"PasswordsDoNotMatch": "Passordene stemmer ikke overens.",
+ "PluginDescription": "Gir autentisering med brukernavn og passord i tillegg til funksjonalitet for å gjenopprette passord. Autentiseringsmetoden kan endres ved å bruke en annen innloggingsutvidelse som LoginLdap, som er tilgjengelig via Markedsplassen.",
"RememberMe": "Husk meg",
"ResetPasswordInstructions": "Skriv inn et nytt passord for kontoen din."
}
diff --git a/plugins/MobileAppMeasurable/lang/hu.json b/plugins/MobileAppMeasurable/lang/hu.json
new file mode 100644
index 0000000000..be174d6036
--- /dev/null
+++ b/plugins/MobileAppMeasurable/lang/hu.json
@@ -0,0 +1,7 @@
+{
+ "MobileAppMeasurable": {
+ "MobileApp": "Mobil applikáció",
+ "MobileApps": "Mobil applikációk",
+ "MobileAppDescription": "Egy natív mobil applikáció iOS-hez, Android-hoz vagy egyéb más mobil operációs rendszerekhez."
+ }
+} \ No newline at end of file
diff --git a/plugins/MobileMessaging/lang/nb.json b/plugins/MobileMessaging/lang/nb.json
index 31a54cae88..79b4224f2a 100644
--- a/plugins/MobileMessaging/lang/nb.json
+++ b/plugins/MobileMessaging/lang/nb.json
@@ -17,6 +17,6 @@
"Settings_VerificationCodeJustSent": "Vi har nettopp sendt en SMS til dette nummeret med en kode: Skriv inn denne koden ovenfor og klikk \"Valider\".",
"SettingsMenu": "Meldingstjenester",
"SMS_Content_Too_Long": "[for lang]",
- "TopMenu": "E-post og SMS-rapporter"
+ "TopMenu": "E-post- og SMS-rapporter"
}
} \ No newline at end of file
diff --git a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less
index 1922c721a8..6e8cd0cf89 100644
--- a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less
+++ b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less
@@ -9,7 +9,7 @@
font-size: 14px;
border-radius: 4px;
- &.update_available .title {
+ &.update_available:not(.isPiwikDemo) .title {
color: #CA8100;
font-weight: bold;
}
diff --git a/plugins/MultiSites/API.php b/plugins/MultiSites/API.php
index 23ae821738..8e2ce0c1a3 100755
--- a/plugins/MultiSites/API.php
+++ b/plugins/MultiSites/API.php
@@ -19,7 +19,6 @@ use Piwik\Period\Range;
use Piwik\Piwik;
use Piwik\Plugins\Goals\Archiver;
use Piwik\Plugins\SitesManager\API as APISitesManager;
-use Piwik\Plugins\SitesManager\Model as ModelSitesManager;
use Piwik\Scheduler\Scheduler;
use Piwik\SettingsPiwik;
use Piwik\Site;
diff --git a/plugins/MultiSites/Controller.php b/plugins/MultiSites/Controller.php
index a59e8a4cdb..ce5f599f13 100644
--- a/plugins/MultiSites/Controller.php
+++ b/plugins/MultiSites/Controller.php
@@ -8,15 +8,12 @@
*/
namespace Piwik\Plugins\MultiSites;
-use Piwik\API\Request;
-use Piwik\API\ResponseBuilder;
use Piwik\Common;
use Piwik\Config;
use Piwik\Date;
use Piwik\Period;
use Piwik\DataTable;
use Piwik\DataTable\Row;
-use Piwik\DataTable\Row\DataTableSummaryRow;
use Piwik\Piwik;
use Piwik\Translation\Translator;
use Piwik\View;
diff --git a/plugins/MultiSites/lang/nb.json b/plugins/MultiSites/lang/nb.json
index 73b0d8531c..2f317cc9fa 100644
--- a/plugins/MultiSites/lang/nb.json
+++ b/plugins/MultiSites/lang/nb.json
@@ -1,7 +1,9 @@
{
"MultiSites": {
"Evolution": "Utvikling",
- "LoadingWebsites": "Laster nettsider",
- "Pagination": "%s - %s av %s"
+ "LoadingWebsites": "Laster nettsteder",
+ "PluginDescription": "Se og sammenligne alle dine nettsteder og apper i denne nyttige «Alle nettsteder»-oversikten.",
+ "TopLinkTooltip": "Sammenligne web-statistikk for alle dine nettsteder.",
+ "Pagination": "%s – %s av %s"
}
} \ No newline at end of file
diff --git a/plugins/Overlay/lang/nb.json b/plugins/Overlay/lang/nb.json
index ba9f8d5596..ce87df390e 100644
--- a/plugins/Overlay/lang/nb.json
+++ b/plugins/Overlay/lang/nb.json
@@ -3,7 +3,7 @@
"Clicks": "%s klikk",
"Domain": "Domene",
"ErrorNotLoadingLink": "Klikk her for å få flere tips for feilsøking",
- "Link": "Link",
+ "Link": "Lenke",
"Location": "Sted",
"OneClick": "1 klikk"
}
diff --git a/plugins/PrivacyManager/lang/nb.json b/plugins/PrivacyManager/lang/nb.json
index 1ac9cbe3ab..512319bd66 100644
--- a/plugins/PrivacyManager/lang/nb.json
+++ b/plugins/PrivacyManager/lang/nb.json
@@ -1,6 +1,6 @@
{
"PrivacyManager": {
- "AnonymizeIpMaskLength": "%s byte(s) - f.eks %s",
+ "AnonymizeIpMaskLength": "%s byte(s) – f.eks %s",
"ClickHereSettings": "Klikk her for å få tilgang til %s-innstillingene.",
"CurrentDBSize": "Nåværende databasestørrelse",
"DeleteDataDescription": "Du kan sette opp Piwik til å regelmessig slette gamle besøkslogger og\/eller behandlede rapporter for å holde databasen din liten.",
diff --git a/plugins/Provider/lang/ko.json b/plugins/Provider/lang/ko.json
index bd18d2d99c..61f86ef1a0 100644
--- a/plugins/Provider/lang/ko.json
+++ b/plugins/Provider/lang/ko.json
@@ -1,7 +1,9 @@
{
"Provider": {
"ColumnProvider": "공급자",
+ "PluginDescription": "방문자의 인터넷 서비스 공급자 확인",
"ProviderReportDocumentation": "이 보고서는 웹사이트를 방문하는 방문자가 사용하고있는 인터넷 서비스 공급자를 보여줍니다. 자세한 내용은 공급자 이름을 클릭하세요. %s Piwik가 방문자의 공급자를 확인할 수없는 경우는 IP로 표시됩니다.",
- "WidgetProviders": "공급자"
+ "WidgetProviders": "공급자",
+ "ProviderReportFooter": "알 수 없는 공급자는 해당 IP 주소가 검색되지 않았음을 의미합니다."
}
} \ No newline at end of file
diff --git a/plugins/Provider/lang/nb.json b/plugins/Provider/lang/nb.json
index 38e9434df0..ad1a77b862 100644
--- a/plugins/Provider/lang/nb.json
+++ b/plugins/Provider/lang/nb.json
@@ -1,6 +1,9 @@
{
"Provider": {
- "ColumnProvider": "Tilbyder",
- "WidgetProviders": "Tilbydere"
+ "ColumnProvider": "Internett-leverandør",
+ "PluginDescription": "Rapporterer internett-leverandøren (ISP-en) til besøkere.",
+ "ProviderReportDocumentation": "Denne rapporten viser hvilken internett-leverandør (ISP) dine besøkere bruker for å besøke nettstedet. Du kan klikke på et ISP-navn for flere detaljer. %s Hvis Piwik ikke kan finne en besøkers ISP, listes den som IP.",
+ "WidgetProviders": "Internett-leverandører",
+ "ProviderReportFooter": "Ukjent internett-leverandør betyr at IP-adressen ikke kunne slås opp."
}
} \ No newline at end of file
diff --git a/plugins/QueuedTracking b/plugins/QueuedTracking
-Subproject 972fb6cc1953f7c21439c901fb87ab471eaf6b6
+Subproject 8aa8c0735c481a7355d69f99374ea7726d2f73c
diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php
index a4da79d389..655ea20449 100644
--- a/plugins/Referrers/Columns/Base.php
+++ b/plugins/Referrers/Columns/Base.php
@@ -34,12 +34,12 @@ abstract class Base extends VisitDimension
protected $currentUrlParse;
protected $idsite;
+ private static $cachedReferrerSearchEngine = array();
+
// Used to prefix when a adsense referrer is detected
const LABEL_PREFIX_ADWORDS_KEYWORD = '(adwords) ';
const LABEL_ADWORDS_NAME = 'AdWords';
- private static $cachedReferrer = array();
-
/**
* Returns an array containing the following information:
* - referer_type
@@ -69,14 +69,8 @@ abstract class Base extends VisitDimension
* @param int $idSite
* @return array
*/
- protected function getReferrerInformation($referrerUrl, $currentUrl, $idSite, Request $request)
+ protected function getReferrerInformation($referrerUrl, $currentUrl, $idSite, Request $request, Visitor $visitor)
{
- $cacheKey = $referrerUrl . $currentUrl . $idSite;
-
- if (isset(self::$cachedReferrer[$cacheKey])) {
- return self::$cachedReferrer[$cacheKey];
- }
-
$this->idsite = $idSite;
// default values for the referer_* fields
@@ -101,7 +95,7 @@ abstract class Base extends VisitDimension
$this->referrerHost = $this->referrerUrlParse['host'];
}
- $referrerDetected = $this->detectReferrerCampaign($request);
+ $referrerDetected = $this->detectReferrerCampaign($request, $visitor);
if (!$referrerDetected) {
if ($this->detectReferrerDirectEntry()
@@ -131,17 +125,15 @@ abstract class Base extends VisitDimension
'referer_url' => $this->referrerUrl,
);
- self::$cachedReferrer[$cacheKey] = $referrerInformation;
-
return $referrerInformation;
}
- protected function getReferrerInformationFromRequest(Request $request)
+ protected function getReferrerInformationFromRequest(Request $request, Visitor $visitor)
{
$referrerUrl = $request->getParam('urlref');
$currentUrl = $request->getParam('url');
- return $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite(), $request);
+ return $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite(), $request, $visitor);
}
/**
@@ -150,28 +142,36 @@ abstract class Base extends VisitDimension
*/
protected function detectReferrerSearchEngine()
{
- $searchEngineInformation = SearchEngineDetection::getInstance()->extractInformationFromUrl($this->referrerUrl);
-
- /**
- * Triggered when detecting the search engine of a referrer URL.
- *
- * Plugins can use this event to provide custom search engine detection
- * logic.
- *
- * @param array &$searchEngineInformation An array with the following information:
- *
- * - **name**: The search engine name.
- * - **keywords**: The search keywords used.
- *
- * This parameter is initialized to the results
- * of Piwik's default search engine detection
- * logic.
- * @param string referrerUrl The referrer URL from the tracking request.
- */
- Piwik::postEvent('Tracker.detectReferrerSearchEngine', array(&$searchEngineInformation, $this->referrerUrl));
+ if (isset(self::$cachedReferrerSearchEngine[$this->referrerUrl])) {
+ $searchEngineInformation = self::$cachedReferrerSearchEngine[$this->referrerUrl];
+ } else {
+ $searchEngineInformation = SearchEngineDetection::getInstance()->extractInformationFromUrl($this->referrerUrl);
+
+ /**
+ * Triggered when detecting the search engine of a referrer URL.
+ *
+ * Plugins can use this event to provide custom search engine detection
+ * logic.
+ *
+ * @param array &$searchEngineInformation An array with the following information:
+ *
+ * - **name**: The search engine name.
+ * - **keywords**: The search keywords used.
+ *
+ * This parameter is initialized to the results
+ * of Piwik's default search engine detection
+ * logic.
+ * @param string referrerUrl The referrer URL from the tracking request.
+ */
+ Piwik::postEvent('Tracker.detectReferrerSearchEngine', array(&$searchEngineInformation, $this->referrerUrl));
+
+ self::$cachedReferrerSearchEngine[$this->referrerUrl] = $searchEngineInformation;
+ }
+
if ($searchEngineInformation === false) {
return false;
}
+
$this->typeReferrerAnalyzed = Common::REFERRER_TYPE_SEARCH_ENGINE;
$this->nameReferrerAnalyzed = $searchEngineInformation['name'];
$this->keywordReferrerAnalyzed = $searchEngineInformation['keywords'];
@@ -354,7 +354,7 @@ abstract class Base extends VisitDimension
/**
* @return bool
*/
- protected function detectReferrerCampaign(Request $request)
+ protected function detectReferrerCampaign(Request $request, Visitor $visitor)
{
$isCampaign = $this->detectReferrerCampaignFromTrackerParams($request);
if (!$isCampaign) {
@@ -363,12 +363,30 @@ abstract class Base extends VisitDimension
$this->detectCampaignKeywordFromReferrerUrl();
- if ($this->typeReferrerAnalyzed != Common::REFERRER_TYPE_CAMPAIGN) {
- return false;
- }
+ $isCurrentVisitACampaignWithSameName = $visitor->getVisitorColumn('referer_name') == $this->nameReferrerAnalyzed;
+ $isCurrentVisitACampaignWithSameName = $isCurrentVisitACampaignWithSameName && $visitor->getVisitorColumn('referer_type') == Common::REFERRER_TYPE_CAMPAIGN;
+
// if we detected a campaign but there is still no keyword set, we set the keyword to the Referrer host
if (empty($this->keywordReferrerAnalyzed)) {
- $this->keywordReferrerAnalyzed = $this->referrerHost;
+ if ($isCurrentVisitACampaignWithSameName) {
+ $this->keywordReferrerAnalyzed = $visitor->getVisitorColumn('referer_keyword');
+ // it is an existing visit and no referrer keyword was used initially (or a different host),
+ // we do not use the default referrer host in this case as it would create a new visit. It would create
+ // a new visit because initially the referrer keyword was not set (or from a different host) and now
+ // we would set it suddenly. The changed keyword would be recognized as a campaign change and a new
+ // visit would be forced. Why would it suddenly set a keyword but not do it initially?
+ // This happens when on the first visit when the URL was opened directly (no referrer or different host)
+ // and then the user navigates to another page where the referrer host becomes the own host
+ // (referrer = own website) see https://github.com/piwik/piwik/issues/9299
+ } else {
+ $this->keywordReferrerAnalyzed = $this->referrerHost;
+ }
+ }
+
+ if ($this->typeReferrerAnalyzed != Common::REFERRER_TYPE_CAMPAIGN) {
+ $this->keywordReferrerAnalyzed = null;
+ $this->nameReferrerAnalyzed = null;
+ return false;
}
$this->keywordReferrerAnalyzed = Common::mb_strtolower($this->keywordReferrerAnalyzed);
@@ -384,7 +402,6 @@ abstract class Base extends VisitDimension
*/
public function getValueForRecordGoal(Request $request, Visitor $visitor)
{
- $referrerTimestamp = $request->getParam('_refts');
$referrerUrl = $request->getParam('_ref');
$referrerCampaignName = $this->getReferrerCampaignQueryParam($request, '_rcn');
$referrerCampaignKeyword = $this->getReferrerCampaignQueryParam($request, '_rck');
@@ -422,7 +439,7 @@ abstract class Base extends VisitDimension
elseif (!empty($referrerUrl)) {
$idSite = $request->getIdSite();
- $referrer = $this->getReferrerInformation($referrerUrl, $currentUrl = '', $idSite, $request);
+ $referrer = $this->getReferrerInformation($referrerUrl, $currentUrl = '', $idSite, $request, $visitor);
// if the parsed referrer is interesting enough, ie. website or search engine
if (in_array($referrer['referer_type'], array(Common::REFERRER_TYPE_SEARCH_ENGINE, Common::REFERRER_TYPE_WEBSITE))) {
diff --git a/plugins/Referrers/Columns/Campaign.php b/plugins/Referrers/Columns/Campaign.php
index c29b622336..be42acb34b 100644
--- a/plugins/Referrers/Columns/Campaign.php
+++ b/plugins/Referrers/Columns/Campaign.php
@@ -50,7 +50,7 @@ class Campaign extends Base
return false;
}
- $information = $this->getReferrerInformationFromRequest($request);
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
if ($information['referer_type'] == Common::REFERRER_TYPE_CAMPAIGN
&& $this->isReferrerInformationNew($visitor, $information)
diff --git a/plugins/Referrers/Columns/Keyword.php b/plugins/Referrers/Columns/Keyword.php
index b3bfc374b1..7c927d6492 100644
--- a/plugins/Referrers/Columns/Keyword.php
+++ b/plugins/Referrers/Columns/Keyword.php
@@ -42,7 +42,7 @@ class Keyword extends Base
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
- $information = $this->getReferrerInformationFromRequest($request);
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
if (!empty($information['referer_keyword'])) {
return Common::mb_substr($information['referer_keyword'], 0, 255);
diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php
index ded0a48f9e..ef21e7a277 100644
--- a/plugins/Referrers/Columns/ReferrerName.php
+++ b/plugins/Referrers/Columns/ReferrerName.php
@@ -36,7 +36,7 @@ class ReferrerName extends Base
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
- $information = $this->getReferrerInformationFromRequest($request);
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
if (!empty($information['referer_name'])) {
return Common::mb_substr($information['referer_name'], 0, 70);
diff --git a/plugins/Referrers/Columns/ReferrerType.php b/plugins/Referrers/Columns/ReferrerType.php
index 5303a1c360..ef3a66325c 100644
--- a/plugins/Referrers/Columns/ReferrerType.php
+++ b/plugins/Referrers/Columns/ReferrerType.php
@@ -42,7 +42,7 @@ class ReferrerType extends Base
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
- $information = $this->getReferrerInformationFromRequest($request);
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
return $information['referer_type'];
}
diff --git a/plugins/Referrers/Columns/ReferrerUrl.php b/plugins/Referrers/Columns/ReferrerUrl.php
index 21c5cd5bdc..ab523740a7 100644
--- a/plugins/Referrers/Columns/ReferrerUrl.php
+++ b/plugins/Referrers/Columns/ReferrerUrl.php
@@ -35,7 +35,7 @@ class ReferrerUrl extends Base
*/
public function onNewVisit(Request $request, Visitor $visitor, $action)
{
- $information = $this->getReferrerInformationFromRequest($request);
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
return $information['referer_url'];
}
diff --git a/plugins/Referrers/Columns/Website.php b/plugins/Referrers/Columns/Website.php
index 42d05068d6..33484b6de1 100644
--- a/plugins/Referrers/Columns/Website.php
+++ b/plugins/Referrers/Columns/Website.php
@@ -41,7 +41,7 @@ class Website extends Base
return false;
}
- $information = $this->getReferrerInformationFromRequest($request);
+ $information = $this->getReferrerInformationFromRequest($request, $visitor);
if ($information['referer_type'] == Common::REFERRER_TYPE_WEBSITE
&& $this->isReferrerInformationNew($visitor, $information)
diff --git a/plugins/Referrers/Social.php b/plugins/Referrers/Social.php
index 71badc3357..93766cddf1 100644
--- a/plugins/Referrers/Social.php
+++ b/plugins/Referrers/Social.php
@@ -8,11 +8,9 @@
*/
namespace Piwik\Plugins\Referrers;
use Piwik\Cache;
-use Piwik\Common;
use Piwik\Option;
use Piwik\Piwik;
use Piwik\Singleton;
-use Piwik\UrlHelper;
/**
* Contains methods to access search engine definition data.
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
new file mode 100644
index 0000000000..f5ff10e11c
--- /dev/null
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\Referrers\tests\Integration\Columns;
+
+use Piwik\Plugins\Referrers\Columns\Keyword;
+use Piwik\Tests\Framework\Fixture;
+use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visit\VisitProperties;
+use Piwik\Tracker\Visitor;
+
+/**
+ * @group Referrers
+ * @group ReferrerTypeTest
+ * @group ReferrerType
+ * @group Plugins
+ */
+class ReferrerKeywordTest extends IntegrationTestCase
+{
+ /**
+ * @var Keyword
+ */
+ private $keyword;
+ private $idSite1 = 1;
+ private $idSite2 = 2;
+
+ public function setUp()
+ {
+ parent::setUp();
+
+ $date = '2012-01-01 00:00:00';
+ $ecommerce = false;
+
+ Fixture::createWebsite($date, $ecommerce, $name = 'test1', $url = 'http://piwik.org/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.pro/');
+
+ $this->keyword = new Keyword();
+ }
+
+ /**
+ * @dataProvider getReferrerUrls
+ */
+ public function test_onNewVisit_shouldDetectCorrectReferrerType($expectedType, $idSite, $url, $referrerUrl)
+ {
+ $request = $this->getRequest(array('idsite' => $idSite, 'url' => $url, 'urlref' => $referrerUrl));
+ $type = $this->keyword->onNewVisit($request, $this->getNewVisitor(), $action = null);
+
+ $this->assertSame($expectedType, $type);
+ }
+
+ public function getReferrerUrls()
+ {
+ $url = 'http://piwik.org/foo/bar';
+ $noReferrer = '';
+ $directReferrer = 'http://piwik.org';
+ $externalReferrer = 'http://example.org';
+
+ $noReferrerKeyword = null;
+ $emptyReferrerKeyword = '';
+
+ return array(
+ // website referrer types usually do not have a keyword
+ array($noReferrerKeyword, $this->idSite1, $url, $externalReferrer),
+ // direct entries do usually not have a referrer keyowrd
+ array($noReferrerKeyword, $this->idSite1, $url, $directReferrer),
+
+ // it is a campaign but there is no referrer url and no keyword set specifically, we cannot detect a keyword
+ // it does not return null as it is converted to strlower(null)
+ array($emptyReferrerKeyword, $this->idSite1, $url . '?pk_campaign=test', $noReferrer),
+
+ // campaigns, coming from same domain should have a keyword
+ array('piwik.org', $this->idSite1, $url . '?pk_campaign=test', $directReferrer),
+ // campaigns, coming from different domain should have a keyword
+ array('example.org', $this->idSite2, $url . '?pk_campaign=test', $externalReferrer),
+ // campaign keyword is specifically set
+ array('campaignkey1', $this->idSite2, $url . '?pk_campaign=test&pk_keyword=campaignkey1', $externalReferrer),
+ array('campaignkey2', $this->idSite2, $url . '?pk_campaign=test&utm_term=campaignkey2', $externalReferrer),
+
+ // search engine should have keyword the search term
+ array('piwik', $this->idSite2, $url, 'http://google.com/search?q=piwik'),
+ );
+ }
+
+ private function getRequest($params)
+ {
+ return new Request($params);
+ }
+
+ private function getNewVisitor()
+ {
+ return new Visitor(new VisitProperties());
+ }
+
+}
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
index db34a25c46..f118e14ba6 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
@@ -8,7 +8,6 @@
namespace Piwik\Plugins\Referrers\tests\Integration\Columns;
-use Piwik\Common;
use Piwik\Plugins\Referrers\Columns\ReferrerName;
use Piwik\Plugins\Referrers\Columns\ReferrerType;
use Piwik\Tests\Framework\Fixture;
@@ -74,7 +73,7 @@ class ReferrerNameTest extends IntegrationTestCase
$url = 'http://piwik.org/foo/bar';
$referrer = 'http://piwik.org';
- $directEntryReferrerName = '';
+ $directEntryReferrerName = null;
return array(
// domain matches but path does not match for idsite1
diff --git a/plugins/Referrers/tests/System/ApiTest.php b/plugins/Referrers/tests/System/ApiTest.php
index 28aede3723..fb91e57ca2 100644
--- a/plugins/Referrers/tests/System/ApiTest.php
+++ b/plugins/Referrers/tests/System/ApiTest.php
@@ -8,7 +8,10 @@
namespace Piwik\Plugins\Referrers\tests\System;
+use Piwik\API\Request;
+use Piwik\DataTable;
use Piwik\Tests\Fixtures\TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
/**
@@ -55,6 +58,56 @@ class ApiTest extends SystemTestCase
return $apiToTest;
}
+ public function test_forceNewVisit_shouldNotForceANewVisitWhenNoKeywordIsSetAndNoReferrerWasSetInitially()
+ {
+ $dateTime = '2015-01-02';
+ $idSite = self::$fixture->idSite;
+
+ $t = Fixture::getTracker($idSite, $dateTime . ' 00:01:02', $defaultInit = true);
+ // track a campaign that was opened directly (no referrer)
+ $t->setUrlReferrer('');
+ $t->setUrl('http://piwik.net/?pk_campaign=adwbuccc');
+ $t->doTrackPageView('My Title');
+
+ // navigate to next page on same page
+ $t->setUrlReferrer('http://piwik.net/?pk_campaign=adwbuccc');
+ $t->setCustomTrackingParameter('_rcn', 'adwbuccc'); // this parameter would be set by piwik.js from cookie / attributionInfo
+ $t->setCustomTrackingParameter('_rck', ''); // no keyword was used in previous tracking request
+ $t->setUrl('http://piwik.net/page1');
+ $t->doTrackPageView('Page 1');
+
+ /** @var DataTable $visits */
+ $visits = Request::processRequest('VisitsSummary.get', array('idSite' => 1, 'period' => 'day', 'date' => $dateTime));
+
+ $this->assertEquals(1, $visits->getFirstRow()->getColumn('nb_visits'));
+ $this->assertEquals(2, $visits->getFirstRow()->getColumn('nb_actions'));
+ }
+
+ public function test_forceNewVisit_shouldNotForceANewVisitWhenNoKeywordIsSetAndReferrerHostChanges()
+ {
+ $dateTime = '2015-01-03';
+ $idSite = self::$fixture->idSite;
+
+ $t = Fixture::getTracker($idSite, $dateTime . ' 00:01:02', $defaultInit = true);
+ // track a campaign that was opened directly (no referrer)
+ $t->setUrlReferrer('http://www.google.com');
+ $t->setUrl('http://piwik.net/?pk_campaign=adwbuccc');
+ $t->doTrackPageView('My Title');
+
+ // navigate to next page on same page
+ $t->setUrlReferrer('http://piwik.net/?pk_campaign=adwbuccc');
+ $t->setCustomTrackingParameter('_rcn', 'adwbuccc'); // this parameter would be set by piwik.js from cookie / attributionInfo
+ $t->setCustomTrackingParameter('_rck', ''); // no keyword was used in previous tracking request
+ $t->setUrl('http://piwik.net/page1');
+ $t->doTrackPageView('Page 1');
+
+ /** @var DataTable $visits */
+ $visits = Request::processRequest('VisitsSummary.get', array('idSite' => 1, 'period' => 'day', 'date' => $dateTime));
+
+ $this->assertEquals(1, $visits->getFirstRow()->getColumn('nb_visits'));
+ $this->assertEquals(2, $visits->getFirstRow()->getColumn('nb_actions'));
+ }
+
public static function getOutputPrefix()
{
return '';
diff --git a/plugins/Referrers/tests/Unit/ReferrersTest.php b/plugins/Referrers/tests/Unit/ReferrersTest.php
index e5dea866e9..a3ca59d2a3 100644
--- a/plugins/Referrers/tests/Unit/ReferrersTest.php
+++ b/plugins/Referrers/tests/Unit/ReferrersTest.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\Referrers\tests;
use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\Period;
-use Piwik\Plugins\Referrers\SearchEngine;
require_once PIWIK_INCLUDE_PATH . '/plugins/Referrers/Referrers.php';
diff --git a/plugins/Resolution/lang/hu.json b/plugins/Resolution/lang/hu.json
index 1be3f7ca3e..803f048cd4 100644
--- a/plugins/Resolution/lang/hu.json
+++ b/plugins/Resolution/lang/hu.json
@@ -3,8 +3,10 @@
"ColumnConfiguration": "Konfiguráció",
"ColumnResolution": "Felbontás",
"Configurations": "Konfigurációk",
+ "PluginDescription": "Jelentés a látogatók képernyőfelbontásairól.",
"Resolutions": "Képernyőfelbontások",
"WidgetGlobalVisitors": "Globális látogatói beállítások",
+ "WidgetGlobalVisitorsDocumentation": "Ez a jelentés megmutatja, az általános beállításokat, melyet a látogatók használnak. A konfiguráció egy kombináció, amely tartalmazza a látogató operációs rendszerét, böngészőjének típusát és a képernyőfelbontását.",
"WidgetResolutions": "Képernyőfelbontások"
}
} \ No newline at end of file
diff --git a/plugins/Resolution/lang/nb.json b/plugins/Resolution/lang/nb.json
index add66843bb..c0181f5705 100644
--- a/plugins/Resolution/lang/nb.json
+++ b/plugins/Resolution/lang/nb.json
@@ -2,9 +2,11 @@
"Resolution": {
"ColumnConfiguration": "Konfigurasjon",
"ColumnResolution": "Oppløsning",
- "Configurations": "Konfigurasjon",
+ "Configurations": "Konfigurasjoner",
+ "PluginDescription": "Rapporterer skjermoppløsningen til dine besøkere.",
"Resolutions": "Oppløsninger",
"WidgetGlobalVisitors": "Besøkendes konfigurasjon",
+ "WidgetGlobalVisitorsDocumentation": "Denne rapporten viser de mest vanlige konfigurasjonene som dine besøkere har. En konfigurasjon er kombinasjonen av operativsystem, nettlesertype og skjermoppløsning.",
"WidgetResolutions": "Skjermoppløsninger"
}
} \ No newline at end of file
diff --git a/plugins/SEO/lang/nb.json b/plugins/SEO/lang/nb.json
index d584d0c55c..1848e495b3 100644
--- a/plugins/SEO/lang/nb.json
+++ b/plugins/SEO/lang/nb.json
@@ -1,5 +1,6 @@
{
"SEO": {
+ "PluginDescription": "Denne utvidelsen ekstraherer og viser SEO-tall: Alexa web-rangering, Google Pagerank, antall indekserte sider og tilbakelenker til det valgte nettstedet.",
"AlexaRank": "Alexa-rangering",
"Bing_IndexedPages": "Indekserte sider hos Bing",
"Dmoz": "DMOZ-oppføringer",
diff --git a/plugins/ScheduledReports/API.php b/plugins/ScheduledReports/API.php
index d5a985e65b..aeef2f2ffb 100644
--- a/plugins/ScheduledReports/API.php
+++ b/plugins/ScheduledReports/API.php
@@ -27,7 +27,6 @@ use Piwik\Tracker;
use Piwik\Translate;
use Piwik\Translation\Translator;
use Piwik\Url;
-use Piwik\UrlHelper;
use Psr\Log\LoggerInterface;
/**
diff --git a/plugins/ScheduledReports/Controller.php b/plugins/ScheduledReports/Controller.php
index 2ae16cc410..3192a3cfc4 100644
--- a/plugins/ScheduledReports/Controller.php
+++ b/plugins/ScheduledReports/Controller.php
@@ -8,7 +8,6 @@
*/
namespace Piwik\Plugins\ScheduledReports;
-use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugins\LanguagesManager\LanguagesManager;
use Piwik\Plugins\SegmentEditor\API as APISegmentEditor;
diff --git a/plugins/ScheduledReports/Model.php b/plugins/ScheduledReports/Model.php
index 01507f65f9..5c7856678a 100644
--- a/plugins/ScheduledReports/Model.php
+++ b/plugins/ScheduledReports/Model.php
@@ -12,7 +12,6 @@ use Piwik\Common;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\ReportRenderer;
-use Piwik\Translate;
class Model
{
diff --git a/plugins/ScheduledReports/lang/ko.json b/plugins/ScheduledReports/lang/ko.json
index 85c4c92a2c..cdbfd197bf 100644
--- a/plugins/ScheduledReports/lang/ko.json
+++ b/plugins/ScheduledReports/lang/ko.json
@@ -9,6 +9,7 @@
"CancelAndReturnToReports": "취소하고 %s보고서 목록으로 이동%s",
"CreateAndScheduleReport": "보고서 작성 및 일정",
"CreateReport": "보고서 생성",
+ "CustomVisitorSegment": "맞춤형 방문자 세그먼트:",
"DescriptionOnFirstPage": "보고서 설명은 보고서의 첫 페이지에 표시됩니다.",
"DisplayFormat_TablesOnly": "테이블만 표시 (그래프는 표시되지 않음)",
"EmailHello": "안녕하세요,",
@@ -16,17 +17,26 @@
"EmailSchedule": "이메일 예약",
"EvolutionGraph": "%s의 값에 대한 이력 그래프 표시",
"FrontPage": "시작 페이지",
+ "PersonalEmailReports": "개인 이메일 보고서",
"MonthlyScheduleHelp": "월간 스케줄: 보고서는 매월 1일에 발송됩니다.",
"MustBeLoggedIn": "보고서 작성 및 일정을 사용자정의하려면 로그인해야합니다.",
"NoRecipients": "이 보고서의 수신자가 없음",
"Pagination": "페이지 %s \/ %s",
"PiwikReports": "Piwik 보고서",
"PleaseFindAttachedFile": "%2$s의 %1$s의 보고서를 첨부합니다.",
+ "SentFromX": "%s에서 보내기",
"PleaseFindBelow": "%2$s의 %1$s 보고서를 제공합니다.",
+ "PluginDescription": "맞춤형 보고서를 만들고 이를 매일, 주간, 월간 한 사람 혹은 여러 명에게 이메일을 보냅니다. 보고서 형식은 다양한 형식(html, pdf, csv, 이미지 등)을 지원합니다.",
"ReportFormat": "보고서 형식",
+ "ReportHour": "%s시 정각에 보고서 보내기",
"ReportIncludeNWebsites": "이 보고서는 하나 이상의 방문있는 모든 웹사이트에 대한 주요 통계를 포함합니다(현재 %s 웹사이트에서 가능).",
+ "ReportSent": "보고서 보내기",
"ReportsIncluded": "보고서에 포함할 정보",
"ReportType": "보고서 발송 via",
+ "ReportUpdated": "보고서 업데이트",
+ "Segment_Deletion_Error": "이 세그멘트는 다른 사용자들이 삭제나 감추도록 할 수 없습니다. 왜냐하면 %s의 이메일 보고서(들)를 만드는데 사용되기 때문입니다. 해당 보고서(들)에서 이 세그먼트를 제거하신 후 다시 시도하시길 바랍니다.",
+ "Segment_Help": "존재하는 맞춤형 세그멘트를 해당 이메일 보고서에 선택하여 적용할 수 있습니다. 대쉬보드 %s(열기)%s에서 맞춤형 세그멘트를 만들거나 수정하신 후 \"%s\" 박스를 클릭하세요. 그 후 \"%s\"하세요.",
+ "SegmentAppliedToReports": "세그먼트 '%s'는 보고서에 적용됩니다.",
"SendReportNow": "보고서 즉시 제출",
"SendReportTo": "보고서를 전송할 대상",
"SentToMe": "나에게 보내기",
diff --git a/plugins/ScheduledReports/lang/nb.json b/plugins/ScheduledReports/lang/nb.json
index 4b49ab9199..5e9517a0d0 100644
--- a/plugins/ScheduledReports/lang/nb.json
+++ b/plugins/ScheduledReports/lang/nb.json
@@ -1,30 +1,48 @@
{
"ScheduledReports": {
+ "AggregateReportsFormat": "(valgfritt) Visningsinnstillinger",
"AggregateReportsFormat_GraphsOnly": "Vis kun grafer (ingen rapport-tabeller)",
+ "AggregateReportsFormat_TablesAndGraphs": "Vis rapporttabeller og grafer for alle rapporter",
+ "AggregateReportsFormat_TablesOnly": "(standard) Vis rapporttabeller (grafer kun for nøkkeltall)",
"AlsoSendReportToTheseEmails": "Send også rapporten til disse e-postadressene (en adresse per linje):",
+ "AreYouSureDeleteReport": "Er du sikker på at du vil slette denne rapporten og timeplanen?",
"CancelAndReturnToReports": "Avbryt og %sreturner til listen over rapporter%s",
+ "CreateAndScheduleReport": "Lag og planlegg en rapport",
"CreateReport": "Lag rapport",
+ "CustomVisitorSegment": "Tilpasset besøkssegment:",
+ "DescriptionOnFirstPage": "Rapportbeskrivelsen vil vises på første siden av rapporten.",
+ "DisplayFormat_TablesOnly": "Vis kun tabeller (ingen grafer)",
"EmailHello": "Hei,",
"EmailReports": "E-postrapporter",
"EmailSchedule": "E-postplan",
+ "EvolutionGraph": "Vis historiske grafer for topp %s verdier",
"FrontPage": "Forside",
"PersonalEmailReports": "Personlige e-postrapporter",
"MonthlyScheduleHelp": "Månedsplan: Rapportene blir sendt første dag i hver måned.",
+ "MustBeLoggedIn": "Du må være logget inn for å lage og planlegge tilpassede rapporter.",
"NoRecipients": "Denne rapporten har ingen mottakere",
"Pagination": "Side %s av %s",
"PiwikReports": "Piwik-rapporter",
"PleaseFindAttachedFile": "I den vedlagte filen finner du din %1$s rapport for %2$s.",
"SentFromX": "Sendt fra %s.",
"PleaseFindBelow": "Nedenfor finner du din %1$s rapport for %2$s.",
+ "PluginDescription": "Lag tilpassede rapporter og planlegg dem slik at de kan sendes på e-post daglig, ukentlig eller månedlig til én eller flere personer. Flere rapportformater er støttet (html, pdf, csv, bilder).",
"ReportFormat": "Rapportformat",
"ReportHour": "Send rapport klokken %s",
+ "ReportIncludeNWebsites": "Rapporten vil inkludere hovedtall for alle nettsteder som har minst ett besøk (fra %s nettsteder som nå er tilgjengelig).",
"ReportSent": "Rapport sendt",
+ "ReportsIncluded": "Inkludert statistikk",
"ReportType": "Send rapport via",
"ReportUpdated": "Rapport oppdatert",
+ "Segment_Deletion_Error": "Dette segmentet kan ikke slettes eller gjøres usynlig for andre brukere fordi det brukes for å generere e-postrapporten(e) %s. Vennligst prøv igjen etter å ha fjernet segmentet fra denne (disse) rapportene.",
+ "Segment_Help": "Du kan velge et eksisterende tilpasset segment som skal brukes på dataene i denne e-postrapporten. Du kan lage og redigere tilpassede segmenter i din oversikt %s(klikk her for å åpne)%s, så klikker du på boksen «%s», så «%s».",
+ "SegmentAppliedToReports": "Segmentet «%s» er applisert til rapportene.",
"SendReportNow": "Send rapport nå",
"SendReportTo": "Send rapport til",
"SentToMe": "Send til meg",
"TableOfContent": "Rapportliste",
+ "ThereIsNoReportToManage": "Det er ingen rapporter å administrere for nettstedet %s",
+ "TopLinkTooltip": "Lag e-postrapporter for å få Piwik-statistikk levert til din eller andres e-post automatisk!",
"TopOfReport": "Tilbake til toppen",
"UpdateReport": "Oppdater rapport",
"WeeklyScheduleHelp": "Ukeplan: Rapportene blir sendt første mandag i hver uke."
diff --git a/plugins/ScheduledReports/tests/Integration/ApiTest.php b/plugins/ScheduledReports/tests/Integration/ApiTest.php
index 2f4b4020fa..e2d242581f 100644
--- a/plugins/ScheduledReports/tests/Integration/ApiTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ApiTest.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\ScheduledReports\tests;
use Piwik\API\Proxy;
use Piwik\DataTable;
use Piwik\Date;
-use Piwik\Plugins\API\API;
use Piwik\Plugins\MobileMessaging\API as APIMobileMessaging;
use Piwik\Plugins\MobileMessaging\MobileMessaging;
use Piwik\Plugins\ScheduledReports\API as APIScheduledReports;
diff --git a/plugins/SecurityInfo b/plugins/SecurityInfo
-Subproject ffbc301bf148481b7896f685847ada3bc9734b5
+Subproject 6a977f29c06633bb0e188f172b212aee5eae43c
diff --git a/plugins/SegmentEditor/API.php b/plugins/SegmentEditor/API.php
index e69a86bb98..358f0d2b3e 100644
--- a/plugins/SegmentEditor/API.php
+++ b/plugins/SegmentEditor/API.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\SegmentEditor;
use Exception;
-use Piwik\Cache\Transient as TransientCache;
use Piwik\Common;
use Piwik\Date;
use Piwik\Db;
diff --git a/plugins/SegmentEditor/SegmentEditor.php b/plugins/SegmentEditor/SegmentEditor.php
index a46be068bc..0d7c84ed7a 100644
--- a/plugins/SegmentEditor/SegmentEditor.php
+++ b/plugins/SegmentEditor/SegmentEditor.php
@@ -10,8 +10,6 @@ namespace Piwik\Plugins\SegmentEditor;
use Piwik\Config;
use Piwik\Db;
-use Piwik\DbHelper;
-use Piwik\Version;
/**
*/
diff --git a/plugins/SegmentEditor/lang/de.json b/plugins/SegmentEditor/lang/de.json
index cde969fba1..05ec7674bb 100644
--- a/plugins/SegmentEditor/lang/de.json
+++ b/plugins/SegmentEditor/lang/de.json
@@ -7,6 +7,7 @@
"AutoArchivePreProcessed": "Segmentierte Berichte werden im Voraus verarbeitet (schneller, benötigt archive.php Cron)",
"AutoArchiveRealTime": "Segmentierte Berichte werden in Echtzeit verarbeitet.",
"ChooseASegment": "Segment auswählen",
+ "CurrentlySelectedSegment": "Aktuell ausgewähltes Segment: %s",
"DataAvailableAtLaterDate": "Ihre segmentierten Analytik-Berichte stehen später zur Verfügung. Wir entschuldigen uns für die Unannehmlichkeit.",
"DefaultAllVisits": "Alle Besuche",
"DragDropCondition": "Bedingung durch Drag & Drop hinzufügen",
diff --git a/plugins/SegmentEditor/lang/fr.json b/plugins/SegmentEditor/lang/fr.json
index d5852d66a5..f7e407b0c9 100644
--- a/plugins/SegmentEditor/lang/fr.json
+++ b/plugins/SegmentEditor/lang/fr.json
@@ -7,6 +7,7 @@
"AutoArchivePreProcessed": "les rapports segmentés sont pré-traités (plus rapide, requiert un cron sur archive.php)",
"AutoArchiveRealTime": "les rapports segmentés sont traités en temps réel",
"ChooseASegment": "Choisir un segment",
+ "CurrentlySelectedSegment": "Segment sélectionné : %s",
"DataAvailableAtLaterDate": "Votre rapport d'analyse segmenté sera disponible plus tard. Veuillez nous excuser pour le désagrément.",
"DefaultAllVisits": "Toutes les visites",
"DragDropCondition": "Condition de Drag & Drop",
@@ -26,6 +27,10 @@
"YouMayChangeSetting": "Vous pouvez ou changer le paramètre depuis le fichier de configuration (%s) ou bien modifier ce segment et choisir '%s'.",
"YouMustBeLoggedInToCreateSegments": "Vous devez être identifié(e) pour créer et modifier des segments de visiteurs personnalisés.",
"YouDontHaveAccessToCreateSegments": "Vous n'avez pas les permissions requises pour créer et modifier des segments.",
- "AddingSegmentForAllWebsitesDisabled": "Ajouter des segments pour tous les sites a été désactivé."
+ "AddingSegmentForAllWebsitesDisabled": "Ajouter des segments pour tous les sites a été désactivé.",
+ "SegmentXIsAUnionOf": "%s est une union des segments suivants :",
+ "CustomSegment": "Segment personnalisé",
+ "SegmentOperatorIsNullOrEmpty": "Est nul ou vide",
+ "SegmentOperatorIsNotNullNorEmpty": "n'est pas nul ou vide"
}
} \ No newline at end of file
diff --git a/plugins/SegmentEditor/lang/nb.json b/plugins/SegmentEditor/lang/nb.json
index 8c7d30b8ba..79c0034940 100644
--- a/plugins/SegmentEditor/lang/nb.json
+++ b/plugins/SegmentEditor/lang/nb.json
@@ -7,7 +7,7 @@
"OperatorAND": "OG",
"OperatorOR": "ELLER",
"SegmentDisplayedAllWebsites": "alle nettsteder",
- "SegmentDisplayedThisWebsiteOnly": "kun denne nettsiden",
+ "SegmentDisplayedThisWebsiteOnly": "kun dette nettstedet",
"SegmentIsDisplayedForWebsite": "og vises for",
"SelectSegmentOfVisitors": "Velg et segment av besøkende:",
"ThisSegmentIsVisibleTo": "Dette segmentet er synlig for:",
diff --git a/plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php b/plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php
index ca37e0775b..206a2e0c74 100644
--- a/plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php
+++ b/plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\SegmentEditor\tests\Integration;
use Piwik\Plugins\SegmentEditor\SegmentFormatter;
use Piwik\Plugins\SegmentEditor\SegmentList;
use Piwik\Tests\Framework\Fixture;
-use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Translate;
use Exception;
diff --git a/plugins/SitesManager/Controller.php b/plugins/SitesManager/Controller.php
index 1c09254a33..fc7b7eb6e8 100644
--- a/plugins/SitesManager/Controller.php
+++ b/plugins/SitesManager/Controller.php
@@ -13,7 +13,6 @@ use Piwik\API\ResponseBuilder;
use Piwik\Common;
use Piwik\Exception\UnexpectedWebsiteFoundException;
use Piwik\Piwik;
-use Piwik\Measurable\MeasurableSetting;
use Piwik\Measurable\MeasurableSettings;
use Piwik\SettingsPiwik;
use Piwik\Site;
diff --git a/plugins/SitesManager/lang/en.json b/plugins/SitesManager/lang/en.json
index e3ae0d3feb..0916869ce0 100644
--- a/plugins/SitesManager/lang/en.json
+++ b/plugins/SitesManager/lang/en.json
@@ -67,7 +67,9 @@
"SiteSearchUse": "You can use Piwik to track and report what visitors are searching in your website's internal search engine.",
"SiteWithoutDataTitle": "No data has been recorded yet",
"SiteWithoutDataDescription": "No analytics data has been tracked for this website yet.",
- "SiteWithoutDataSetupTracking": "Please set up the %1$sJavaScript tracking code%2$s on your website and refresh the page.",
+ "SiteWithoutDataSetupTracking": "Please set up the %1$sJavaScript tracking code%2$s on your website if you haven't done that already.",
+ "SiteWithoutDataMessageDisappears": "This message will disappear as soon as some data was tracked for this website.",
+ "SiteWithoutDataSetupGoals": "In the meantime, maybe you would like to %1$sset up some goals%2$s.",
"SuperUserAccessCan": "A user with Super User access can also %s specify global settings%s for new websites.",
"Timezone": "Time zone",
"TrackingSiteSearch": "Tracking Internal Site Search",
diff --git a/plugins/SitesManager/lang/nb.json b/plugins/SitesManager/lang/nb.json
index 7d982149ab..d0ba30edaf 100644
--- a/plugins/SitesManager/lang/nb.json
+++ b/plugins/SitesManager/lang/nb.json
@@ -1,6 +1,10 @@
{
"SitesManager": {
"AddSite": "Legg til et nytt nettsted",
+ "AddMeasurable": "Legg til nytt område",
+ "AdvancedTimezoneSupportNotFound": "Avansert støtte for tidssoner ble ikke funnet i din PHP (støttet i PHP>=5.2). Du kan fortsatt velge et manuelt UTC-offset.",
+ "AliasUrlHelp": "Det er anbefalt, men ikke påkrevd, å spesifisere ulike URL-er, en per linje, som dine besøkere vil bruke for å nå dette nettstedet. Alias-URLer for et nettsted vil ikke vises i Henvisere > Nettsteder-rapporten. Merk at det ikke er nødvendig å spesifisere URLer med og uten «www», siden Piwik automatisk tar med begge.",
+ "ChangingYourTimezoneWillOnlyAffectDataForward": "Å endre din tidssone vil kun påvirke data fremover, ikke bakover.",
"ChooseCityInSameTimezoneAsYou": "Velg en by i samme tidssone som deg.",
"Currency": "Valuta",
"CurrencySymbolWillBeUsedForGoals": "Valuta-symbolet vises ved siden av omsetningsmål.",
@@ -8,40 +12,74 @@
"DefaultTimezoneForNewWebsites": "Standard tidssone for nye nettsteder",
"DeleteConfirm": "Er du sikker på at du ønsker å slette nettstedet %s?",
"DisableSiteSearch": "Ikke spor sidesøk",
+ "EcommerceHelp": "Når aktivert vil «Mål»-rapporten ha en ny E-handelsseksjon.",
"EnableEcommerce": "E-handel aktivert",
"EnableSiteSearch": "Sporing av sidesøk aktivert",
- "ExceptionDeleteSite": "Det er ikke mulig å slette dette nettstedet, da det er det eneste registrerte nettstedet. Legg til et nytt nettsted, og deretter slett dette.",
+ "EnableSiteSpecificUserAgentExclude": "Aktiver nettstedsspesifikk ekskludering av brukeragenter.",
+ "EnableSiteSpecificUserAgentExclude_Help": "Hvis du må ekskludere ulike brukeragenter for ulike nettsteder, huk av denne boksen, klikk lagre og %1$slegg til brukeragentene over%2$s.",
+ "ExceptionDeleteSite": "Det er ikke mulig å slette dette nettstedet, da det er det eneste registrerte nettstedet. Legg til et nytt nettsted, og slett deretter dette.",
"ExceptionEmptyName": "Nettstedets navn kan ikke være tomt.",
- "ExceptionInvalidCurrency": "Valutaen \"%s\" er ikke gyldig. Vennligst skriv inn et gyldig valutasymbol (f.eks %s)",
- "ExceptionInvalidTimezone": "Tidssonen \"%s\" er ikke gyldig. Vennligst skriv inn en gyldig tidssone.",
- "ExceptionInvalidUrl": "URL-en '%s' er ikke en gyldig URL.",
- "ExceptionNoUrl": "Du må spesifisere minst en URL til nettstedet.",
+ "ExceptionInvalidCurrency": "Valutaen «%s» er ikke gyldig. Vennligst skriv inn et gyldig valutasymbol (f.eks %s)",
+ "ExceptionInvalidIPFormat": "IP-en for å ekskludere «%s» virker ikke å ha et gyldig IP-format (f.eks. %s).",
+ "ExceptionInvalidTimezone": "Tidssonen «%s» er ugyldig. Vennligst skriv inn en gyldig tidssone.",
+ "ExceptionInvalidUrl": "URL-en «%s» er ikke en gyldig URL.",
+ "ExceptionNoUrl": "Du må spesifisere minst én URL til nettstedet.",
"ExcludedIps": "Ekskluderte IP-adresser",
"ExcludedParameters": "Ekskluderte parametre",
"ExcludedUserAgents": "Ekskluderte brukeragenter",
- "GlobalListExcludedIps": "Global liste over ekskluderte IP-adresser",
+ "GlobalExcludedUserAgentHelp1": "Skriv inn listen med brukeragenter som skal ekskluderes fra å spores av Piwik.",
+ "GlobalExcludedUserAgentHelp2": "Du kan bruke denne for å ekskludere noen roboter fra å bli sporet.",
+ "GlobalListExcludedIps": "Global liste med ekskluderte IP-adresser",
"GlobalListExcludedQueryParameters": "Global liste over URL-spørreparametre som skal ekskluderes",
+ "GlobalListExcludedUserAgents": "Global liste med brukeragenter som skal ekskluderes",
"GlobalListExcludedUserAgents_Desc": "Hvis den besøkendes brukeragentstreng inneholder noen av strengene du angir, vil besøkende bli ekskludert fra Piwik.",
"GlobalWebsitesSettings": "Globale nettstedinnstillinger",
+ "HelpExcludedIps": "Skriv inn listen med IP-er, én per linje, som du vil ekskludere fra Piwik-sporing. Du kan bruke jokertegn, som %1$s eller %2$s",
"JsTrackingTagHelp": "Her er JavaScript-sporingskoden som må inkluderes på alle dine sider.",
+ "KeepURLFragments": "URL-fragmentsporing",
+ "KeepURLFragmentsHelp": "Hvis boksen under ikke er merket, vil URL-fragmenter (alt etter %1$s) fjernes når de spores: %2$s vil bli sporet som %3$s",
+ "KeepURLFragmentsHelp2": "Du kan også overstyre denne innstillingen for individuelle nettsteder over.",
+ "KeepURLFragmentsLong": "Behold URL-fragmenter når URLer spores",
"ListOfIpsToBeExcludedOnAllWebsites": "IP-adressene nedenfor blir ekskludert fra sporing på alle nettsteder.",
"ListOfQueryParametersToBeExcludedOnAllWebsites": "URL-spørreparametrene nedenfor blir ekskludert fra alle side URL-rapporter.",
+ "ListOfQueryParametersToExclude": "Skriv inn listen med URL-spørreparametere, en per linje, for å ekskludere dem fra Side-URL-rapporter.",
"MainDescription": "Dine analyser trenger nettsteder! Legg til, oppdater, slett websider, og vis koden som du skal legge inn på dine websider.",
- "NotAnEcommerceSite": "Ikke en e-handel side",
+ "NotAnEcommerceSite": "Ikke en e-handelside",
"NotFound": "Ingen nettsteder funnet for",
- "NoWebsites": "Du har ingen nettsteder å administrere",
+ "NoWebsites": "Du har ingen nettsteder å administrere.",
+ "OnlyOneSiteAtTime": "Du kan bare redigere ett nettsted av gangen. Vennligst lagre eller avbryt dine gjeldende modifikasjoner for nettstedet %s.",
+ "PiwikOffersEcommerceAnalytics": "Piwik legger til rette for avansert e-handelssporing og rapportering. Lær mer om %s Ecommerce Analytics%s.",
+ "PiwikWillAutomaticallyExcludeCommonSessionParameters": "Piwik vil automatisk ekskludere vanlige sesjonsparametere (%s).",
+ "PluginDescription": "Nettstedsadministrasjon lar deg legge til et nytt nettsted og redigere eksisterende nettsteder.",
+ "SearchCategoryDesc": "Piwik kan også spore søkekategorier for alle interne nettstedssøk.",
"SearchCategoryLabel": "Kategori-parameter",
+ "SearchCategoryParametersDesc": "Du kan skrive inn en komma-separert liste med spørreparametere som spesifiserer søkekategorien.",
+ "SearchKeywordLabel": "Spørreparameter",
+ "SearchKeywordParametersDesc": "Skriv inn en kommaseparert liste med alle spørreparameternavn som inneholder nettstedssøkeord.",
+ "SearchParametersNote": "Merk: Spørreparametere og kategoriparametere vil kun brukes for nettsteder som har nettstedssøk aktivert, men som har latt disse parameterne være tomme.",
+ "SearchParametersNote2": "For å deaktivere nettstedssøk for nye nettsteder, la disse to feltene være tomme.",
+ "SearchUseDefault": "Bruk %sstandard%s nettstedssøkeparametere",
"SelectACity": "Velg en by",
"SelectDefaultCurrency": "Du kan velge standard valuta for nye nettsteder.",
"SelectDefaultTimezone": "Du kan velge standard tidssone for nye nettsteder.",
"ShowTrackingTag": "Vis sporingskoden",
"Sites": "Nettsteder",
+ "SiteSearchUse": "Du kan bruke Piwik for å spore og rapportere hva besøkere søker etter i ditt nettsteds interne søkemotor.",
+ "SiteWithoutDataTitle": "Ingen data har blitt samlet inn ennå",
+ "SiteWithoutDataDescription": "Ingen analysedata har blitt sporet for dette nettstedet ennå.",
+ "SiteWithoutDataSetupTracking": "Vennligst sett opp %1$sJavaScript-sporingskoden%2$s på ditt nettsted og last inn siden på nytt.",
+ "SuperUserAccessCan": "En bruker med superbrukertilgang kan også %s spesifisere globale innstillinger%s for nye nettster.",
"Timezone": "Tidssone",
+ "TrackingSiteSearch": "Sporer interne nettstedssøk",
"TrackingTags": "Sporingskode for %s",
"Urls": "URL-er",
"UTCTimeIs": "UTC-tid er %s.",
+ "OnlyMatchedUrlsAllowed": "Spor kun besøk og handlinger når URL-en starter med en av URL-ene over.",
+ "OnlyMatchedUrlsAllowedHelp": "Når dette er aktivert vil Piwik kun spore interne handlinger når side-URL-en er en av de kjente URL-ene for ditt nettsted. Dette forhindrer folk fra å spamme dine analyser med URL-er for andre nettsteder.",
"WebsitesManagement": "Administrasjon av nettsteder",
- "XManagement": "Behandle %s",
+ "XManagement": "Administrer %s",
+ "ChooseMeasurableTypeHeadline": "Hva vil du måle?",
+ "YouCurrentlyHaveAccessToNWebsites": "Du har nå tilgang til %s nettsteder.",
"YourCurrentIpAddressIs": "Din nåværende IP-adresse er %s"
}
} \ No newline at end of file
diff --git a/plugins/SitesManager/templates/_displayJavascriptCode.twig b/plugins/SitesManager/templates/_displayJavascriptCode.twig
index 8a96569adb..772fcadf89 100644
--- a/plugins/SitesManager/templates/_displayJavascriptCode.twig
+++ b/plugins/SitesManager/templates/_displayJavascriptCode.twig
@@ -7,7 +7,7 @@
<h3>{{ 'General_JsTrackingTag'|translate }}</h3>
- <p>{{ 'CoreAdminHome_JSTracking_CodeNote'|translate("&lt;/body&gt;")|raw }}</p>
+ <p>{{ 'CoreAdminHome_JSTracking_CodeNoteBeforeClosingHead'|translate("&lt;/head&gt;")|raw }}</p>
<pre>{{ jsTag|raw }}</pre>
diff --git a/plugins/SitesManager/templates/siteWithoutData.twig b/plugins/SitesManager/templates/siteWithoutData.twig
index eafb7a287f..498d2ee765 100644
--- a/plugins/SitesManager/templates/siteWithoutData.twig
+++ b/plugins/SitesManager/templates/siteWithoutData.twig
@@ -8,6 +8,22 @@
{% block content %}
+ <script type="text/javascript" charset="utf-8">
+ $(document).ready(function () {
+ $('<div />').insertAfter('.site-without-data').liveWidget({
+ interval: 1000,
+ onUpdate: function () {
+ // reload page as soon as a visit was detected
+ document.location.reload();
+ },
+ dataUrlParams: {
+ module: 'Live',
+ action: 'getLastVisitsStart'
+ }
+ });
+ });
+ </script>
+
<div class="site-without-data">
<h2>{{ 'SitesManager_SiteWithoutDataTitle'|translate }}</h2>
@@ -20,6 +36,14 @@
}) ~ '">', '</a>')|raw }}
</p>
+ <p>
+ {{ 'SitesManager_SiteWithoutDataMessageDisappears'|translate }}
+ {{ 'SitesManager_SiteWithoutDataSetupGoals'|translate('<a href="' ~ linkTo({
+ 'module': 'Goals',
+ 'action': 'manage',
+ }) ~ '">', '</a>')|raw }}
+ </p>
+
{{ trackingHelp|raw }}
</div>
diff --git a/plugins/SitesManager/tests/Integration/SitesManagerTest.php b/plugins/SitesManager/tests/Integration/SitesManagerTest.php
index 15345fc231..5676372776 100644
--- a/plugins/SitesManager/tests/Integration/SitesManagerTest.php
+++ b/plugins/SitesManager/tests/Integration/SitesManagerTest.php
@@ -8,7 +8,6 @@
namespace Piwik\Plugins\SitesManager\tests\Integration;
-use Piwik\Access;
use Piwik\Cache;
use Piwik\Archive\ArchiveInvalidator;
use Piwik\Container\StaticContainer;
diff --git a/plugins/TasksTimetable b/plugins/TasksTimetable
-Subproject 67c1119ff385f153439e81555d7d3e4a799ebe5
+Subproject 5ea1e7ab52db8f33782b297bf1386f2d86fbee5
diff --git a/plugins/Transitions/API.php b/plugins/Transitions/API.php
index 68c4461623..1ab38f89ae 100644
--- a/plugins/Transitions/API.php
+++ b/plugins/Transitions/API.php
@@ -15,7 +15,6 @@ use Piwik\Common;
use Piwik\DataAccess\LogAggregator;
use Piwik\DataArray;
use Piwik\DataTable;
-use Piwik\DataTable\Manager;
use Piwik\DataTable\Row;
use Piwik\Metrics;
use Piwik\Period;
diff --git a/plugins/Transitions/lang/nb.json b/plugins/Transitions/lang/nb.json
index 4cafa5a51e..67a4f32b49 100644
--- a/plugins/Transitions/lang/nb.json
+++ b/plugins/Transitions/lang/nb.json
@@ -1,6 +1,9 @@
{
"Transitions": {
+ "BouncesInline": "%s sprett",
+ "DirectEntries": "Direkte treff",
"ErrorBack": "Gå tilbake til forrige handling",
+ "ExitsInline": "%s utganger",
"FromCampaigns": "Fra kampanjer",
"FromPreviousPages": "Fra interne sider",
"FromPreviousPagesInline": "%s fra interne sider",
@@ -9,12 +12,17 @@
"FromSearchEngines": "Fra søkemotorer",
"FromWebsites": "Fra nettsider",
"IncomingTraffic": "Innkommende trafikk",
+ "LoopsInline": "%s innlastinger av side på nytt",
"NoDataForAction": "Det finnes ingen data for %s",
+ "NoDataForActionDetails": "Enten har handlingen ingen sidevisninger i perioden %s eller så er den ugyldig.",
"OutgoingTraffic": "Utgående trafikk",
+ "PluginDescription": "Rapporterer forrige og neste handlinger for hver URL i en ny Overganger-rapport, tilgjengelig i Handlinger-rapporten og via et nytt ikon.",
+ "ShareOfAllPageviews": "Denne siden hadde %s sidevisninger (%s av alle sidevisninger)",
"ToFollowingPages": "Til interne sider",
"ToFollowingPagesInline": "%s til interne sider",
"ToFollowingSiteSearches": "Interne søk",
"ToFollowingSiteSearchesInline": "%s interne søk",
+ "XOfAllPageviews": "%s av alle besøk på denne siden",
"XOutOfYVisits": "%s (av %s)"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Latitude.php b/plugins/UserCountry/Columns/Latitude.php
index 0e27285f9d..d768af53f9 100644
--- a/plugins/UserCountry/Columns/Latitude.php
+++ b/plugins/UserCountry/Columns/Latitude.php
@@ -8,7 +8,6 @@
*/
namespace Piwik\Plugins\UserCountry\Columns;
-use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugins\UserCountry\LocationProvider;
use Piwik\Plugins\UserCountry\Segment;
diff --git a/plugins/UserCountry/Columns/Longitude.php b/plugins/UserCountry/Columns/Longitude.php
index 4a93f83223..e937193dd6 100644
--- a/plugins/UserCountry/Columns/Longitude.php
+++ b/plugins/UserCountry/Columns/Longitude.php
@@ -8,7 +8,6 @@
*/
namespace Piwik\Plugins\UserCountry\Columns;
-use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugins\UserCountry\LocationProvider;
use Piwik\Plugins\UserCountry\Segment;
diff --git a/plugins/UserCountry/UserCountry.php b/plugins/UserCountry/UserCountry.php
index d0ea7fab1b..fd616321ff 100644
--- a/plugins/UserCountry/UserCountry.php
+++ b/plugins/UserCountry/UserCountry.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\UserCountry;
use Piwik\ArchiveProcessor;
-use Piwik\Common;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Intl\Data\Provider\RegionDataProvider;
diff --git a/plugins/UserCountry/functions.php b/plugins/UserCountry/functions.php
index 830f026eda..33a95600bb 100644
--- a/plugins/UserCountry/functions.php
+++ b/plugins/UserCountry/functions.php
@@ -9,7 +9,6 @@
namespace Piwik\Plugins\UserCountry;
-use Piwik\Container\StaticContainer;
use Piwik\DataTable;
use Piwik\Piwik;
use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
diff --git a/plugins/UserCountryMap/UserCountryMap.php b/plugins/UserCountryMap/UserCountryMap.php
index 6453cc7f29..e5e9f041ab 100644
--- a/plugins/UserCountryMap/UserCountryMap.php
+++ b/plugins/UserCountryMap/UserCountryMap.php
@@ -10,10 +10,6 @@ namespace Piwik\Plugins\UserCountryMap;
use Piwik\FrontController;
use Piwik\Piwik;
-use Piwik\Widget\WidgetConfig;
-use Piwik\Version;
-use Piwik\Widget\WidgetsList;
-use Piwik\Plugin\Manager as PluginManager;
/**
*/
diff --git a/plugins/UserCountryMap/javascripts/realtime-map.js b/plugins/UserCountryMap/javascripts/realtime-map.js
index 22b7fe7ea2..5724294276 100644
--- a/plugins/UserCountryMap/javascripts/realtime-map.js
+++ b/plugins/UserCountryMap/javascripts/realtime-map.js
@@ -102,7 +102,7 @@
colorManager = piwik.ColorManager,
colors = colorManager.getColors('realtime-map', ['white-bg', 'white-fill', 'black-bg', 'black-fill', 'visit-stroke',
'website-referrer-color', 'direct-referrer-color', 'search-referrer-color',
- 'live-widget-highlight', 'live-widget-unhighlight', 'symbol-animate-fill']),
+ 'live-widget-highlight', 'live-widget-unhighlight', 'symbol-animate-fill', 'region-stroke-color']),
currentTheme = 'white',
colorTheme = {
white: {
@@ -497,7 +497,7 @@
*/
function initMap() {
$('#widgetRealTimeMapliveMap .loadingPiwik, .RealTimeMap .loadingPiwik').hide();
- map.addLayer('countries', {
+ map.addLayer(currentMap.length == 3 ? 'context' : 'countries', {
styles: {
fill: colorTheme[currentTheme].fill,
stroke: colorTheme[currentTheme].bg,
@@ -505,7 +505,9 @@
},
click: function (d, p, evt) {
evt.stopPropagation();
- if (currentMap != 'world') { // zoom out if zoomed in
+ if (currentMap.length == 2){ // zoom to country
+ updateMap(d.iso);
+ } else if (currentMap != 'world') { // zoom out if zoomed in
updateMap('world');
} else { // or zoom to continent view otherwise
updateMap(UserCountryMap.ISO3toCONT[d.iso]);
@@ -516,7 +518,13 @@
return d.name;
}
});
-
+ if (currentMap.length == 3){
+ map.addLayer('regions', {
+ styles: {
+ stroke: colors['region-stroke-color']
+ }
+ });
+ }
var lastVisitId = -1,
lastReport = [];
refreshVisits(true);
@@ -546,7 +554,7 @@
storeSettings();
}
- updateMap(location.hash && (location.hash == '#world' || location.hash.match(/^#[A-Z][A-Z]$/)) ? location.hash.substr(1) : 'world'); // TODO: restore last state
+ updateMap(location.hash && (location.hash == '#world' || location.hash.match(/^#[A-Z]{2,3}$/)) ? location.hash.substr(1) : 'world'); // TODO: restore last state
// clicking on map background zooms out
$('.RealTimeMap_map', this.$element).off('click').click(function () {
@@ -644,4 +652,4 @@
});
-}()); \ No newline at end of file
+}());
diff --git a/plugins/UserCountryMap/javascripts/visitor-map.js b/plugins/UserCountryMap/javascripts/visitor-map.js
index b3b6d747a1..9597152095 100644
--- a/plugins/UserCountryMap/javascripts/visitor-map.js
+++ b/plugins/UserCountryMap/javascripts/visitor-map.js
@@ -1256,12 +1256,18 @@
*/
resize: function () {
var ratio, w, h,
- map = this.map,
- maxHeight = $(window).height() - (this.theWidget && this.theWidget.isMaximised ? 150 : 79);
+ map = this.map;
+
ratio = map.viewAB.width / map.viewAB.height;
w = map.container.width();
h = w / ratio;
- h = Math.min(maxHeight, h);
+
+ // special handling for widgetize mode
+ if (!this.theWidget && map.container.parents('.widget').length) {
+ var maxHeight = $(window).height() - ($('html').height() - map.container.height());
+ h = Math.min(maxHeight, h);
+ }
+
map.container.height(h - 2);
map.resize(w, h);
diff --git a/plugins/UserCountryMap/lang/nb.json b/plugins/UserCountryMap/lang/nb.json
index b4a60ba301..ec039727c7 100644
--- a/plugins/UserCountryMap/lang/nb.json
+++ b/plugins/UserCountryMap/lang/nb.json
@@ -1,5 +1,6 @@
{
"UserCountryMap": {
+ "PluginDescription": "Denne utvidelsen gir deg widgetene Kart over besøkende og Sanntidskart. Merk: krever at UserCountry-utvidelsen er aktivert.",
"AndNOthers": "og %s andre",
"Cities": "Byer",
"Countries": "Land",
@@ -14,6 +15,8 @@
"Regions": "Regioner",
"Searches": "%s søk",
"SecondsAgo": "%s sekunder siden",
+ "ShowingVisits": "Stedsbestemte besøk siste",
+ "Unlocated": "<b>%s<\/b> %p av besøkene fra %c kunne ikke stedsbestemmes.",
"VisitorMap": "Kart over besøkende",
"WorldWide": "Verdensbasis",
"WithUnknownRegion": "%s med ukjent region",
diff --git a/plugins/UserCountryMap/stylesheets/realtime-map.less b/plugins/UserCountryMap/stylesheets/realtime-map.less
index b6dbd8a65b..ac5c5533ff 100644
--- a/plugins/UserCountryMap/stylesheets/realtime-map.less
+++ b/plugins/UserCountryMap/stylesheets/realtime-map.less
@@ -155,3 +155,7 @@
.realtime-map[data-name=symbol-animate-fill] {
color: #fdb;
}
+
+.realtime-map[data-name=region-stroke-color] {
+ color: #bbb;
+}
diff --git a/plugins/UserLanguage/Reports/Base.php b/plugins/UserLanguage/Reports/Base.php
index 68e8a91b4b..9aa6a6ab35 100644
--- a/plugins/UserLanguage/Reports/Base.php
+++ b/plugins/UserLanguage/Reports/Base.php
@@ -8,7 +8,6 @@
*/
namespace Piwik\Plugins\UserLanguage\Reports;
-use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
abstract class Base extends \Piwik\Plugin\Report
diff --git a/plugins/UserLanguage/lang/nb.json b/plugins/UserLanguage/lang/nb.json
index 8f801da735..d647c56bc5 100644
--- a/plugins/UserLanguage/lang/nb.json
+++ b/plugins/UserLanguage/lang/nb.json
@@ -1,6 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Nettleserspråk",
- "LanguageCode": "Språkkode"
+ "LanguageCode": "Språkkode",
+ "PluginDescription": "Rapporterer språket som er brukt av dine besøkeres nettlesere."
}
} \ No newline at end of file
diff --git a/plugins/UsersManager/.gitignore b/plugins/UsersManager/.gitignore
new file mode 100644
index 0000000000..c8c9480010
--- /dev/null
+++ b/plugins/UsersManager/.gitignore
@@ -0,0 +1 @@
+tests/System/processed/*xml \ No newline at end of file
diff --git a/plugins/UsersManager/API.php b/plugins/UsersManager/API.php
index 036f77b6bf..ec900ff65d 100644
--- a/plugins/UsersManager/API.php
+++ b/plugins/UsersManager/API.php
@@ -40,14 +40,20 @@ class API extends \Piwik\Plugin\API
*/
private $model;
+ /**
+ * @var UserAccessFilter
+ */
+ private $userFilter;
+
const PREFERENCE_DEFAULT_REPORT = 'defaultReport';
const PREFERENCE_DEFAULT_REPORT_DATE = 'defaultReportDate';
private static $instance = null;
- public function __construct(Model $model)
+ public function __construct(Model $model, UserAccessFilter $filter)
{
$this->model = $model;
+ $this->userFilter = $filter;
}
/**
@@ -201,6 +207,7 @@ class API extends \Piwik\Plugin\API
}
$users = $this->model->getUsers($logins);
+ $users = $this->userFilter->filterUsers($users);
// Non Super user can only access login & alias
if (!Piwik::hasUserSuperUserAccess()) {
@@ -221,7 +228,10 @@ class API extends \Piwik\Plugin\API
{
Piwik::checkUserHasSomeAdminAccess();
- return $this->model->getUsersLogin();
+ $logins = $this->model->getUsersLogin();
+ $logins = $this->userFilter->filterLogins($logins);
+
+ return $logins;
}
/**
@@ -244,7 +254,10 @@ class API extends \Piwik\Plugin\API
$this->checkAccessType($access);
- return $this->model->getUsersSitesFromAccess($access);
+ $userSites = $this->model->getUsersSitesFromAccess($access);
+ $userSites = $this->userFilter->filterLoginIndexedArray($userSites);
+
+ return $userSites;
}
/**
@@ -266,7 +279,10 @@ class API extends \Piwik\Plugin\API
{
Piwik::checkUserHasAdminAccess($idSite);
- return $this->model->getUsersAccessFromSite($idSite);
+ $usersAccess = $this->model->getUsersAccessFromSite($idSite);
+ $usersAccess = $this->userFilter->filterLoginIndexedArray($usersAccess);
+
+ return $usersAccess;
}
public function getUsersWithSiteAccess($idSite, $access)
@@ -280,6 +296,7 @@ class API extends \Piwik\Plugin\API
return array();
}
+ $logins = $this->userFilter->filterLogins($logins);
$logins = implode(',', $logins);
return $this->getUsers($logins);
@@ -336,7 +353,9 @@ class API extends \Piwik\Plugin\API
Piwik::checkUserHasSuperUserAccessOrIsTheUser($userLogin);
$this->checkUserExists($userLogin);
- return $this->model->getUser($userLogin);
+ $user = $this->model->getUser($userLogin);
+
+ return $this->userFilter->filterUser($user);
}
/**
@@ -351,7 +370,9 @@ class API extends \Piwik\Plugin\API
Piwik::checkUserHasSuperUserAccess();
$this->checkUserEmailExists($userEmail);
- return $this->model->getUserByEmail($userEmail);
+ $user = $this->model->getUserByEmail($userEmail);
+
+ return $this->userFilter->filterUser($user);
}
private function checkLogin($userLogin)
@@ -485,6 +506,9 @@ class API extends \Piwik\Plugin\API
unset($user['token_auth']);
}
+ // we do not filter these users by access and return them all since we need to print this information in the
+ // UI and they are allowed to see this.
+
return $users;
}
@@ -607,11 +631,33 @@ class API extends \Piwik\Plugin\API
public function userEmailExists($userEmail)
{
Piwik::checkUserIsNotAnonymous();
+ Piwik::checkUserHasSomeViewAccess();
return $this->model->userEmailExists($userEmail);
}
/**
+ * Returns the first login name of an existing user that has the given email address. If no user can be found for
+ * this user an error will be returned.
+ *
+ * @param string $userEmail
+ * @return bool true if the user is known
+ */
+ public function getUserLoginFromUserEmail($userEmail)
+ {
+ Piwik::checkUserIsNotAnonymous();
+ Piwik::checkUserHasSomeAdminAccess();
+
+ $this->checkUserEmailExists($userEmail);
+
+ $user = $this->model->getUserByEmail($userEmail);
+
+ // any user with some admin access is allowed to find any user by email, no need to filter by access here
+
+ return $user['login'];
+ }
+
+ /**
* Set an access level to a given user for a list of websites ID.
*
* If access = 'noaccess' the current access (if any) will be deleted.
diff --git a/plugins/UsersManager/Controller.php b/plugins/UsersManager/Controller.php
index 37e13fcefa..16ae4c04e7 100644
--- a/plugins/UsersManager/Controller.php
+++ b/plugins/UsersManager/Controller.php
@@ -53,6 +53,7 @@ class Controller extends ControllerAdmin
function index()
{
Piwik::checkUserIsNotAnonymous();
+ Piwik::checkUserHasSomeAdminAccess();
$view = new View('@UsersManager/index');
@@ -68,6 +69,12 @@ class Controller extends ControllerAdmin
$usersAccessByWebsite = array();
$defaultReportSiteName = $this->translator->translate('UsersManager_ApplyToAllWebsites');
} else {
+
+ if (!Piwik::isUserHasAdminAccess($idSiteSelected) && count($IdSitesAdmin) > 0) {
+ // make sure to show a website where user actually has admin access
+ $idSiteSelected = $IdSitesAdmin[0];
+ }
+
$defaultReportSiteName = Site::getNameFor($idSiteSelected);
try {
$usersAccessByWebsite = Request::processRequest('UsersManager.getUsersAccessFromSite', array('idSite' => $idSiteSelected));
@@ -123,6 +130,7 @@ class Controller extends ControllerAdmin
}
}
+ $view->hasOnlyAdminAccess = Piwik::isUserHasSomeAdminAccess() && !Piwik::hasUserSuperUserAccess();
$view->anonymousHasViewAccess = $this->hasAnonymousUserViewAccess($usersAccessByWebsite);
$view->idSiteSelected = $idSiteSelected;
$view->defaultReportSiteName = $defaultReportSiteName;
diff --git a/plugins/UsersManager/UserAccessFilter.php b/plugins/UsersManager/UserAccessFilter.php
new file mode 100644
index 0000000000..20fd671aa3
--- /dev/null
+++ b/plugins/UsersManager/UserAccessFilter.php
@@ -0,0 +1,183 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UsersManager;
+
+use Piwik\Access;
+
+/**
+ * This class offers methods to filter a list of users, logins, or anything that is related to users/logins.
+ *
+ * * By default a super user is allowed to see all users.
+ * * A user having admin access is allowed to see all other users that have view or admin access to the same access.
+ * * A user not having any admin access is only allowed to see the own user.
+ *
+ * The methods in this class make sure to only return the data for logins / users the current user actually has
+ * permission to see.
+ *
+ * FYI: The anonymous user is not treated in any special way. The anonymous user is a regular user with no access or
+ * view access only and can only see itself.
+ */
+class UserAccessFilter
+{
+ /**
+ * @var Model
+ */
+ private $model;
+
+ /**
+ * @var Access
+ */
+ private $access;
+
+ /**
+ * Holds a list of all idSites the current user has view access to. Only used for caching.
+ * @var array
+ */
+ private $idSitesWithAdmin;
+
+ /**
+ * Holds a list of all user logins that have admin access. Only used for caching
+ * @var array Array ('loginName' => array(idsites...))
+ */
+ private $usersWithAdminAccess;
+
+ /**
+ * Holds a list of all user logins that have view access. Only used for caching
+ * @var array Array ('loginName' => array(idsites...))
+ */
+ private $usersWithViewAccess;
+
+ public function __construct(Model $model, Access $access)
+ {
+ $this->model = $model;
+ $this->access = $access;
+ }
+
+ /**
+ * Removes all array values where the current user has no permission to see the existence of a given login index/key.
+ * @param array $arrayIndexedByLogin An array that is indexed by login / usernames. Eg:
+ * array('username1' => 5, 'username2' => array(...), ...)
+ * @return array
+ */
+ public function filterLoginIndexedArray($arrayIndexedByLogin)
+ {
+ if ($this->access->hasSuperUserAccess()) {
+ return $arrayIndexedByLogin; // this part is not needed but makes it faster for super user.
+ }
+
+ $allowedLogins = $this->filterLogins(array_keys($arrayIndexedByLogin));
+
+ return array_intersect_key($arrayIndexedByLogin, array_flip($allowedLogins));
+ }
+
+ /**
+ * Removes all users from the list of the given users where the current user has no permission to see the existence
+ * of that other user.
+ * @param array $users An array of arrays. Each inner array must have a key 'login'. Eg:
+ * array(array('login' => 'username1'), array('login' => 'username2'), ...)
+ * @return array
+ */
+ public function filterUsers($users)
+ {
+ if ($this->access->hasSuperUserAccess()) {
+ return $users;
+ }
+
+ if (!$this->access->isUserHasSomeAdminAccess()) {
+ // keep only own user if it is in the list
+ foreach ($users as $user) {
+ if ($this->isOwnLogin($user['login'])) {
+ return array($user);
+ }
+ }
+
+ return array();
+ }
+
+ foreach ($users as $index => $user) {
+ if (!$this->isNonSuperUserAllowedToSeeThisLogin($user['login'])) {
+ unset($users[$index]);
+ }
+ }
+
+ return array_values($users);
+ }
+
+ /**
+ * Returns the given user only if the current user has permission to see the given user
+ * @param array $user An array containing a key 'login'
+ * @return bool
+ */
+ public function filterUser($user)
+ {
+ if ($this->access->hasSuperUserAccess() || $this->isNonSuperUserAllowedToSeeThisLogin($user['login'])) {
+ return $user;
+ }
+ }
+
+ /**
+ * Removes all logins from the list of logins where the current user has no permission to see them.
+ *
+ * @param string[] $logins An array of logins / usernames. Eg array('username1', 'username2')
+ * @return array
+ */
+ public function filterLogins($logins)
+ {
+ if ($this->access->hasSuperUserAccess()) {
+ return $logins;
+ }
+
+ if (!$this->access->isUserHasSomeAdminAccess()) {
+ // keep only own user if it is in the list
+ foreach ($logins as $login) {
+ if ($this->isOwnLogin($login)) {
+ return array($login);
+ }
+ }
+
+ return array();
+ }
+
+ foreach ($logins as $index => $login) {
+ if (!$this->isNonSuperUserAllowedToSeeThisLogin($login)) {
+ unset($logins[$index]);
+ }
+ }
+
+ return array_values($logins);
+ }
+
+ protected function isNonSuperUserAllowedToSeeThisLogin($login)
+ {
+ // we do not test for super user access here for better performance as we would otherwise test for access for
+ // each single login in the other calling methods.
+ return $this->hasAccessToSameSite($login) || $this->isOwnLogin($login);
+ }
+
+ private function isOwnLogin($login)
+ {
+ return $login === $this->access->getLogin();
+ }
+
+ private function hasAccessToSameSite($login)
+ {
+ // users is allowed to see other users having view or admin access to these sites
+ if (!isset($this->idSitesWithAdmin)) {
+ $this->idSitesWithAdmin = $this->access->getSitesIdWithAdminAccess();
+ $this->usersWithAdminAccess = $this->model->getUsersSitesFromAccess('admin');
+ $this->usersWithViewAccess = $this->model->getUsersSitesFromAccess('view');
+ }
+
+ return (
+ (isset($this->usersWithViewAccess[$login]) && array_intersect($this->idSitesWithAdmin, $this->usersWithViewAccess[$login]))
+ ||
+ (isset($this->usersWithAdminAccess[$login]) && array_intersect($this->idSitesWithAdmin, $this->usersWithAdminAccess[$login]))
+ );
+ }
+}
diff --git a/plugins/UsersManager/UsersManager.php b/plugins/UsersManager/UsersManager.php
index 340f081b5f..344faf107a 100644
--- a/plugins/UsersManager/UsersManager.php
+++ b/plugins/UsersManager/UsersManager.php
@@ -94,6 +94,7 @@ class UsersManager extends \Piwik\Plugin
{
$jsFiles[] = "plugins/UsersManager/javascripts/usersManager.js";
$jsFiles[] = "plugins/UsersManager/javascripts/usersSettings.js";
+ $jsFiles[] = "plugins/UsersManager/javascripts/giveViewAccess.js";
}
/**
@@ -165,5 +166,7 @@ class UsersManager extends \Piwik\Plugin
$translationKeys[] = "UsersManager_ConfirmGrantSuperUserAccess";
$translationKeys[] = "UsersManager_ConfirmProhibitOtherUsersSuperUserAccess";
$translationKeys[] = "UsersManager_ConfirmProhibitMySuperUserAccess";
+ $translationKeys[] = "UsersManager_ExceptionUserHasViewAccessAlready";
+ $translationKeys[] = "UsersManager_ExceptionNoValueForUsernameOrEmail";
}
}
diff --git a/plugins/UsersManager/javascripts/giveViewAccess.js b/plugins/UsersManager/javascripts/giveViewAccess.js
new file mode 100644
index 0000000000..3db1bc3889
--- /dev/null
+++ b/plugins/UsersManager/javascripts/giveViewAccess.js
@@ -0,0 +1,176 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+$(document).ready(function () {
+
+ function hideLoading()
+ {
+ $('#giveUserAccessToViewReports').prop('disabled', false);
+ $('#ajaxLoadingGiveViewAccess').hide();
+ }
+
+ function showLoading()
+ {
+ $('#giveUserAccessToViewReports').prop('disabled', true);
+ $('#ajaxLoadingGiveViewAccess').show();
+ }
+
+ function showErrorNotification(errorMessage)
+ {
+ var placeAt = '#ajaxErrorGiveViewAccess';
+ $(placeAt).show();
+
+ var UI = require('piwik/UI');
+ var notification = new UI.Notification();
+ notification.show(errorMessage, {
+ placeat: placeAt,
+ context: 'error',
+ id: 'ajaxHelper',
+ type: null
+ });
+ notification.scrollToNotification();
+ hideLoading();
+ }
+
+ function createNewAjaxHelper()
+ {
+ var ajaxHandler = new ajaxHelper();
+ ajaxHandler.setCompleteCallback(function (xhr, status) {
+ if (xhr &&
+ xhr.responseJSON &&
+ xhr.responseJSON.message &&
+ xhr.responseJSON.result &&
+ xhr.responseJSON.result == 'error') {
+ hideLoading();
+ }
+ if (status && String(status).toLowerCase() !== 'sucess') {
+ hideLoading();
+ }
+ });
+ ajaxHandler.addParams({
+ module: 'API',
+ format: 'json'
+ }, 'GET');
+ ajaxHandler.setErrorElement('#ajaxErrorGiveViewAccess');
+
+ return ajaxHandler;
+ }
+
+ function sendViewAccess(userLogin)
+ {
+ sendUpdateUserAccess(userLogin, 'view', function () { window.location.reload(); });
+ setTimeout(hideLoading, 250);
+ // we hide loading after a bit since we cannot influence the ajax request in case of any error
+ }
+
+ function setViewAccessForUserToAllWebsitesIfUserConfirms(userLogin)
+ {
+ // ask confirmation
+ $('#confirm').find('#login').text(userLogin);
+
+ function onValidate() {
+ sendViewAccess(userLogin);
+ }
+
+ piwikHelper.modalConfirm('#confirm', {yes: onValidate, no: hideLoading})
+ }
+
+ function setViewAccessForUserIfNotAlreadyHasAccess(userLogin, idSites)
+ {
+ var ajaxHandler = createNewAjaxHelper();
+ ajaxHandler.addParams({
+ method: 'UsersManager.getUsersAccessFromSite',
+ userLogin: userLogin,
+ idSite: idSites
+ }, 'GET');
+ ajaxHandler.setCallback(function (users) {
+ var userLogins = [];
+ if (users && users[0]) {
+ userLogins = $.map(users[0], function (val, key) {
+ return (''+ key).toLowerCase();
+ });
+ }
+
+ if (-1 !== userLogins.indexOf(userLogin.toLowerCase())) {
+ showErrorNotification(_pk_translate('UsersManager_ExceptionUserHasViewAccessAlready'));
+ } else {
+ sendViewAccess(userLogin);
+ }
+
+ });
+ ajaxHandler.send();
+ }
+
+ function ifUserExists(usernameOrEmail, callback)
+ {
+ var ajaxHandler = createNewAjaxHelper();
+ ajaxHandler.addParams({
+ method: 'UsersManager.userExists',
+ userLogin: usernameOrEmail,
+ }, 'GET');
+ ajaxHandler.setCallback(callback);
+ ajaxHandler.send();
+ }
+
+ function getUsernameFromEmail(usernameOrEmail, callback)
+ {
+ var ajaxHandler = createNewAjaxHelper();
+ ajaxHandler.addParams({
+ method: 'UsersManager.getUserLoginFromUserEmail',
+ userEmail: usernameOrEmail,
+ }, 'GET');
+ ajaxHandler.setCallback(callback);
+ ajaxHandler.send();
+ }
+
+ function giveViewAccessToUser(userLogin)
+ {
+ var idSites = getIdSites();
+
+ if (idSites === 'all') {
+ setViewAccessForUserToAllWebsitesIfUserConfirms(userLogin);
+ } else {
+ setViewAccessForUserIfNotAlreadyHasAccess(userLogin, idSites);
+ }
+ }
+
+ $('#showGiveViewAccessForm').click(function () {
+ $('#giveViewAccessForm').toggle()
+ });
+
+ $('#giveViewAccessForm #user_invite').keypress(function (e) {
+ var key = e.keyCode || e.which;
+ if (key == 13) {
+ $('#giveViewAccessForm #giveUserAccessToViewReports').click();
+ }
+ });
+
+ $('#giveViewAccessForm #giveUserAccessToViewReports').click(function () {
+ showLoading();
+
+ var usernameOrEmail = $('#user_invite').val();
+
+ if (!usernameOrEmail) {
+ showErrorNotification(_pk_translate('UsersManager_ExceptionNoValueForUsernameOrEmail'));
+ return;
+ }
+
+ ifUserExists(usernameOrEmail, function (isUserName) {
+ if (isUserName && isUserName.value) {
+ giveViewAccessToUser(usernameOrEmail);
+ } else {
+ getUsernameFromEmail(usernameOrEmail, function (login) {
+ if (login && login.value) {
+ giveViewAccessToUser(login.value);
+ } else {
+ hideLoading();
+ }
+ });
+ }
+ });
+ });
+});
diff --git a/plugins/UsersManager/javascripts/usersManager.js b/plugins/UsersManager/javascripts/usersManager.js
index c0aaeb9bf2..eb0452013c 100644
--- a/plugins/UsersManager/javascripts/usersManager.js
+++ b/plugins/UsersManager/javascripts/usersManager.js
@@ -292,8 +292,7 @@ $(document).ready(function () {
});
});
- $('#access .updateAccess')
- .click(bindUpdateAccess);
+ $('#access .updateAccess').click(bindUpdateAccess);
$('#superUserAccess .accessGranted, #superUserAccess .updateAccess').click(bindUpdateSuperUserAccess);
diff --git a/plugins/UsersManager/lang/en.json b/plugins/UsersManager/lang/en.json
index 522039c459..144b66ec03 100644
--- a/plugins/UsersManager/lang/en.json
+++ b/plugins/UsersManager/lang/en.json
@@ -17,6 +17,7 @@
"DeleteConfirm": "Are you sure you want to delete the user %s?",
"Email": "Email",
"EmailYourAdministrator": "%1$sE-mail your administrator about this problem%2$s.",
+ "EnterUsernameOrEmail": "Enter a username or email address",
"ExceptionAccessValues": "The parameter access must have one of the following values: [ %s ]",
"ExceptionAdminAnonymous": "You cannot grant 'admin' access to the 'anonymous' user.",
"ExceptionDeleteDoesNotExist": "User '%s' doesn't exist therefore it can't be deleted.",
@@ -32,8 +33,13 @@
"ExceptionSuperUserAccess": "This user has Super User access and has already permission to access and modify all websites in Piwik. You may remove the Super User access from this user and try again.",
"ExceptionUserDoesNotExist": "User '%s' doesn't exist.",
"ExceptionYouMustGrantSuperUserAccessFirst": "There has to be at least one user with Super User access. Please grant Super User access to another user first.",
+ "ExceptionUserHasViewAccessAlready": "This user has access to this website already.",
+ "ExceptionNoValueForUsernameOrEmail": "Please enter a username or email address.",
"ExcludeVisitsViaCookie": "Exclude your visits using a cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "For anonymous users, report date to load by default",
+ "GiveViewAccess": "Give view access",
+ "GiveViewAccessTitle": "Give an existing user access to view reports for %s",
+ "GiveViewAccessInstructions": "To give an existing user view access for %s enter the username or email address of an existing user",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "If you would like to change the password type a new one. Otherwise leave this blank.",
"InjectedHostCannotChangePwd": "You are currently visiting with an unknown host (%1$s). You cannot change your password until this problem is fixed.",
"LastSeen": "Last seen",
diff --git a/plugins/UsersManager/lang/nb.json b/plugins/UsersManager/lang/nb.json
index 07680f5182..a73b5ee55f 100644
--- a/plugins/UsersManager/lang/nb.json
+++ b/plugins/UsersManager/lang/nb.json
@@ -4,26 +4,38 @@
"Alias": "Alias",
"AllWebsites": "Alle nettsteder",
"AnonymousUser": "Anonym bruker",
+ "AnonymousUserHasViewAccess": "Merk: brukeren %1$s har %2$s tilgang til dette nettstedet.",
+ "AnonymousUserHasViewAccess2": "Dine analyserapporter og informasjon om dine besøkere er offentlig tilgjengelig.",
"ApplyToAllWebsites": "Legg til alle nettsteder",
- "ChangeAllConfirm": "Er du sikker på at du vil endre '%s' rettigheter på alle nettstedene?",
- "ClickHereToDeleteTheCookie": "Klikk her for å slette informasjonskapselen og la Piwik spore dine besøk.",
+ "ChangeAllConfirm": "Er du sikker på at du vil endre «%s» rettigheter på alle nettstedene?",
+ "ChangePasswordConfirm": "Endrer du passordet vil du også endre brukerens token_auth. Vil du virkelig fortsette?",
+ "ClickHereToDeleteTheCookie": "Klikk her for å slette informasjonskapselen og la Piwik spore dine besøk",
"ClickHereToSetTheCookieOnDomain": "Klikk her for å sette en informasjonskapsel som vil ekskludere dine besøk på nettsteder som spores av Piwik på %s",
+ "ConfirmGrantSuperUserAccess": "Vil du virkelig gi «%s» superbrukertilgang? Advarsel: brukeren vil ha tilgang til alle nettsteder og være i stand til å utføre administrative oppgaver.",
+ "ConfirmProhibitMySuperUserAccess": "%s, vil du virkelig fjerne din egen superbrukertilgang? Du vil miste alle rettigheter og tilgang til alle nettsteder og bli logget ut av Piwik.",
+ "ConfirmProhibitOtherUsersSuperUserAccess": "Vil du virkelig fjerne superbrukertilgangen til «%s»? Brukeren vil miste alle rettigheter og tilgang til alle nettsteder. Forsikre deg om at du setter rettigheter som nødvendig til ulike nettsteder etterpå.",
"DeleteConfirm": "Er du sikker på at du vil slette brukeren %s?",
"Email": "E-post",
"EmailYourAdministrator": "%1$sSend e-post til din administrator om dette problemet%2$s.",
"ExceptionAccessValues": "Tilgangsparameteret må minst ha en av de følgende verdier: [ %s ]",
"ExceptionAdminAnonymous": "Du kan ikke gi administrator-tilgang til 'anonymous'-brukeren.",
- "ExceptionDeleteDoesNotExist": "Bruker '%s' eksisterer ikke og kan derfor ikke bli slettet.",
- "ExceptionDeleteOnlyUserWithSuperUserAccess": "Sletting av brukeren '%s\" er ikke mulig.",
+ "ExceptionDeleteDoesNotExist": "Bruker «%s» eksisterer ikke og kan derfor ikke bli slettet.",
+ "ExceptionDeleteOnlyUserWithSuperUserAccess": "Sletting av brukeren «%s» er ikke mulig.",
"ExceptionEditAnonymous": "Den anonyme brukeren kan ikke bli redigert eller slettet. Den blir brukt av Piwik for å definere en bruker som ikke har blitt logget inn ennå. Du kan for eksempel gjøre statistikken din offentlig ved å gi 'view'-tilgang til 'anonymous'-brukeren.",
- "ExceptionEmailExists": "Bruker med e-post '%s' eksisterer allerede.",
+ "ExceptionEmailExists": "Bruker med e-post «%s» eksisterer allerede.",
"ExceptionInvalidEmail": "Epost-adressen er ikke i gyldig format.",
- "ExceptionInvalidLoginFormat": "Brukernavnet må være mellom %1$s og %2$s tegn langt og inneholde kun bokstaver, tall eller tegnene '_', '-' og '.'.",
- "ExceptionLoginExists": "Brukernavn '%s' eksisterer allerede.",
- "ExceptionUserDoesNotExist": "Bruker '%s' eksisterer ikke.",
+ "ExceptionInvalidLoginFormat": "Brukernavnet må være mellom %1$s og %2$s tegn langt og inneholde kun bokstaver, tall eller tegnene _ - . @ +",
+ "ExceptionInvalidPassword": "Passordet må være mellom %1$s og %2$s tegn.",
+ "ExceptionLoginExists": "Brukernavnet «%s» eksisterer allerede.",
+ "ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth forventer et MD5-hashet passord (32 tegn lang streng). Vennligst kall md5()-funksjonen på passordet før du kaller denne metoden.",
+ "ExceptionRemoveSuperUserAccessOnlySuperUser": "Det er ikke mulig å fjerne superbrukertilgang fra brukeren «%s».",
+ "ExceptionSuperUserAccess": "Denne brukeren har superbrukertilgang og har allerede tilgang til å se og modifisere alle nettsteder i Piwik. Du kan også fjerne superbrukertilgangen fra denne brukeren og prøve igjen.",
+ "ExceptionUserDoesNotExist": "Bruker «%s» eksisterer ikke.",
+ "ExceptionYouMustGrantSuperUserAccessFirst": "Det må være minst én bruker med superbrukertilgang. Vennligst gi superbrukertilgang til en annen bruker først.",
"ExcludeVisitsViaCookie": "Ekskluder dine besøk med en informasjonskapsel",
"ForAnonymousUsersReportDateToLoadByDefault": "Rapportdato som skal lastes som standard for anonyme brukere",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Hvis du vil endre passordet, skriv inn et nytt. Hvis ikke, lar du feltet være tomt.",
+ "InjectedHostCannotChangePwd": "Du besøker nå med et ukjent vertsnavn (%1$s). Du kan ikke endre passord før problemet er rettet opp.",
"LastSeen": "Sist sett",
"MainDescription": "Bestem hvilke brukere som har tilgang til Piwik på dine nettsteder. Du kan også sette rettighetene på alle dine nettsteder på en gang.",
"ManageAccess": "Administrer tilgang",
@@ -32,12 +44,17 @@
"MenuUserSettings": "Brukerinnstillinger",
"MenuPersonal": "Personlig",
"PersonalSettings": "Personlige innstillinger",
- "NoUsersExist": "Det er ingen brukere enda.",
+ "NoteNoAnonymousUserAccessSettingsWontBeUsed2": "Merk: Du kan ikke endre innstillingene i denne seksjonen fordi du ikke har noen nettsteder som kan nås av en anonym bruker.",
+ "NoUsersExist": "Det er ingen brukere ennå.",
+ "PluginDescription": "Brukerhåndtering lar deg legge til nye brukere, redigere eksisterende brukere og gi dem tilganger til å se eller administrere nettsteder.",
"PrivAdmin": "Admin",
"PrivNone": "Ingen tilgang",
"PrivView": "Vis",
"ReportDateToLoadByDefault": "Rapportdato som skal lastes som standard",
"ReportToLoadByDefault": "Rapport som skal lastes som standard",
+ "SuperUserAccessManagement": "Administrer superbrukertilgang",
+ "SuperUserAccessManagementGrantMore": "Du kan gi superbrukertilgang til andre Piwik-brukere her. Vennligst bruk denne funksjonen forsiktig.",
+ "SuperUserAccessManagementMainDescription": "Superbrukere har alle mulige rettigheter. De kan utføre alle administrative funksjoner slik som å legge til nye nettsteder som skal spores, legge til brukere, endre brukerrettigheter, aktivering og deaktivering av utvidelser og til og med installere nye utvidelser fra Markedsplassen.",
"TheLoginScreen": "Innloggingsside",
"ThereAreCurrentlyNRegisteredUsers": "Det er for tiden %s registrerte brukere.",
"TypeYourPasswordAgain": "Skriv inn ditt nye passord på nytt.",
diff --git a/plugins/UsersManager/stylesheets/usersManager.less b/plugins/UsersManager/stylesheets/usersManager.less
index ed2dd7f315..f8f0f9de92 100644
--- a/plugins/UsersManager/stylesheets/usersManager.less
+++ b/plugins/UsersManager/stylesheets/usersManager.less
@@ -38,4 +38,21 @@
.sites_selector_container {
padding-top: 0px;
}
+}
+
+.old-ie #sites.usersManager .sites_selector_title {
+ height: 30px;
+}
+
+#showGiveViewAccessForm {
+ text-align: left;
+}
+
+#giveViewAccessForm {
+ display: none;
+ margin-left: 30px;
+
+ #user_invite {
+ min-width: 300px;
+ }
} \ No newline at end of file
diff --git a/plugins/UsersManager/templates/index.twig b/plugins/UsersManager/templates/index.twig
index 6bf12d01e0..d6f6edfdbd 100644
--- a/plugins/UsersManager/templates/index.twig
+++ b/plugins/UsersManager/templates/index.twig
@@ -16,6 +16,7 @@
<div piwik-siteselector
show-selected-site="true"
+ only-sites-with-admin-access="true"
class="sites_autocomplete"
siteid="{{ idSiteSelected }}"
sitename="{{ defaultReportSiteName }}"
@@ -55,6 +56,7 @@
{% set accesInvalid %}<img src='plugins/UsersManager/images/no-access.png' class='updateAccess' />{% endset %}
{% set superUserAccess %}<span title="{{ 'UsersManager_ExceptionSuperUserAccess'|translate }}">N/A</span>{% endset %}
{% for login,access in usersAccessByWebsite %}
+ {% if userIsSuperUser or (hasOnlyAdminAccess and (access!='noaccess' or idSiteSelected == 'all')) %}
<tr>
<td id='login'>{{ login }}</td>
<td>{{ usersAliasByLogin[login]|raw }}</td>
@@ -84,12 +86,34 @@
{% endif %}
</td>
</tr>
+ {% endif %}
{% endfor %}
</tbody>
</table>
<div id="accessUpdated" style="vertical-align:top;"></div>
</div>
+{% if hasOnlyAdminAccess %}
+ <p>
+ <button id="showGiveViewAccessForm" class="add-user btn btn-lg btn-flat">
+ <span class="icon-add"></span>
+ {{ 'UsersManager_GiveViewAccessTitle'|translate('"' ~ defaultReportSiteName ~ '"')|raw }}
+ </button>
+ </p>
+ <form id="giveViewAccessForm">
+ <div class="form-group">
+ <input type="text" name="user_invite"
+ id="user_invite"
+ placeholder="{{ 'UsersManager_EnterUsernameOrEmail'|translate|e('html_attr') }}"
+ title="{{ 'UsersManager_GiveViewAccessInstructions'|translate("'" ~ defaultReportSiteName ~ "'")|e('html_attr') }}">
+ </div>
+
+ <input class="btn" type="button" id="giveUserAccessToViewReports" value="{{ 'UsersManager_GiveViewAccess'|translate|e('html_attr') }}">
+ </form>
+ {{ ajax.errorDiv('ajaxErrorGiveViewAccess') }}
+ {{ ajax.loadingDiv('ajaxLoadingGiveViewAccess') }}
+{% endif %}
+
<div class="ui-confirm" id="confirm">
<h2>{{ 'UsersManager_ChangeAllConfirm'|translate("<span id='login'></span>")|raw }}</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
diff --git a/plugins/UsersManager/tests/Fixtures/ManyUsers.php b/plugins/UsersManager/tests/Fixtures/ManyUsers.php
new file mode 100644
index 0000000000..b92be230f5
--- /dev/null
+++ b/plugins/UsersManager/tests/Fixtures/ManyUsers.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Plugins\UsersManager\tests\Fixtures;
+
+use Piwik\Plugins\UsersManager\API;
+use Piwik\Tests\Framework\Fixture;
+
+/**
+ * Generates tracker testing data for our APITest
+ *
+ * This Simple fixture adds one website and tracks one visit with couple pageviews and an ecommerce conversion
+ */
+class ManyUsers extends Fixture
+{
+ public $dateTime = '2013-01-23 01:23:45';
+ public $idSite = 1;
+
+ public $users = array(
+ 'login1' => array(),
+ 'login2' => array('view' => array(1,3,5), 'admin' => array(2,6)),
+ 'login3' => array('view' => array(), 'admin' => array()), // no access to any site
+ 'login4' => array('view' => array(6), 'admin' => array()), // only access to one with view
+ 'login5' => array('view' => array(), 'admin' => array(3)), // only access to one with admin
+ 'login6' => array('view' => array(), 'admin' => array(6,3)), // access to a couple of sites with admin
+ 'login7' => array('view' => array(2,1,6,3), 'admin' => array()), // access to a couple of sites with view
+ 'login8' => array('view' => array(4,7), 'admin' => array(2,5)), // access to a couple of sites with admin and view
+ );
+
+ public function setUp()
+ {
+ $this->setUpWebsite();
+ $this->setUpUsers();
+ }
+
+ public function tearDown()
+ {
+ // empty
+ }
+
+ private function setUpWebsite()
+ {
+ foreach (range(1,7) as $idSite) {
+ Fixture::createWebsite('2010-01-01 00:00:00');
+ }
+ }
+
+ protected function setUpUsers()
+ {
+ $api = API::getInstance();
+ foreach ($this->users as $login => $permissions) {
+ $api->addUser($login, 'password', $login . '@example.com');
+ foreach ($permissions as $access => $idSites) {
+ if (!empty($idSites)) {
+ $api->setUserAccess($login, $access, $idSites);
+ }
+ }
+ $user = $api->getUser($login);
+ $this->users[$login]['token'] = $user['token_auth'];
+ }
+
+ $api->setSuperUserAccess('login1', true);
+ }
+
+} \ No newline at end of file
diff --git a/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php b/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php
new file mode 100644
index 0000000000..74ce4e09df
--- /dev/null
+++ b/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php
@@ -0,0 +1,322 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\UsersManager\tests\Integration;
+
+use Piwik\Access;
+use Piwik\Plugins\UsersManager\Model;
+use Piwik\Plugins\UsersManager\UserAccessFilter;
+use Piwik\Tests\Framework\Fixture;
+use Piwik\Tests\Framework\Mock\FakeAccess;
+use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+
+class TestUserAccessFilter extends UserAccessFilter {
+
+ public function isNonSuperUserAllowedToSeeThisLogin($login)
+ {
+ return parent::isNonSuperUserAllowedToSeeThisLogin($login);
+ }
+}
+
+/**
+ * @group UsersManager
+ * @group UserAccessFilterTest
+ * @group UserAccessFilter
+ * @group Plugins
+ */
+class UserAccessFilterTest extends IntegrationTestCase
+{
+ /**
+ * @var Model
+ */
+ private $model;
+
+ /**
+ * @var Access
+ */
+ private $access;
+
+ /**
+ * @var TestUserAccessFilter
+ */
+ private $filter;
+
+ private $users = array(
+ 'login2' => array('view' => array(1,3,5), 'admin' => array(2,6)),
+ 'login3' => array('view' => array(), 'admin' => array()), // no access to any site
+ 'login4' => array('view' => array(6), 'admin' => array()), // only access to one with view
+ 'login5' => array('view' => array(), 'admin' => array(3)), // only access to one with admin
+ 'login6' => array('view' => array(), 'admin' => array(6,3)), // access to a couple of sites with admin
+ 'login7' => array('view' => array(2,1,6,3), 'admin' => array()), // access to a couple of sites with view
+ 'login8' => array('view' => array(4,7), 'admin' => array(2,5)), // access to a couple of sites with admin and view
+ );
+
+ public function setUp()
+ {
+ parent::setUp();
+
+ // set up your test here if needed
+ $this->model = new Model();
+ $this->access = new FakeAccess();
+
+ $this->createManyWebsites();
+ $this->createManyUsers();
+ FakeAccess::clearAccess();
+
+ $this->filter = new TestUserAccessFilter($this->model, $this->access);
+ }
+
+ public function test_filterUser_WithSuperUserAccess_ShouldAlwaysReturnTrue()
+ {
+ $this->configureAcccessForLogin('login1');
+ foreach ($this->getAllLogins() as $login) {
+ $this->assertSame(array('login' => $login), $this->filter->filterUser(array('login' => $login)));
+ }
+ }
+
+ public function test_filterUser_WithViewUserAccess_ShouldOnlyReturnUserForOwnLogin()
+ {
+ $identity = 'login4';
+ $this->configureAcccessForLogin($identity);
+ $this->assertSame(array('login' => $identity), $this->filter->filterUser(array('login' => $identity)));
+ foreach ($this->getAllLogins() as $login) {
+ if ($login !== $identity) {
+ $this->assertNull($this->filter->filterUser(array('login' => $login)));
+ }
+ }
+ }
+
+ /**
+ * @dataProvider getIsUserAllowedToSeeThisLoginWithAdminAccess
+ */
+ public function test_filterUser_WithAdminAccess_ShouldOnlyReturnUserForOwnLogin($expectedAllowed, $loginToSee)
+ {
+ $this->configureAcccessForLogin('login2');
+ if ($expectedAllowed) {
+ $this->assertSame(array('login' => $loginToSee), $this->filter->filterUser(array('login' => $loginToSee)));
+ } else {
+ $this->assertSame(null, $this->filter->filterUser(array('login' => $loginToSee)));
+ }
+ }
+
+ /**
+ * @dataProvider getIsUserAllowedToSeeThisLoginWithAdminAccess
+ */
+ public function test_isNonSuperUserAllowedToSeeThisLogin_WithAdminAccess_IsAllowedToSeeAnyUserHavingAccessToSameAdminSites($expectedAllowed, $loginToSee)
+ {
+ $this->configureAcccessForLogin('login2');
+ $this->assertSame($expectedAllowed, $this->filter->isNonSuperUserAllowedToSeeThisLogin($loginToSee));
+ }
+
+ public function getIsUserAllowedToSeeThisLoginWithAdminAccess()
+ {
+ return array(
+ array($expectedAllowed = false, 'login1'), // not allowed to see this user as it has super user access
+ array($expectedAllowed = true, 'login2'), // it is the own user so visible anyway
+ array($expectedAllowed = false, 'login3'), // not allowed to see this user as this one does not have access to any site
+ array($expectedAllowed = true, 'login4'),
+ array($expectedAllowed = false, 'login5'), // this user doesn't share any site id where the user has admin access
+ array($expectedAllowed = true, 'login6'),
+ array($expectedAllowed = true, 'login7'),
+ array($expectedAllowed = true, 'login8'),
+ );
+ }
+
+ public function test_isNonSuperUserAllowedToSeeThisLogin_WithAdminAccess_IsAllowedToSeeAnyUserHavingAccessToSameAdminSites_UserHasAccessToOnlyOneAdminSite()
+ {
+ $this->configureAcccessForLogin('login5');
+
+ $this->assertTrue($this->filter->isNonSuperUserAllowedToSeeThisLogin('login2'));
+ $this->assertTrue($this->filter->isNonSuperUserAllowedToSeeThisLogin('login5'));
+ $this->assertTrue($this->filter->isNonSuperUserAllowedToSeeThisLogin('login7'));
+ $this->assertTrue($this->filter->isNonSuperUserAllowedToSeeThisLogin('login6'));
+
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login1')); // a user having view access only is not allowed to see any other user
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login3'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login4'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login8'));
+ }
+
+ public function test_isNonSuperUserAllowedToSeeThisLogin_WithOnlyViewAccess_IsAllowedToSeeOnlyOwnUser()
+ {
+ $this->configureAcccessForLogin('login7');
+ $this->assertTrue($this->filter->isNonSuperUserAllowedToSeeThisLogin('login7')); // a view user is allowed to see itself
+
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login1')); // a user having view access only is not allowed to see any other user
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login2'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login3'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login4'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login5'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login6'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login8'));
+ }
+
+ public function test_isNonSuperUserAllowedToSeeThisLogin_WithNoAccess_IsStillAllowedToSeeAnyUser()
+ {
+ $this->configureAcccessForLogin('login3');
+ $this->assertTrue($this->filter->isNonSuperUserAllowedToSeeThisLogin('login3')); // a view user is allowed to see itself
+
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login1'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login2'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login4'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login5'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login7'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login6'));
+ $this->assertFalse($this->filter->isNonSuperUserAllowedToSeeThisLogin('login8'));
+ }
+
+ /**
+ * @dataProvider getTestFilterLogins
+ */
+ public function test_filterLogins($expectedLogins, $loginIdentity, $logins)
+ {
+ $this->configureAcccessForLogin($loginIdentity);
+ $this->assertSame($expectedLogins, $this->filter->filterLogins($logins)); // a view user is allowed to see itself
+ }
+
+ /**
+ * @dataProvider getTestFilterLogins
+ */
+ public function test_filterUsers($expectedLogins, $loginIdentity, $logins)
+ {
+ $this->configureAcccessForLogin($loginIdentity);
+
+ $users = array();
+ $expectedUsers = array();
+
+ foreach ($logins as $login) {
+ $user = array('login' => $login, 'alias' => 'test', 'password' => md5('pass'));
+
+ $users[] = $user;
+ if (in_array($login, $expectedLogins)) {
+ $expectedUsers[] = $user;
+ }
+ }
+
+ $this->assertSame($expectedUsers, $this->filter->filterUsers($users)); // a view user is allowed to see itself
+ }
+
+ /**
+ * @dataProvider getTestFilterLogins
+ */
+ public function test_filterLoginIndexedArray($expectedLogins, $loginIdentity, $logins)
+ {
+ $this->configureAcccessForLogin($loginIdentity);
+
+ $testArray = array();
+ $expectedTestArray = array();
+
+ foreach ($logins as $login) {
+ $anything = array('foo' . $login);
+
+ $users[$login] = $anything;
+
+ if (in_array($login, $expectedLogins)) {
+ $expectedUsers[$login] = $anything;
+ }
+ }
+
+ $this->assertSame($expectedTestArray, $this->filter->filterLoginIndexedArray($testArray)); // a view user is allowed to see itself
+ }
+
+ public function getTestFilterLogins()
+ {
+ return array(
+ array($expectedLogins = $this->getAllLogins(), $identity = 'login1', $this->getAllLogins()), // a super user is allowed to see all logins
+ array($expectedLogins = array('login2', 'foobar'), $identity = 'login1', array('login2', 'foobar')), // for super users we do not even check if they actually exist
+ array($expectedLogins = $this->buildLogins(array(2,4)), $identity = 'login2', array('login2', 'foobar', 'login4', 'login3')), // should remove logins that do not actually exist when user has admin permission
+ array($expectedLogins = $this->buildLogins(array(2,4,6,7,8)), $identity = 'login2', $this->getAllLogins()), // an admin user can see users having access to the admin sites
+ array($expectedLogins = $this->buildLogins(array(3)), $identity = 'login3', $this->getAllLogins()), // a user with no access to any site can only see itself
+ array($expectedLogins = array('foobar'), $identity = 'foobar', array('foobar')), // doesn't check whether user exists when not having access to any site and user doesn't actually exist
+ array($expectedLogins = $this->buildLogins(array(4)), $identity = 'login4', $this->getAllLogins()), // a user with only view access to a site can only see itself
+ array($expectedLogins = $this->buildLogins(array(2,5,6,7)), $identity = 'login5', $this->getAllLogins()), // has access to one admin site
+ array($expectedLogins = $this->buildLogins(array(2,4,5,6,7)), $identity = 'login6', $this->getAllLogins()), // has access to multiple admin sites
+ array($expectedLogins = $this->buildLogins(array(7)), $identity = 'login7', $this->getAllLogins()), // has only access to multiple view sites
+ array($expectedLogins = $this->buildLogins(array(2,7,8)), $identity = 'login8', $this->getAllLogins()), // a user with only view access to a site can only see itself
+ array($expectedLogins = array(), $identity = 'login1', array()), // no users given, should return empty array for user with super user access
+ array($expectedLogins = array(), $identity = 'login2', array()), // no users given, should return empty array for user with admin access
+ array($expectedLogins = array(), $identity = 'login3', array()), // no users given, should return empty array for user with no access
+ array($expectedLogins = array(), $identity = 'login4', array()), // no users given, should return empty array for user with only view access
+ array($expectedLogins = array('anonymous'), $identity = 'anonymous', array('anonymous')), // anonymous user can see itself
+ );
+ }
+
+ public function test_getAllLogins_shouldBeUpToDate()
+ {
+ $this->assertSame($this->model->getUsersLogin(), $this->getAllLogins());
+ $this->assertNotEmpty($this->getAllLogins());
+ }
+
+ public function test_buildLogins()
+ {
+ $this->assertSame(array('login2', 'login3', 'login7'), $this->buildLogins(array(2,3,7)));
+ $this->assertSame(array(), $this->buildLogins(array()));
+ }
+
+ private function createManyWebsites()
+ {
+ for ($i = 0; $i < 10; $i++) {
+ Fixture::createWebsite('2014-01-01 00:00:00');
+ }
+ }
+
+ private function buildLogins($ids)
+ {
+ $logins = array();
+ foreach ($ids as $id) {
+ $logins[] = 'login' . $id;
+ }
+ return $logins;
+ }
+
+ private function getAllLogins()
+ {
+ $logins = $this->buildLogins(range(1,8));
+ array_unshift($logins, 'anonymous');
+ return $logins;
+ }
+
+ private function createManyUsers()
+ {
+ $this->model->addUser('login1', md5('pass'), 'email1@example.com', 'alias1', md5('token1'), '2008-01-01 00:00:00');
+ $this->model->addUser('login2', md5('pass'), 'email2@example.com', 'alias2', md5('token2'), '2008-01-01 00:00:00');
+ // login3 won't have access to any site
+ $this->model->addUser('login3', md5('pass'), 'email3@example.com', 'alias3', md5('token3'), '2008-01-01 00:00:00');
+ $this->model->addUser('login4', md5('pass'), 'email4@example.com', 'alias4', md5('token4'), '2008-01-01 00:00:00');
+ $this->model->addUser('login5', md5('pass'), 'email5@example.com', 'alias5', md5('token5'), '2008-01-01 00:00:00');
+ $this->model->addUser('login6', md5('pass'), 'email6@example.com', 'alias6', md5('token6'), '2008-01-01 00:00:00');
+ $this->model->addUser('login7', md5('pass'), 'email7@example.com', 'alias7', md5('token7'), '2008-01-01 00:00:00');
+ $this->model->addUser('login8', md5('pass'), 'email8@example.com', 'alias8', md5('token8'), '2008-01-01 00:00:00');
+ $this->model->addUser('anonymous', '', 'ano@example.com', 'anonymous', 'anonymous', '2008-01-01 00:00:00');
+
+ $this->model->setSuperUserAccess('login1', true); // we treat this one as our superuser
+
+ foreach ($this->users as $login => $permissions) {
+ foreach ($permissions as $access => $idSites) {
+ $this->model->addUserAccess($login, $access, $idSites);
+ }
+ }
+ }
+
+ private function configureAcccessForLogin($login)
+ {
+ $hasSuperUser = false;
+ $idSitesAdmin = array();
+ $idSitesView = array();
+
+ if ($login === 'login1') {
+ $hasSuperUser = true;
+ } elseif (isset($this->users[$login])) {
+ $idSitesAdmin = $this->users[$login]['admin'];
+ $idSitesView = $this->users[$login]['view'];
+ }
+
+ FakeAccess::clearAccess($hasSuperUser, $idSitesAdmin, $idSitesView, $login);
+ }
+
+}
diff --git a/plugins/UsersManager/tests/Integration/UserPreferencesTest.php b/plugins/UsersManager/tests/Integration/UserPreferencesTest.php
index cf77f01411..acc2ffdb8b 100644
--- a/plugins/UsersManager/tests/Integration/UserPreferencesTest.php
+++ b/plugins/UsersManager/tests/Integration/UserPreferencesTest.php
@@ -12,7 +12,6 @@ use Piwik\Config;
use Piwik\Piwik;
use Piwik\Plugins\UsersManager\UserPreferences;
use Piwik\Plugins\UsersManager\API as APIUsersManager;
-use Piwik\Access;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
diff --git a/plugins/UsersManager/tests/Integration/UsersManagerTest.php b/plugins/UsersManager/tests/Integration/UsersManagerTest.php
index 391ba8dab2..4b4dfb6fa7 100644
--- a/plugins/UsersManager/tests/Integration/UsersManagerTest.php
+++ b/plugins/UsersManager/tests/Integration/UsersManagerTest.php
@@ -378,6 +378,21 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertEquals(array($user1, $user2), $this->_removeNonTestableFieldsFromUsers($this->api->getUsers('gegg4564eqgeqag,geggeqge632ge56a4qag')));
}
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage checkUserHasSomeAdminAccess Fake exception
+ */
+ public function testGetUsers_withViewAccess_shouldThrowAnException()
+ {
+ $this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
+ $this->api->addUser("geggeqge632ge56a4qag", "geqgegeagae", "tesggt@tesgt.com", "alias");
+ $this->api->addUser("geggeqgeqagqegg", "geqgeaggggae", "tesgggt@tesgt.com");
+
+ FakeAccess::clearAccess($superUser = false, $admin = array(), $view = array(1), 'gegg4564eqgeqag');
+
+ $this->api->getUsers();
+ }
+
protected function _removeNonTestableFieldsFromUsers($users)
{
foreach ($users as &$user) {
@@ -401,6 +416,37 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertEquals(array("gegg4564eqgeqag", "geggeqge632ge56a4qag", "geggeqgeqagqegg"), $logins);
}
+ public function testGetUserLoginFromUserEmail()
+ {
+ $this->api->addUser('gegg4564eqgeqag', 'geqgegagae', 'tegst@tesgt.com', 'alias');
+ $this->api->addUser("geggeqge632ge56a4qag", "geqgegeagae", "tesggt@tesgt.com", "alias");
+ $this->api->addUser("geggeqgeqagqegg", "geqgeaggggae", "tesgggt@tesgt.com");
+
+ $this->assertSame('gegg4564eqgeqag', $this->api->getUserLoginFromUserEmail('tegst@tesgt.com'));
+ $this->assertSame('geggeqge632ge56a4qag', $this->api->getUserLoginFromUserEmail('tesggt@tesgt.com'));
+ // test camel case should still find user
+ $this->assertSame('geggeqge632ge56a4qag', $this->api->getUserLoginFromUserEmail('teSGgT@tesgt.com'));
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
+ */
+ public function testGetUserLoginFromUserEmail_shouldThrowException_IfUserDoesNotExist()
+ {
+ $this->api->getUserLoginFromUserEmail('unknownUser@teSsgt.com');
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage checkUserHasSomeAdminAccess Fake exception
+ */
+ public function testGetUserLoginFromUserEmail_shouldThrowException_IfUserDoesNotHaveAtLeastAdminPermission()
+ {
+ FakeAccess::clearAccess($superUser = false, $admin =array(), $view = array(1));
+ $this->api->getUserLoginFromUserEmail('tegst@tesgt.com');
+ }
+
/**
* @expectedException \Exception
* @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
diff --git a/plugins/UsersManager/tests/System/ApiTest.php b/plugins/UsersManager/tests/System/ApiTest.php
new file mode 100644
index 0000000000..7696c786b5
--- /dev/null
+++ b/plugins/UsersManager/tests/System/ApiTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\UsersManager\tests\System;
+
+use Piwik\Plugins\UsersManager\tests\Fixtures\ManyUsers;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * @group UsersManager
+ * @group ApiTest
+ * @group Plugins
+ */
+class ApiTest extends SystemTestCase
+{
+ /**
+ * @var ManyUsers
+ */
+ public static $fixture = null; // initialized below class definition
+
+ /**
+ * @dataProvider getApiForTesting
+ */
+ public function testApi($api, $params = array())
+ {
+ $apiId = implode('_', $params);
+ $logins = array(
+ 'login1' => 'when_superuseraccess',
+ 'login2' => 'when_adminaccess',
+ 'login4' => 'when_viewaccess'
+ );
+
+ // login1 = super user, login2 = some admin access, login4 = only view access
+ foreach ($logins as $login => $appendix) {
+ $params['token_auth'] = self::$fixture->users[$login]['token'];
+
+ $this->runAnyApiTest($api, $apiId . '_' . $appendix, $params, array('xmlFieldsToRemove' => array('date_registered')));
+ }
+ }
+
+ public function getApiForTesting()
+ {
+ $apiToTest = array(
+ array('UsersManager.getUsers'),
+ array('UsersManager.getUsersLogin'),
+ array('UsersManager.getUsersAccessFromSite', array('idSite' => 6)), // admin user has admin acces for this
+ array('UsersManager.getUsersAccessFromSite', array('idSite' => 3)), // admin user has only view access for this, should not see anything
+ array('UsersManager.getUsersSitesFromAccess', array('access' => 'admin')),
+ array('UsersManager.getUsersWithSiteAccess', array('idSite' => 3, 'access' => 'admin')),
+ array('UsersManager.getUser', array('userLogin' => 'login1')),
+ array('UsersManager.getUser', array('userLogin' => 'login2')),
+ array('UsersManager.getUser', array('userLogin' => 'login4')),
+ array('UsersManager.getUser', array('userLogin' => 'login6')),
+ );
+
+ return $apiToTest;
+ }
+
+ public static function getOutputPrefix()
+ {
+ return '';
+ }
+
+ public static function getPathToTestDirectory()
+ {
+ return dirname(__FILE__);
+ }
+
+}
+
+ApiTest::$fixture = new ManyUsers(); \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_adminaccess.xml
new file mode 100644
index 0000000000..9960d68a9d
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_adminaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="The user has to be either a Super User or the user 'login1' itself." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml
new file mode 100644
index 0000000000..b96941238e
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_superuseraccess.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login1</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login1</alias>
+ <email>login1@example.com</email>
+ <token_auth>367ea0b18ee1e641089e5d0a4d5f276d</token_auth>
+ <superuser_access>1</superuser_access>
+
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_viewaccess.xml
new file mode 100644
index 0000000000..9960d68a9d
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login1_when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="The user has to be either a Super User or the user 'login1' itself." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml
new file mode 100644
index 0000000000..3516ee8eab
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_adminaccess.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login2</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login2</alias>
+ <email>login2@example.com</email>
+ <token_auth>ef3cb848005bffc2e2f3c8edbd95c58f</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml
new file mode 100644
index 0000000000..3516ee8eab
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_superuseraccess.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login2</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login2</alias>
+ <email>login2@example.com</email>
+ <token_auth>ef3cb848005bffc2e2f3c8edbd95c58f</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_viewaccess.xml
new file mode 100644
index 0000000000..907f6cc3b0
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login2_when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="The user has to be either a Super User or the user 'login2' itself." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_adminaccess.xml
new file mode 100644
index 0000000000..99e541176d
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_adminaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="The user has to be either a Super User or the user 'login4' itself." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml
new file mode 100644
index 0000000000..16caa1d378
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_superuseraccess.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login4</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login4</alias>
+ <email>login4@example.com</email>
+ <token_auth>dc6fb0514c143d97c72b8be165e7ee0a</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml
new file mode 100644
index 0000000000..16caa1d378
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login4_when_viewaccess.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login4</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login4</alias>
+ <email>login4@example.com</email>
+ <token_auth>dc6fb0514c143d97c72b8be165e7ee0a</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_adminaccess.xml
new file mode 100644
index 0000000000..de29ba4336
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_adminaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="The user has to be either a Super User or the user 'login6' itself." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml
new file mode 100644
index 0000000000..2cd79e6cd4
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_superuseraccess.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login6</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login6</alias>
+ <email>login6@example.com</email>
+ <token_auth>2cafd6512d8b2739a7b2b01ab6609272</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_viewaccess.xml
new file mode 100644
index 0000000000..de29ba4336
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUser_login6_when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="The user has to be either a Super User or the user 'login6' itself." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_adminaccess.xml
new file mode 100644
index 0000000000..8dbbc46cd7
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_adminaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires an 'admin' access for the website id = 3." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_superuseraccess.xml
new file mode 100644
index 0000000000..29c1c8fc6f
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_superuseraccess.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login2>view</login2>
+ <login5>admin</login5>
+ <login6>admin</login6>
+ <login7>view</login7>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_viewaccess.xml
new file mode 100644
index 0000000000..8dbbc46cd7
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_3_when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires an 'admin' access for the website id = 3." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_adminaccess.xml
new file mode 100644
index 0000000000..ca45c6e1b2
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_adminaccess.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login2>admin</login2>
+ <login4>view</login4>
+ <login6>admin</login6>
+ <login7>view</login7>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_superuseraccess.xml
new file mode 100644
index 0000000000..ca45c6e1b2
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_superuseraccess.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login2>admin</login2>
+ <login4>view</login4>
+ <login6>admin</login6>
+ <login7>view</login7>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_viewaccess.xml
new file mode 100644
index 0000000000..77eacac8af
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersAccessFromSite_6_when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires an 'admin' access for the website id = 6." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml
new file mode 100644
index 0000000000..11c32f1705
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_adminaccess.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>login2</row>
+ <row>login4</row>
+ <row>login6</row>
+ <row>login7</row>
+ <row>login8</row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml
new file mode 100644
index 0000000000..151105d5b4
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_superuseraccess.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>login1</row>
+ <row>login2</row>
+ <row>login3</row>
+ <row>login4</row>
+ <row>login5</row>
+ <row>login6</row>
+ <row>login7</row>
+ <row>login8</row>
+ <row>superUserLogin</row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_viewaccess.xml
new file mode 100644
index 0000000000..89ba742bef
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersLogin__when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires an admin access for at least one website." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_adminaccess.xml
new file mode 100644
index 0000000000..a88f3cd9e9
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_adminaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires a 'superuser' access." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_superuseraccess.xml
new file mode 100644
index 0000000000..52d3c05844
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_superuseraccess.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <login2>
+ <row>2</row>
+ <row>6</row>
+ </login2>
+ <login5>
+ <row>3</row>
+ </login5>
+ <login6>
+ <row>3</row>
+ <row>6</row>
+ </login6>
+ <login8>
+ <row>2</row>
+ <row>5</row>
+ </login8>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_viewaccess.xml
new file mode 100644
index 0000000000..a88f3cd9e9
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersSitesFromAccess_admin_when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires a 'superuser' access." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_adminaccess.xml
new file mode 100644
index 0000000000..8dbbc46cd7
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_adminaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires an 'admin' access for the website id = 3." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml
new file mode 100644
index 0000000000..9af31e8a0c
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_superuseraccess.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login5</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login5</alias>
+ <email>login5@example.com</email>
+ <token_auth>4550293427ba5d0a0c96d6123429e9d3</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+ <row>
+ <login>login6</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login6</alias>
+ <email>login6@example.com</email>
+ <token_auth>2cafd6512d8b2739a7b2b01ab6609272</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_viewaccess.xml
new file mode 100644
index 0000000000..8dbbc46cd7
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsersWithSiteAccess_3_admin_when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires an 'admin' access for the website id = 3." />
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml
new file mode 100644
index 0000000000..30411b3ef8
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_adminaccess.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login2</login>
+ <alias>login2</alias>
+ </row>
+ <row>
+ <login>login4</login>
+ <alias>login4</alias>
+ </row>
+ <row>
+ <login>login6</login>
+ <alias>login6</alias>
+ </row>
+ <row>
+ <login>login7</login>
+ <alias>login7</alias>
+ </row>
+ <row>
+ <login>login8</login>
+ <alias>login8</alias>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml
new file mode 100644
index 0000000000..af284f900d
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_superuseraccess.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <login>login1</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login1</alias>
+ <email>login1@example.com</email>
+ <token_auth>367ea0b18ee1e641089e5d0a4d5f276d</token_auth>
+ <superuser_access>1</superuser_access>
+
+ </row>
+ <row>
+ <login>login2</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login2</alias>
+ <email>login2@example.com</email>
+ <token_auth>ef3cb848005bffc2e2f3c8edbd95c58f</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+ <row>
+ <login>login3</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login3</alias>
+ <email>login3@example.com</email>
+ <token_auth>4298f4654bddcccac23e3d38c7d8a79d</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+ <row>
+ <login>login4</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login4</alias>
+ <email>login4@example.com</email>
+ <token_auth>dc6fb0514c143d97c72b8be165e7ee0a</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+ <row>
+ <login>login5</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login5</alias>
+ <email>login5@example.com</email>
+ <token_auth>4550293427ba5d0a0c96d6123429e9d3</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+ <row>
+ <login>login6</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login6</alias>
+ <email>login6@example.com</email>
+ <token_auth>2cafd6512d8b2739a7b2b01ab6609272</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+ <row>
+ <login>login7</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login7</alias>
+ <email>login7@example.com</email>
+ <token_auth>8bda247657d9b13c20843fd97c3fb427</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+ <row>
+ <login>login8</login>
+ <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
+ <alias>login8</alias>
+ <email>login8@example.com</email>
+ <token_auth>8fdfef11755e29a8369a57fe2709445b</token_auth>
+ <superuser_access>0</superuser_access>
+
+ </row>
+ <row>
+ <login>superUserLogin</login>
+ <password>1e56c228742c0189d261500852e27a02</password>
+ <alias>superUserLogin</alias>
+ <email>hello@example.org</email>
+ <token_auth>9ad1de7f8b329ab919d854c556f860c1</token_auth>
+ <superuser_access>1</superuser_access>
+
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_viewaccess.xml b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_viewaccess.xml
new file mode 100644
index 0000000000..89ba742bef
--- /dev/null
+++ b/plugins/UsersManager/tests/System/expected/test___UsersManager.getUsers__when_viewaccess.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <error message="You can't access this resource as it requires an admin access for at least one website." />
+</result> \ No newline at end of file
diff --git a/plugins/VisitFrequency/lang/hu.json b/plugins/VisitFrequency/lang/hu.json
index 745af72069..fb5912e367 100644
--- a/plugins/VisitFrequency/lang/hu.json
+++ b/plugins/VisitFrequency/lang/hu.json
@@ -3,8 +3,15 @@
"ColumnActionsByReturningVisits": "Ismétlődő látogatások akciói",
"ColumnAverageVisitDurationForReturningVisitors": "Látogatások átlagos időtartama visszatérő látogatók esetén (másodpercekben)",
"ColumnAvgActionsPerReturningVisit": "Akciók átlagos gyakorisága ismétlődő látogatások esetén",
+ "ColumnBounceCountForReturningVisits": "Visszafordulások száma visszatérő látogatók esetén",
"ColumnBounceRateForReturningVisits": "Visszafordulások aránya ismétlődő látogatások esetén",
+ "ColumnMaxActionsInReturningVisit": "Maximális akciók egy visszatérés alkalmával",
+ "ColumnNbReturningVisitsConverted": "Konvertált visszatérő látogatások száma",
"ColumnReturningVisits": "Ismétlődő látogatások",
+ "ColumnSumVisitLengthReturning": "Visszatérő látogatók által eltöltött összes idő (másodpercben)",
+ "ColumnUniqueReturningVisitors": "Egyedi visszatérő látogatók",
+ "ColumnReturningUsers": "Visszatérő látogatók",
+ "PluginDescription": "Jelentés az új és a visszatérő látogatókról.",
"ReturnActions": "%s akció ismétlődő látogatások során",
"ReturnAverageVisitDuration": "%s a látogatás átlagos időtartama a visszatérő látogatók esetén",
"ReturnAvgActions": "%s akció ismétlődő látogatás során",
diff --git a/plugins/VisitFrequency/lang/nb.json b/plugins/VisitFrequency/lang/nb.json
index c3fbb37c38..204710d88b 100644
--- a/plugins/VisitFrequency/lang/nb.json
+++ b/plugins/VisitFrequency/lang/nb.json
@@ -1,17 +1,26 @@
{
"VisitFrequency": {
"ColumnActionsByReturningVisits": "Handlinger av tilbakevendende besøk",
- "ColumnAverageVisitDurationForReturningVisitors": "Gj. besøksvarighet for tilbakevendende besøk (i sekunder)",
- "ColumnAvgActionsPerReturningVisit": "Gj. handling per tilbakevendende besøk",
+ "ColumnAverageVisitDurationForReturningVisitors": "Gj.snitt. besøksvarighet for tilbakevendende besøk (i sekunder)",
+ "ColumnAvgActionsPerReturningVisit": "Gj.snitt. handlinger per tilbakevendende besøk",
+ "ColumnBounceCountForReturningVisits": "Sprettmengde for tilbakevendende besøk",
"ColumnBounceRateForReturningVisits": "Sprettfrekvens for tilbakevendende besøk",
+ "ColumnMaxActionsInReturningVisit": "Maks antall handlinger i ett tilbakevendende besøk",
+ "ColumnNbReturningVisitsConverted": "Antall konverterte tilbakevendende besøk",
"ColumnReturningVisits": "Tilbakevendende besøk",
- "ColumnReturningUsers": "Returnerende brukere",
- "ReturnActions": "%s handlinger av de tilbakevendende besøk",
- "ReturnAverageVisitDuration": "%s gjennomsnittlig besøksvarighet for tilbakevendende besøk",
+ "ColumnSumVisitLengthReturning": "Total tid brukt av tilbakevendende besøkere (i sekunder)",
+ "ColumnUniqueReturningVisitors": "Unike tilbakevendende besøkere",
+ "ColumnReturningUsers": "Tilbakevendende brukere",
+ "PluginDescription": "Rapporterer tall om dine nye og tilbakevendende besøkere.",
+ "ReturnActions": "%s handlinger av de tilbakevendende besøkerne",
+ "ReturnAverageVisitDuration": "%s gj.snitt. besøksvarighet for tilbakevendende besøk",
+ "ReturnAvgActions": "%s handlinger per tilbakevendende besøk",
"ReturnBounceRate": "%s tilbakevendende besøk har sprettet (forlatt siden etter en side).",
+ "ReturningVisitDocumentation": "Et tilbakevendende besøk (i motsetning til et nytt besøk) er gjort av noen som har besøkt nettstedet minst én gang før.",
+ "ReturningVisitsDocumentation": "Dette er en oversikt over tilbakevendende besøk.",
"ReturnVisits": "%s tilbakevendende besøk",
"SubmenuFrequency": "Frekvens",
- "WidgetGraphReturning": "Graf for tilbakevendende besøk",
+ "WidgetGraphReturning": "Tilbakevendende besøk over tid",
"WidgetOverview": "Frekvens-oversikt"
}
} \ No newline at end of file
diff --git a/plugins/VisitTime/API.php b/plugins/VisitTime/API.php
index e1f90db70e..f706860b4e 100644
--- a/plugins/VisitTime/API.php
+++ b/plugins/VisitTime/API.php
@@ -14,7 +14,6 @@ use Piwik\DataTable;
use Piwik\Date;
use Piwik\Metrics;
use Piwik\Period;
-use Piwik\Period\Range;
use Piwik\Piwik;
use Piwik\Site;
diff --git a/plugins/VisitTime/lang/nb.json b/plugins/VisitTime/lang/nb.json
index 97f6945b38..3a3aa77d30 100644
--- a/plugins/VisitTime/lang/nb.json
+++ b/plugins/VisitTime/lang/nb.json
@@ -1,15 +1,18 @@
{
"VisitTime": {
"ColumnLocalTime": "Lokaltid",
- "ColumnServerTime": "Tjenertid",
+ "ColumnServerTime": "Servertid",
"DayOfWeek": "Dag i uken",
"LocalTime": "Besøk pr. lokaltid",
"NHour": "%st",
- "ServerTime": "Besøk pr. tjenertid",
+ "PluginDescription": "Rapporterer lokal tid og servertid når dine besøkere ser ditt nettsted eller din app.",
+ "ServerTime": "Besøk pr. servertid",
"SubmenuTimes": "Tider",
"VisitsByDayOfWeek": "Besøk etter ukedag",
- "WidgetByDayOfWeekDocumentation": "Denne grafen viser antall besøk nettstedet ditt mottatt på hver dag i uken.",
+ "WidgetByDayOfWeekDocumentation": "Denne grafen viser antall besøk nettstedet ditt mottatt på de ulike dagene i uken.",
"WidgetLocalTime": "Besøk etter lokaltid",
- "WidgetServerTime": "Besøk etter tjenertid"
+ "WidgetLocalTimeDocumentation": "Denne grafen viser hvilken tid det var i %s besøkeres tidssoner %s da besøkene skjedde.",
+ "WidgetServerTime": "Besøk etter servertid",
+ "WidgetServerTimeDocumentation": "Denne grafen viser hvilken tid det var i %s serverens tidssone %s da besøkene skjedde."
}
} \ No newline at end of file
diff --git a/plugins/VisitorInterest/lang/nb.json b/plugins/VisitorInterest/lang/nb.json
index d3f7f1d968..19c38738f5 100644
--- a/plugins/VisitorInterest/lang/nb.json
+++ b/plugins/VisitorInterest/lang/nb.json
@@ -1,6 +1,6 @@
{
"VisitorInterest": {
- "BetweenXYMinutes": "%1$s-%2$s min",
+ "BetweenXYMinutes": "%1$s – %2$s min",
"BetweenXYSeconds": "%1$s-%2$ss",
"ColumnPagesPerVisit": "Sider pr. besøk",
"ColumnVisitDuration": "Besøksvarighet",
diff --git a/plugins/VisitsSummary/Reports/Get.php b/plugins/VisitsSummary/Reports/Get.php
index 46ba992787..c74a82566f 100644
--- a/plugins/VisitsSummary/Reports/Get.php
+++ b/plugins/VisitsSummary/Reports/Get.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugins\VisitsSummary\Reports;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\DataTable;
-use Piwik\DataTable\DataTableInterface;
use Piwik\Metrics\Formatter;
use Piwik\NumberFormatter;
use Piwik\Piwik;
diff --git a/plugins/VisitsSummary/lang/nb.json b/plugins/VisitsSummary/lang/nb.json
index 8310f1b531..e304e11936 100644
--- a/plugins/VisitsSummary/lang/nb.json
+++ b/plugins/VisitsSummary/lang/nb.json
@@ -5,18 +5,21 @@
"GenerateQueries": "%s spørringer kjørt",
"GenerateTime": "%s sekunder for å generere denne siden",
"MaxNbActions": "%s maks handlinger i ett besøk",
- "NbActionsDescription": "%s handlinger (sidevisninger, nedlastinger og utlenker)",
- "NbActionsPerVisit": "%s handlinger per besøk",
+ "NbActionsDescription": "%s handlinger",
+ "NbActionsPerVisit": "%s handlinger (sidevisninger, nedlastinger, utlenker og interne nettstedssøk) per besøk",
"NbDownloadsDescription": "%s nedlastinger",
"NbKeywordsDescription": "%s unike nøkkelord",
"NbOutlinksDescription": "%s utlenker",
"NbPageviewsDescription": "%s sidevisninger",
+ "NbSearchesDescription": "%s søk totalt på ditt nettsted",
"NbUniqueDownloadsDescription": "%s unike nedlastinger",
"NbUniqueOutlinksDescription": "%s unike utlenker",
"NbUniquePageviewsDescription": "%s unike sidevisninger",
"NbUniqueVisitors": "%s unike besøkende",
"NbVisitsBounced": "%s besøk har sprettet (forlatt nettstedet etter en side)",
+ "PluginDescription": "Rapporterer generelle analysetall: besøk, unike besøkere, antall handlinger, sprettfrekvens, etc.",
"VisitsSummary": "Besøksammendrag",
+ "VisitsSummaryDocumentation": "Dette er en oversikt over besøksutvikling.",
"WidgetLastVisits": "Graf over siste besøk",
"WidgetOverviewGraph": "Oversikt med grafikk",
"WidgetVisits": "Besøksoversikt"
diff --git a/plugins/WebsiteMeasurable/lang/nb.json b/plugins/WebsiteMeasurable/lang/nb.json
index 4a45e3023c..88ae414b5d 100644
--- a/plugins/WebsiteMeasurable/lang/nb.json
+++ b/plugins/WebsiteMeasurable/lang/nb.json
@@ -1,6 +1,7 @@
{
"WebsiteMeasurable": {
"Website": "Nettsted",
- "Websites": "Nettsteder"
+ "Websites": "Nettsteder",
+ "WebsiteDescription": "Et nettsted består av nettsider som typisk vises fra ett enkelt domene."
}
} \ No newline at end of file
diff --git a/plugins/Widgetize/lang/nb.json b/plugins/Widgetize/lang/nb.json
index 659ed7e34f..f87b9c39fc 100644
--- a/plugins/Widgetize/lang/nb.json
+++ b/plugins/Widgetize/lang/nb.json
@@ -1,6 +1,7 @@
{
"Widgetize": {
"OpenInNewWindow": "Åpne i nytt vindu",
+ "PluginDescription": "Vis alle Piwik-rapporter du vil på ditt nettsted eller i din app med en enkel embed HTML-tagg.",
"TopLinkTooltip": "Eksporter Piwik-rapporter som widgeter og bygg dem inn kontrollpanelet i din app som en iframe."
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/Framework/Mock/FakeAccess.php b/tests/PHPUnit/Framework/Mock/FakeAccess.php
index 7cd1691639..e23ceb2148 100644
--- a/tests/PHPUnit/Framework/Mock/FakeAccess.php
+++ b/tests/PHPUnit/Framework/Mock/FakeAccess.php
@@ -128,7 +128,7 @@ class FakeAccess extends Access
public function checkUserHasSomeViewAccess()
{
if (!self::$superUser) {
- if (count(self::$idSitesView) == 0) {
+ if (count(array_merge(self::$idSitesView, self::$idSitesAdmin)) == 0) {
throw new NoAccessException("checkUserHasSomeViewAccess Fake exception // string not to be tested");
}
} else {
@@ -137,14 +137,20 @@ class FakeAccess extends Access
}
//means at least view access
+ public function isUserHasSomeAdminAccess()
+ {
+ if (self::$superUser) {
+ return true;
+ }
+
+ return count(self::$idSitesAdmin) > 0;
+ }
+
+ //means at least view access
public function checkUserHasSomeAdminAccess()
{
- if (!self::$superUser) {
- if (count(self::$idSitesAdmin) == 0) {
- throw new NoAccessException("checkUserHasSomeAdminAccess Fake exception // string not to be tested");
- }
- } else {
- return; //Super User has some admin rights
+ if (!$this->isUserHasSomeAdminAccess()) {
+ throw new NoAccessException("checkUserHasSomeAdminAccess Fake exception // string not to be tested");
}
}
diff --git a/tests/PHPUnit/Framework/TestCase/SystemTestCase.php b/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
index cccd70b8aa..dbcd3671ef 100755
--- a/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
+++ b/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
@@ -15,6 +15,7 @@ use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Db;
use Piwik\DbHelper;
+use Piwik\Http;
use Piwik\ReportRenderer;
use Piwik\Tests\Framework\Constraint\ResponseCode;
use Piwik\Tests\Framework\Constraint\HttpResponseText;
@@ -26,6 +27,7 @@ use Piwik\Log;
use PHPUnit_Framework_TestCase;
use Piwik\Tests\Framework\Fixture;
use Piwik\Translation\Translator;
+use Piwik\Url;
require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
@@ -287,6 +289,65 @@ abstract class SystemTestCase extends PHPUnit_Framework_TestCase
return $apiCalls;
}
+ /**
+ * While {@link runApiTests()} lets you run test for many API methods at once this one tests only one specific
+ * API method and it goes via HTTP. While the other method lets you test only some methods starting with 'get'
+ * this one lets you actually test any API method.
+ */
+ protected function runAnyApiTest($apiMethod, $apiId, $requestParams, $options = array())
+ {
+ $requestParams['module'] = 'API';
+ $requestParams['format'] = 'XML';
+ $requestParams['method'] = $apiMethod;
+
+ $apiId = $apiMethod . '_' . $apiId . '.xml';
+ $testName = 'test_' . static::getOutputPrefix();
+
+ list($processedFilePath, $expectedFilePath) =
+ $this->getProcessedAndExpectedPaths($testName, $apiId, $format = null, $compareAgainst = false);
+
+ if (!array_key_exists('token_auth', $requestParams)) {
+ $requestParams['token_auth'] = Fixture::getTokenAuth();
+ }
+
+ $response = $this->getResponseFromHttpAPI($requestParams);
+ $processedResponse = new Response($response, $options, $requestParams);
+
+ if (empty($compareAgainst)) {
+ $processedResponse->save($processedFilePath);
+ }
+
+ try {
+ $expectedResponse = Response::loadFromFile($expectedFilePath, $options, $requestParams);
+ } catch (Exception $ex) {
+ $this->handleMissingExpectedFile($expectedFilePath, $processedResponse);
+ return;
+ }
+
+ try {
+ $errorMessage = get_class($this) . ": Differences with expected in '$processedFilePath'";
+ Response::assertEquals($expectedResponse, $processedResponse, $errorMessage);
+ } catch (Exception $ex) {
+ $this->comparisonFailures[] = $ex;
+ }
+
+ $this->printApiTestFailures();
+ }
+
+ /**
+ * @param $requestUrl
+ * @return string
+ * @throws Exception
+ */
+ protected function getResponseFromHttpAPI($requestUrl)
+ {
+ $queryString = Url::getQueryStringFromParameters($requestUrl);
+ $hostAndPath = Fixture::getTestRootUrl();
+ $url = $hostAndPath . '?' . $queryString;
+ $response = Http::sendHttpRequest($url, $timeout = 300);
+ return $response;
+ }
+
protected function _testApiUrl($testName, $apiId, $requestUrl, $compareAgainst, $params = array())
{
list($processedFilePath, $expectedFilePath) =
@@ -460,6 +521,13 @@ abstract class SystemTestCase extends PHPUnit_Framework_TestCase
$this->changeLanguage('en');
}
+ $this->printApiTestFailures();
+
+ return count($this->comparisonFailures) == 0;
+ }
+
+ private function printApiTestFailures()
+ {
if (!empty($this->missingExpectedFiles)) {
$expectedDir = dirname(reset($this->missingExpectedFiles));
$this->fail(" ERROR: Could not find expected API output '"
@@ -473,8 +541,6 @@ abstract class SystemTestCase extends PHPUnit_Framework_TestCase
$this->printComparisonFailures();
throw reset($this->comparisonFailures);
}
-
- return count($this->comparisonFailures) == 0;
}
protected function getTestRequestsCollection($api, $testConfig, $apiToCall)
diff --git a/tests/PHPUnit/Framework/TestRequest/Response.php b/tests/PHPUnit/Framework/TestRequest/Response.php
index 8a3ed5d39e..b67b7d8092 100644
--- a/tests/PHPUnit/Framework/TestRequest/Response.php
+++ b/tests/PHPUnit/Framework/TestRequest/Response.php
@@ -145,6 +145,7 @@ class Response
'lastActionDateTime',
'serverTimestamp',
'serverTimePretty',
+ 'daysAgo',
'serverDatePretty',
'serverDatePrettyFirstAction',
'serverTimePrettyFirstAction',
diff --git a/tests/PHPUnit/Integration/AccessTest.php b/tests/PHPUnit/Integration/AccessTest.php
index 23267a0cfd..0f9c075e63 100644
--- a/tests/PHPUnit/Integration/AccessTest.php
+++ b/tests/PHPUnit/Integration/AccessTest.php
@@ -117,6 +117,19 @@ class AccessTest extends IntegrationTestCase
$access->checkUserHasSomeAdminAccess();
}
+ public function test_isUserHasSomeAdminAccess_WithSuperUserAccess()
+ {
+ $access = new Access();
+ $access->setSuperUserAccess(true);
+ $this->assertTrue($access->isUserHasSomeAdminAccess());
+ }
+
+ public function test_isUserHasSomeAdminAccess_WithOnlyViewAccess()
+ {
+ $access = new Access();
+ $this->assertFalse($access->isUserHasSomeAdminAccess());
+ }
+
/**
* @expectedException \Piwik\NoAccessException
*/
diff --git a/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php b/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
index 7501a34715..c0b9baf438 100644
--- a/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
@@ -346,6 +346,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
),
'2015_05' => array(),
'2015_06' => array(),
+ '2015_07' => array(),
),
),
@@ -368,6 +369,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
'2015_04' => array(),
'2015_05' => array(),
'2015_06' => array(),
+ '2015_07' => array(),
),
),
@@ -432,6 +434,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
'2015_04' => array(),
'2015_05' => array(),
'2015_06' => array(),
+ '2015_07' => array(),
),
),
@@ -476,6 +479,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
'2015_04' => array(),
'2015_05' => array(),
'2015_06' => array(),
+ '2015_07' => array(),
),
),
@@ -500,6 +504,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
'2015_04' => array(),
'2015_05' => array(),
'2015_06' => array(),
+ '2015_07' => array(),
),
),
@@ -537,6 +542,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
'2015_04' => array(),
'2015_05' => array(),
'2015_06' => array(),
+ '2015_07' => array(),
),
),
@@ -562,6 +568,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
'1.2015-05-01.2015-05-31.3.done3736b708e4d20cfc10610e816a1b2341',
),
'2015_06' => array(),
+ '2015_07' => array(),
),
),
);
diff --git a/tests/PHPUnit/Integration/DbTest.php b/tests/PHPUnit/Integration/DbTest.php
index 9a5595e29a..e30de8a062 100644
--- a/tests/PHPUnit/Integration/DbTest.php
+++ b/tests/PHPUnit/Integration/DbTest.php
@@ -56,6 +56,35 @@ class DbTest extends IntegrationTestCase
$this->assertSame($expected, $result);
}
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessagelock name has to be 64 characters or less
+ */
+ public function test_getDbLock_shouldThrowAnException_IfDbLockNameIsTooLong()
+ {
+ Db::getDbLock(str_pad('test', 65, '1'));
+ }
+
+ public function test_getDbLock_shouldGetLock()
+ {
+ $db = Db::get();
+ $this->assertTrue(Db::getDbLock('MyLock'));
+ // same session still has lock
+ $this->assertTrue(Db::getDbLock('MyLock'));
+
+ Db::setDatabaseObject(null);
+ // different session, should not be able to acquire lock
+ $this->assertFalse(Db::getDbLock('MyLock', 1));
+ // different session cannot release lock
+ $this->assertFalse(Db::releaseDbLock('MyLock'));
+ Db::destroyDatabaseObject();
+
+ // release lock again by using previous session
+ Db::setDatabaseObject($db);
+ $this->assertTrue(Db::releaseDbLock('MyLock'));
+ Db::destroyDatabaseObject();
+ }
+
public function getDbAdapter()
{
return array(
diff --git a/tests/PHPUnit/Integration/SegmentTest.php b/tests/PHPUnit/Integration/SegmentTest.php
index eccd355ee3..7041c89202 100644
--- a/tests/PHPUnit/Integration/SegmentTest.php
+++ b/tests/PHPUnit/Integration/SegmentTest.php
@@ -1140,6 +1140,148 @@ class SegmentTest extends IntegrationTestCase
$this->assertCacheWasHit($hits = 2);
}
+ // se https://github.com/piwik/piwik/issues/9194
+ public function test_getSelectQuery_whenQueryingLogConversionWithSegmentThatUsesLogLinkVisitAction_shouldUseSubselect()
+ {
+ $select = 'log_conversion.idgoal AS `idgoal`,
+ count(*) AS `1`,
+ count(distinct log_conversion.idvisit) AS `3`,
+ ROUND(SUM(log_conversion.revenue),2) AS `2`,
+ SUM(log_conversion.items) AS `8`';
+ $from = 'log_conversion';
+ $where = 'log_conversion.server_time >= ? AND log_conversion.server_time <= ? AND log_conversion.idsite IN (?)';
+ $groupBy = 'log_conversion.idgoal';
+ $bind = array('2015-10-14 11:00:00', '2015-10-15 10:59:59', 1);
+
+ $segment = 'pageUrl=@/';
+ $segment = new Segment($segment, $idSites = array());
+
+ $query = $segment->getSelectQuery($select, $from, $where, $bind, $orderBy = false, $groupBy);
+
+ $logConversionTable = Common::prefixTable('log_conversion');
+ $logLinkVisitActionTable = Common::prefixTable('log_link_visit_action');
+
+ $expectedBind = $bind;
+ $expectedBind[] = '/';
+ $expected = array(
+ "sql" => "
+ SELECT log_inner.idgoal AS `idgoal`, count(*) AS `1`, count(distinct log_inner.idvisit) AS `3`, ROUND(SUM(log_inner.revenue),2) AS `2`, SUM(log_inner.items) AS `8`
+ FROM (
+ SELECT log_conversion.idgoal, log_conversion.idvisit, log_conversion.revenue, log_conversion.items
+ FROM $logConversionTable AS log_conversion
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_conversion.idvisit = log_link_visit_action.idvisit
+ WHERE ( log_conversion.server_time >= ?
+ AND log_conversion.server_time <= ?
+ AND log_conversion.idsite IN (?) )
+ AND ( ( log_link_visit_action.idaction_url IN (SELECT idaction FROM log_action WHERE ( name LIKE CONCAT('%', ?, '%') AND type = 1 )) ) )
+ GROUP BY CONCAT(log_conversion.idvisit, '_' , log_conversion.idgoal, '_', log_conversion.buster)
+ ORDER BY NULL )
+ AS log_inner GROUP BY log_inner.idgoal",
+ "bind" => $expectedBind);
+
+ $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
+ }
+
+ // se https://github.com/piwik/piwik/issues/9194
+ public function test_getSelectQuery_whenQueryingLogConversionWithSegmentThatUsesLogLinkVisitActionAndGroupsForUsageInConversionsByTypeOfVisit_shouldUseSubselect()
+ {
+ $select = 'log_conversion.idgoal AS `idgoal`,
+ log_conversion.referer_type AS `referer_type`,
+ log_conversion.referer_name AS `referer_name`,
+ log_conversion.referer_keyword AS `referer_keyword`,
+ count(*) AS `1`,
+ count(distinct log_conversion.idvisit) AS `3`,
+ ROUND(SUM(log_conversion.revenue),2) AS `2`';
+
+ $from = 'log_conversion';
+ $where = 'log_conversion.server_time >= ? AND log_conversion.server_time <= ? AND log_conversion.idsite IN (?)';
+ $groupBy = 'log_conversion.idgoal, log_conversion.referer_type, log_conversion.referer_name, log_conversion.referer_keyword';
+ $bind = array('2015-10-14 11:00:00', '2015-10-15 10:59:59', 1);
+
+ $segment = 'pageUrl=@/';
+ $segment = new Segment($segment, $idSites = array());
+
+ $query = $segment->getSelectQuery($select, $from, $where, $bind, $orderBy = false, $groupBy);
+
+ $logConversionTable = Common::prefixTable('log_conversion');
+ $logLinkVisitActionTable = Common::prefixTable('log_link_visit_action');
+
+ $expectedBind = $bind;
+ $expectedBind[] = '/';
+ $expected = array(
+ "sql" => "
+ SELECT log_inner.idgoal AS `idgoal`,
+ log_inner.referer_type AS `referer_type`,
+ log_inner.referer_name AS `referer_name`,
+ log_inner.referer_keyword AS `referer_keyword`,
+ count(*) AS `1`,
+ count(distinct log_inner.idvisit) AS `3`,
+ ROUND(SUM(log_inner.revenue),2) AS `2`
+ FROM (
+ SELECT log_conversion.idgoal, log_conversion.referer_type, log_conversion.referer_name, log_conversion.referer_keyword, log_conversion.idvisit, log_conversion.revenue
+ FROM $logConversionTable AS log_conversion
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_conversion.idvisit = log_link_visit_action.idvisit
+ WHERE ( log_conversion.server_time >= ?
+ AND log_conversion.server_time <= ?
+ AND log_conversion.idsite IN (?) )
+ AND ( ( log_link_visit_action.idaction_url IN (SELECT idaction FROM log_action WHERE ( name LIKE CONCAT('%', ?, '%') AND type = 1 )) ) )
+ GROUP BY CONCAT(log_conversion.idvisit, '_' , log_conversion.idgoal, '_', log_conversion.buster)
+ ORDER BY NULL )
+ AS log_inner GROUP BY log_inner.idgoal, log_inner.referer_type, log_inner.referer_name, log_inner.referer_keyword",
+ "bind" => $expectedBind);
+
+ $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
+ }
+
+ // se https://github.com/piwik/piwik/issues/9194
+ public function test_getSelectQuery_whenQueryingLogConversionWithSegmentThatUsesLogLinkVisitActionAndLogVisit_shouldUseSubselectGroupedByIdVisitAndBuster()
+ {
+ $select = 'log_conversion.idgoal AS `idgoal`,
+ count(*) AS `1`,
+ count(distinct log_conversion.idvisit) AS `3`,
+ ROUND(SUM(log_conversion.revenue),2) AS `2`';
+
+ $from = 'log_conversion';
+ $where = 'log_conversion.server_time >= ? AND log_conversion.server_time <= ? AND log_conversion.idsite IN (?)';
+ $groupBy = 'log_conversion.idgoal';
+ $bind = array('2015-10-14 11:00:00', '2015-10-15 10:59:59', 1);
+
+ $segment = 'visitorType==returning,visitorType==returningCustomer;pageUrl=@/';
+ $segment = new Segment($segment, $idSites = array());
+
+ $query = $segment->getSelectQuery($select, $from, $where, $bind, $orderBy = false, $groupBy);
+
+ $logConversionTable = Common::prefixTable('log_conversion');
+ $logLinkVisitActionTable = Common::prefixTable('log_link_visit_action');
+ $logVisitTable = Common::prefixTable('log_visit');
+
+ $expectedBind = $bind;
+ $expectedBind[] = 1;
+ $expectedBind[] = 2;
+ $expectedBind[] = '/';
+ $expected = array(
+ "sql" => "
+ SELECT log_inner.idgoal AS `idgoal`, count(*) AS `1`, count(distinct log_inner.idvisit) AS `3`, ROUND(SUM(log_inner.revenue),2) AS `2`
+ FROM (
+ SELECT log_conversion.idgoal, log_conversion.idvisit, log_conversion.revenue
+ FROM $logConversionTable AS log_conversion
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_conversion.idvisit = log_link_visit_action.idvisit
+ LEFT JOIN $logVisitTable AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit
+ WHERE ( log_conversion.server_time >= ?
+ AND log_conversion.server_time <= ?
+ AND log_conversion.idsite IN (?) )
+ AND ( (log_visit.visitor_returning = ?
+ OR log_visit.visitor_returning = ?)
+ AND ( log_link_visit_action.idaction_url IN (SELECT idaction FROM log_action WHERE ( name LIKE CONCAT('%', ?, '%') AND type = 1 )) ) )
+ GROUP BY CONCAT(log_conversion.idvisit, '_' , log_conversion.idgoal, '_', log_conversion.buster)
+ ORDER BY NULL )
+ AS log_inner
+ GROUP BY log_inner.idgoal",
+ "bind" => $expectedBind);
+
+ $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
+ }
+
/**
* @param $pageUrlFoundInDb
* @return string
diff --git a/tests/PHPUnit/System/TrackGoalsAllowMultipleConversionsPerVisitTest.php b/tests/PHPUnit/System/TrackGoalsAllowMultipleConversionsPerVisitTest.php
index df052b6e6b..e084c0d475 100755
--- a/tests/PHPUnit/System/TrackGoalsAllowMultipleConversionsPerVisitTest.php
+++ b/tests/PHPUnit/System/TrackGoalsAllowMultipleConversionsPerVisitTest.php
@@ -50,11 +50,19 @@ class TrackGoalsAllowMultipleConversionsPerVisitTest extends SystemTestCase
{
$apiToCall = array(
'VisitTime.getVisitInformationPerServerTime',
- 'VisitsSummary.get'
+ 'VisitsSummary.get',
+ 'Goals.get'
);
return array(
- array($apiToCall, array('idSite' => self::$fixture->idSite, 'date' => self::$fixture->dateTime))
+ array($apiToCall, array('idSite' => self::$fixture->idSite, 'date' => self::$fixture->dateTime)),
+ array(array('Goals.get'), array(
+ 'idSite' => self::$fixture->idSite,
+ 'date' => self::$fixture->dateTime,
+ 'segment' => 'pageUrl=@/',
+ 'testSuffix' => '_withLogLinkVisitActionSegment'
+ )),
+
);
}
diff --git a/tests/PHPUnit/System/TrackGoalsOneConversionPerVisitTest.php b/tests/PHPUnit/System/TrackGoalsOneConversionPerVisitTest.php
new file mode 100755
index 0000000000..478a4a1152
--- /dev/null
+++ b/tests/PHPUnit/System/TrackGoalsOneConversionPerVisitTest.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Tests\System;
+
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+use Piwik\Tests\Fixtures\TwoVisitsWithCustomVariables;
+
+/**
+ * @group Plugins
+ * @group TrackGoalsOneConversionPerVisitTest
+ */
+class TrackGoalsOneConversionPerVisitTest extends SystemTestCase
+{
+ /**
+ * @var TwoVisitsWithCustomVariables
+ */
+ public static $fixture = null; // initialized below class definition
+
+ /**
+ * @dataProvider getApiForTesting
+ */
+ public function testApi($api, $params)
+ {
+ $this->runApiTests($api, $params);
+ }
+
+ public function getApiForTesting()
+ {
+ $apiToCall = array('Goals.get');
+
+ return array(
+ array($apiToCall, array(
+ 'idSite' => self::$fixture->idSite,
+ 'date' => self::$fixture->dateTime,
+ 'periods' => array('day'))),
+ // test for https://github.com/piwik/piwik/issues/9194 requesting log_conversion with log_link_visit_action segment
+ array($apiToCall, array(
+ 'idSite' => self::$fixture->idSite,
+ 'date' => self::$fixture->dateTime,
+ 'segment' => 'pageUrl=@/',
+ 'testSuffix' => '_withLogLinkVisitActionSegment'
+ )),
+ array($apiToCall, array(
+ 'idSite' => self::$fixture->idSite,
+ 'date' => self::$fixture->dateTime,
+ 'segment' => 'visitCount>=1;pageUrl=@/',
+ 'testSuffix' => '_withLogLinkVisitActionAndLogVisitSegment'
+ )),
+ );
+ }
+
+ public static function getOutputPrefix()
+ {
+ return 'trackGoals_oneConversionPerVisit';
+ }
+}
+
+TrackGoalsOneConversionPerVisitTest::$fixture = new TwoVisitsWithCustomVariables();
+TrackGoalsOneConversionPerVisitTest::$fixture->doExtraQuoteTests = false; \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_month.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_month.xml
index 6cc283b555..51252ac498 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_month.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_month.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_uniq_visitors>27</nb_uniq_visitors>
+ <nb_uniq_visitors>28</nb_uniq_visitors>
<nb_users>0</nb_users>
- <nb_visits>27</nb_visits>
- <nb_actions>30</nb_actions>
- <nb_visits_converted>25</nb_visits_converted>
- <bounce_count>25</bounce_count>
+ <nb_visits>28</nb_visits>
+ <nb_actions>31</nb_actions>
+ <nb_visits_converted>26</nb_visits_converted>
+ <bounce_count>26</bounce_count>
<sum_visit_length>305</sum_visit_length>
<max_actions>3</max_actions>
<bounce_rate>93%</bounce_rate>
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_week.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_week.xml
index 16c4dae84f..22528b0939 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_week.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_week.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_uniq_visitors>25</nb_uniq_visitors>
+ <nb_uniq_visitors>26</nb_uniq_visitors>
<nb_users>0</nb_users>
- <nb_visits>25</nb_visits>
- <nb_actions>28</nb_actions>
- <nb_visits_converted>23</nb_visits_converted>
- <bounce_count>23</bounce_count>
+ <nb_visits>26</nb_visits>
+ <nb_actions>29</nb_actions>
+ <nb_visits_converted>24</nb_visits_converted>
+ <bounce_count>24</bounce_count>
<sum_visit_length>305</sum_visit_length>
<max_actions>3</max_actions>
<bounce_rate>92%</bounce_rate>
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_year.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_year.xml
index 19948ee71e..284a007a78 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_year.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_noOptions__VisitsSummary.get_year.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_visits>28</nb_visits>
- <nb_actions>40</nb_actions>
- <nb_visits_converted>26</nb_visits_converted>
- <bounce_count>25</bounce_count>
+ <nb_visits>29</nb_visits>
+ <nb_actions>41</nb_actions>
+ <nb_visits_converted>27</nb_visits_converted>
+ <bounce_count>26</bounce_count>
<sum_visit_length>359</sum_visit_length>
<max_actions>10</max_actions>
- <bounce_rate>89%</bounce_rate>
+ <bounce_rate>90%</bounce_rate>
<nb_actions_per_visit>1.4</nb_actions_per_visit>
- <avg_time_on_site>13</avg_time_on_site>
+ <avg_time_on_site>12</avg_time_on_site>
</result>
<result idSite="2">
<nb_visits>1</nb_visits>
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml
index 13de94417a..0a45cfa38e 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml
@@ -2,7 +2,7 @@
<result>
<row>
<idSite>1</idSite>
- <idVisit>56</idVisit>
+ <idVisit>57</idVisit>
<visitIp>175.41.192.40</visitIp>
<actionDetails>
@@ -12,7 +12,7 @@
<pageTitle />
<pageIdAction>1</pageIdAction>
- <pageId>69</pageId>
+ <pageId>70</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -30,7 +30,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>69</goalPageId>
+ <goalPageId>70</goalPageId>
<url>http://piwik.net/blog/category/meta/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -42,7 +42,7 @@
<pageTitle />
<pageIdAction>1</pageIdAction>
- <pageId>73</pageId>
+ <pageId>74</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -61,7 +61,7 @@
<pageTitle />
<pageIdAction>1</pageIdAction>
- <pageId>77</pageId>
+ <pageId>78</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -80,7 +80,7 @@
<pageTitle />
<pageIdAction>2</pageIdAction>
- <pageId>70</pageId>
+ <pageId>71</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -99,7 +99,7 @@
<pageTitle />
<pageIdAction>2</pageIdAction>
- <pageId>74</pageId>
+ <pageId>75</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -118,7 +118,7 @@
<pageTitle />
<pageIdAction>2</pageIdAction>
- <pageId>78</pageId>
+ <pageId>79</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -137,7 +137,7 @@
<pageTitle />
<pageIdAction>3</pageIdAction>
- <pageId>71</pageId>
+ <pageId>72</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -156,7 +156,7 @@
<pageTitle />
<pageIdAction>3</pageIdAction>
- <pageId>75</pageId>
+ <pageId>76</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -175,7 +175,7 @@
<pageTitle />
<pageIdAction>4</pageIdAction>
- <pageId>72</pageId>
+ <pageId>73</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -194,7 +194,7 @@
<pageTitle />
<pageIdAction>4</pageIdAction>
- <pageId>76</pageId>
+ <pageId>77</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -280,7 +280,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>26</idVisit>
+ <idVisit>27</idVisit>
<visitIp>0.0.0.0</visitIp>
<actionDetails>
@@ -289,7 +289,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>29</goalPageId>
+ <goalPageId>30</goalPageId>
<url>http://example.org/index.htm</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -301,7 +301,7 @@
<pageTitle>incredible title!</pageTitle>
<pageIdAction>29</pageIdAction>
- <pageId>29</pageId>
+ <pageId>30</pageId>
<customVariables>
<row>
<customVariablePageName3>_pks</customVariablePageName3>
@@ -517,6 +517,116 @@
</row>
<row>
<idSite>1</idSite>
+ <idVisit>26</idVisit>
+ <visitIp>::ffff:123.45.67.89</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>goal</type>
+ <goalName>all</goalName>
+ <goalId>1</goalId>
+ <revenue>5</revenue>
+ <goalPageId>29</goalPageId>
+
+ <url>http://piwik.net/blog/category/meta/</url>
+ <icon>plugins/Morpheus/images/goal.png</icon>
+
+ </row>
+ <row>
+ <type>action</type>
+ <url>http://piwik.net/blog/category/meta/</url>
+ <pageTitle />
+ <pageIdAction>1</pageIdAction>
+
+ <pageId>29</pageId>
+ <customVariables>
+ <row>
+ <customVariablePageName1>HTTP-code</customVariablePageName1>
+ <customVariablePageValue1>200</customVariablePageValue1>
+ </row>
+ </customVariables>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>1</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>1</visitConverted>
+ <visitConvertedIcon>plugins/Morpheus/images/goal.png</visitConvertedIcon>
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Desktop</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/normal.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Mac 10.6</operatingSystem>
+ <operatingSystemName>Mac</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/MAC.gif</operatingSystemIcon>
+ <operatingSystemCode>MAC</operatingSystemCode>
+ <operatingSystemVersion>10.6</operatingSystemVersion>
+ <browserFamily>WebKit</browserFamily>
+ <browserFamilyDescription>WebKit (Safari, Chrome)</browserFamilyDescription>
+ <browser>RockMelt 0.9</browser>
+ <browserName>RockMelt</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/CH.gif</browserIcon>
+ <browserCode>RM</browserCode>
+ <browserVersion>0.9</browserVersion>
+ <events>0</events>
+ <continent>Asia</continent>
+ <continentCode>asi</continentCode>
+ <country>South Korea</country>
+ <countryCode>kr</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/kr.png</countryFlag>
+ <region>Seoul-t'ukpyolsi</region>
+ <regionCode>11</regionCode>
+ <city>Seoul</city>
+ <location>Seoul, Seoul-t'ukpyolsi, South Korea</location>
+ <visitLocalTime>20:15:41</visitLocalTime>
+ <visitLocalHour>20</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ <row>
+ <customVariableName1>Not-Bot</customVariableName1>
+ <customVariableValue1>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24</customVariableValue1>
+ </row>
+ </customVariables>
+ <resolution>unknown</resolution>
+ <plugins />
+ <pluginsIcons />
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
<idVisit>24</idVisit>
<visitIp>175.41.192.43</visitIp>
@@ -1207,114 +1317,4 @@
</row>
- <row>
- <idSite>1</idSite>
- <idVisit>19</idVisit>
- <visitIp>175.41.192.41</visitIp>
-
- <actionDetails>
- <row>
- <type>goal</type>
- <goalName>all</goalName>
- <goalId>1</goalId>
- <revenue>5</revenue>
- <goalPageId>19</goalPageId>
-
- <url>http://piwik.net/blog/category/meta/</url>
- <icon>plugins/Morpheus/images/goal.png</icon>
-
- </row>
- <row>
- <type>action</type>
- <url>http://piwik.net/blog/category/meta/</url>
- <pageTitle />
- <pageIdAction>1</pageIdAction>
-
- <pageId>19</pageId>
- <customVariables>
- <row>
- <customVariablePageName1>HTTP-code</customVariablePageName1>
- <customVariablePageValue1>200</customVariablePageValue1>
- </row>
- </customVariables>
- <icon />
-
- </row>
- </actionDetails>
- <goalConversions>1</goalConversions>
- <siteCurrency>USD</siteCurrency>
- <siteCurrencySymbol>$</siteCurrencySymbol>
-
-
-
-
- <userId />
- <visitorType>new</visitorType>
- <visitorTypeIcon />
- <visitConverted>1</visitConverted>
- <visitConvertedIcon>plugins/Morpheus/images/goal.png</visitConvertedIcon>
- <visitCount>1</visitCount>
-
- <visitEcommerceStatus>none</visitEcommerceStatus>
- <visitEcommerceStatusIcon />
- <daysSinceFirstVisit>0</daysSinceFirstVisit>
- <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
- <visitDuration>0</visitDuration>
- <visitDurationPretty>0s</visitDurationPretty>
- <searches>0</searches>
- <actions>1</actions>
- <referrerType>direct</referrerType>
- <referrerTypeName>Direct Entry</referrerTypeName>
- <referrerName />
- <referrerKeyword />
- <referrerKeywordPosition />
- <referrerUrl />
- <referrerSearchEngineUrl />
- <referrerSearchEngineIcon />
- <languageCode />
- <language>Unknown</language>
- <deviceType>Desktop</deviceType>
- <deviceTypeIcon>plugins/DevicesDetection/images/screens/normal.gif</deviceTypeIcon>
- <deviceBrand>Unknown</deviceBrand>
- <deviceModel />
- <operatingSystem>Mac 10.6</operatingSystem>
- <operatingSystemName>Mac</operatingSystemName>
- <operatingSystemIcon>plugins/DevicesDetection/images/os/MAC.gif</operatingSystemIcon>
- <operatingSystemCode>MAC</operatingSystemCode>
- <operatingSystemVersion>10.6</operatingSystemVersion>
- <browserFamily>WebKit</browserFamily>
- <browserFamilyDescription>WebKit (Safari, Chrome)</browserFamilyDescription>
- <browser>RockMelt 0.9</browser>
- <browserName>RockMelt</browserName>
- <browserIcon>plugins/DevicesDetection/images/browsers/CH.gif</browserIcon>
- <browserCode>RM</browserCode>
- <browserVersion>0.9</browserVersion>
- <events>0</events>
- <continent>Asia</continent>
- <continentCode>asi</continentCode>
- <country>Japan</country>
- <countryCode>jp</countryCode>
- <countryFlag>plugins/UserCountry/images/flags/jp.png</countryFlag>
- <region />
- <regionCode />
- <city />
- <location>Japan</location>
- <visitLocalTime>16:10:38</visitLocalTime>
- <visitLocalHour>16</visitLocalHour>
- <daysSinceLastVisit>0</daysSinceLastVisit>
- <customVariables>
- <row>
- <customVariableName1>Not-Bot</customVariableName1>
- <customVariableValue1>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24</customVariableValue1>
- </row>
- </customVariables>
- <resolution>unknown</resolution>
- <plugins />
- <pluginsIcons />
-
-
-
-
-
- </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__VisitsSummary.get_year.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__VisitsSummary.get_year.xml
index d59560e4a4..811259d2dd 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__VisitsSummary.get_year.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__VisitsSummary.get_year.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_visits>27</nb_visits>
- <nb_actions>39</nb_actions>
- <nb_visits_converted>25</nb_visits_converted>
- <bounce_count>24</bounce_count>
+ <nb_visits>28</nb_visits>
+ <nb_actions>40</nb_actions>
+ <nb_visits_converted>26</nb_visits_converted>
+ <bounce_count>25</bounce_count>
<sum_visit_length>359</sum_visit_length>
<max_actions>10</max_actions>
<bounce_rate>89%</bounce_rate>
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_month.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_month.xml
index 22528b0939..744ab64e8e 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_month.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_month.xml
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_uniq_visitors>26</nb_uniq_visitors>
+ <nb_uniq_visitors>27</nb_uniq_visitors>
<nb_users>0</nb_users>
- <nb_visits>26</nb_visits>
- <nb_actions>29</nb_actions>
- <nb_visits_converted>24</nb_visits_converted>
- <bounce_count>24</bounce_count>
+ <nb_visits>27</nb_visits>
+ <nb_actions>30</nb_actions>
+ <nb_visits_converted>25</nb_visits_converted>
+ <bounce_count>25</bounce_count>
<sum_visit_length>305</sum_visit_length>
<max_actions>3</max_actions>
- <bounce_rate>92%</bounce_rate>
+ <bounce_rate>93%</bounce_rate>
<nb_actions_per_visit>1.1</nb_actions_per_visit>
- <avg_time_on_site>12</avg_time_on_site>
+ <avg_time_on_site>11</avg_time_on_site>
</result>
<result idSite="2" />
<result idSite="3" />
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_week.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_week.xml
index 16c4dae84f..22528b0939 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_week.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_week.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_uniq_visitors>25</nb_uniq_visitors>
+ <nb_uniq_visitors>26</nb_uniq_visitors>
<nb_users>0</nb_users>
- <nb_visits>25</nb_visits>
- <nb_actions>28</nb_actions>
- <nb_visits_converted>23</nb_visits_converted>
- <bounce_count>23</bounce_count>
+ <nb_visits>26</nb_visits>
+ <nb_actions>29</nb_actions>
+ <nb_visits_converted>24</nb_visits_converted>
+ <bounce_count>24</bounce_count>
<sum_visit_length>305</sum_visit_length>
<max_actions>3</max_actions>
<bounce_rate>92%</bounce_rate>
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_year.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_year.xml
index e0409a2e7a..bebdd468f5 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_year.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchivedWithUrlEncoding_noOptions__VisitsSummary.get_year.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_visits>27</nb_visits>
- <nb_actions>39</nb_actions>
- <nb_visits_converted>25</nb_visits_converted>
- <bounce_count>24</bounce_count>
+ <nb_visits>28</nb_visits>
+ <nb_actions>40</nb_actions>
+ <nb_visits_converted>26</nb_visits_converted>
+ <bounce_count>25</bounce_count>
<sum_visit_length>359</sum_visit_length>
<max_actions>10</max_actions>
<bounce_rate>89%</bounce_rate>
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_month.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_month.xml
index 22528b0939..744ab64e8e 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_month.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_month.xml
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_uniq_visitors>26</nb_uniq_visitors>
+ <nb_uniq_visitors>27</nb_uniq_visitors>
<nb_users>0</nb_users>
- <nb_visits>26</nb_visits>
- <nb_actions>29</nb_actions>
- <nb_visits_converted>24</nb_visits_converted>
- <bounce_count>24</bounce_count>
+ <nb_visits>27</nb_visits>
+ <nb_actions>30</nb_actions>
+ <nb_visits_converted>25</nb_visits_converted>
+ <bounce_count>25</bounce_count>
<sum_visit_length>305</sum_visit_length>
<max_actions>3</max_actions>
- <bounce_rate>92%</bounce_rate>
+ <bounce_rate>93%</bounce_rate>
<nb_actions_per_visit>1.1</nb_actions_per_visit>
- <avg_time_on_site>12</avg_time_on_site>
+ <avg_time_on_site>11</avg_time_on_site>
</result>
<result idSite="2" />
<result idSite="3" />
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_week.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_week.xml
index 16c4dae84f..22528b0939 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_week.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_week.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_uniq_visitors>25</nb_uniq_visitors>
+ <nb_uniq_visitors>26</nb_uniq_visitors>
<nb_users>0</nb_users>
- <nb_visits>25</nb_visits>
- <nb_actions>28</nb_actions>
- <nb_visits_converted>23</nb_visits_converted>
- <bounce_count>23</bounce_count>
+ <nb_visits>26</nb_visits>
+ <nb_actions>29</nb_actions>
+ <nb_visits_converted>24</nb_visits_converted>
+ <bounce_count>24</bounce_count>
<sum_visit_length>305</sum_visit_length>
<max_actions>3</max_actions>
<bounce_rate>92%</bounce_rate>
diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_year.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_year.xml
index e0409a2e7a..bebdd468f5 100644
--- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_year.xml
+++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_segmentPreArchived_noOptions__VisitsSummary.get_year.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
<result idSite="1">
- <nb_visits>27</nb_visits>
- <nb_actions>39</nb_actions>
- <nb_visits_converted>25</nb_visits_converted>
- <bounce_count>24</bounce_count>
+ <nb_visits>28</nb_visits>
+ <nb_actions>40</nb_actions>
+ <nb_visits_converted>26</nb_visits_converted>
+ <bounce_count>25</bounce_count>
<sum_visit_length>359</sum_visit_length>
<max_actions>10</max_actions>
<bounce_rate>89%</bounce_rate>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
index f6346a73a2..bd56600c6b 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
@@ -57,7 +57,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -192,7 +192,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -201,7 +201,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
index f8925c9d33..bea242a734 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
@@ -102,7 +102,7 @@
<nb_events>6</nb_events>
<nb_events_with_value>6</nb_events_with_value>
<sum_event_value>57.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.55</avg_event_value>
</row>
@@ -120,7 +120,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
index b864dfee8d..98d6c9c102 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
@@ -66,7 +66,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -138,7 +138,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -192,7 +192,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
index db11c2d0f7..e8f56874f1 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
@@ -66,7 +66,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
index 75d7258c81..7e7115220c 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
@@ -57,7 +57,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -120,7 +120,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -219,7 +219,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
index 17fc816682..8abd14891c 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
@@ -75,7 +75,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml
index 23075dc425..67343d25f6 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml
@@ -223,7 +223,7 @@
<nb_events>6</nb_events>
<nb_events_with_value>6</nb_events_with_value>
<sum_event_value>57.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.55</avg_event_value>
<segment>eventAction==rating</segment>
@@ -235,7 +235,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -246,7 +246,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -284,7 +284,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -296,7 +296,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
index 0a05b73d79..8f96e9b8f8 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
@@ -222,7 +222,7 @@
<nb_events>6</nb_events>
<nb_events_with_value>6</nb_events_with_value>
<sum_event_value>57.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
<avg_event_value>9.55</avg_event_value>
@@ -234,7 +234,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
@@ -245,7 +245,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -283,7 +283,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -295,7 +295,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml
index 0616bb52ea..705ab95996 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml
@@ -118,7 +118,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -198,7 +198,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -211,7 +211,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -223,7 +223,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
index 43d8ed7afe..0ec9655add 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
@@ -117,7 +117,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -197,7 +197,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
@@ -210,7 +210,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -222,7 +222,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml
index f7271a5cff..84c1b47507 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml
@@ -96,7 +96,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -176,7 +176,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -224,7 +224,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -236,7 +236,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
index a2d8c3267c..141ccc652e 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
@@ -95,7 +95,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -175,7 +175,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
@@ -223,7 +223,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -235,7 +235,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getAction_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getAction_day.xml
index c51dd380e7..1ae34d2b69 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getAction_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getAction_day.xml
@@ -223,7 +223,7 @@
<nb_events>6</nb_events>
<nb_events_with_value>6</nb_events_with_value>
<sum_event_value>57.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.55</avg_event_value>
<segment>eventAction==rating</segment>
@@ -235,7 +235,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -246,7 +246,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getCategory_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getCategory_day.xml
index 2c7daee22f..c6a456e3b8 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getCategory_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getCategory_day.xml
@@ -118,7 +118,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -198,7 +198,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getName_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getName_day.xml
index 2e1666f4b2..5b4b604c43 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getName_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_eventCategoryOrNameMatch__Events.getName_day.xml
@@ -96,7 +96,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -176,7 +176,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml
index 0616bb52ea..705ab95996 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml
@@ -118,7 +118,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -198,7 +198,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -211,7 +211,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -223,7 +223,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
index 43d8ed7afe..0ec9655add 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
@@ -117,7 +117,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -197,7 +197,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
@@ -210,7 +210,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -222,7 +222,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml
index f7271a5cff..84c1b47507 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml
@@ -96,7 +96,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -176,7 +176,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -224,7 +224,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -236,7 +236,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
index a2d8c3267c..141ccc652e 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
@@ -95,7 +95,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -175,7 +175,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
@@ -223,7 +223,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -235,7 +235,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml
index b32b2ae040..31da89e717 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml
@@ -201,7 +201,7 @@
<nb_events>6</nb_events>
<nb_events_with_value>6</nb_events_with_value>
<sum_event_value>57.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.55</avg_event_value>
<segment>eventAction==rating</segment>
@@ -213,7 +213,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -224,7 +224,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -262,7 +262,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -274,7 +274,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
index a6a3d0be52..f695f351a1 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
@@ -200,7 +200,7 @@
<nb_events>6</nb_events>
<nb_events_with_value>6</nb_events_with_value>
<sum_event_value>57.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
<avg_event_value>9.55</avg_event_value>
@@ -212,7 +212,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -223,7 +223,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
@@ -261,7 +261,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -273,7 +273,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml
index 1eb6e13021..194453a8db 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml
@@ -81,7 +81,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -93,7 +93,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
index b203fc7041..e27153830c 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
@@ -80,7 +80,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -92,7 +92,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml
index 23075dc425..67343d25f6 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml
@@ -223,7 +223,7 @@
<nb_events>6</nb_events>
<nb_events_with_value>6</nb_events_with_value>
<sum_event_value>57.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.55</avg_event_value>
<segment>eventAction==rating</segment>
@@ -235,7 +235,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
@@ -246,7 +246,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
@@ -284,7 +284,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -296,7 +296,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
index 0a05b73d79..8f96e9b8f8 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
@@ -222,7 +222,7 @@
<nb_events>6</nb_events>
<nb_events_with_value>6</nb_events_with_value>
<sum_event_value>57.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
<avg_event_value>9.55</avg_event_value>
@@ -234,7 +234,7 @@
<nb_events>4</nb_events>
<nb_events_with_value>4</nb_events_with_value>
<sum_event_value>38</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9</min_event_value>
<max_event_value>10</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.5</avg_event_value>
@@ -245,7 +245,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -283,7 +283,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -295,7 +295,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml
index f2154fd380..ab1e9a0af0 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml
@@ -90,7 +90,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
<segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
@@ -102,7 +102,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
index a752c1e0bd..2e1a51f476 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
@@ -89,7 +89,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
@@ -101,7 +101,7 @@
<nb_events>2</nb_events>
<nb_events_with_value>2</nb_events_with_value>
<sum_event_value>19.32</sum_event_value>
- <min_event_value>0</min_event_value>
+ <min_event_value>9.66</min_event_value>
<max_event_value>9.66</max_event_value>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>9.66</avg_event_value>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_month.xml
index 10b6cbd275..2bb1a15667 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_month.xml
@@ -2,17 +2,17 @@
<result>
<row>
<label>blog</label>
- <nb_visits>5</nb_visits>
- <nb_hits>5</nb_hits>
+ <nb_visits>6</nb_visits>
+ <nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>0</nb_hits_with_time_generation>
<min_time_generation />
<max_time_generation>0</max_time_generation>
- <entry_nb_visits>5</entry_nb_visits>
- <entry_nb_actions>5</entry_nb_actions>
+ <entry_nb_visits>6</entry_nb_visits>
+ <entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>5</entry_bounce_count>
- <exit_nb_visits>5</exit_nb_visits>
+ <entry_bounce_count>6</entry_bounce_count>
+ <exit_nb_visits>6</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
@@ -20,45 +20,45 @@
<subtable>
<row>
<label>category</label>
- <nb_visits>4</nb_visits>
- <nb_hits>4</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>5</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>4</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>5</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>4</entry_bounce_count>
- <exit_nb_visits>4</exit_nb_visits>
+ <entry_bounce_count>5</entry_bounce_count>
+ <exit_nb_visits>5</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
<subtable>
<row>
<label>meta</label>
- <nb_visits>3</nb_visits>
- <nb_hits>3</nb_hits>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>3</entry_nb_visits>
- <entry_nb_actions>3</entry_nb_actions>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
<subtable>
<row>
<label>/index</label>
- <nb_visits>3</nb_visits>
- <nb_hits>3</nb_hits>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>3</entry_nb_visits>
- <entry_nb_actions>3</entry_nb_actions>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
- <sum_daily_entry_nb_uniq_visitors>3</sum_daily_entry_nb_uniq_visitors>
- <sum_daily_exit_nb_uniq_visitors>3</sum_daily_exit_nb_uniq_visitors>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_entry_nb_uniq_visitors>4</sum_daily_entry_nb_uniq_visitors>
+ <sum_daily_exit_nb_uniq_visitors>4</sum_daily_exit_nb_uniq_visitors>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_range.xml
index 136c7cf125..d1c53283d0 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getEntryPageUrls_range.xml
@@ -2,77 +2,77 @@
<result>
<row>
<label>blog</label>
- <nb_visits>9</nb_visits>
- <nb_hits>12</nb_hits>
+ <nb_visits>10</nb_visits>
+ <nb_hits>13</nb_hits>
<sum_time_spent>166</sum_time_spent>
<nb_hits_with_time_generation>7</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>1.324</max_time_generation>
- <entry_nb_visits>8</entry_nb_visits>
- <entry_nb_actions>17</entry_nb_actions>
+ <entry_nb_visits>9</entry_nb_visits>
+ <entry_nb_actions>18</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>7</entry_bounce_count>
- <exit_nb_visits>7</exit_nb_visits>
- <avg_time_on_page>18</avg_time_on_page>
- <bounce_rate>88%</bounce_rate>
- <exit_rate>78%</exit_rate>
+ <entry_bounce_count>8</entry_bounce_count>
+ <exit_nb_visits>8</exit_nb_visits>
+ <avg_time_on_page>17</avg_time_on_page>
+ <bounce_rate>89%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.389</avg_time_generation>
<subtable>
<row>
<label>category</label>
- <nb_visits>6</nb_visits>
- <nb_hits>9</nb_hits>
+ <nb_visits>7</nb_visits>
+ <nb_hits>10</nb_hits>
<sum_time_spent>166</sum_time_spent>
<nb_hits_with_time_generation>5</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>1.324</max_time_generation>
- <entry_nb_visits>5</entry_nb_visits>
- <entry_nb_actions>14</entry_nb_actions>
+ <entry_nb_visits>6</entry_nb_visits>
+ <entry_nb_actions>15</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>4</entry_bounce_count>
- <exit_nb_visits>4</exit_nb_visits>
- <avg_time_on_page>28</avg_time_on_page>
- <bounce_rate>80%</bounce_rate>
- <exit_rate>67%</exit_rate>
+ <entry_bounce_count>5</entry_bounce_count>
+ <exit_nb_visits>5</exit_nb_visits>
+ <avg_time_on_page>24</avg_time_on_page>
+ <bounce_rate>83%</bounce_rate>
+ <exit_rate>71%</exit_rate>
<avg_time_generation>0.443</avg_time_generation>
<subtable>
<row>
<label>meta</label>
- <nb_visits>4</nb_visits>
- <nb_hits>6</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>7</nb_hits>
<sum_time_spent>151</sum_time_spent>
<nb_hits_with_time_generation>3</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>0.123</max_time_generation>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>13</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>14</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <avg_time_on_page>38</avg_time_on_page>
- <bounce_rate>75%</bounce_rate>
- <exit_rate>75%</exit_rate>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <avg_time_on_page>30</avg_time_on_page>
+ <bounce_rate>80%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.089</avg_time_generation>
<subtable>
<row>
<label>/index</label>
- <nb_visits>4</nb_visits>
- <nb_hits>6</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>7</nb_hits>
<sum_time_spent>151</sum_time_spent>
<nb_hits_with_time_generation>3</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>0.123</max_time_generation>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>13</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>14</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
- <sum_daily_entry_nb_uniq_visitors>4</sum_daily_entry_nb_uniq_visitors>
- <sum_daily_exit_nb_uniq_visitors>3</sum_daily_exit_nb_uniq_visitors>
- <avg_time_on_page>38</avg_time_on_page>
- <bounce_rate>75%</bounce_rate>
- <exit_rate>75%</exit_rate>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
+ <sum_daily_entry_nb_uniq_visitors>5</sum_daily_entry_nb_uniq_visitors>
+ <sum_daily_exit_nb_uniq_visitors>4</sum_daily_exit_nb_uniq_visitors>
+ <avg_time_on_page>30</avg_time_on_page>
+ <bounce_rate>80%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.089</avg_time_generation>
<url>http://piwik.net/blog/category/meta/</url>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_month.xml
index 89abc41b11..05350333b8 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_month.xml
@@ -2,17 +2,17 @@
<result>
<row>
<label>blog</label>
- <nb_visits>5</nb_visits>
- <nb_hits>5</nb_hits>
+ <nb_visits>6</nb_visits>
+ <nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>0</nb_hits_with_time_generation>
<min_time_generation />
<max_time_generation>0</max_time_generation>
- <entry_nb_visits>5</entry_nb_visits>
- <entry_nb_actions>5</entry_nb_actions>
+ <entry_nb_visits>6</entry_nb_visits>
+ <entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>5</entry_bounce_count>
- <exit_nb_visits>5</exit_nb_visits>
+ <entry_bounce_count>6</entry_bounce_count>
+ <exit_nb_visits>6</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
@@ -20,45 +20,45 @@
<subtable>
<row>
<label>category</label>
- <nb_visits>4</nb_visits>
- <nb_hits>4</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>5</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>4</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>5</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>4</entry_bounce_count>
- <exit_nb_visits>4</exit_nb_visits>
+ <entry_bounce_count>5</entry_bounce_count>
+ <exit_nb_visits>5</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
<subtable>
<row>
<label>meta</label>
- <nb_visits>3</nb_visits>
- <nb_hits>3</nb_hits>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>3</entry_nb_visits>
- <entry_nb_actions>3</entry_nb_actions>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
<subtable>
<row>
<label>/index</label>
- <nb_visits>3</nb_visits>
- <nb_hits>3</nb_hits>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>3</entry_nb_visits>
- <entry_nb_actions>3</entry_nb_actions>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
- <sum_daily_entry_nb_uniq_visitors>3</sum_daily_entry_nb_uniq_visitors>
- <sum_daily_exit_nb_uniq_visitors>3</sum_daily_exit_nb_uniq_visitors>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_entry_nb_uniq_visitors>4</sum_daily_entry_nb_uniq_visitors>
+ <sum_daily_exit_nb_uniq_visitors>4</sum_daily_exit_nb_uniq_visitors>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_range.xml
index acc61f1910..e5240da081 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getExitPageUrls_range.xml
@@ -2,77 +2,77 @@
<result>
<row>
<label>blog</label>
- <nb_visits>9</nb_visits>
- <nb_hits>12</nb_hits>
+ <nb_visits>10</nb_visits>
+ <nb_hits>13</nb_hits>
<sum_time_spent>166</sum_time_spent>
<nb_hits_with_time_generation>7</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>1.324</max_time_generation>
- <entry_nb_visits>8</entry_nb_visits>
- <entry_nb_actions>17</entry_nb_actions>
+ <entry_nb_visits>9</entry_nb_visits>
+ <entry_nb_actions>18</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>7</entry_bounce_count>
- <exit_nb_visits>7</exit_nb_visits>
- <avg_time_on_page>18</avg_time_on_page>
- <bounce_rate>88%</bounce_rate>
- <exit_rate>78%</exit_rate>
+ <entry_bounce_count>8</entry_bounce_count>
+ <exit_nb_visits>8</exit_nb_visits>
+ <avg_time_on_page>17</avg_time_on_page>
+ <bounce_rate>89%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.389</avg_time_generation>
<subtable>
<row>
<label>category</label>
- <nb_visits>6</nb_visits>
- <nb_hits>9</nb_hits>
+ <nb_visits>7</nb_visits>
+ <nb_hits>10</nb_hits>
<sum_time_spent>166</sum_time_spent>
<nb_hits_with_time_generation>5</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>1.324</max_time_generation>
- <entry_nb_visits>5</entry_nb_visits>
- <entry_nb_actions>14</entry_nb_actions>
+ <entry_nb_visits>6</entry_nb_visits>
+ <entry_nb_actions>15</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>4</entry_bounce_count>
- <exit_nb_visits>4</exit_nb_visits>
- <avg_time_on_page>28</avg_time_on_page>
- <bounce_rate>80%</bounce_rate>
- <exit_rate>67%</exit_rate>
+ <entry_bounce_count>5</entry_bounce_count>
+ <exit_nb_visits>5</exit_nb_visits>
+ <avg_time_on_page>24</avg_time_on_page>
+ <bounce_rate>83%</bounce_rate>
+ <exit_rate>71%</exit_rate>
<avg_time_generation>0.443</avg_time_generation>
<subtable>
<row>
<label>meta</label>
- <nb_visits>4</nb_visits>
- <nb_hits>6</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>7</nb_hits>
<sum_time_spent>151</sum_time_spent>
<nb_hits_with_time_generation>3</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>0.123</max_time_generation>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>13</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>14</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <avg_time_on_page>38</avg_time_on_page>
- <bounce_rate>75%</bounce_rate>
- <exit_rate>75%</exit_rate>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <avg_time_on_page>30</avg_time_on_page>
+ <bounce_rate>80%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.089</avg_time_generation>
<subtable>
<row>
<label>/index</label>
- <nb_visits>4</nb_visits>
- <nb_hits>6</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>7</nb_hits>
<sum_time_spent>151</sum_time_spent>
<nb_hits_with_time_generation>3</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>0.123</max_time_generation>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>13</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>14</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
- <sum_daily_entry_nb_uniq_visitors>4</sum_daily_entry_nb_uniq_visitors>
- <sum_daily_exit_nb_uniq_visitors>3</sum_daily_exit_nb_uniq_visitors>
- <avg_time_on_page>38</avg_time_on_page>
- <bounce_rate>75%</bounce_rate>
- <exit_rate>75%</exit_rate>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
+ <sum_daily_entry_nb_uniq_visitors>5</sum_daily_entry_nb_uniq_visitors>
+ <sum_daily_exit_nb_uniq_visitors>4</sum_daily_exit_nb_uniq_visitors>
+ <avg_time_on_page>30</avg_time_on_page>
+ <bounce_rate>80%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.089</avg_time_generation>
<url>http://piwik.net/blog/category/meta/</url>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_month.xml
index 1506b1f2d3..a56dd22637 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>Page Name not defined</label>
- <nb_visits>26</nb_visits>
- <nb_hits>27</nb_hits>
+ <nb_visits>27</nb_visits>
+ <nb_hits>28</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>6</nb_hits_with_time_generation>
<min_time_generation>0.001</min_time_generation>
<max_time_generation>0.359</max_time_generation>
- <sum_daily_nb_uniq_visitors>25</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>26</sum_daily_nb_uniq_visitors>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>0%</exit_rate>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_range.xml
index 56591ed8ab..9ac6ea68c2 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageTitles_range.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>Page Name not defined</label>
- <nb_visits>27</nb_visits>
- <nb_hits>37</nb_hits>
+ <nb_visits>28</nb_visits>
+ <nb_hits>38</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>16</nb_hits_with_time_generation>
<min_time_generation>0.001</min_time_generation>
<max_time_generation>1.324</max_time_generation>
- <sum_daily_nb_uniq_visitors>26</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>27</sum_daily_nb_uniq_visitors>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>0%</bounce_rate>
<exit_rate>0%</exit_rate>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_month.xml
index 8b4c3e8f59..cf6cb6491a 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_month.xml
@@ -2,17 +2,17 @@
<result>
<row>
<label>blog</label>
- <nb_visits>5</nb_visits>
- <nb_hits>5</nb_hits>
+ <nb_visits>6</nb_visits>
+ <nb_hits>6</nb_hits>
<sum_time_spent>0</sum_time_spent>
<nb_hits_with_time_generation>0</nb_hits_with_time_generation>
<min_time_generation />
<max_time_generation>0</max_time_generation>
- <entry_nb_visits>5</entry_nb_visits>
- <entry_nb_actions>5</entry_nb_actions>
+ <entry_nb_visits>6</entry_nb_visits>
+ <entry_nb_actions>6</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>5</entry_bounce_count>
- <exit_nb_visits>5</exit_nb_visits>
+ <entry_bounce_count>6</entry_bounce_count>
+ <exit_nb_visits>6</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
@@ -20,45 +20,45 @@
<subtable>
<row>
<label>category</label>
- <nb_visits>4</nb_visits>
- <nb_hits>4</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>5</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>4</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>5</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>4</entry_bounce_count>
- <exit_nb_visits>4</exit_nb_visits>
+ <entry_bounce_count>5</entry_bounce_count>
+ <exit_nb_visits>5</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
<subtable>
<row>
<label>meta</label>
- <nb_visits>3</nb_visits>
- <nb_hits>3</nb_hits>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>3</entry_nb_visits>
- <entry_nb_actions>3</entry_nb_actions>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
<subtable>
<row>
<label>/index</label>
- <nb_visits>3</nb_visits>
- <nb_hits>3</nb_hits>
+ <nb_visits>4</nb_visits>
+ <nb_hits>4</nb_hits>
<sum_time_spent>0</sum_time_spent>
- <entry_nb_visits>3</entry_nb_visits>
- <entry_nb_actions>3</entry_nb_actions>
+ <entry_nb_visits>4</entry_nb_visits>
+ <entry_nb_actions>4</entry_nb_actions>
<entry_sum_visit_length>0</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
- <sum_daily_entry_nb_uniq_visitors>3</sum_daily_entry_nb_uniq_visitors>
- <sum_daily_exit_nb_uniq_visitors>3</sum_daily_exit_nb_uniq_visitors>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_entry_nb_uniq_visitors>4</sum_daily_entry_nb_uniq_visitors>
+ <sum_daily_exit_nb_uniq_visitors>4</sum_daily_exit_nb_uniq_visitors>
<avg_time_on_page>0</avg_time_on_page>
<bounce_rate>100%</bounce_rate>
<exit_rate>100%</exit_rate>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_range.xml
index b39b3cb13f..6cad9e0d80 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.getPageUrls_range.xml
@@ -2,77 +2,77 @@
<result>
<row>
<label>blog</label>
- <nb_visits>9</nb_visits>
- <nb_hits>12</nb_hits>
+ <nb_visits>10</nb_visits>
+ <nb_hits>13</nb_hits>
<sum_time_spent>166</sum_time_spent>
<nb_hits_with_time_generation>7</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>1.324</max_time_generation>
- <entry_nb_visits>8</entry_nb_visits>
- <entry_nb_actions>17</entry_nb_actions>
+ <entry_nb_visits>9</entry_nb_visits>
+ <entry_nb_actions>18</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>7</entry_bounce_count>
- <exit_nb_visits>7</exit_nb_visits>
- <avg_time_on_page>18</avg_time_on_page>
- <bounce_rate>88%</bounce_rate>
- <exit_rate>78%</exit_rate>
+ <entry_bounce_count>8</entry_bounce_count>
+ <exit_nb_visits>8</exit_nb_visits>
+ <avg_time_on_page>17</avg_time_on_page>
+ <bounce_rate>89%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.389</avg_time_generation>
<subtable>
<row>
<label>category</label>
- <nb_visits>6</nb_visits>
- <nb_hits>9</nb_hits>
+ <nb_visits>7</nb_visits>
+ <nb_hits>10</nb_hits>
<sum_time_spent>166</sum_time_spent>
<nb_hits_with_time_generation>5</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>1.324</max_time_generation>
- <entry_nb_visits>5</entry_nb_visits>
- <entry_nb_actions>14</entry_nb_actions>
+ <entry_nb_visits>6</entry_nb_visits>
+ <entry_nb_actions>15</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>4</entry_bounce_count>
- <exit_nb_visits>4</exit_nb_visits>
- <avg_time_on_page>28</avg_time_on_page>
- <bounce_rate>80%</bounce_rate>
- <exit_rate>67%</exit_rate>
+ <entry_bounce_count>5</entry_bounce_count>
+ <exit_nb_visits>5</exit_nb_visits>
+ <avg_time_on_page>24</avg_time_on_page>
+ <bounce_rate>83%</bounce_rate>
+ <exit_rate>71%</exit_rate>
<avg_time_generation>0.443</avg_time_generation>
<subtable>
<row>
<label>meta</label>
- <nb_visits>4</nb_visits>
- <nb_hits>6</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>7</nb_hits>
<sum_time_spent>151</sum_time_spent>
<nb_hits_with_time_generation>3</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>0.123</max_time_generation>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>13</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>14</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <avg_time_on_page>38</avg_time_on_page>
- <bounce_rate>75%</bounce_rate>
- <exit_rate>75%</exit_rate>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <avg_time_on_page>30</avg_time_on_page>
+ <bounce_rate>80%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.089</avg_time_generation>
<subtable>
<row>
<label>/index</label>
- <nb_visits>4</nb_visits>
- <nb_hits>6</nb_hits>
+ <nb_visits>5</nb_visits>
+ <nb_hits>7</nb_hits>
<sum_time_spent>151</sum_time_spent>
<nb_hits_with_time_generation>3</nb_hits_with_time_generation>
<min_time_generation>0.023</min_time_generation>
<max_time_generation>0.123</max_time_generation>
- <entry_nb_visits>4</entry_nb_visits>
- <entry_nb_actions>13</entry_nb_actions>
+ <entry_nb_visits>5</entry_nb_visits>
+ <entry_nb_actions>14</entry_nb_actions>
<entry_sum_visit_length>54</entry_sum_visit_length>
- <entry_bounce_count>3</entry_bounce_count>
- <exit_nb_visits>3</exit_nb_visits>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
- <sum_daily_entry_nb_uniq_visitors>4</sum_daily_entry_nb_uniq_visitors>
- <sum_daily_exit_nb_uniq_visitors>3</sum_daily_exit_nb_uniq_visitors>
- <avg_time_on_page>38</avg_time_on_page>
- <bounce_rate>75%</bounce_rate>
- <exit_rate>75%</exit_rate>
+ <entry_bounce_count>4</entry_bounce_count>
+ <exit_nb_visits>4</exit_nb_visits>
+ <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
+ <sum_daily_entry_nb_uniq_visitors>5</sum_daily_entry_nb_uniq_visitors>
+ <sum_daily_exit_nb_uniq_visitors>4</sum_daily_exit_nb_uniq_visitors>
+ <avg_time_on_page>30</avg_time_on_page>
+ <bounce_rate>80%</bounce_rate>
+ <exit_rate>80%</exit_rate>
<avg_time_generation>0.089</avg_time_generation>
<url>http://piwik.net/blog/category/meta/</url>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_month.xml
index 13b24ecfac..a9f37fee84 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_month.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_pageviews>38</nb_pageviews>
- <nb_uniq_pageviews>37</nb_uniq_pageviews>
+ <nb_pageviews>39</nb_pageviews>
+ <nb_uniq_pageviews>38</nb_uniq_pageviews>
<nb_downloads>4</nb_downloads>
<nb_uniq_downloads>4</nb_uniq_downloads>
<nb_outlinks>0</nb_outlinks>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_range.xml
index 80680b1482..f06074a2b3 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Actions.get_range.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_pageviews>62</nb_pageviews>
- <nb_uniq_pageviews>55</nb_uniq_pageviews>
+ <nb_pageviews>63</nb_pageviews>
+ <nb_uniq_pageviews>56</nb_uniq_pageviews>
<nb_downloads>5</nb_downloads>
<nb_uniq_downloads>5</nb_uniq_downloads>
<nb_outlinks>1</nb_outlinks>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getCustomVariables_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getCustomVariables_month.xml
index 4582327ecc..3746937e85 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getCustomVariables_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getCustomVariables_month.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>HTTP-code</label>
- <nb_actions>43</nb_actions>
+ <nb_actions>44</nb_actions>
<slots>
<row>
<scope>page</scope>
@@ -17,9 +17,9 @@
<subtable>
<row>
<label>200</label>
- <nb_visits>32</nb_visits>
- <nb_actions>34</nb_actions>
- <sum_daily_nb_uniq_visitors>32</sum_daily_nb_uniq_visitors>
+ <nb_visits>33</nb_visits>
+ <nb_actions>35</nb_actions>
+ <sum_daily_nb_uniq_visitors>33</sum_daily_nb_uniq_visitors>
</row>
<row>
<label>301</label>
@@ -55,21 +55,21 @@
</row>
<row>
<label>Not-Bot</label>
- <nb_visits>7</nb_visits>
- <nb_actions>10</nb_actions>
+ <nb_visits>8</nb_visits>
+ <nb_actions>11</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>305</sum_visit_length>
- <bounce_count>5</bounce_count>
+ <bounce_count>6</bounce_count>
<goals>
<row idgoal='1'>
- <nb_conversions>5</nb_conversions>
- <nb_visits_converted>5</nb_visits_converted>
- <revenue>25</revenue>
+ <nb_conversions>6</nb_conversions>
+ <nb_visits_converted>6</nb_visits_converted>
+ <revenue>30</revenue>
</row>
</goals>
- <nb_conversions>5</nb_conversions>
- <revenue>25</revenue>
- <sum_daily_nb_uniq_visitors>7</sum_daily_nb_uniq_visitors>
+ <nb_conversions>6</nb_conversions>
+ <revenue>30</revenue>
+ <sum_daily_nb_uniq_visitors>8</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<slots>
<row>
@@ -81,21 +81,21 @@
<subtable>
<row>
<label>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24</label>
- <nb_visits>4</nb_visits>
- <nb_actions>7</nb_actions>
+ <nb_visits>5</nb_visits>
+ <nb_actions>8</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>305</sum_visit_length>
- <bounce_count>2</bounce_count>
+ <bounce_count>3</bounce_count>
<goals>
<row idgoal='1'>
- <nb_conversions>3</nb_conversions>
- <nb_visits_converted>3</nb_visits_converted>
- <revenue>15</revenue>
+ <nb_conversions>4</nb_conversions>
+ <nb_visits_converted>4</nb_visits_converted>
+ <revenue>20</revenue>
</row>
</goals>
- <nb_conversions>3</nb_conversions>
- <revenue>15</revenue>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <nb_conversions>4</nb_conversions>
+ <revenue>20</revenue>
+ <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getUsagesOfSlots.xml b/tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getUsagesOfSlots.xml
index 4e74cbbfdf..55ef69079d 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getUsagesOfSlots.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__CustomVariables.getUsagesOfSlots.xml
@@ -11,8 +11,8 @@
</row>
<row>
<name>Not-Bot</name>
- <nb_visits>7</nb_visits>
- <nb_actions>10</nb_actions>
+ <nb_visits>8</nb_visits>
+ <nb_actions>11</nb_actions>
</row>
<row>
<name>User Name</name>
@@ -72,7 +72,7 @@
<row>
<name>HTTP-code</name>
<nb_visits>0</nb_visits>
- <nb_actions>69</nb_actions>
+ <nb_actions>70</nb_actions>
</row>
<row>
<name>Generation Time</name>
@@ -99,7 +99,7 @@
<row>
<name>HTTP-code</name>
<nb_visits>0</nb_visits>
- <nb_actions>69</nb_actions>
+ <nb_actions>70</nb_actions>
</row>
</usages>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicePlugins.getPlugin_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicePlugins.getPlugin_month.xml
index b3aef9f3d3..e2ab7a0e53 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicePlugins.getPlugin_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicePlugins.getPlugin_month.xml
@@ -3,19 +3,19 @@
<row>
<label>Cookie</label>
<nb_visits>2</nb_visits>
- <nb_visits_percentage>7%</nb_visits_percentage>
+ <nb_visits_percentage>6%</nb_visits_percentage>
<logo>plugins/DevicePlugins/images/plugins/cookie.gif</logo>
</row>
<row>
<label>Flash</label>
<nb_visits>2</nb_visits>
- <nb_visits_percentage>7%</nb_visits_percentage>
+ <nb_visits_percentage>6%</nb_visits_percentage>
<logo>plugins/DevicePlugins/images/plugins/flash.gif</logo>
</row>
<row>
<label>Java</label>
<nb_visits>2</nb_visits>
- <nb_visits_percentage>7%</nb_visits_percentage>
+ <nb_visits_percentage>6%</nb_visits_percentage>
<logo>plugins/DevicePlugins/images/plugins/java.gif</logo>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrand_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrand_month.xml
index 48593c4304..08840cc821 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrand_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrand_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>Unknown</label>
- <nb_visits>34</nb_visits>
- <nb_actions>39</nb_actions>
+ <nb_visits>35</nb_visits>
+ <nb_actions>40</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>549</sum_visit_length>
- <bounce_count>30</bounce_count>
- <nb_visits_converted>30</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>32</sum_daily_nb_uniq_visitors>
+ <bounce_count>31</bounce_count>
+ <nb_visits_converted>31</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>33</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>1</sum_daily_nb_users>
<logo>plugins/DevicesDetection/images/brand/Unknown.ico</logo>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserEngines_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserEngines_month.xml
index fc9865b725..4c4cb49892 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserEngines_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserEngines_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>WebKit (Safari, Chrome)</label>
- <nb_visits>17</nb_visits>
- <nb_actions>20</nb_actions>
+ <nb_visits>18</nb_visits>
+ <nb_actions>21</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>305</sum_visit_length>
- <bounce_count>15</bounce_count>
- <nb_visits_converted>16</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>17</sum_daily_nb_uniq_visitors>
+ <bounce_count>16</bounce_count>
+ <nb_visits_converted>17</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>18</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<segment>browserEngine==WebKit</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml
index 971cd5f0fb..d1231b5bb1 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml
@@ -25,6 +25,18 @@
<logo>plugins/DevicesDetection/images/browsers/IE.gif</logo>
</row>
<row>
+ <label>RockMelt</label>
+ <nb_visits>6</nb_visits>
+ <nb_actions>9</nb_actions>
+ <max_actions>3</max_actions>
+ <sum_visit_length>305</sum_visit_length>
+ <bounce_count>4</bounce_count>
+ <nb_visits_converted>5</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>0</sum_daily_nb_users>
+ <logo>plugins/DevicesDetection/images/browsers/CH.gif</logo>
+ </row>
+ <row>
<label>Epiphany</label>
<nb_visits>5</nb_visits>
<nb_actions>5</nb_actions>
@@ -37,18 +49,6 @@
<logo>plugins/DevicesDetection/images/browsers/EP.gif</logo>
</row>
<row>
- <label>RockMelt</label>
- <nb_visits>5</nb_visits>
- <nb_actions>8</nb_actions>
- <max_actions>3</max_actions>
- <sum_visit_length>305</sum_visit_length>
- <bounce_count>3</bounce_count>
- <nb_visits_converted>4</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
- <sum_daily_nb_users>0</sum_daily_nb_users>
- <logo>plugins/DevicesDetection/images/browsers/CH.gif</logo>
- </row>
- <row>
<label>Unknown</label>
<nb_visits>4</nb_visits>
<nb_actions>4</nb_actions>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserVersions_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserVersions_month.xml
index d6572a8ba3..8d82c019fc 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserVersions_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserVersions_month.xml
@@ -1,6 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
<row>
+ <label>RockMelt 0.9</label>
+ <nb_visits>6</nb_visits>
+ <nb_actions>9</nb_actions>
+ <max_actions>3</max_actions>
+ <sum_visit_length>305</sum_visit_length>
+ <bounce_count>4</bounce_count>
+ <nb_visits_converted>5</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>0</sum_daily_nb_users>
+ <segment>browserCode==RM;browserVersion==0.9</segment>
+ <logo>plugins/DevicesDetection/images/browsers/CH.gif</logo>
+ </row>
+ <row>
<label>Epiphany 2.30</label>
<nb_visits>5</nb_visits>
<nb_actions>5</nb_actions>
@@ -27,19 +40,6 @@
<logo>plugins/DevicesDetection/images/browsers/IE.gif</logo>
</row>
<row>
- <label>RockMelt 0.9</label>
- <nb_visits>5</nb_visits>
- <nb_actions>8</nb_actions>
- <max_actions>3</max_actions>
- <sum_visit_length>305</sum_visit_length>
- <bounce_count>3</bounce_count>
- <nb_visits_converted>4</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
- <sum_daily_nb_users>0</sum_daily_nb_users>
- <segment>browserCode==RM;browserVersion==0.9</segment>
- <logo>plugins/DevicesDetection/images/browsers/CH.gif</logo>
- </row>
- <row>
<label>Unknown</label>
<nb_visits>4</nb_visits>
<nb_actions>4</nb_actions>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml
index 6f39904036..34e9fb7630 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml
@@ -27,6 +27,19 @@
<segment>browserCode==IE</segment>
</row>
<row>
+ <label>RockMelt</label>
+ <nb_visits>6</nb_visits>
+ <nb_actions>9</nb_actions>
+ <max_actions>3</max_actions>
+ <sum_visit_length>305</sum_visit_length>
+ <bounce_count>4</bounce_count>
+ <nb_visits_converted>5</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>0</sum_daily_nb_users>
+ <logo>plugins/DevicesDetection/images/browsers/CH.gif</logo>
+ <segment>browserCode==RM</segment>
+ </row>
+ <row>
<label>Epiphany</label>
<nb_visits>5</nb_visits>
<nb_actions>5</nb_actions>
@@ -40,19 +53,6 @@
<segment>browserCode==EP</segment>
</row>
<row>
- <label>RockMelt</label>
- <nb_visits>5</nb_visits>
- <nb_actions>8</nb_actions>
- <max_actions>3</max_actions>
- <sum_visit_length>305</sum_visit_length>
- <bounce_count>3</bounce_count>
- <nb_visits_converted>4</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
- <sum_daily_nb_users>0</sum_daily_nb_users>
- <logo>plugins/DevicesDetection/images/browsers/CH.gif</logo>
- <segment>browserCode==RM</segment>
- </row>
- <row>
<label>Unknown</label>
<nb_visits>4</nb_visits>
<nb_actions>4</nb_actions>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getModel_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getModel_month.xml
index ab2a9c029e..f330ccb30f 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getModel_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getModel_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>Unknown</label>
- <nb_visits>34</nb_visits>
- <nb_actions>39</nb_actions>
+ <nb_visits>35</nb_visits>
+ <nb_actions>40</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>549</sum_visit_length>
- <bounce_count>30</bounce_count>
- <nb_visits_converted>30</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>32</sum_daily_nb_uniq_visitors>
+ <bounce_count>31</bounce_count>
+ <nb_visits_converted>31</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>33</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>1</sum_daily_nb_users>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsFamilies_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsFamilies_month.xml
index 813ebfe05a..c7234f8606 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsFamilies_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsFamilies_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>Mac</label>
- <nb_visits>11</nb_visits>
- <nb_actions>15</nb_actions>
+ <nb_visits>12</nb_visits>
+ <nb_actions>16</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>307</sum_visit_length>
- <bounce_count>8</bounce_count>
- <nb_visits_converted>10</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>9</sum_daily_nb_uniq_visitors>
+ <bounce_count>9</bounce_count>
+ <nb_visits_converted>11</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>10</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>1</sum_daily_nb_users>
<logo>plugins/DevicesDetection/images/os/MAC.gif</logo>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsVersions_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsVersions_month.xml
index 38dd7759a4..8ff1d6faee 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsVersions_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getOsVersions_month.xml
@@ -28,13 +28,13 @@
</row>
<row>
<label>Mac 10.6</label>
- <nb_visits>5</nb_visits>
- <nb_actions>8</nb_actions>
+ <nb_visits>6</nb_visits>
+ <nb_actions>9</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>305</sum_visit_length>
- <bounce_count>3</bounce_count>
- <nb_visits_converted>4</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
+ <bounce_count>4</bounce_count>
+ <nb_visits_converted>5</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<segment>operatingSystemCode==MAC;operatingSystemVersion==10.6</segment>
<logo>plugins/DevicesDetection/images/os/MAC.gif</logo>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getType_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getType_month.xml
index af1de4ce8e..875400f578 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getType_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getType_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>Desktop</label>
- <nb_visits>30</nb_visits>
- <nb_actions>35</nb_actions>
+ <nb_visits>31</nb_visits>
+ <nb_actions>36</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>549</sum_visit_length>
- <bounce_count>26</bounce_count>
- <nb_visits_converted>29</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>28</sum_daily_nb_uniq_visitors>
+ <bounce_count>27</bounce_count>
+ <nb_visits_converted>30</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>29</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>1</sum_daily_nb_users>
<segment>deviceType==desktop</segment>
<logo>plugins/DevicesDetection/images/screens/normal.gif</logo>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getDaysToConversion_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getDaysToConversion_month.xml
index e8f75dee69..d6f76b939e 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getDaysToConversion_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getDaysToConversion_month.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>0 days</label>
- <nb_conversions>32</nb_conversions>
+ <nb_conversions>33</nb_conversions>
</row>
<row>
<label>1 day</label>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getMetrics_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getMetrics_month.xml
index 7ada36be0d..d97c3eb0d0 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getMetrics_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getMetrics_month.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_conversions>33</nb_conversions>
- <nb_visits_converted>33</nb_visits_converted>
- <revenue>165</revenue>
- <conversion_rate>89.19%</conversion_rate>
+ <nb_conversions>34</nb_conversions>
+ <nb_visits_converted>34</nb_visits_converted>
+ <revenue>170</revenue>
+ <conversion_rate>89.47%</conversion_rate>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getVisitsUntilConversion_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getVisitsUntilConversion_month.xml
index f906c7ccaf..fcd1e7c56b 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getVisitsUntilConversion_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Goals.getVisitsUntilConversion_month.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>1 visit</label>
- <nb_conversions>33</nb_conversions>
+ <nb_conversions>34</nb_conversions>
</row>
<row>
<label>2 visits</label>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Goals.get_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Goals.get_month.xml
index 13474931ed..73154bb53f 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Goals.get_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Goals.get_month.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_conversions>33</nb_conversions>
- <nb_visits_converted>33</nb_visits_converted>
- <revenue>165</revenue>
- <conversion_rate>89.19%</conversion_rate>
- <nb_conversions_new_visit>30</nb_conversions_new_visit>
- <nb_visits_converted_new_visit>30</nb_visits_converted_new_visit>
- <revenue_new_visit>150</revenue_new_visit>
- <conversion_rate_new_visit>88.24%</conversion_rate_new_visit>
+ <nb_conversions>34</nb_conversions>
+ <nb_visits_converted>34</nb_visits_converted>
+ <revenue>170</revenue>
+ <conversion_rate>89.47%</conversion_rate>
+ <nb_conversions_new_visit>31</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>31</nb_visits_converted_new_visit>
+ <revenue_new_visit>155</revenue_new_visit>
+ <conversion_rate_new_visit>88.57%</conversion_rate_new_visit>
<nb_conversions_returning_visit>3</nb_conversions_returning_visit>
<nb_visits_converted_returning_visit>3</nb_visits_converted_returning_visit>
<revenue_returning_visit>15</revenue_returning_visit>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml
index facf6114ed..84ba4e506d 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml
@@ -2,7 +2,7 @@
<result>
<row>
<idSite>1</idSite>
- <idVisit>41</idVisit>
+ <idVisit>42</idVisit>
<visitIp>174.97.139.63</visitIp>
<actionDetails>
@@ -11,7 +11,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>48</goalPageId>
+ <goalPageId>49</goalPageId>
<url>http://piwik.org/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -23,7 +23,7 @@
<pageTitle>Liberate Web Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>35</pageIdAction>
- <pageId>48</pageId>
+ <pageId>49</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -128,7 +128,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>34</idVisit>
+ <idVisit>35</idVisit>
<visitIp>206.190.75.8</visitIp>
<actionDetails>
@@ -138,7 +138,7 @@
<pageTitle>Changelog Archive - Analytics - Piwik</pageTitle>
<pageIdAction>44</pageIdAction>
- <pageId>39</pageId>
+ <pageId>40</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -155,7 +155,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>39</goalPageId>
+ <goalPageId>40</goalPageId>
<url>http://piwik.org/changelog/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -167,7 +167,7 @@
<pageTitle>Contact the Piwik team - Analytics - Piwik</pageTitle>
<pageIdAction>55</pageIdAction>
- <pageId>47</pageId>
+ <pageId>48</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -258,7 +258,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>40</idVisit>
+ <idVisit>41</idVisit>
<visitIp>193.159.20.129</visitIp>
<actionDetails>
@@ -267,7 +267,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>46</goalPageId>
+ <goalPageId>47</goalPageId>
<url>http://demo.piwik.org/index.php?module=CoreHome&amp;action=index&amp;date=yesterday&amp;period=day&amp;idSite=7</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -279,7 +279,7 @@
<pageTitle>demo.piwik.org/Piwik Forums - Piwik › Web Analytics Reports</pageTitle>
<pageIdAction>53</pageIdAction>
- <pageId>46</pageId>
+ <pageId>47</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -396,7 +396,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>38</idVisit>
+ <idVisit>39</idVisit>
<visitIp>50.244.17.130</visitIp>
<actionDetails>
@@ -406,7 +406,7 @@
<pageTitle>Liberate Web Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>35</pageIdAction>
- <pageId>43</pageId>
+ <pageId>44</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -423,7 +423,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>43</goalPageId>
+ <goalPageId>44</goalPageId>
<url>http://piwik.org/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -435,7 +435,7 @@
<pageTitle>What is Piwik? - Analytics - Piwik</pageTitle>
<pageIdAction>51</pageIdAction>
- <pageId>45</pageId>
+ <pageId>46</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -543,7 +543,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>39</idVisit>
+ <idVisit>40</idVisit>
<visitIp>84.194.72.21</visitIp>
<actionDetails>
@@ -553,7 +553,7 @@
<pageTitle />
<pageIdAction>49</pageIdAction>
- <pageId>44</pageId>
+ <pageId>45</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -661,7 +661,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>37</idVisit>
+ <idVisit>38</idVisit>
<visitIp>108.211.181.12</visitIp>
<actionDetails>
@@ -670,7 +670,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>42</goalPageId>
+ <goalPageId>43</goalPageId>
<url>http://piwik.org/blog/2012/10/integrate-piwik-into-your-rails-application/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -682,7 +682,7 @@
<pageTitle>Integrate Piwik into your Rails Application - Analytics - Piwik</pageTitle>
<pageIdAction>48</pageIdAction>
- <pageId>42</pageId>
+ <pageId>43</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -799,7 +799,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>36</idVisit>
+ <idVisit>37</idVisit>
<visitIp>219.101.46.222</visitIp>
<actionDetails>
@@ -808,7 +808,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>41</goalPageId>
+ <goalPageId>42</goalPageId>
<url>https://piwik.org/log-analytics/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -820,7 +820,7 @@
<pageTitle>Log Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>42</pageIdAction>
- <pageId>41</pageId>
+ <pageId>42</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -924,7 +924,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>35</idVisit>
+ <idVisit>36</idVisit>
<visitIp>80.136.160.65</visitIp>
<actionDetails>
@@ -933,7 +933,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>40</goalPageId>
+ <goalPageId>41</goalPageId>
<url>http://piwik.org/blog/2014/03/piwik-2-1-massive-performance-reliability-improvements/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -945,7 +945,7 @@
<pageTitle>Piwik 2.1 — Massive Performance and Reliability Improvements - Analytics - Piwik</pageTitle>
<pageIdAction>46</pageIdAction>
- <pageId>40</pageId>
+ <pageId>41</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1042,7 +1042,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>33</idVisit>
+ <idVisit>34</idVisit>
<visitIp>188.107.238.9</visitIp>
<actionDetails>
@@ -1051,7 +1051,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>38</goalPageId>
+ <goalPageId>39</goalPageId>
<url>http://piwik.org/log-analytics/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -1063,7 +1063,7 @@
<pageTitle>Log Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>42</pageIdAction>
- <pageId>38</pageId>
+ <pageId>39</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1180,7 +1180,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>31</idVisit>
+ <idVisit>32</idVisit>
<visitIp>93.80.130.163</visitIp>
<actionDetails>
@@ -1190,7 +1190,7 @@
<pageTitle>Liberate Web Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>35</pageIdAction>
- <pageId>34</pageId>
+ <pageId>35</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1208,7 +1208,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>34</goalPageId>
+ <goalPageId>35</goalPageId>
<url>http://piwik.org/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -1220,7 +1220,7 @@
<pageTitle>Download - Analytics - Piwik</pageTitle>
<pageIdAction>39</pageIdAction>
- <pageId>36</pageId>
+ <pageId>37</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1239,7 +1239,7 @@
<pageTitle />
<pageIdAction>40</pageIdAction>
- <pageId>37</pageId>
+ <pageId>38</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1339,7 +1339,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>32</idVisit>
+ <idVisit>33</idVisit>
<visitIp>176.41.226.154</visitIp>
<actionDetails>
@@ -1348,7 +1348,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>35</goalPageId>
+ <goalPageId>36</goalPageId>
<url>http://piwik.org/docs/installation/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -1360,7 +1360,7 @@
<pageTitle>Hello Installing Piwik - Analytics - Piwik</pageTitle>
<pageIdAction>37</pageIdAction>
- <pageId>35</pageId>
+ <pageId>36</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1469,7 +1469,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>30</idVisit>
+ <idVisit>31</idVisit>
<visitIp>84.194.72.21</visitIp>
<actionDetails>
@@ -1478,7 +1478,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>33</goalPageId>
+ <goalPageId>34</goalPageId>
<url>http://piwik.org/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -1490,7 +1490,7 @@
<pageTitle>Liberate Web Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>35</pageIdAction>
- <pageId>33</pageId>
+ <pageId>34</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1599,7 +1599,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>56</idVisit>
+ <idVisit>57</idVisit>
<visitIp>175.41.192.40</visitIp>
<actionDetails>
@@ -1609,7 +1609,7 @@
<pageTitle />
<pageIdAction>1</pageIdAction>
- <pageId>69</pageId>
+ <pageId>70</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1627,7 +1627,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>69</goalPageId>
+ <goalPageId>70</goalPageId>
<url>http://piwik.net/blog/category/meta/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -1639,7 +1639,7 @@
<pageTitle />
<pageIdAction>1</pageIdAction>
- <pageId>73</pageId>
+ <pageId>74</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1658,7 +1658,7 @@
<pageTitle />
<pageIdAction>1</pageIdAction>
- <pageId>77</pageId>
+ <pageId>78</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1677,7 +1677,7 @@
<pageTitle />
<pageIdAction>2</pageIdAction>
- <pageId>70</pageId>
+ <pageId>71</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1696,7 +1696,7 @@
<pageTitle />
<pageIdAction>2</pageIdAction>
- <pageId>74</pageId>
+ <pageId>75</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1715,7 +1715,7 @@
<pageTitle />
<pageIdAction>2</pageIdAction>
- <pageId>78</pageId>
+ <pageId>79</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1734,7 +1734,7 @@
<pageTitle />
<pageIdAction>3</pageIdAction>
- <pageId>71</pageId>
+ <pageId>72</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1753,7 +1753,7 @@
<pageTitle />
<pageIdAction>3</pageIdAction>
- <pageId>75</pageId>
+ <pageId>76</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1772,7 +1772,7 @@
<pageTitle />
<pageIdAction>4</pageIdAction>
- <pageId>72</pageId>
+ <pageId>73</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1791,7 +1791,7 @@
<pageTitle />
<pageIdAction>4</pageIdAction>
- <pageId>76</pageId>
+ <pageId>77</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1879,7 +1879,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>61</idVisit>
+ <idVisit>62</idVisit>
<visitIp>192.0.2.10</visitIp>
<actionDetails>
@@ -1888,7 +1888,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>85</goalPageId>
+ <goalPageId>86</goalPageId>
<url>http://piwik.net/view/my/file.html</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -1900,7 +1900,7 @@
<pageTitle />
<pageIdAction>65</pageIdAction>
- <pageId>85</pageId>
+ <pageId>86</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1988,7 +1988,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>60</idVisit>
+ <idVisit>61</idVisit>
<visitIp>172.20.1.0</visitIp>
<actionDetails>
@@ -1998,7 +1998,7 @@
<pageTitle>302/URL = http%3A%2F%2Fpiwik.net%2FCitrix%2FXenApp%2FWan%2Fauth%2Flogin.jsp</pageTitle>
<pageIdAction>63</pageIdAction>
- <pageId>83</pageId>
+ <pageId>84</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -2015,7 +2015,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>83</goalPageId>
+ <goalPageId>84</goalPageId>
<url>http://piwik.net/Citrix/XenApp/Wan/auth/login.jsp</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -2027,7 +2027,7 @@
<pageTitle />
<pageIdAction>64</pageIdAction>
- <pageId>84</pageId>
+ <pageId>85</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -2114,7 +2114,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>66</idVisit>
+ <idVisit>67</idVisit>
<visitIp>173.5.0.0</visitIp>
<actionDetails>
@@ -2123,7 +2123,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>92</goalPageId>
+ <goalPageId>93</goalPageId>
<url>http://hello.example.com/hello/from/another/world/6,681965</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -2135,7 +2135,7 @@
<pageTitle />
<pageIdAction>61</pageIdAction>
- <pageId>92</pageId>
+ <pageId>93</pageId>
<customVariables>
<row>
<customVariablePageName1>Generation Time</customVariablePageName1>
@@ -2235,7 +2235,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>57</idVisit>
+ <idVisit>58</idVisit>
<visitIp>70.95.0.0</visitIp>
<actionDetails>
@@ -2245,7 +2245,7 @@
<pageTitle />
<pageIdAction>56</pageIdAction>
- <pageId>79</pageId>
+ <pageId>80</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -2263,7 +2263,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>79</goalPageId>
+ <goalPageId>80</goalPageId>
<url>http://xzy.example.com/Products/theProduct</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -2275,7 +2275,7 @@
<pageTitle>301/URL = http%3A%2F%2Fexample.hello.com%2FTopic%2Fhw43061</pageTitle>
<pageIdAction>58</pageIdAction>
- <pageId>80</pageId>
+ <pageId>81</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -2293,7 +2293,7 @@
<pageTitle />
<pageIdAction>56</pageIdAction>
- <pageId>89</pageId>
+ <pageId>90</pageId>
<customVariables>
<row>
<customVariablePageName1>Generation Time</customVariablePageName1>
@@ -2393,7 +2393,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>58</idVisit>
+ <idVisit>59</idVisit>
<visitIp>173.5.0.0</visitIp>
<actionDetails>
@@ -2402,7 +2402,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>81</goalPageId>
+ <goalPageId>82</goalPageId>
<url>http://hello.example.com/hello/world/6,681965</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -2414,7 +2414,7 @@
<pageTitle>404/URL = http%3A%2F%2Fhello.example.com%2Fhello%2Fworld%2F6%2C681965</pageTitle>
<pageIdAction>60</pageIdAction>
- <pageId>81</pageId>
+ <pageId>82</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -2502,7 +2502,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>59</idVisit>
+ <idVisit>60</idVisit>
<visitIp>173.5.0.0</visitIp>
<actionDetails>
@@ -2512,7 +2512,7 @@
<pageTitle>404/URL = http%3A%2F%2Fhello.example.com%2Fhello%2Fworld%2F6%2C681965</pageTitle>
<pageIdAction>60</pageIdAction>
- <pageId>91</pageId>
+ <pageId>92</pageId>
<customVariables>
<row>
<customVariablePageName1>Generation Time</customVariablePageName1>
@@ -2538,7 +2538,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>82</goalPageId>
+ <goalPageId>83</goalPageId>
<url>http://hello.example.com/hello/from/another/world/6,681965</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -2550,7 +2550,7 @@
<pageTitle />
<pageIdAction>61</pageIdAction>
- <pageId>82</pageId>
+ <pageId>83</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -2638,7 +2638,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>65</idVisit>
+ <idVisit>66</idVisit>
<visitIp>70.95.32.0</visitIp>
<actionDetails>
@@ -2647,7 +2647,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>90</goalPageId>
+ <goalPageId>91</goalPageId>
<url>http://example.hello.com/Topic/hw43061</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -2659,7 +2659,7 @@
<pageTitle>301/URL = http%3A%2F%2Fexample.hello.com%2FTopic%2Fhw43061</pageTitle>
<pageIdAction>58</pageIdAction>
- <pageId>90</pageId>
+ <pageId>91</pageId>
<customVariables>
<row>
<customVariablePageName1>Generation Time</customVariablePageName1>
@@ -2758,7 +2758,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>26</idVisit>
+ <idVisit>27</idVisit>
<visitIp>0.0.0.0</visitIp>
<actionDetails>
@@ -2767,7 +2767,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>29</goalPageId>
+ <goalPageId>30</goalPageId>
<url>http://example.org/index.htm</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -2779,7 +2779,7 @@
<pageTitle>incredible title!</pageTitle>
<pageIdAction>29</pageIdAction>
- <pageId>29</pageId>
+ <pageId>30</pageId>
<customVariables>
<row>
<customVariablePageName3>_pks</customVariablePageName3>
@@ -2887,7 +2887,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>27</idVisit>
+ <idVisit>28</idVisit>
<visitIp>0.0.0.0</visitIp>
<actionDetails>
@@ -2896,7 +2896,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>30</goalPageId>
+ <goalPageId>31</goalPageId>
<url>http://forum.piwik.org/register.php?0,approve=9a94a02145599</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -2908,7 +2908,7 @@
<pageTitle>Piwik Forums</pageTitle>
<pageIdAction>31</pageIdAction>
- <pageId>30</pageId>
+ <pageId>31</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -3024,7 +3024,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>64</idVisit>
+ <idVisit>65</idVisit>
<visitIp>72.45.67.32</visitIp>
<actionDetails>
@@ -3033,7 +3033,7 @@
<goalName>all</goalName>
<goalId>1</goalId>
<revenue>5</revenue>
- <goalPageId>88</goalPageId>
+ <goalPageId>89</goalPageId>
<url>http://piwik.net/</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -3045,7 +3045,7 @@
<pageTitle />
<pageIdAction>5</pageIdAction>
- <pageId>88</pageId>
+ <pageId>89</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -3133,7 +3133,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>63</idVisit>
+ <idVisit>64</idVisit>
<visitIp>192.0.2.222</visitIp>
<actionDetails>
@@ -3142,7 +3142,7 @@
<url>http://piwik.net/shqshne4jdp4b6.cloudfront.net/cfx/st​?key=value</url>
<pageIdAction>66</pageIdAction>
- <pageId>87</pageId>
+ <pageId>88</pageId>
<eventCategory>cloudfront_rtmp</eventCategory>
<eventAction>play</eventAction>
<customVariables>
@@ -3232,7 +3232,7 @@
</row>
<row>
<idSite>1</idSite>
- <idVisit>62</idVisit>
+ <idVisit>63</idVisit>
<visitIp>192.0.2.147</visitIp>
<actionDetails>
@@ -3241,7 +3241,7 @@
<url>http://piwik.net/shqshne4jdp4b6.cloudfront.net/cfx/st​?key=value</url>
<pageIdAction>66</pageIdAction>
- <pageId>86</pageId>
+ <pageId>87</pageId>
<eventCategory>cloudfront_rtmp</eventCategory>
<eventAction>connect</eventAction>
<customVariables>
@@ -3442,6 +3442,118 @@
</row>
<row>
<idSite>1</idSite>
+ <idVisit>26</idVisit>
+ <visitIp>::ffff:123.45.67.89</visitIp>
+
+ <actionDetails>
+ <row>
+ <type>goal</type>
+ <goalName>all</goalName>
+ <goalId>1</goalId>
+ <revenue>5</revenue>
+ <goalPageId>29</goalPageId>
+
+ <url>http://piwik.net/blog/category/meta/</url>
+ <icon>plugins/Morpheus/images/goal.png</icon>
+
+ </row>
+ <row>
+ <type>action</type>
+ <url>http://piwik.net/blog/category/meta/</url>
+ <pageTitle />
+ <pageIdAction>1</pageIdAction>
+
+ <pageId>29</pageId>
+ <customVariables>
+ <row>
+ <customVariablePageName1>HTTP-code</customVariablePageName1>
+ <customVariablePageValue1>200</customVariablePageValue1>
+ </row>
+ </customVariables>
+ <icon />
+
+ </row>
+ </actionDetails>
+ <goalConversions>1</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <userId />
+ <visitorType>new</visitorType>
+ <visitorTypeIcon />
+ <visitConverted>1</visitConverted>
+ <visitConvertedIcon>plugins/Morpheus/images/goal.png</visitConvertedIcon>
+ <visitCount>1</visitCount>
+
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Desktop</deviceType>
+ <deviceTypeIcon>plugins/DevicesDetection/images/screens/normal.gif</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel />
+ <operatingSystem>Mac 10.6</operatingSystem>
+ <operatingSystemName>Mac</operatingSystemName>
+ <operatingSystemIcon>plugins/DevicesDetection/images/os/MAC.gif</operatingSystemIcon>
+ <operatingSystemCode>MAC</operatingSystemCode>
+ <operatingSystemVersion>10.6</operatingSystemVersion>
+ <browserFamily>WebKit</browserFamily>
+ <browserFamilyDescription>WebKit (Safari, Chrome)</browserFamilyDescription>
+ <browser>RockMelt 0.9</browser>
+ <browserName>RockMelt</browserName>
+ <browserIcon>plugins/DevicesDetection/images/browsers/CH.gif</browserIcon>
+ <browserCode>RM</browserCode>
+ <browserVersion>0.9</browserVersion>
+ <events>0</events>
+ <continent>Asia</continent>
+ <continentCode>asi</continentCode>
+ <country>South Korea</country>
+ <countryCode>kr</countryCode>
+ <countryFlag>plugins/UserCountry/images/flags/kr.png</countryFlag>
+ <region>Seoul-t'ukpyolsi</region>
+ <regionCode>11</regionCode>
+ <city>Seoul</city>
+ <location>Seoul, Seoul-t'ukpyolsi, South Korea</location>
+ <latitude>37.598999</latitude>
+ <longitude>126.977997</longitude>
+ <visitLocalTime>20:15:41</visitLocalTime>
+ <visitLocalHour>20</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ <row>
+ <customVariableName1>Not-Bot</customVariableName1>
+ <customVariableValue1>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24</customVariableValue1>
+ </row>
+ </customVariables>
+ <resolution>unknown</resolution>
+ <plugins />
+ <pluginsIcons />
+
+
+
+
+
+ </row>
+ <row>
+ <idSite>1</idSite>
<idVisit>24</idVisit>
<visitIp>175.41.192.43</visitIp>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getAll_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getAll_month.xml
index 071b803478..8485ac465c 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getAll_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getAll_month.xml
@@ -2,10 +2,10 @@
<result>
<row>
<label>Piwik test</label>
- <nb_visits>37</nb_visits>
- <nb_actions>44</nb_actions>
- <nb_pageviews>38</nb_pageviews>
- <revenue>165</revenue>
+ <nb_visits>38</nb_visits>
+ <nb_actions>45</nb_actions>
+ <nb_pageviews>39</nb_pageviews>
+ <revenue>170</revenue>
<visits_evolution>100%</visits_evolution>
<actions_evolution>100%</actions_evolution>
<pageviews_evolution>100%</pageviews_evolution>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getOne_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getOne_month.xml
index 79c9ff4ab6..9b9cc1efd7 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getOne_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__MultiSites.getOne_month.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_visits>37</nb_visits>
- <nb_actions>44</nb_actions>
+ <nb_visits>38</nb_visits>
+ <nb_actions>45</nb_actions>
<visits_evolution>100%</visits_evolution>
<actions_evolution>100%</actions_evolution>
<pageviews_evolution>100%</pageviews_evolution>
<revenue_evolution>100%</revenue_evolution>
- <nb_pageviews>38</nb_pageviews>
- <revenue>165</revenue>
+ <nb_pageviews>39</nb_pageviews>
+ <revenue>170</revenue>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Referrers.getReferrerType_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Referrers.getReferrerType_month.xml
index b0ecf5b676..a1e8fd0e9d 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Referrers.getReferrerType_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Referrers.getReferrerType_month.xml
@@ -2,21 +2,21 @@
<result>
<row>
<label>Direct Entry</label>
- <nb_visits>33</nb_visits>
- <nb_actions>38</nb_actions>
+ <nb_visits>34</nb_visits>
+ <nb_actions>39</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>549</sum_visit_length>
- <bounce_count>29</bounce_count>
+ <bounce_count>30</bounce_count>
<goals>
<row idgoal='1'>
- <nb_conversions>29</nb_conversions>
- <nb_visits_converted>29</nb_visits_converted>
- <revenue>145</revenue>
+ <nb_conversions>30</nb_conversions>
+ <nb_visits_converted>30</nb_visits_converted>
+ <revenue>150</revenue>
</row>
</goals>
- <nb_conversions>29</nb_conversions>
- <revenue>145</revenue>
- <sum_daily_nb_uniq_visitors>31</sum_daily_nb_uniq_visitors>
+ <nb_conversions>30</nb_conversions>
+ <revenue>150</revenue>
+ <sum_daily_nb_uniq_visitors>32</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>1</sum_daily_nb_users>
<nb_visits_converted>0</nb_visits_converted>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getConfiguration_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getConfiguration_month.xml
index 110eafe235..55471df8f7 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getConfiguration_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getConfiguration_month.xml
@@ -1,6 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
<row>
+ <label>Mac / RockMelt / unknown</label>
+ <nb_visits>6</nb_visits>
+ <nb_actions>9</nb_actions>
+ <max_actions>3</max_actions>
+ <sum_visit_length>305</sum_visit_length>
+ <bounce_count>4</bounce_count>
+ <nb_visits_converted>5</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>0</sum_daily_nb_users>
+ </row>
+ <row>
<label>Windows / Internet Explorer / unknown</label>
<nb_visits>6</nb_visits>
<nb_actions>7</nb_actions>
@@ -34,17 +45,6 @@
<sum_daily_nb_users>1</sum_daily_nb_users>
</row>
<row>
- <label>Mac / RockMelt / unknown</label>
- <nb_visits>5</nb_visits>
- <nb_actions>8</nb_actions>
- <max_actions>3</max_actions>
- <sum_visit_length>305</sum_visit_length>
- <bounce_count>3</bounce_count>
- <nb_visits_converted>4</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
- <sum_daily_nb_users>0</sum_daily_nb_users>
- </row>
- <row>
<label>Unknown / Unknown / unknown</label>
<nb_visits>3</nb_visits>
<nb_actions>3</nb_actions>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getResolution_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getResolution_month.xml
index 6adc37a0cd..2dd3a3f0ff 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getResolution_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Resolution.getResolution_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>unknown</label>
- <nb_visits>35</nb_visits>
- <nb_actions>42</nb_actions>
+ <nb_visits>36</nb_visits>
+ <nb_actions>43</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>551</sum_visit_length>
- <bounce_count>30</bounce_count>
- <nb_visits_converted>31</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>33</sum_daily_nb_uniq_visitors>
+ <bounce_count>31</bounce_count>
+ <nb_visits_converted>32</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>34</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>2</sum_daily_nb_users>
<segment>resolution==unknown</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml
index d91f34ccc0..fa5433509b 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml
@@ -83,4 +83,32 @@
<region_name>Nunavut</region_name>
<logo>plugins/UserCountry/images/flags/ca.png</logo>
</row>
+ <row>
+ <label>Seoul, Seoul-t&amp;#039;ukpyolsi, South Korea</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>5</revenue>
+ </row>
+ </goals>
+ <nb_conversions>1</nb_conversions>
+ <revenue>5</revenue>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>0</sum_daily_nb_users>
+ <lat>37.599</lat>
+ <long>126.978</long>
+ <segment>city==Seoul;regionCode==11;countryCode==kr</segment>
+ <city_name>Seoul</city_name>
+ <region>11</region>
+ <country>kr</country>
+ <country_name>South Korea</country_name>
+ <region_name>Seoul-t'ukpyolsi</region_name>
+ <logo>plugins/UserCountry/images/flags/kr.png</logo>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getContinent_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getContinent_month.xml
index 14bb86a968..054cf2e1d3 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getContinent_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getContinent_month.xml
@@ -2,21 +2,21 @@
<result>
<row>
<label>Asia</label>
- <nb_visits>11</nb_visits>
- <nb_actions>14</nb_actions>
+ <nb_visits>12</nb_visits>
+ <nb_actions>15</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>305</sum_visit_length>
- <bounce_count>9</bounce_count>
+ <bounce_count>10</bounce_count>
<goals>
<row idgoal='1'>
- <nb_conversions>10</nb_conversions>
- <nb_visits_converted>10</nb_visits_converted>
- <revenue>50</revenue>
+ <nb_conversions>11</nb_conversions>
+ <nb_visits_converted>11</nb_visits_converted>
+ <revenue>55</revenue>
</row>
</goals>
- <nb_conversions>10</nb_conversions>
- <revenue>50</revenue>
- <sum_daily_nb_uniq_visitors>11</sum_daily_nb_uniq_visitors>
+ <nb_conversions>11</nb_conversions>
+ <revenue>55</revenue>
+ <sum_daily_nb_uniq_visitors>12</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<code>Asia</code>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml
index 2faa0742a5..98deda9945 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml
@@ -137,4 +137,28 @@
<logoWidth>16</logoWidth>
<logoHeight>11</logoHeight>
</row>
+ <row>
+ <label>South Korea</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>5</revenue>
+ </row>
+ </goals>
+ <nb_conversions>1</nb_conversions>
+ <revenue>5</revenue>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>0</sum_daily_nb_users>
+ <code>kr</code>
+ <logo>plugins/UserCountry/images/flags/kr.png</logo>
+ <segment>countryCode==kr</segment>
+ <logoWidth>16</logoWidth>
+ <logoHeight>11</logoHeight>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getNumberOfDistinctCountries_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getNumberOfDistinctCountries_month.xml
index 3cc2819f51..773871bab0 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getNumberOfDistinctCountries_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getNumberOfDistinctCountries_month.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result>6</result> \ No newline at end of file
+<result>7</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml
index 5631e75efb..bdcfaeca3c 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml
@@ -75,4 +75,29 @@
<region_name>Nunavut</region_name>
<logo>plugins/UserCountry/images/flags/ca.png</logo>
</row>
+ <row>
+ <label>Seoul-t&amp;#039;ukpyolsi, South Korea</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>5</revenue>
+ </row>
+ </goals>
+ <nb_conversions>1</nb_conversions>
+ <revenue>5</revenue>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>0</sum_daily_nb_users>
+ <segment>regionCode==11;countryCode==kr</segment>
+ <region>11</region>
+ <country>kr</country>
+ <country_name>South Korea</country_name>
+ <region_name>Seoul-t'ukpyolsi</region_name>
+ <logo>plugins/UserCountry/images/flags/kr.png</logo>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguageCode_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguageCode_month.xml
index 9e03cf2c7f..da22c13a83 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguageCode_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguageCode_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>Unknown (xx)</label>
- <nb_visits>37</nb_visits>
- <nb_actions>44</nb_actions>
+ <nb_visits>38</nb_visits>
+ <nb_actions>45</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>551</sum_visit_length>
- <bounce_count>32</bounce_count>
- <nb_visits_converted>33</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>35</sum_daily_nb_uniq_visitors>
+ <bounce_count>33</bounce_count>
+ <nb_visits_converted>34</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>36</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>2</sum_daily_nb_users>
<segment>languageCode==xx</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguage_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguage_month.xml
index a1cb640be4..d2c34aab1a 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguage_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserLanguage.getLanguage_month.xml
@@ -2,13 +2,13 @@
<result>
<row>
<label>Unknown</label>
- <nb_visits>37</nb_visits>
- <nb_actions>44</nb_actions>
+ <nb_visits>38</nb_visits>
+ <nb_actions>45</nb_actions>
<max_actions>3</max_actions>
<sum_visit_length>551</sum_visit_length>
- <bounce_count>32</bounce_count>
- <nb_visits_converted>33</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>35</sum_daily_nb_uniq_visitors>
+ <bounce_count>33</bounce_count>
+ <nb_visits_converted>34</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>36</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>2</sum_daily_nb_users>
<segment>languageCode==xx</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getByDayOfWeek_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getByDayOfWeek_month.xml
index f23909c920..b381de56d6 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getByDayOfWeek_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getByDayOfWeek_month.xml
@@ -51,13 +51,13 @@
</row>
<row>
<label>Saturday</label>
- <nb_visits>10</nb_visits>
- <nb_uniq_visitors>10</nb_uniq_visitors>
- <nb_actions>13</nb_actions>
+ <nb_visits>11</nb_visits>
+ <nb_uniq_visitors>11</nb_uniq_visitors>
+ <nb_actions>14</nb_actions>
<nb_users>0</nb_users>
<sum_visit_length>305</sum_visit_length>
- <bounce_count>8</bounce_count>
- <nb_visits_converted>8</nb_visits_converted>
+ <bounce_count>9</bounce_count>
+ <nb_visits_converted>9</nb_visits_converted>
<day_of_week>6</day_of_week>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerLocalTime_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerLocalTime_month.xml
index e3f6916792..e4f045cd9f 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerLocalTime_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerLocalTime_month.xml
@@ -242,13 +242,13 @@
</row>
<row>
<label>20h</label>
- <nb_visits>6</nb_visits>
- <nb_actions>6</nb_actions>
+ <nb_visits>7</nb_visits>
+ <nb_actions>7</nb_actions>
<max_actions>1</max_actions>
<sum_visit_length>0</sum_visit_length>
- <bounce_count>6</bounce_count>
- <nb_visits_converted>6</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <bounce_count>7</bounce_count>
+ <nb_visits_converted>7</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>7</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<segment>visitLocalHour==20</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerServerTime_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerServerTime_month.xml
index da07966d39..fcc08ecee4 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerServerTime_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitTime.getVisitInformationPerServerTime_month.xml
@@ -350,21 +350,21 @@
</row>
<row>
<label>20h</label>
- <nb_visits>6</nb_visits>
- <nb_actions>6</nb_actions>
+ <nb_visits>7</nb_visits>
+ <nb_actions>7</nb_actions>
<max_actions>1</max_actions>
<sum_visit_length>0</sum_visit_length>
- <bounce_count>6</bounce_count>
+ <bounce_count>7</bounce_count>
<goals>
<row idgoal='1'>
- <nb_conversions>6</nb_conversions>
- <nb_visits_converted>6</nb_visits_converted>
- <revenue>30</revenue>
+ <nb_conversions>7</nb_conversions>
+ <nb_visits_converted>7</nb_visits_converted>
+ <revenue>35</revenue>
</row>
</goals>
- <nb_conversions>6</nb_conversions>
- <revenue>30</revenue>
- <sum_daily_nb_uniq_visitors>6</sum_daily_nb_uniq_visitors>
+ <nb_conversions>7</nb_conversions>
+ <revenue>35</revenue>
+ <sum_daily_nb_uniq_visitors>7</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<nb_visits_converted>0</nb_visits_converted>
<segment>visitServerHour==20</segment>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
index cfcc9e97d1..43027f77b0 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_month.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>New visits</label>
- <nb_visits>34</nb_visits>
+ <nb_visits>35</nb_visits>
</row>
<row>
<label>0 days</label>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_range.xml
index e5413c84fb..a879d261b3 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByDaysSinceLast_range.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>New visits</label>
- <nb_visits>38</nb_visits>
+ <nb_visits>39</nb_visits>
</row>
<row>
<label>0 days</label>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_month.xml
index dbf2a47c48..221a29c2b5 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_month.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>1 visit</label>
- <nb_visits>37</nb_visits>
+ <nb_visits>38</nb_visits>
<nb_visits_percentage>100%</nb_visits_percentage>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_range.xml
index 789e9e8110..11fd85a144 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsByVisitCount_range.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>1 visit</label>
- <nb_visits>43</nb_visits>
+ <nb_visits>44</nb_visits>
<nb_visits_percentage>86%</nb_visits_percentage>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_month.xml
index 8829c9b1a5..0ca3284b5b 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_month.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>1 page</label>
- <nb_visits>32</nb_visits>
+ <nb_visits>33</nb_visits>
</row>
<row>
<label>2 pages</label>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_range.xml
index d99a7802f0..51ed7da2eb 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerPage_range.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>1 page</label>
- <nb_visits>41</nb_visits>
+ <nb_visits>42</nb_visits>
</row>
<row>
<label>2 pages</label>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_month.xml
index eac22754d0..f3e2effb18 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_month.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>0-10s</label>
- <nb_visits>34</nb_visits>
+ <nb_visits>35</nb_visits>
</row>
<row>
<label>11-30s</label>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_range.xml
index 0fa5658a92..b62b79979b 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitorInterest.getNumberOfVisitsPerVisitDuration_range.xml
@@ -2,7 +2,7 @@
<result>
<row>
<label>0-10s</label>
- <nb_visits>44</nb_visits>
+ <nb_visits>45</nb_visits>
</row>
<row>
<label>11-30s</label>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getActions_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getActions_month.xml
index 1e4ba1a5cb..05473b60f6 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getActions_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getActions_month.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result>44</result> \ No newline at end of file
+<result>45</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getBounceCount_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getBounceCount_month.xml
index a946f8e505..95aa700980 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getBounceCount_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getBounceCount_month.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result>32</result> \ No newline at end of file
+<result>33</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getUniqueVisitors_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getUniqueVisitors_month.xml
index 8e4b837a62..8af80c337f 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getUniqueVisitors_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getUniqueVisitors_month.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result>35</result> \ No newline at end of file
+<result>36</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisitsConverted_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisitsConverted_month.xml
index 95aa700980..5c61a82137 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisitsConverted_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisitsConverted_month.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result>33</result> \ No newline at end of file
+<result>34</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisits_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisits_month.xml
index 51a0bb8472..962fbe983a 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisits_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.getVisits_month.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result>37</result> \ No newline at end of file
+<result>38</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.get_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.get_month.xml
index 1d536766e2..a71746a977 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.get_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__VisitsSummary.get_month.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_uniq_visitors>35</nb_uniq_visitors>
+ <nb_uniq_visitors>36</nb_uniq_visitors>
<nb_users>2</nb_users>
- <nb_visits>37</nb_visits>
- <nb_actions>44</nb_actions>
- <nb_visits_converted>33</nb_visits_converted>
- <bounce_count>32</bounce_count>
+ <nb_visits>38</nb_visits>
+ <nb_actions>45</nb_actions>
+ <nb_visits_converted>34</nb_visits_converted>
+ <bounce_count>33</bounce_count>
<sum_visit_length>551</sum_visit_length>
<max_actions>3</max_actions>
- <bounce_rate>86%</bounce_rate>
+ <bounce_rate>87%</bounce_rate>
<nb_actions_per_visit>1.2</nb_actions_per_visit>
<avg_time_on_site>15</avg_time_on_site>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml
index 8d46a2bb1d..2ae237fb14 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml
@@ -2,7 +2,7 @@
<result>
<row>
<idSite>3</idSite>
- <idVisit>55</idVisit>
+ <idVisit>56</idVisit>
<visitIp>174.97.139.63</visitIp>
<actionDetails>
@@ -12,7 +12,7 @@
<pageTitle>Liberate Web Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>35</pageIdAction>
- <pageId>68</pageId>
+ <pageId>69</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -117,7 +117,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>48</idVisit>
+ <idVisit>49</idVisit>
<visitIp>206.190.75.8</visitIp>
<actionDetails>
@@ -127,7 +127,7 @@
<pageTitle>Changelog Archive - Analytics - Piwik</pageTitle>
<pageIdAction>44</pageIdAction>
- <pageId>59</pageId>
+ <pageId>60</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -145,7 +145,7 @@
<pageTitle>Contact the Piwik team - Analytics - Piwik</pageTitle>
<pageIdAction>55</pageIdAction>
- <pageId>67</pageId>
+ <pageId>68</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -236,7 +236,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>54</idVisit>
+ <idVisit>55</idVisit>
<visitIp>193.159.20.129</visitIp>
<actionDetails>
@@ -246,7 +246,7 @@
<pageTitle>demo.piwik.org/Piwik Forums - Piwik › Web Analytics Reports</pageTitle>
<pageIdAction>53</pageIdAction>
- <pageId>66</pageId>
+ <pageId>67</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -363,7 +363,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>52</idVisit>
+ <idVisit>53</idVisit>
<visitIp>50.244.17.130</visitIp>
<actionDetails>
@@ -373,7 +373,7 @@
<pageTitle>Liberate Web Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>35</pageIdAction>
- <pageId>63</pageId>
+ <pageId>64</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -391,7 +391,7 @@
<pageTitle>What is Piwik? - Analytics - Piwik</pageTitle>
<pageIdAction>51</pageIdAction>
- <pageId>65</pageId>
+ <pageId>66</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -499,7 +499,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>53</idVisit>
+ <idVisit>54</idVisit>
<visitIp>84.194.72.21</visitIp>
<actionDetails>
@@ -509,7 +509,7 @@
<pageTitle />
<pageIdAction>49</pageIdAction>
- <pageId>64</pageId>
+ <pageId>65</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -617,7 +617,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>51</idVisit>
+ <idVisit>52</idVisit>
<visitIp>108.211.181.12</visitIp>
<actionDetails>
@@ -627,7 +627,7 @@
<pageTitle>Integrate Piwik into your Rails Application - Analytics - Piwik</pageTitle>
<pageIdAction>48</pageIdAction>
- <pageId>62</pageId>
+ <pageId>63</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -744,7 +744,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>50</idVisit>
+ <idVisit>51</idVisit>
<visitIp>219.101.46.222</visitIp>
<actionDetails>
@@ -754,7 +754,7 @@
<pageTitle>Log Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>42</pageIdAction>
- <pageId>61</pageId>
+ <pageId>62</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -858,7 +858,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>49</idVisit>
+ <idVisit>50</idVisit>
<visitIp>80.136.160.65</visitIp>
<actionDetails>
@@ -868,7 +868,7 @@
<pageTitle>Piwik 2.1 — Massive Performance and Reliability Improvements - Analytics - Piwik</pageTitle>
<pageIdAction>46</pageIdAction>
- <pageId>60</pageId>
+ <pageId>61</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -965,7 +965,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>47</idVisit>
+ <idVisit>48</idVisit>
<visitIp>188.107.238.9</visitIp>
<actionDetails>
@@ -975,7 +975,7 @@
<pageTitle>Log Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>42</pageIdAction>
- <pageId>58</pageId>
+ <pageId>59</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1092,7 +1092,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>45</idVisit>
+ <idVisit>46</idVisit>
<visitIp>93.80.130.163</visitIp>
<actionDetails>
@@ -1102,7 +1102,7 @@
<pageTitle>Liberate Web Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>35</pageIdAction>
- <pageId>54</pageId>
+ <pageId>55</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1121,7 +1121,7 @@
<pageTitle>Download - Analytics - Piwik</pageTitle>
<pageIdAction>39</pageIdAction>
- <pageId>56</pageId>
+ <pageId>57</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1140,7 +1140,7 @@
<pageTitle />
<pageIdAction>40</pageIdAction>
- <pageId>57</pageId>
+ <pageId>58</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1240,7 +1240,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>46</idVisit>
+ <idVisit>47</idVisit>
<visitIp>176.41.226.154</visitIp>
<actionDetails>
@@ -1250,7 +1250,7 @@
<pageTitle>Hello Installing Piwik - Analytics - Piwik</pageTitle>
<pageIdAction>37</pageIdAction>
- <pageId>55</pageId>
+ <pageId>56</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1359,7 +1359,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>44</idVisit>
+ <idVisit>45</idVisit>
<visitIp>84.194.72.21</visitIp>
<actionDetails>
@@ -1369,7 +1369,7 @@
<pageTitle>Liberate Web Analytics - Analytics - Piwik</pageTitle>
<pageIdAction>35</pageIdAction>
- <pageId>53</pageId>
+ <pageId>54</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1478,7 +1478,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>42</idVisit>
+ <idVisit>43</idVisit>
<visitIp>0.0.0.0</visitIp>
<actionDetails>
@@ -1488,7 +1488,7 @@
<pageTitle>incredible title!</pageTitle>
<pageIdAction>29</pageIdAction>
- <pageId>49</pageId>
+ <pageId>50</pageId>
<customVariables>
<row>
<customVariablePageName3>_pks</customVariablePageName3>
@@ -1596,7 +1596,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>43</idVisit>
+ <idVisit>44</idVisit>
<visitIp>0.0.0.0</visitIp>
<actionDetails>
@@ -1606,7 +1606,7 @@
<pageTitle>Piwik Forums</pageTitle>
<pageIdAction>31</pageIdAction>
- <pageId>50</pageId>
+ <pageId>51</pageId>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
@@ -1722,7 +1722,7 @@
</row>
<row>
<idSite>3</idSite>
- <idVisit>29</idVisit>
+ <idVisit>30</idVisit>
<visitIp>0.0.0.0</visitIp>
<actionDetails>
@@ -1732,7 +1732,7 @@
<pageTitle>Looking at Electronics &amp; Cameras page with a page level custom variable</pageTitle>
<pageIdAction>29</pageIdAction>
- <pageId>32</pageId>
+ <pageId>33</pageId>
<customVariables>
<row>
<customVariablePageName5>_pkc</customVariablePageName5>
@@ -1750,7 +1750,7 @@
<pageTitle>Another Product page with no category</pageTitle>
<pageIdAction>29</pageIdAction>
- <pageId>51</pageId>
+ <pageId>52</pageId>
<customVariables>
<row>
<customVariablePageName3>_pks</customVariablePageName3>
@@ -1772,7 +1772,7 @@
<pageTitle>Looking at Electronics &amp; Cameras page with a page level custom variable</pageTitle>
<pageIdAction>29</pageIdAction>
- <pageId>52</pageId>
+ <pageId>53</pageId>
<customVariables>
<row>
<customVariablePageName5>_pkc</customVariablePageName5>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs_withEnhancedAndLast7__MultiSites.getAll_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs_withEnhancedAndLast7__MultiSites.getAll_month.xml
index ddd44050a8..4e4c5a220b 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs_withEnhancedAndLast7__MultiSites.getAll_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs_withEnhancedAndLast7__MultiSites.getAll_month.xml
@@ -3,11 +3,11 @@
<result date="2012-08">
<row>
<label>Piwik test</label>
- <nb_visits>37</nb_visits>
- <nb_actions>44</nb_actions>
- <nb_pageviews>38</nb_pageviews>
- <revenue>165</revenue>
- <nb_conversions>33</nb_conversions>
+ <nb_visits>38</nb_visits>
+ <nb_actions>45</nb_actions>
+ <nb_pageviews>39</nb_pageviews>
+ <revenue>170</revenue>
+ <nb_conversions>34</nb_conversions>
<visits_evolution>100%</visits_evolution>
<actions_evolution>100%</actions_evolution>
<pageviews_evolution>100%</pageviews_evolution>
@@ -58,11 +58,11 @@
<nb_pageviews>10</nb_pageviews>
<revenue>5</revenue>
<nb_conversions>1</nb_conversions>
- <visits_evolution>-97.3%</visits_evolution>
- <actions_evolution>-77.3%</actions_evolution>
- <pageviews_evolution>-73.7%</pageviews_evolution>
- <revenue_evolution>-97%</revenue_evolution>
- <nb_conversions_evolution>-97%</nb_conversions_evolution>
+ <visits_evolution>-97.4%</visits_evolution>
+ <actions_evolution>-77.8%</actions_evolution>
+ <pageviews_evolution>-74.4%</pageviews_evolution>
+ <revenue_evolution>-97.1%</revenue_evolution>
+ <nb_conversions_evolution>-97.1%</nb_conversions_evolution>
<idsite>1</idsite>
<group />
<main_url>http://piwik.net</main_url>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml
index 63d03fdf76..eb5982c49b 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml
@@ -196,7 +196,7 @@
<type>goal</type>
<goalName>triggered js</goalName>
<goalId>1</goalId>
- <revenue>0</revenue>
+ <revenue>42</revenue>
<goalPageId />
<url>http://example.org/</url>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml
index 13ab39584f..e00992d683 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml
@@ -122,7 +122,7 @@
<type>goal</type>
<goalName>triggered js</goalName>
<goalId>1</goalId>
- <revenue>0</revenue>
+ <revenue>42</revenue>
<goalPageId />
<url>http://example.org/this%20is%20cool!?filter=&lt;script&gt;alert(1);&lt;/script&gt;{&quot;place&quot;:{&quot;place&quot;:&quot;0c5b2444-70a0-4932-980c-b4dc0d3f02b5&quot;}}</url>
diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml
index 2c8c1f8bf5..614ca49126 100644
--- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml
+++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml
@@ -118,7 +118,7 @@
<type>goal</type>
<goalName>triggered js</goalName>
<goalId>1</goalId>
- <revenue>0</revenue>
+ <revenue>1000</revenue>
<goalPageId />
<url>http://example.org/homepage</url>
diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml
index 2c8c1f8bf5..614ca49126 100644
--- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml
+++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml
@@ -118,7 +118,7 @@
<type>goal</type>
<goalName>triggered js</goalName>
<goalId>1</goalId>
- <revenue>0</revenue>
+ <revenue>1000</revenue>
<goalPageId />
<url>http://example.org/homepage</url>
diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml
index 8147eed81e..ad8e93fed4 100644
--- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml
+++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml
@@ -10,6 +10,9 @@
<row idgoal="1">1</row>
</totalConversionsByGoal>
<hasLatLong>0</hasLatLong>
+ <totalRevenueByGoal>
+ <row idgoal="1">1000</row>
+ </totalRevenueByGoal>
<searches>
</searches>
<continents>
@@ -164,7 +167,7 @@
<type>goal</type>
<goalName>triggered js</goalName>
<goalId>1</goalId>
- <revenue>0</revenue>
+ <revenue>1000</revenue>
<goalPageId />
<url>http://example.org/homepage</url>
diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml
index 2c8c1f8bf5..614ca49126 100644
--- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml
+++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml
@@ -118,7 +118,7 @@
<type>goal</type>
<goalName>triggered js</goalName>
<goalId>1</goalId>
- <revenue>0</revenue>
+ <revenue>1000</revenue>
<goalPageId />
<url>http://example.org/homepage</url>
diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml
index 2c8c1f8bf5..614ca49126 100644
--- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml
+++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml
@@ -118,7 +118,7 @@
<type>goal</type>
<goalName>triggered js</goalName>
<goalId>1</goalId>
- <revenue>0</revenue>
+ <revenue>1000</revenue>
<goalPageId />
<url>http://example.org/homepage</url>
diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml
index 8147eed81e..ad8e93fed4 100644
--- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml
+++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml
@@ -10,6 +10,9 @@
<row idgoal="1">1</row>
</totalConversionsByGoal>
<hasLatLong>0</hasLatLong>
+ <totalRevenueByGoal>
+ <row idgoal="1">1000</row>
+ </totalRevenueByGoal>
<searches>
</searches>
<continents>
@@ -164,7 +167,7 @@
<type>goal</type>
<goalName>triggered js</goalName>
<goalId>1</goalId>
- <revenue>0</revenue>
+ <revenue>1000</revenue>
<goalPageId />
<url>http://example.org/homepage</url>
diff --git a/tests/PHPUnit/System/expected/test_trackGoals_allowMultipleConversionsPerVisit__Goals.get_day.xml b/tests/PHPUnit/System/expected/test_trackGoals_allowMultipleConversionsPerVisit__Goals.get_day.xml
new file mode 100644
index 0000000000..e7f13c883f
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_trackGoals_allowMultipleConversionsPerVisit__Goals.get_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_conversions>8</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>1332</revenue>
+ <conversion_rate>100%</conversion_rate>
+ <nb_conversions_new_visit>8</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>2</nb_visits_converted_new_visit>
+ <revenue_new_visit>1332</revenue_new_visit>
+ <conversion_rate_new_visit>100%</conversion_rate_new_visit>
+ <nb_conversions_returning_visit>0</nb_conversions_returning_visit>
+ <nb_visits_converted_returning_visit>0</nb_visits_converted_returning_visit>
+ <revenue_returning_visit>0</revenue_returning_visit>
+ <conversion_rate_returning_visit>0%</conversion_rate_returning_visit>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_trackGoals_allowMultipleConversionsPerVisit_withLogLinkVisitActionSegment__Goals.get_day.xml b/tests/PHPUnit/System/expected/test_trackGoals_allowMultipleConversionsPerVisit_withLogLinkVisitActionSegment__Goals.get_day.xml
new file mode 100644
index 0000000000..e7f13c883f
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_trackGoals_allowMultipleConversionsPerVisit_withLogLinkVisitActionSegment__Goals.get_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_conversions>8</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>1332</revenue>
+ <conversion_rate>100%</conversion_rate>
+ <nb_conversions_new_visit>8</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>2</nb_visits_converted_new_visit>
+ <revenue_new_visit>1332</revenue_new_visit>
+ <conversion_rate_new_visit>100%</conversion_rate_new_visit>
+ <nb_conversions_returning_visit>0</nb_conversions_returning_visit>
+ <nb_visits_converted_returning_visit>0</nb_visits_converted_returning_visit>
+ <revenue_returning_visit>0</revenue_returning_visit>
+ <conversion_rate_returning_visit>0%</conversion_rate_returning_visit>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit__Goals.get_day.xml b/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit__Goals.get_day.xml
new file mode 100644
index 0000000000..2c07daa5b1
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit__Goals.get_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_conversions>3</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>1000</revenue>
+ <conversion_rate>66.67%</conversion_rate>
+ <nb_conversions_new_visit>3</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>2</nb_visits_converted_new_visit>
+ <revenue_new_visit>1000</revenue_new_visit>
+ <conversion_rate_new_visit>66.67%</conversion_rate_new_visit>
+ <nb_conversions_returning_visit>0</nb_conversions_returning_visit>
+ <nb_visits_converted_returning_visit>0</nb_visits_converted_returning_visit>
+ <revenue_returning_visit>0</revenue_returning_visit>
+ <conversion_rate_returning_visit>0%</conversion_rate_returning_visit>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit_withLogLinkVisitActionAndLogVisitSegment__Goals.get_day.xml b/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit_withLogLinkVisitActionAndLogVisitSegment__Goals.get_day.xml
new file mode 100644
index 0000000000..580ead80ab
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit_withLogLinkVisitActionAndLogVisitSegment__Goals.get_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_conversions>3</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>1000</revenue>
+ <conversion_rate>100%</conversion_rate>
+ <nb_conversions_new_visit>3</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>2</nb_visits_converted_new_visit>
+ <revenue_new_visit>1000</revenue_new_visit>
+ <conversion_rate_new_visit>100%</conversion_rate_new_visit>
+ <nb_conversions_returning_visit>0</nb_conversions_returning_visit>
+ <nb_visits_converted_returning_visit>0</nb_visits_converted_returning_visit>
+ <revenue_returning_visit>0</revenue_returning_visit>
+ <conversion_rate_returning_visit>0%</conversion_rate_returning_visit>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit_withLogLinkVisitActionSegment__Goals.get_day.xml b/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit_withLogLinkVisitActionSegment__Goals.get_day.xml
new file mode 100644
index 0000000000..580ead80ab
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_trackGoals_oneConversionPerVisit_withLogLinkVisitActionSegment__Goals.get_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_conversions>3</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>1000</revenue>
+ <conversion_rate>100%</conversion_rate>
+ <nb_conversions_new_visit>3</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>2</nb_visits_converted_new_visit>
+ <revenue_new_visit>1000</revenue_new_visit>
+ <conversion_rate_new_visit>100%</conversion_rate_new_visit>
+ <nb_conversions_returning_visit>0</nb_conversions_returning_visit>
+ <nb_visits_converted_returning_visit>0</nb_visits_converted_returning_visit>
+ <revenue_returning_visit>0</revenue_returning_visit>
+ <conversion_rate_returning_visit>0%</conversion_rate_returning_visit>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData__Goals.get_week.xml b/tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData__Goals.get_week.xml
new file mode 100644
index 0000000000..a3a013c18d
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData__Goals.get_week.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<results>
+ <result idSite="1">
+ <result date="From 2009-12-28 to 2010-01-03">
+ <nb_conversions>3</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>1000</revenue>
+ <conversion_rate>66.67%</conversion_rate>
+ <nb_conversions_new_visit>3</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>2</nb_visits_converted_new_visit>
+ <revenue_new_visit>1000</revenue_new_visit>
+ <conversion_rate_new_visit>66.67%</conversion_rate_new_visit>
+ </result>
+ <result date="From 2010-01-04 to 2010-01-10" />
+ <result date="From 2010-01-11 to 2010-01-17" />
+ <result date="From 2010-01-18 to 2010-01-24" />
+ <result date="From 2010-01-25 to 2010-01-31" />
+ <result date="From 2010-02-01 to 2010-02-07" />
+ <result date="From 2010-02-08 to 2010-02-14" />
+ </result>
+</results> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData_withLogLinkVisitActionSegment__Goals.get_day.xml b/tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData_withLogLinkVisitActionSegment__Goals.get_day.xml
new file mode 100644
index 0000000000..580ead80ab
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_twoVisitsWithCustomVariables_segmentMatchALL_noGoalData_withLogLinkVisitActionSegment__Goals.get_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_conversions>3</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>1000</revenue>
+ <conversion_rate>100%</conversion_rate>
+ <nb_conversions_new_visit>3</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>2</nb_visits_converted_new_visit>
+ <revenue_new_visit>1000</revenue_new_visit>
+ <conversion_rate_new_visit>100%</conversion_rate_new_visit>
+ <nb_conversions_returning_visit>0</nb_conversions_returning_visit>
+ <nb_visits_converted_returning_visit>0</nb_visits_converted_returning_visit>
+ <revenue_returning_visit>0</revenue_returning_visit>
+ <conversion_rate_returning_visit>0%</conversion_rate_returning_visit>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/Unit/Period/WeekTest.php b/tests/PHPUnit/Unit/Period/WeekTest.php
index 5df53acb45..23effa9595 100644
--- a/tests/PHPUnit/Unit/Period/WeekTest.php
+++ b/tests/PHPUnit/Unit/Period/WeekTest.php
@@ -156,6 +156,7 @@ class WeekTest extends BasePeriodTest
{
return array(
array('en', array('week October 7 – 13, 2024', 'week November 25 – December 1, 2024', 'week December 30, 2024 – January 5, 2025')),
+ array('es', array('semana 7–13 de Octubre de 2024', 'semana 25 de Noviembre–1 de Diciembre de 2024', 'semana 30 de Diciembre de 2024–5 de Enero de 2025')),
array('lt', array('savaitė 2024 Spalio 7–13', 'savaitė 2024 Lapkričio 25 – Gruodžio 1', 'savaitė 2024 Gruodžio 30 – 2025 Sausio 5')),
array('zh-cn', array('周 2024年10月7日至13日', '周 2024年11月25日至12月1日', '周 2024年12月30日至2025年01月5日')),
);
diff --git a/tests/UI/expected-ui-screenshots b/tests/UI/expected-ui-screenshots
-Subproject f52be03f1613724942f6fdc3430abd1743cd6c4
+Subproject 8423a15f21cffe1e0023c364de02ebe10e91a6d
diff --git a/tests/UI/specs/UsersManager_spec.js b/tests/UI/specs/UsersManager_spec.js
new file mode 100644
index 0000000000..1c88dbd917
--- /dev/null
+++ b/tests/UI/specs/UsersManager_spec.js
@@ -0,0 +1,110 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * Site selector screenshot tests.
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+describe("UsersManager", function () {
+ this.timeout(0);
+ this.fixture = "Piwik\\Plugins\\UsersManager\\tests\\Fixtures\\ManyUsers";
+
+ var url = "?module=UsersManager&action=index";
+
+ function assertScreenshotEquals(screenshotName, done, test)
+ {
+ expect.screenshot(screenshotName).to.be.captureSelector('#content', test, done);
+ }
+
+ function openGiveAccessForm(page) {
+ page.click('#showGiveViewAccessForm');
+ }
+
+ function setLoginOrEmailForGiveAccessForm(page, loginOrEmail)
+ {
+ page.evaluate(function () {
+ $('#user_invite').val('');
+ });
+ page.sendKeys('#user_invite', loginOrEmail);
+ }
+
+ function submitGiveAccessForm(page)
+ {
+ page.click('#giveUserAccessToViewReports');
+ page.wait(1000); // we wait in case error notification is still fading in and not fully visible yet
+ }
+
+ before(function () {
+ testEnvironment.idSitesAdminAccess = [1,2];
+ testEnvironment.save();
+ });
+
+ after(function () {
+ delete testEnvironment.idSitesAdminAccess;
+ testEnvironment.save();
+ });
+
+ it("should show only users having access to same site", function (done) {
+ assertScreenshotEquals("loaded_as_admin", done, function (page) {
+ page.load(url);
+ });
+ });
+
+ it("should open give view access form when clicking on button", function (done) {
+ assertScreenshotEquals("adminuser_give_view_access_form_opened", done, function (page) {
+ openGiveAccessForm(page);
+ });
+ });
+
+ it("should show an error when nothing entered", function (done) {
+ assertScreenshotEquals("adminuser_give_view_access_no_user_entered", done, function (page) {
+ submitGiveAccessForm(page);
+ });
+ });
+
+ it("should show an error when no such user found", function (done) {
+ assertScreenshotEquals("adminuser_give_view_access_user_not_found", done, function (page) {
+ setLoginOrEmailForGiveAccessForm(page, 'anyNoNExistingUser');
+ submitGiveAccessForm(page);
+ });
+ });
+
+ it("should show an error if user already has access", function (done) {
+ assertScreenshotEquals("adminuser_give_view_access_user_already_has_access", done, function (page) {
+ setLoginOrEmailForGiveAccessForm(page, 'login2');
+ submitGiveAccessForm(page);
+ });
+ });
+
+ it("should add a user by login", function (done) {
+ assertScreenshotEquals("adminuser_give_view_access_via_login", done, function (page) {
+ setLoginOrEmailForGiveAccessForm(page, 'login3');
+ submitGiveAccessForm(page);
+ });
+ });
+
+ it("should add a user by email", function (done) {
+ assertScreenshotEquals("adminuser_give_view_access_via_email", done, function (page) {
+ page.load(url);
+ openGiveAccessForm(page);
+ setLoginOrEmailForGiveAccessForm(page, 'login4@example.com');
+ submitGiveAccessForm(page);
+ });
+ });
+
+ it("should ask for confirmation when all sites selected", function (done) {
+ assertScreenshotEquals("adminuser_all_users_loaded", done, function (page) {
+ page.load(url + '&idSite=all');
+ });
+ });
+
+ it("should ask for confirmation when all sites selected", function (done) {
+ assertScreenshotEquals("adminuser_all_users_confirmation", done, function (page) {
+ openGiveAccessForm(page);
+ setLoginOrEmailForGiveAccessForm(page, 'login5@example.com');
+ submitGiveAccessForm(page);
+ });
+ });
+}); \ No newline at end of file
diff --git a/tests/resources/access-logs/fake_logs_enable_all.log b/tests/resources/access-logs/fake_logs_enable_all.log
index 24bafade73..b487279981 100644
--- a/tests/resources/access-logs/fake_logs_enable_all.log
+++ b/tests/resources/access-logs/fake_logs_enable_all.log
@@ -12,3 +12,5 @@
175.41.192.43 - - [11/Aug/2012:21:12:40 +0200] "GET /moved-permanently HTTP/1.1" 301 3574 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24"
175.41.192.43 - - [11/Aug/2012:21:15:40 +0200] "GET /temp-redirect HTTP/1.1" 307 3574 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24"
175.41.192.41 - - [11/Aug/2012:22:15:41 +0200] "GET /BLOG/cAtEgOrY/meta/ HTTP/1.1" 200 3574 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24"
+
+0:0:0:0:0:ffff:7b2d:4359 - - [11/Aug/2012:22:15:41 +0200] "GET /BLOG/cAtEgOrY/meta/ HTTP/1.1" 200 3574 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) RockMelt/0.9.58.494 Chrome/11.0.696.71 Safari/534.24"