Admin: Move migration page + add landing page

This commit is contained in:
Olivier Perez [a570709] 2015-01-07 14:01:08 +01:00
parent 073bc9048d
commit 1f8fd2e3e2
9 changed files with 218 additions and 144 deletions

View File

@ -1,118 +1,5 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
require_once '../app/inc/init.php';
use Framadate\Services\AdminPollService;
use Framadate\Services\LogService;
use Framadate\Services\PollService;
use Framadate\Services\SuperAdminService;
use Framadate\Utils;
include_once __DIR__ . '/../app/inc/init.php';
include_once __DIR__ . '/../bandeaux.php';
/* Services */
/*----------*/
$logService = new LogService();
$pollService = new PollService($connect, $logService);
$adminPollService = new AdminPollService($connect, $pollService, $logService);
$superAdminService = new SuperAdminService($connect);
// Ce fichier index.php se trouve dans le sous-repertoire ADMIN de Studs. Il sert à afficher l'intranet de studs
// pour modifier les sondages directement sans avoir reçu les mails. C'est l'interface d'aministration
// de l'application.
// Affichage des balises standards
Utils::print_header(_('Polls administrator'));
bandeau_titre(_('Polls administrator'));
$polls = $superAdminService->findAllPolls();
echo '<form action="' . Utils::get_server_name() . 'admin/index.php" method="POST">' . "\n";
// Test et affichage du bouton de confirmation en cas de suppression de sondage
foreach ($polls as $poll) {
if (!empty($_POST['supprimersondage' . $poll->id])) {
echo '
<div class="alert alert-warning text-center">
<h3>' . _("Confirm removal of the poll ") . '"' . $poll->id . '</h3>
<p><button class="btn btn-default" type="submit" value="1" name="annullesuppression">' . _('Keep this poll!') . '</button>
<button type="submit" name="confirmesuppression' . $poll->id . '" value="1" class="btn btn-danger">' . _('Remove this poll!') . '</button></p>
</div>';
}
// Traitement de la confirmation de suppression
if (!empty($_POST['confirmesuppression' . $poll->id])) {
// On inclut la routine de suppression
$date = date('H:i:s d/m/Y');
$adminPollService->deleteEntirePoll($poll->id);
}
}
$btn_logs = (is_readable('../' . LOG_FILE)) ? '<a role="button" class="btn btn-default btn-xs pull-right" href="' . Utils::get_server_name() . LOG_FILE . '">' . _("Logs") . '</a>' : '';
echo '<p>' . count($polls) . ' ' . _("polls in the database at this time") . $btn_logs . '</p>' . "\n";
// tableau qui affiche tous les sondages de la base
echo '<table class="table table-bordered">
<tr align="center">
<th scope="col">' . _('Poll ID') . '</th>
<th scope="col">' . _('Format') . '</th>
<th scope="col">' . _('Title') . '</th>
<th scope="col">' . _('Author') . '</th>
<th scope="col">' . _('Email') . '</th>
<th scope="col">' . _('Expiration\'s date') . '</th>
<th scope="col">' . _('Users') . '</th>
<th scope="col" colspan="3">' . _('Actions') . '</th>
</tr>' . "\n";
$i = 0;
foreach ($polls as $poll) {
$nb_users = $pollService->countVotesByPollId($poll->id);
if ($poll->format === 'D') {
$format_html = '<span class="glyphicon glyphicon-calendar" aria-hidden="true"></span><span class="sr-only">'. _('Date').'</span>';
} else {
$format_html = '<span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span><span class="sr-only">'. _('Classic').'</span>';
}
echo '
<tr align="center">
<td>' . $poll->id . '</td>
<td>' . $format_html . '</td>
<td>' . htmlentities($poll->title) . '</td>
<td>' . htmlentities($poll->admin_name) . '</td>
<td>' . htmlentities($poll->admin_mail) . '</td>';
if (strtotime($poll->end_date) > time()) {
echo '<td>' . date('d/m/y', strtotime($poll->end_date)) . '</td>';
} else {
echo '<td><span class="text-danger">' . date('d/m/y', strtotime($poll->end_date)) . '</span></td>';
}
echo '
<td>' . $nb_users . '</td>
<td><a href="' . Utils::getUrlSondage($poll->id) . '" class="btn btn-link" title="' . _('See the poll') . '"><span class="glyphicon glyphicon-eye-open"></span><span class="sr-only">' . _('See the poll') . '</span></a></td>
<td><a href="' . Utils::getUrlSondage($poll->admin_id, true) . '" class="btn btn-link" title="' . _('Change the poll') . '"><span class="glyphicon glyphicon-pencil"></span><span class="sr-only">' . _("Change the poll") . '</span></a></td>
<td><button type="submit" name="supprimersondage' . $poll->id . '" value="' . _('Remove the poll') . '" class="btn btn-link" title="' . _("Remove the poll") . '"><span class="glyphicon glyphicon-trash text-danger"></span><span class="sr-only">' . _('Remove the poll') . '</span></td>
</tr>' . "\n";
++$i;
}
echo '</table></form>' . "\n";
bandeau_pied(true);
$smarty->assign('title', _('Administration'));
$smarty->display('admin/index.tpl');

View File

@ -4,11 +4,7 @@ use Framadate\Migration\From_0_8_to_0_9_Migration;
use Framadate\Migration\Migration;
use Framadate\Utils;
include_once __DIR__ . '/app/inc/init.php';
function output($msg) {
echo $msg . '<br/>';
}
include_once __DIR__ . '/../app/inc/init.php';
// List a Migration sub classes to execute
$migrations = [
@ -43,12 +39,15 @@ $countFailed = 0;
$countSkipped = 0;
// Loop on every Migration sub classes
$success = [];
$fail = [];
foreach ($migrations as $migration) {
$className = get_class($migration);
// Check if $className is a Migration sub class
if (!$migration instanceof Migration) {
output('The class ' . $className . ' is not a sub class of Framadate\\Migration\\Migration.');
$smarty->assign('error', 'The class ' . $className . ' is not a sub class of Framadate\\Migration\\Migration.');
$smarty->display('error.tpl');
exit;
}
@ -61,10 +60,10 @@ foreach ($migrations as $migration) {
$migration->execute($pdo);
if ($insertStmt->execute([$className])) {
$countSucceeded++;
output('Migration done: ' . $className);
$success[] = $className;
} else {
$countFailed++;
output('Migration failed: ' . $className);
$fail[] = $className;
}
} else {
$countSkipped++;
@ -74,7 +73,14 @@ foreach ($migrations as $migration) {
$countTotal = $countSucceeded + $countFailed + $countSkipped;
output('Summary<hr/>');
output('Success: ' . $countSucceeded . ' / ' . $countTotal);
output('Fail: ' . $countFailed . ' / ' . $countTotal);
output('Skipped: ' . $countSkipped . ' / ' . $countTotal);
$smarty->assign('success', $success);
$smarty->assign('fail', $fail);
$smarty->assign('countSucceeded', $countSucceeded);
$smarty->assign('countFailed', $countFailed);
$smarty->assign('countSkipped', $countSkipped);
$smarty->assign('countTotal', $countTotal);
$smarty->assign('title', _('Migration'));
$smarty->display('admin/migration.tpl');

118
admin/polls.php Normal file
View File

@ -0,0 +1,118 @@
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
use Framadate\Services\AdminPollService;
use Framadate\Services\LogService;
use Framadate\Services\PollService;
use Framadate\Services\SuperAdminService;
use Framadate\Utils;
include_once __DIR__ . '/../app/inc/init.php';
include_once __DIR__ . '/../bandeaux.php';
/* Services */
/*----------*/
$logService = new LogService();
$pollService = new PollService($connect, $logService);
$adminPollService = new AdminPollService($connect, $pollService, $logService);
$superAdminService = new SuperAdminService($connect);
// Ce fichier index.php se trouve dans le sous-repertoire ADMIN de Studs. Il sert à afficher l'intranet de studs
// pour modifier les sondages directement sans avoir reçu les mails. C'est l'interface d'aministration
// de l'application.
// Affichage des balises standards
Utils::print_header(_('Polls administrator'));
bandeau_titre(_('Polls administrator'));
$polls = $superAdminService->findAllPolls();
echo '<form action="' . Utils::get_server_name() . 'admin/index.php" method="POST">' . "\n";
// Test et affichage du bouton de confirmation en cas de suppression de sondage
foreach ($polls as $poll) {
if (!empty($_POST['supprimersondage' . $poll->id])) {
echo '
<div class="alert alert-warning text-center">
<h3>' . _("Confirm removal of the poll ") . '"' . $poll->id . '</h3>
<p><button class="btn btn-default" type="submit" value="1" name="annullesuppression">' . _('Keep this poll!') . '</button>
<button type="submit" name="confirmesuppression' . $poll->id . '" value="1" class="btn btn-danger">' . _('Remove this poll!') . '</button></p>
</div>';
}
// Traitement de la confirmation de suppression
if (!empty($_POST['confirmesuppression' . $poll->id])) {
// On inclut la routine de suppression
$date = date('H:i:s d/m/Y');
$adminPollService->deleteEntirePoll($poll->id);
}
}
$btn_logs = (is_readable('../' . LOG_FILE)) ? '<a role="button" class="btn btn-default btn-xs pull-right" href="' . Utils::get_server_name() . LOG_FILE . '">' . _("Logs") . '</a>' : '';
echo '<p>' . count($polls) . ' ' . _("polls in the database at this time") . $btn_logs . '</p>' . "\n";
// tableau qui affiche tous les sondages de la base
echo '<table class="table table-bordered">
<tr align="center">
<th scope="col">' . _('Poll ID') . '</th>
<th scope="col">' . _('Format') . '</th>
<th scope="col">' . _('Title') . '</th>
<th scope="col">' . _('Author') . '</th>
<th scope="col">' . _('Email') . '</th>
<th scope="col">' . _('Expiration\'s date') . '</th>
<th scope="col">' . _('Users') . '</th>
<th scope="col" colspan="3">' . _('Actions') . '</th>
</tr>' . "\n";
$i = 0;
foreach ($polls as $poll) {
$nb_users = $pollService->countVotesByPollId($poll->id);
if ($poll->format === 'D') {
$format_html = '<span class="glyphicon glyphicon-calendar" aria-hidden="true"></span><span class="sr-only">'. _('Date').'</span>';
} else {
$format_html = '<span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span><span class="sr-only">'. _('Classic').'</span>';
}
echo '
<tr align="center">
<td>' . $poll->id . '</td>
<td>' . $format_html . '</td>
<td>' . htmlentities($poll->title) . '</td>
<td>' . htmlentities($poll->admin_name) . '</td>
<td>' . htmlentities($poll->admin_mail) . '</td>';
if (strtotime($poll->end_date) > time()) {
echo '<td>' . date('d/m/y', strtotime($poll->end_date)) . '</td>';
} else {
echo '<td><span class="text-danger">' . date('d/m/y', strtotime($poll->end_date)) . '</span></td>';
}
echo '
<td>' . $nb_users . '</td>
<td><a href="' . Utils::getUrlSondage($poll->id) . '" class="btn btn-link" title="' . _('See the poll') . '"><span class="glyphicon glyphicon-eye-open"></span><span class="sr-only">' . _('See the poll') . '</span></a></td>
<td><a href="' . Utils::getUrlSondage($poll->admin_id, true) . '" class="btn btn-link" title="' . _('Change the poll') . '"><span class="glyphicon glyphicon-pencil"></span><span class="sr-only">' . _("Change the poll") . '</span></a></td>
<td><button type="submit" name="supprimersondage' . $poll->id . '" value="' . _('Remove the poll') . '" class="btn btn-link" title="' . _("Remove the poll") . '"><span class="glyphicon glyphicon-trash text-danger"></span><span class="sr-only">' . _('Remove the poll') . '</span></td>
</tr>' . "\n";
++$i;
}
echo '</table></form>' . "\n";
bandeau_pied(true);

View File

@ -30,15 +30,17 @@ if (ini_get('date.timezone') == '') {
date_default_timezone_set('Europe/Paris');
}
define('ROOT_DIR', __DIR__ . '/../../');
require_once __DIR__ . '/constants.php';
require_once __DIR__ . '/i18n.php';
// Smarty
require_once __DIR__ . '/../../vendor/smarty/smarty/libs/Smarty.class.php';
$smarty = new \Smarty();
$smarty->setTemplateDir('tpl/');
$smarty->setCompileDir('tpl_c/');
$smarty->setCacheDir('cache/');
$smarty->setTemplateDir(ROOT_DIR . '/tpl/');
$smarty->setCompileDir(ROOT_DIR . '/tpl_c/');
$smarty->setCacheDir(ROOT_DIR . '/cache/');
$smarty->caching = false;
$smarty->assign('APPLICATION_NAME', NOMAPPLICATION);
@ -57,6 +59,10 @@ function smarty_modifier_markdown($md, $clear = false) {
return Utils::markdown($md, $clear);
}
function smarty_modifier_resource($link) {
return Utils::get_server_name() . $link;
}
// End- Smarty
$connect = new FramaDB(DB_CONNECTION_STRING, DB_USER, DB_PASSWORD);

10
tpl/admin/admin_page.tpl Normal file
View File

@ -0,0 +1,10 @@
{extends 'page.tpl'}
{block 'main'}
<div class="row">
<div class="col-xs-12">
<a href="{'admin'|resource}">{_('Back to administration')}</a>
</div>
</div>
{block 'admin_main'}{/block}
{/block}

12
tpl/admin/index.tpl Normal file
View File

@ -0,0 +1,12 @@
{extends 'admin/admin_page.tpl'}
{block 'main'}
<div class="row">
<div class="col-md-6 col-xs-12">
<a href="./polls.php"><h2>{_('Polls')}</h2></a>
</div>
<div class="col-md-6 col-xs-12">
<a href="./migration.php"><h2>{_('Migration')}</h2></a>
</div>
</div>
{/block}

35
tpl/admin/migration.tpl Normal file
View File

@ -0,0 +1,35 @@
{extends 'admin/admin_page.tpl'}
{block 'admin_main'}
<div class="row">
<div class="col-xs-12 col-md-4">
<h2>{_('Summary')}</h2>
{_('Succeeded:')} <span class="label label-warning">{$countSucceeded} / {$countTotal}</span>
<br/>
{_('Failed:')} <span class="label label-danger">{$countFailed} / {$countTotal}</span>
<br/>
{_('Skipped:')} <span class="label label-info">{$countSkipped} / {$countTotal}</span>
</div>
<div class="col-xs-12 col-md-4">
<h2>{_('Success')}</h2>
<ul>
{foreach $success as $s}
<li>{$s}</li>
{foreachelse}
<li>{_('Nothing')}</li>
{/foreach}
</ul>
</div>
<div class="col-xs-12 col-md-4">
<h2>{_('Fail')}</h2>
<ul>
{foreach $fail as $f}
<li>{$f}</li>
{foreachelse}
<li>{_('Nothing')}</li>
{/foreach}
</ul>
</div>
</div>
{/block}

View File

@ -9,19 +9,19 @@
<title>{$APPLICATION_NAME}</title>
{/if}
<link rel="stylesheet" href="{$SERVER_URL}css/bootstrap.min.css">
<link rel="stylesheet" href="{$SERVER_URL}css/datepicker3.css">
<link rel="stylesheet" href="{$SERVER_URL}css/style.css">
<link rel="stylesheet" href="{$SERVER_URL}css/frama.css">
<link rel="stylesheet" href="{$SERVER_URL}css/print.css" media="print">
<script type="text/javascript" src="{$SERVER_URL}js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="{$SERVER_URL}js/bootstrap.min.js"></script>
<script type="text/javascript" src="{$SERVER_URL}js/bootstrap-datepicker.js"></script>
<script type="text/javascript" src="{$SERVER_URL}js/locales/bootstrap-datepicker.{$lang}.js"></script>
<script type="text/javascript" src="{$SERVER_URL}js/core.js"></script>
<link rel="stylesheet" href="{'css/bootstrap.min.css'|resource}">
<link rel="stylesheet" href="{'css/datepicker3.css'|resource}">
<link rel="stylesheet" href="{'css/style.css'|resource}">
<link rel="stylesheet" href="{'css/frama.css'|resource}">
<link rel="stylesheet" href="{'css/print.css'|resource}" media="print">
<script type="text/javascript" src="{'js/jquery-1.11.1.min.js'|resource}"></script>
<script type="text/javascript" src="{'js/bootstrap.min.js'|resource}"></script>
<script type="text/javascript" src="{'js/bootstrap-datepicker.js'|resource}"></script>
<script type="text/javascript" src="{"js/locales/bootstrap-datepicker.$lang.js"|resource}"></script>
<script type="text/javascript" src="{'js/core.js'|resource}"></script>
{if !empty($nav_js)}
<script src="/nav/nav.js" id="nav_js" type="text/javascript" charset="utf-8"></script><!-- /Framanav -->
<script src="{'nav/nav.js'|resource}" id="nav_js" type="text/javascript" charset="utf-8"></script><!-- /Framanav -->
{/if}
</head>

View File

@ -2,7 +2,7 @@
{if count($langs)>1}
<form method="post" action="" class="hidden-print">
<div class="input-group input-group-sm pull-right col-md-2 col-xs-4">
<select name="lang" class="form-control" title="${_("Select the language")}" >
<select name="lang" class="form-control" title="{_("Select the language")}" >
{foreach $langs as $lang_key=>$lang_value}
<option lang="{substr($lang_key, 0, 2)}" {if substr($lang_key, 0, 2)==$lang}selected{/if} value="{$lang_key}">{$lang_value}</option>
{/foreach}
@ -14,7 +14,7 @@
</form>
{/if}
<h1><a href="{$SERVER_URL}" title="{_("Home")} - {$APPLICATION_NAME}"><img src="{$TITLE_IMAGE}" alt="{$APPLICATION_NAME}"/></a></h1>
<h1><a href="{$SERVER_URL}" title="{_("Home")} - {$APPLICATION_NAME}"><img src="{$TITLE_IMAGE|resource}" alt="{$APPLICATION_NAME}"/></a></h1>
{if !empty($title)}<h2 class="lead"><i>{$title}</i></h2>{/if}
<hr class="trait" role="presentation" />
</header>