Skip to content

Commit

Permalink
display plugins/themes having an update, will refactor some code part…
Browse files Browse the repository at this point in the history
…s later
  • Loading branch information
tsteur committed Sep 16, 2013
1 parent b2c7cd1 commit 986b297
Show file tree
Hide file tree
Showing 6 changed files with 222 additions and 10 deletions.
89 changes: 80 additions & 9 deletions plugins/CorePluginsAdmin/Controller.php
Expand Up @@ -50,6 +50,32 @@ public function activatePlugin()
$this->extend();
}

public function updatePlugin()
{
$pluginName = Common::getRequestVar('pluginName', '', 'string');
$nonce = Common::getRequestVar('nonce', '', 'string');

if (empty($pluginName)) {
return;
}

if (!Nonce::verifyNonce('CorePluginsAdmin.updatePlugin', $nonce)) {
// todo display error
return;
}

Nonce::discardNonce('CorePluginsAdmin.updatePlugin');

$pluginInstaller = new PluginInstaller($pluginName);
$pluginInstaller->installOrUpdatePluginFromMarketplace();
$marketplace = new MarketplaceApiClient();

$view = $this->configureView('@CorePluginsAdmin/updatePlugin');
$view->plugin = $marketplace->getPluginInfo($pluginName);

echo $view->render();
}

public function installPlugin()
{
$pluginName = Common::getRequestVar('pluginName', '', 'string');
Expand All @@ -59,7 +85,7 @@ public function installPlugin()
return;
}

if (Nonce::verifyNonce('CorePluginsAdmin.installPlugin', $nonce)) {
if (!Nonce::verifyNonce('CorePluginsAdmin.installPlugin', $nonce)) {
// todo display error
return;
}
Expand Down Expand Up @@ -142,14 +168,26 @@ function extend()
function plugins()
{
$view = $this->configureView('@CorePluginsAdmin/plugins');
$view->pluginsInfo = $this->getPluginsInfo();

$pluginsInfo = $this->getPluginsInfo();

$view->updateNonce = Nonce::getNonce('CorePluginsAdmin.updatePlugin');
$view->pluginsInfo = $pluginsInfo;
$view->pluginsHavingUpdate = $this->getPluginsHavingUpdate($pluginsInfo, $themesOnly = false);

echo $view->render();
}

function themes()
{
$view = $this->configureView('@CorePluginsAdmin/themes');
$view->pluginsInfo = $this->getPluginsInfo($themesOnly = true);

$pluginsInfo = $this->getPluginsInfo();

$view->updateNonce = Nonce::getNonce('CorePluginsAdmin.updatePlugin');
$view->pluginsInfo = $pluginsInfo;
$view->pluginsHavingUpdate = $this->getPluginsHavingUpdate($pluginsInfo, $themesOnly = true);

echo $view->render();
}

Expand All @@ -166,27 +204,31 @@ protected function getPluginsInfo($themesOnly = false)
{
$plugins = array();

$pluginsManager = \Piwik\PluginsManager::getInstance();
$listPlugins = array_merge(
\Piwik\PluginsManager::getInstance()->readPluginsDirectory(),
$pluginsManager->readPluginsDirectory(),
Config::getInstance()->Plugins['Plugins']
);
$listPlugins = array_unique($listPlugins);
foreach ($listPlugins as $pluginName) {
\Piwik\PluginsManager::getInstance()->loadPlugin($pluginName);
$plugins[$pluginName] = array(
'activated' => \Piwik\PluginsManager::getInstance()->isPluginActivated($pluginName),
'alwaysActivated' => \Piwik\PluginsManager::getInstance()->isPluginAlwaysActivated($pluginName),
'uninstallable' => \Piwik\PluginsManager::getInstance()->isPluginUninstallable($pluginName),
'activated' => $pluginsManager->isPluginActivated($pluginName),
'alwaysActivated' => $pluginsManager->isPluginAlwaysActivated($pluginName),
'uninstallable' => $pluginsManager->isPluginUninstallable($pluginName),
);
}
\Piwik\PluginsManager::getInstance()->loadPluginTranslations();
$pluginsManager->loadPluginTranslations();

$loadedPlugins = $pluginsManager->getLoadedPlugins();

$loadedPlugins = \Piwik\PluginsManager::getInstance()->getLoadedPlugins();
foreach ($loadedPlugins as $oPlugin) {
$pluginName = $oPlugin->getPluginName();

$plugins[$pluginName]['info'] = $oPlugin->getInformation();
}


foreach ($plugins as $pluginName => &$plugin) {
if (!isset($plugin['info'])) {
$plugin['info'] = array(
Expand Down Expand Up @@ -264,4 +306,33 @@ public function uninstall($redirectAfter = true)
}
$this->redirectAfterModification($redirectAfter);
}

/**
* @param $pluginsInfo
* @param bool $themesOnly
* @return array
*/
private function getPluginsHavingUpdate($pluginsInfo, $themesOnly)
{
$loadedPlugins = PluginsManager::getInstance()->getLoadedPlugins();

$marketplace = new MarketplaceApiClient();

if ($themesOnly) {
$pluginsHavingUpdate = $marketplace->getInfoOfThemesHavingUpdate($loadedPlugins);
} else {
$pluginsHavingUpdate = $marketplace->getInfoOfPluginsHavingUpdate($loadedPlugins);
}

foreach ($pluginsHavingUpdate as $updatePlugin) {
foreach ($pluginsInfo as $pluginName => $plugin) {
// TODO check if pluginName == $plugin
$updatePlugin->currentVersion = $plugin['info']['version'];
$updatePlugin->isActivated = $plugin['activated'];
break;
}

}
return $pluginsHavingUpdate;
}
}
67 changes: 66 additions & 1 deletion plugins/CorePluginsAdmin/MarketplaceApiClient.php
Expand Up @@ -17,7 +17,7 @@
*/
class MarketplaceApiClient
{
private $domain = 'http://plugins.piwik';
private $domain = 'http://plugins.piwik.org/';

/**
* @var array array(pluginName => stdClass pluginInfo)
Expand All @@ -34,6 +34,11 @@ private function fetch($action, $params)
$result = Http::sendHttpRequest($url, 5);
$result = json_decode($result);

if (!empty($result->error)) {
// TODO create own exception
throw new \Exception($result->error);
}

return $result;
}

Expand Down Expand Up @@ -67,6 +72,66 @@ public function download($pluginOrThemeName, $target)
return $success;
}

/**
* @param \Piwik\Plugin[] $plugins
*/
public function checkUpdates($plugins)
{
$params = array();

foreach ($plugins as $plugin) {
$pluginName = $plugin->getPluginName();

$params[] = array('name' => $pluginName, 'version' => $plugin->getVersion());
}

$params = array('plugins' => $params);

$hasUpdates = $this->fetch('plugins/checkUpdates', array('plugins' => json_encode($params)));

if (empty($hasUpdates)) {
return array();
}

return $hasUpdates;
}

/**
* @param \Piwik\Plugin[] $plugins
*/
public function getInfoOfPluginsHavingUpdate($plugins)
{
$hasUpdates = $this->checkUpdates($plugins);

$pluginDetails = array();
foreach ($hasUpdates as $pluginHavingUpdate) {
$plugin = $this->getPluginInfo($pluginHavingUpdate->name);
if (!$plugin->isTheme) {
$pluginDetails[] = $plugin;
}
}

return $pluginDetails;
}

/**
* @param \Piwik\Plugin[] $plugins
*/
public function getInfoOfThemesHavingUpdate($plugins)
{
$hasUpdates = $this->checkUpdates($plugins);

$pluginDetails = array();
foreach ($hasUpdates as $pluginHavingUpdate) {
$plugin = $this->getPluginInfo($pluginHavingUpdate->name);
if ($plugin->isTheme) {
$pluginDetails[] = $plugin;
}
}

return $pluginDetails;
}

public function searchForPlugins($keywords, $query, $sort)
{
$response = $this->fetch('plugins', array('keywords' => $keywords, 'query' => $query, 'sort' => $sort));
Expand Down
43 changes: 43 additions & 0 deletions plugins/CorePluginsAdmin/templates/macros.twig
@@ -1,3 +1,46 @@
{% macro tablePluginUpdates(pluginsHavingUpdate, pluginsInfo, nonce, isTheme) %}

<div class='entityContainer'>
<table class="dataTable entityTable">
<thead>
<tr>
<th>{% if isTheme %}{{ 'CorePluginsAdmin_Theme'|translate }}{% else %}{{ 'General_Plugin'|translate }}{% endif %}</th>
<th class="num">{{ 'CorePluginsAdmin_Version'|translate }}</th>
<th>{{ 'General_Description'|translate }}</th>
<th class="status">{{ 'CorePluginsAdmin_Status'|translate }}</th>
<th class="action-links">{{ 'General_Action'|translate }}</th>
</tr>
</thead>
<tbody id="plugins">
{% for name,plugin in pluginsHavingUpdate %}
<tr {% if plugin.isActivated %}class="highlighted"{% endif %}>
<td class="name">
{{ plugin.name }}
</td>
<td class="vers">
{{ plugin.currentVersion }} => {{ plugin.latestVersion }}
</td>
<td class="desc">
{{ plugin.description }}
</td>
<td class="status">
{% if plugin.isActivated %}
{{ 'CorePluginsAdmin_Active'|translate }}
{% else %}
{{ 'CorePluginsAdmin_Inactive'|translate }}
{% endif %}
</td>
<td class="togl action-links">
<a href="{{ linkTo({'action':'updatePlugin', 'pluginName': plugin.name, 'nonce': nonce}) }}">Update</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>

{% endmacro %}

{% macro tablePlugins(pluginsInfo, token_auth, isTheme) %}

<div class='entityContainer'>
Expand Down
6 changes: 6 additions & 0 deletions plugins/CorePluginsAdmin/templates/plugins.twig
Expand Up @@ -5,6 +5,12 @@
{% block content %}
<div style="max-width:980px;">

{% if pluginsHavingUpdate|length %}
<h2>{{ pluginsHavingUpdate|length }} Update(s) available</h2>

{{ plugins.tablePluginUpdates(pluginsHavingUpdate, pluginsInfo, updateNonce, 0) }}
{% endif %}

<h2>{{ 'CorePluginsAdmin_PluginsManagement'|translate }}</h2>

<p>{{ 'CorePluginsAdmin_MainDescription'|translate }}</p>
Expand Down
6 changes: 6 additions & 0 deletions plugins/CorePluginsAdmin/templates/themes.twig
Expand Up @@ -5,6 +5,12 @@
{% block content %}
<div style="max-width:980px;">

{% if pluginsHavingUpdate|length %}
<h2>{{ pluginsHavingUpdate|length }} Update(s) available</h2>

{{ plugins.tablePluginUpdates(pluginsHavingUpdate, pluginsInfo, updateNonce, 1) }}
{% endif %}

<h2>{{ 'CorePluginsAdmin_ThemesManagement'|translate }}</h2>

<p>{{ 'CorePluginsAdmin_ThemesDescription'|translate }}</p>
Expand Down
21 changes: 21 additions & 0 deletions plugins/CorePluginsAdmin/templates/updatePlugin.twig
@@ -0,0 +1,21 @@
{% extends 'admin.twig' %}

{% block content %}

<div style="max-width:980px;">

<h2>Updating plugin {{ plugin.name}}</h2>

<div>
<p>Downloading plugin from Marketplace</p>

<p>Unzipping plugin</p>

<p>Replacing existing plugin</p>

<p>You have successfully updated the Plugin {{ plugin.name }} {{ plugin.latestVersion }}.</p>

</div>
</div>

{% endblock %}

0 comments on commit 986b297

Please sign in to comment.