Skip to content
Extraits de code Groupes Projets
Valider 173259c4 rédigé par diosmosis's avatar diosmosis
Parcourir les fichiers

Refactor API.getSegmentsMetadata and Plugin\Segment so segments are all...

Refactor API.getSegmentsMetadata and Plugin\Segment so segments are all defined through Plugin\Segment class in dimensions & make sure AutoSuggestAPITest data providers do not use database.
parent 76adbdc8
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -52,6 +52,12 @@ class Segment ...@@ -52,6 +52,12 @@ class Segment
private $permission; private $permission;
private $suggestedValuesCallback; private $suggestedValuesCallback;
/**
* TODO
* @var bool
*/
private $requiresAtLeastViewAccess = false;
/** /**
* @ignore * @ignore
*/ */
...@@ -255,4 +261,24 @@ class Segment ...@@ -255,4 +261,24 @@ class Segment
return $segment; return $segment;
} }
/**
* TODO
* @return boolean
* @ignore
*/
public function isRequiresAtLeastViewAccess()
{
return $this->requiresAtLeastViewAccess;
}
/**
* TODO
* @param boolean $requiresAtLeastViewAccess
* @ignore
*/
public function setRequiresAtLeastViewAccess($requiresAtLeastViewAccess)
{
$this->requiresAtLeastViewAccess = $requiresAtLeastViewAccess;
}
} }
...@@ -120,10 +120,15 @@ class API extends \Piwik\Plugin\API ...@@ -120,10 +120,15 @@ class API extends \Piwik\Plugin\API
public function getSegmentsMetadata($idSites = array(), $_hideImplementationData = true) public function getSegmentsMetadata($idSites = array(), $_hideImplementationData = true)
{ {
$segments = array(); $isAuthenticatedWithViewAccess = Piwik::isUserHasViewAccess($idSites) && !Piwik::isUserIsAnonymous();
$segments = array();
foreach (Dimension::getAllDimensions() as $dimension) { foreach (Dimension::getAllDimensions() as $dimension) {
foreach ($dimension->getSegments() as $segment) { foreach ($dimension->getSegments() as $segment) {
if ($segment->isRequiresAtLeastViewAccess()) {
$segment->setPermission($isAuthenticatedWithViewAccess);
}
$segments[] = $segment->toArray(); $segments[] = $segment->toArray();
} }
} }
...@@ -176,50 +181,6 @@ class API extends \Piwik\Plugin\API ...@@ -176,50 +181,6 @@ class API extends \Piwik\Plugin\API
*/ */
Piwik::postEvent('API.getSegmentDimensionMetadata', array(&$segments, $idSites)); Piwik::postEvent('API.getSegmentDimensionMetadata', array(&$segments, $idSites));
$isAuthenticatedWithViewAccess = Piwik::isUserHasViewAccess($idSites) && !Piwik::isUserIsAnonymous();
$segments[] = array(
'type' => 'dimension',
'category' => Piwik::translate('General_Visit'),
'name' => 'General_UserId',
'segment' => 'userId',
'acceptedValues' => 'any non empty unique string identifying the user (such as an email address or a username).',
'sqlSegment' => 'log_visit.user_id',
'permission' => $isAuthenticatedWithViewAccess,
);
$segments[] = array(
'type' => 'dimension',
'category' => Piwik::translate('General_Visit'),
'name' => 'General_VisitorID',
'segment' => 'visitorId',
'acceptedValues' => '34c31e04394bdc63 - any 16 Hexadecimal chars ID, which can be fetched using the Tracking API function getVisitorId()',
'sqlSegment' => 'log_visit.idvisitor',
'sqlFilterValue' => array('Piwik\Common', 'convertVisitorIdToBin'),
'permission' => $isAuthenticatedWithViewAccess,
);
$segments[] = array(
'type' => 'dimension',
'category' => Piwik::translate('General_Visit'),
'name' => Piwik::translate('General_Visit') . " ID",
'segment' => 'visitId',
'acceptedValues' => 'Any integer. ',
'sqlSegment' => 'log_visit.idvisit',
'permission' => $isAuthenticatedWithViewAccess,
);
$segments[] = array(
'type' => 'metric',
'category' => Piwik::translate('General_Visit'),
'name' => 'General_VisitorIP',
'segment' => 'visitIp',
'acceptedValues' => '13.54.122.1. </code>Select IP ranges with notation: <code>visitIp>13.54.122.0;visitIp<13.54.122.255',
'sqlSegment' => 'log_visit.location_ip',
'sqlFilterValue' => array('Piwik\Network\IPUtils', 'stringToBinaryIP'),
'permission' => $isAuthenticatedWithViewAccess,
);
foreach ($segments as &$segment) { foreach ($segments as &$segment) {
$segment['name'] = Piwik::translate($segment['name']); $segment['name'] = Piwik::translate($segment['name']);
$segment['category'] = Piwik::translate($segment['category']); $segment['category'] = Piwik::translate($segment['category']);
......
...@@ -12,7 +12,9 @@ use Piwik\Cache; ...@@ -12,7 +12,9 @@ use Piwik\Cache;
use Piwik\DataTable; use Piwik\DataTable;
use Piwik\DataTable\Map; use Piwik\DataTable\Map;
use Piwik\Period\Range; use Piwik\Period\Range;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension; use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
use Piwik\Plugins\VisitsSummary\API as VisitsSummaryApi; use Piwik\Plugins\VisitsSummary\API as VisitsSummaryApi;
use Piwik\Tracker\Request; use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor; use Piwik\Tracker\Visitor;
...@@ -33,6 +35,19 @@ class UserId extends VisitDimension ...@@ -33,6 +35,19 @@ class UserId extends VisitDimension
*/ */
protected $columnType = 'VARCHAR(200) NULL'; protected $columnType = 'VARCHAR(200) NULL';
protected function configureSegments()
{
$segment = new Segment();
$segment->setType('dimension');
$segment->setSegment('userId');
$segment->setCategory(Piwik::translate('General_Visit'));
$segment->setName('General_UserId');
$segment->setAcceptedValues('any non empty unique string identifying the user (such as an email address or a username).');
$segment->setSqlSegment('log_visit.user_id');
$segment->setRequiresAtLeastViewAccess(true);
$this->addSegment($segment);
}
/** /**
* @param Request $request * @param Request $request
* @param Visitor $visitor * @param Visitor $visitor
......
<?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\CoreHome\Columns;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
/**
* TODO
*/
class VisitId extends VisitDimension
{
protected function configureSegments()
{
parent::configureSegments();
$segment = new Segment();
$segment->setType('dimension');
$segment->setCategory(Piwik::translate('General_Visit'));
$segment->setName(Piwik::translate('General_Visit') . " ID");
$segment->setSegment('visitId');
$segment->setAcceptedValues('Any integer.');
$segment->setSqlSegment('log_visit.idvisit');
$segment->setRequiresAtLeastViewAccess(true);
$this->addSegment($segment);
}
}
\ No newline at end of file
<?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\CoreHome\Columns;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
/**
* TODO
*/
class VisitIp extends VisitDimension
{
protected function configureSegments()
{
parent::configureSegments();
$segment = new Segment();
$segment->setType('metric');
$segment->setCategory(Piwik::translate('General_Visit'));
$segment->setName('General_VisitorIP');
$segment->setSegment('visitIp');
$segment->setAcceptedValues('13.54.122.1. </code>Select IP ranges with notation: <code>visitIp>13.54.122.0;visitIp<13.54.122.255');
$segment->setSqlSegment('log_visit.location_ip');
$segment->setSqlFilterValue(array('Piwik\Network\IPUtils', 'stringToBinaryIP'));
$segment->setRequiresAtLeastViewAccess(true);
$this->addSegment($segment);
}
}
<?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\CoreHome\Columns;
use Piwik\Piwik;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
/**
* TODO
*/
class VisitorId extends VisitDimension
{
protected function configureSegments()
{
parent::configureSegments();
$segment = new Segment();
$segment->setType('dimension');
$segment->setCategory(Piwik::translate('General_Visit'));
$segment->setName('General_VisitorID');
$segment->setSegment('visitorId');
$segment->setAcceptedValues('34c31e04394bdc63 - any 16 Hexadecimal chars ID, which can be fetched using the Tracking API function getVisitorId()');
$segment->setSqlSegment('log_visit.idvisitor');
$segment->setSqlFilterValue(array('Piwik\Common', 'convertVisitorIdToBin'));
$segment->setRequiresAtLeastViewAccess(true);
$this->addSegment($segment);
}
}
...@@ -18,6 +18,7 @@ class Model ...@@ -18,6 +18,7 @@ class Model
const SCOPE_PAGE = 'log_link_visit_action'; const SCOPE_PAGE = 'log_link_visit_action';
const SCOPE_VISIT = 'log_visit'; const SCOPE_VISIT = 'log_visit';
const SCOPE_CONVERSION = 'log_conversion'; const SCOPE_CONVERSION = 'log_conversion';
const DEFAULT_CUSTOM_VAR_COUNT = 5;
private $scope = null; private $scope = null;
...@@ -159,7 +160,7 @@ class Model ...@@ -159,7 +160,7 @@ class Model
$model = new Model($scope); $model = new Model($scope);
try { try {
$maxCustomVars = 5; $maxCustomVars = self::DEFAULT_CUSTOM_VAR_COUNT;
$customVarsToAdd = $maxCustomVars - $model->getCurrentNumCustomVars(); $customVarsToAdd = $maxCustomVars - $model->getCurrentNumCustomVars();
for ($index = 0; $index < $customVarsToAdd; $index++) { for ($index = 0; $index < $customVarsToAdd; $index++) {
......
...@@ -8,8 +8,11 @@ ...@@ -8,8 +8,11 @@
namespace Piwik\Tests\System; namespace Piwik\Tests\System;
use Piwik\API\Request; use Piwik\API\Request;
use Piwik\Application\Environment;
use Piwik\Columns\Dimension;
use Piwik\Common; use Piwik\Common;
use Piwik\Date; use Piwik\Date;
use Piwik\Plugins\CustomVariables\Model;
use Piwik\Tests\Framework\TestCase\SystemTestCase; use Piwik\Tests\Framework\TestCase\SystemTestCase;
use Piwik\Tests\Fixtures\ManyVisitsWithGeoIP; use Piwik\Tests\Fixtures\ManyVisitsWithGeoIP;
use Piwik\Tests\Framework\Fixture; use Piwik\Tests\Framework\Fixture;
...@@ -45,15 +48,12 @@ class AutoSuggestAPITest extends SystemTestCase ...@@ -45,15 +48,12 @@ class AutoSuggestAPITest extends SystemTestCase
public function getApiForTesting() public function getApiForTesting()
{ {
// we will test all segments from all plugins
Fixture::loadAllPlugins();
$idSite = self::$fixture->idSite; $idSite = self::$fixture->idSite;
$apiForTesting = array(); $segments = self::getSegmentsMetadata();
$segments = \Piwik\Plugins\API\API::getInstance()->getSegmentsMetadata(self::$fixture->idSite); $apiForTesting = array();
foreach ($segments as $segment) { foreach ($segments as $segment) {
$apiForTesting[] = $this->getApiForTestingForSegment($idSite, $segment['segment']); $apiForTesting[] = $this->getApiForTestingForSegment($idSite, $segment);
} }
if (self::isMysqli() || self::isTravisCI()) { if (self::isMysqli() || self::isTravisCI()) {
...@@ -119,11 +119,11 @@ class AutoSuggestAPITest extends SystemTestCase ...@@ -119,11 +119,11 @@ class AutoSuggestAPITest extends SystemTestCase
public function getAnotherApiForTesting() public function getAnotherApiForTesting()
{ {
$segments = self::getSegmentsMetadata(self::$fixture->idSite); $segments = self::getSegmentsMetadata();
$apiForTesting = array(); $apiForTesting = array();
foreach ($segments as $segment) { foreach ($segments as $segment) {
if(self::isTravisCI() && $segment['segment'] == 'deviceType') { if(self::isTravisCI() && $segment == 'deviceType') {
// test started failing after bc19503 and I cannot understand why // test started failing after bc19503 and I cannot understand why
continue; continue;
} }
...@@ -131,8 +131,8 @@ class AutoSuggestAPITest extends SystemTestCase ...@@ -131,8 +131,8 @@ class AutoSuggestAPITest extends SystemTestCase
array('idSite' => self::$fixture->idSite, array('idSite' => self::$fixture->idSite,
'date' => date("Y-m-d", strtotime(self::$fixture->dateTime)) . ',today', 'date' => date("Y-m-d", strtotime(self::$fixture->dateTime)) . ',today',
'period' => 'range', 'period' => 'range',
'testSuffix' => '_' . $segment['segment'], 'testSuffix' => '_' . $segment,
'segmentToComplete' => $segment['segment'])); 'segmentToComplete' => $segment));
} }
return $apiForTesting; return $apiForTesting;
} }
...@@ -153,15 +153,45 @@ class AutoSuggestAPITest extends SystemTestCase ...@@ -153,15 +153,45 @@ class AutoSuggestAPITest extends SystemTestCase
$this->assertGreaterThan($minimumSegmentsToTest, self::$processed, $message); $this->assertGreaterThan($minimumSegmentsToTest, self::$processed, $message);
} }
public static function getSegmentsMetadata($idSite) public static function getSegmentsMetadata()
{ {
// Refresh cache for CustomVariables\Model // Refresh cache for CustomVariables\Model
Cache::clearCacheGeneral(); Cache::clearCacheGeneral();
\Piwik\Plugins\CustomVariables\Model::install(); $segments = array();
$environment = new Environment(null);
$exception = null;
try {
$environment->init();
$environment->getContainer()->get('Piwik\Plugin\Manager')->loadActivatedPlugins();
foreach (Dimension::getAllDimensions() as $dimension) {
foreach ($dimension->getSegments() as $segment) {
$segments[] = $segment->getSegment();
}
}
// add CustomVariables manually since the data provider may not have access to the DB
for ($i = 1; $i != Model::DEFAULT_CUSTOM_VAR_COUNT + 1; ++$i) {
$segments[] = 'customVariableName' . $i;
$segments[] = 'customVariableValue' . $i;
$segments[] = 'customVariablePageName' . $i;
$segments[] = 'customVariablePageValue' . $i;
}
} catch (\Exception $ex) {
$exception = $ex;
echo $ex->getMessage()."\n".$ex->getTraceAsString()."\n";
}
$environment->destroy();
if (!empty($exception)) {
throw $exception;
}
// Segment matching NONE
$segments = \Piwik\Plugins\API\API::getInstance()->getSegmentsMetadata($idSite);
return $segments; return $segments;
} }
} }
......
...@@ -48,7 +48,7 @@ class TwoVisitsWithCustomVariablesSegmentMatchNONETest extends SystemTestCase ...@@ -48,7 +48,7 @@ class TwoVisitsWithCustomVariablesSegmentMatchNONETest extends SystemTestCase
public function getSegmentToTest() public function getSegmentToTest()
{ {
$segments = AutoSuggestAPITest::getSegmentsMetadata(self::$fixture->idSite); $segments = AutoSuggestAPITest::getSegmentsMetadata();
$minimumExpectedSegmentsCount = 55; // as of Piwik 1.12 $minimumExpectedSegmentsCount = 55; // as of Piwik 1.12
$this->assertGreaterThan($minimumExpectedSegmentsCount, count($segments)); $this->assertGreaterThan($minimumExpectedSegmentsCount, count($segments));
...@@ -57,18 +57,18 @@ class TwoVisitsWithCustomVariablesSegmentMatchNONETest extends SystemTestCase ...@@ -57,18 +57,18 @@ class TwoVisitsWithCustomVariablesSegmentMatchNONETest extends SystemTestCase
$seenVisitorId = false; $seenVisitorId = false;
foreach ($segments as $segment) { foreach ($segments as $segment) {
$value = 'campaign'; $value = 'campaign';
if ($segment['segment'] == 'visitorId') { if ($segment == 'visitorId') {
$seenVisitorId = true; $seenVisitorId = true;
$value = '34c31e04394bdc63'; $value = '34c31e04394bdc63';
} }
if ($segment['segment'] == 'visitEcommerceStatus') { if ($segment == 'visitEcommerceStatus') {
$value = 'none'; $value = 'none';
} }
$matchNone = $segment['segment'] . '!=' . $value; $matchNone = $segment . '!=' . $value;
// deviceType != campaign matches ALL visits, but we want to match None // deviceType != campaign matches ALL visits, but we want to match None
if($segment['segment'] == 'deviceType') { if($segment == 'deviceType') {
$matchNone = $segment['segment'] . '==car%20browser'; $matchNone = $segment . '==car%20browser';
} }
$segmentExpression[] = $matchNone; $segmentExpression[] = $matchNone;
} }
......
...@@ -198,7 +198,7 @@ ...@@ -198,7 +198,7 @@
<category>Visit</category> <category>Visit</category>
<name>Visit ID</name> <name>Visit ID</name>
<segment>visitId</segment> <segment>visitId</segment>
<acceptedValues>Any integer. </acceptedValues> <acceptedValues>Any integer.</acceptedValues>
<permission>1</permission> <permission>1</permission>
</row> </row>
<row> <row>
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter