mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-15 05:53:13 +00:00
AdminRoot Controller refactoring
This commit is contained in:
@@ -12,7 +12,6 @@
|
||||
namespace Alchemy\Phrasea;
|
||||
|
||||
use Alchemy\Geonames\GeonamesServiceProvider;
|
||||
use Alchemy\Phrasea\ControllerProvider\Admin\Root as AdminRoot;
|
||||
use Alchemy\Phrasea\ControllerProvider\Admin\SearchEngine;
|
||||
use Alchemy\Phrasea\ControllerProvider\Admin\Setup;
|
||||
use Alchemy\Phrasea\ControllerProvider\Admin\Subdefs;
|
||||
@@ -312,6 +311,7 @@ class Application extends SilexApplication
|
||||
'Alchemy\Phrasea\ControllerProvider\Admin\Databoxes' => [],
|
||||
'Alchemy\Phrasea\ControllerProvider\Admin\Feeds' => [],
|
||||
'Alchemy\Phrasea\ControllerProvider\Admin\Fields' => [],
|
||||
'Alchemy\Phrasea\ControllerProvider\Admin\Root' => [],
|
||||
'Alchemy\Phrasea\ControllerProvider\Admin\Users' => [],
|
||||
'Alchemy\Phrasea\ControllerProvider\Datafiles' => [],
|
||||
'Alchemy\Phrasea\ControllerProvider\Lightbox' => [],
|
||||
@@ -669,6 +669,7 @@ class Application extends SilexApplication
|
||||
$this->mount('/xmlhttp', new ThesaurusXMLHttp());
|
||||
|
||||
$providers = [
|
||||
'/admin/' => 'Alchemy\Phrasea\ControllerProvider\Admin\Root',
|
||||
'/admin/collection' => 'Alchemy\Phrasea\ControllerProvider\Admin\Collection',
|
||||
'/admin/connected-users' => 'Alchemy\Phrasea\ControllerProvider\Admin\ConnectedUsers',
|
||||
'/admin/dashboard' => 'Alchemy\Phrasea\ControllerProvider\Admin\Dashboard',
|
||||
|
410
lib/Alchemy/Phrasea/Controller/Admin/RootController.php
Normal file
410
lib/Alchemy/Phrasea/Controller/Admin/RootController.php
Normal file
@@ -0,0 +1,410 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of Phraseanet
|
||||
*
|
||||
* (c) 2005-2015 Alchemy
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Alchemy\Phrasea\Controller\Admin;
|
||||
|
||||
use Alchemy\Phrasea\Controller\Controller;
|
||||
use Alchemy\Phrasea\Exception\SessionNotFound;
|
||||
use Alchemy\Phrasea\Status\StatusStructureProviderInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
||||
|
||||
class RootController extends Controller
|
||||
{
|
||||
public function indexAction(Request $request)
|
||||
{
|
||||
try {
|
||||
\Session_Logger::updateClientInfos($this->app, 3);
|
||||
} catch (SessionNotFound $e) {
|
||||
return $this->app->redirectPath('logout');
|
||||
}
|
||||
|
||||
$params = $this->getSectionParameters($request->query->get('section', false));
|
||||
|
||||
return $this->render('admin/index.html.twig', array_merge([
|
||||
'module' => 'admin',
|
||||
'events' => $this->app['events-manager'],
|
||||
'module_name' => 'Admin',
|
||||
'notice' => $request->query->get("notice"),
|
||||
'tree' => $this->render('admin/tree.html.twig', $params),
|
||||
], $params));
|
||||
}
|
||||
|
||||
public function displayTreeAction(Request $request)
|
||||
{
|
||||
try {
|
||||
\Session_Logger::updateClientInfos($this->app, 3);
|
||||
} catch (SessionNotFound $e) {
|
||||
return $this->app->redirectPath('logout');
|
||||
}
|
||||
|
||||
$params = $this->getSectionParameters($request->query->get('position', false));
|
||||
|
||||
return $this->render('admin/tree.html.twig', $params);
|
||||
}
|
||||
|
||||
public function testPathsAction(Request $request)
|
||||
{
|
||||
if (!$request->isXmlHttpRequest()) {
|
||||
$this->app->abort(400);
|
||||
}
|
||||
if (!array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) {
|
||||
$this->app->abort(400, $this->app->trans('Bad request format, only JSON is allowed'));
|
||||
}
|
||||
|
||||
if (0 === count($tests = $request->query->get('tests', []))) {
|
||||
$this->app->abort(400, $this->app->trans('Missing tests parameter'));
|
||||
}
|
||||
|
||||
if (null === $path = $request->query->get('path')) {
|
||||
$this->app->abort(400, $this->app->trans('Missing path parameter'));
|
||||
}
|
||||
|
||||
$result = false;
|
||||
foreach ($tests as $test) {
|
||||
switch ($test) {
|
||||
case 'writeable':
|
||||
$result = is_writable($path);
|
||||
break;
|
||||
case 'readable':
|
||||
default:
|
||||
$result = is_readable($path);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->app->json(['results' => $result]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $databox_id
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function displayStatusBitAction($databox_id)
|
||||
{
|
||||
if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$this->app->abort(403);
|
||||
}
|
||||
|
||||
return $this->render('admin/statusbit.html.twig', [
|
||||
'databox' => $this->findDataboxById($databox_id),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param int $databox_id
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function displayDataboxStructureAction(Request $request, $databox_id)
|
||||
{
|
||||
if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$this->app->abort(403);
|
||||
}
|
||||
|
||||
$databox = $this->findDataboxById((int) $databox_id);
|
||||
$structure = $databox->get_structure();
|
||||
$errors = \databox::get_structure_errors($this->app['translator'], $structure);
|
||||
|
||||
if ($updateOk = !!$request->query->get('success', false)) {
|
||||
$updateOk = true;
|
||||
}
|
||||
|
||||
if (false !== $errorsStructure = $request->query->get('error', false)) {
|
||||
$errorsStructure = true;
|
||||
}
|
||||
|
||||
return $this->render('admin/structure.html.twig', [
|
||||
'databox' => $databox,
|
||||
'errors' => $errors,
|
||||
'structure' => $structure,
|
||||
'errorsStructure' => $errorsStructure,
|
||||
'updateOk' => $updateOk
|
||||
]);
|
||||
}
|
||||
|
||||
public function submitDatabaseStructureAction(Request $request, $databox_id)
|
||||
{
|
||||
if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$this->app->abort(403);
|
||||
}
|
||||
|
||||
if (null === $structure = $request->request->get('structure')) {
|
||||
$this->app->abort(400, $this->app->trans('Missing "structure" parameter'));
|
||||
}
|
||||
|
||||
$errors = \databox::get_structure_errors($this->app['translator'], $structure);
|
||||
|
||||
$domst = new \DOMDocument('1.0', 'UTF-8');
|
||||
$domst->preserveWhiteSpace = false;
|
||||
$domst->formatOutput = true;
|
||||
|
||||
if (count($errors) == 0 && $domst->loadXML($structure)) {
|
||||
$databox = $this->findDataboxById($databox_id);
|
||||
$databox->saveStructure($domst);
|
||||
|
||||
return $this->app->redirectPath('database_display_stucture', ['databox_id' => $databox_id, 'success' => 1]);
|
||||
}
|
||||
|
||||
return $this->app->redirectPath('database_display_stucture', [
|
||||
'databox_id' => $databox_id,
|
||||
'success' => 0,
|
||||
'error' => 'struct',
|
||||
]);
|
||||
}
|
||||
|
||||
public function displayDatabaseStatusBitFormAction(Request $request, $databox_id, $bit)
|
||||
{
|
||||
if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$this->app->abort(403);
|
||||
}
|
||||
|
||||
$databox = $this->findDataboxById($databox_id);
|
||||
|
||||
$statusStructure = $databox->getStatusStructure();
|
||||
|
||||
switch ($errorMsg = $request->query->get('error')) {
|
||||
case 'rights':
|
||||
$errorMsg = $this->app->trans('You do not enough rights to update status');
|
||||
break;
|
||||
case 'too-big':
|
||||
$errorMsg = $this->app->trans('File is too big : 64k max');
|
||||
break;
|
||||
case 'upload-error':
|
||||
$errorMsg = $this->app->trans('Status icon upload failed : upload error');
|
||||
break;
|
||||
case 'wright-error':
|
||||
$errorMsg = $this->app->trans('Status icon upload failed : can not write on disk');
|
||||
break;
|
||||
case 'unknow-error':
|
||||
$errorMsg = $this->app->trans('Something wrong happend');
|
||||
break;
|
||||
}
|
||||
|
||||
if ($statusStructure->hasStatus($bit)) {
|
||||
$status = $statusStructure->getStatus($bit);
|
||||
} else {
|
||||
$status = [
|
||||
"labeloff" => '',
|
||||
"labelon" => '',
|
||||
"img_off" => '',
|
||||
"img_on" => '',
|
||||
"path_off" => '',
|
||||
"path_on" => '',
|
||||
"searchable" => false,
|
||||
"printable" => false,
|
||||
];
|
||||
|
||||
foreach ($this->app['locales.available'] as $code => $language) {
|
||||
$status['labels_on'][$code] = null;
|
||||
$status['labels_off'][$code] = null;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->render('admin/statusbit/edit.html.twig', [
|
||||
'status' => $status,
|
||||
'errorMsg' => $errorMsg
|
||||
]);
|
||||
}
|
||||
|
||||
public function deleteStatusBitAction(Request $request, $databox_id, $bit)
|
||||
{
|
||||
if (!$request->isXmlHttpRequest() || !array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) {
|
||||
$this->app->abort(400, $this->app->trans('Bad request format, only JSON is allowed'));
|
||||
}
|
||||
|
||||
if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$this->app->abort(403);
|
||||
}
|
||||
|
||||
$databox = $this->findDataboxById($databox_id);
|
||||
|
||||
$error = false;
|
||||
|
||||
try {
|
||||
$this->app['status.provider']->deleteStatus($databox->getStatusStructure(), $bit);
|
||||
} catch (\Exception $e) {
|
||||
$error = true;
|
||||
}
|
||||
|
||||
return $this->app->json(['success' => !$error]);
|
||||
}
|
||||
|
||||
public function submitStatusBitAction(Request $request, $databox_id, $bit) {
|
||||
if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$this->app->abort(403);
|
||||
}
|
||||
|
||||
$properties = [
|
||||
'searchable' => $request->request->get('searchable') ? '1' : '0',
|
||||
'printable' => $request->request->get('printable') ? '1' : '0',
|
||||
'name' => $request->request->get('name', ''),
|
||||
'labelon' => $request->request->get('label_on', ''),
|
||||
'labeloff' => $request->request->get('label_off', ''),
|
||||
'labels_on' => $request->request->get('labels_on', []),
|
||||
'labels_off' => $request->request->get('labels_off', []),
|
||||
];
|
||||
|
||||
$databox = $this->findDataboxById($databox_id);
|
||||
|
||||
/** @var StatusStructureProviderInterface $statusProvider */
|
||||
$statusProvider = $this->app['status.provider'];
|
||||
$statusProvider->updateStatus($databox->getStatusStructure(), $bit, $properties);
|
||||
|
||||
if (null !== $request->request->get('delete_icon_off')) {
|
||||
\databox_status::deleteIcon($this->app, $databox_id, $bit, 'off');
|
||||
}
|
||||
|
||||
if (null !== $file = $request->files->get('image_off')) {
|
||||
try {
|
||||
\databox_status::updateIcon($this->app, $databox_id, $bit, 'off', $file);
|
||||
} catch (AccessDeniedHttpException $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'rights',
|
||||
]);
|
||||
} catch (\Exception_InvalidArgument $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'unknow-error',
|
||||
]);
|
||||
} catch (\Exception_Upload_FileTooBig $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'too-big',
|
||||
]);
|
||||
} catch (\Exception_Upload_Error $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'upload-error',
|
||||
]);
|
||||
} catch (\Exception_Upload_CannotWriteFile $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'wright-error',
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'unknow-error',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
if (null !== $request->request->get('delete_icon_on')) {
|
||||
\databox_status::deleteIcon($this->app, $databox_id, $bit, 'on');
|
||||
}
|
||||
|
||||
if (null !== $file = $request->files->get('image_on')) {
|
||||
try {
|
||||
\databox_status::updateIcon($this->app, $databox_id, $bit, 'on', $file);
|
||||
} catch (AccessDeniedHttpException $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'rights',
|
||||
]);
|
||||
} catch (\Exception_InvalidArgument $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'unknow-error',
|
||||
]);
|
||||
} catch (\Exception_Upload_FileTooBig $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'too-big',
|
||||
]);
|
||||
} catch (\Exception_Upload_Error $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'upload-error',
|
||||
]);
|
||||
} catch (\Exception_Upload_CannotWriteFile $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'wright-error',
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return $this->app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'unknow-error',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->app->redirectPath('database_display_statusbit', ['databox_id' => $databox_id, 'success' => 1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $section
|
||||
* @return array
|
||||
*/
|
||||
private function getSectionParameters($section)
|
||||
{
|
||||
$available = [
|
||||
'connected',
|
||||
'registrations',
|
||||
'taskmanager',
|
||||
'base',
|
||||
'bases',
|
||||
'collection',
|
||||
'user',
|
||||
'users',
|
||||
];
|
||||
|
||||
$feature = 'connected';
|
||||
$featured = false;
|
||||
$position = explode(':', $section);
|
||||
if (count($position) > 0) {
|
||||
if (in_array($position[0], $available)) {
|
||||
$feature = $position[0];
|
||||
|
||||
if (isset($position[1])) {
|
||||
$featured = $position[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$databoxes = $off_databoxes = [];
|
||||
$acl = $this->getAclForUser();
|
||||
foreach ($this->getApplicationBox()->get_databoxes() as $databox) {
|
||||
try {
|
||||
if (!$acl->has_access_to_sbas($databox->get_sbas_id())) {
|
||||
continue;
|
||||
}
|
||||
$databox->get_connection();
|
||||
} catch (\Exception $e) {
|
||||
$off_databoxes[] = $databox;
|
||||
continue;
|
||||
}
|
||||
|
||||
$databoxes[] = $databox;
|
||||
}
|
||||
|
||||
return [
|
||||
'feature' => $feature,
|
||||
'featured' => $featured,
|
||||
'databoxes' => $databoxes,
|
||||
'off_databoxes' => $off_databoxes,
|
||||
];
|
||||
}
|
||||
}
|
@@ -11,443 +11,77 @@
|
||||
|
||||
namespace Alchemy\Phrasea\ControllerProvider\Admin;
|
||||
|
||||
use Alchemy\Phrasea\Exception\SessionNotFound;
|
||||
use Alchemy\Phrasea\Helper\DatabaseHelper;
|
||||
use Alchemy\Phrasea\Helper\PathHelper;
|
||||
use Alchemy\Phrasea\Application as PhraseaApplication;
|
||||
use Alchemy\Phrasea\Controller\Admin\RootController;
|
||||
use Alchemy\Phrasea\Security\Firewall;
|
||||
use Silex\Application;
|
||||
use Silex\ControllerCollection;
|
||||
use Silex\ControllerProviderInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
||||
use Silex\ServiceProviderInterface;
|
||||
|
||||
class Root implements ControllerProviderInterface
|
||||
class Root implements ControllerProviderInterface, ServiceProviderInterface
|
||||
{
|
||||
public function register(Application $app)
|
||||
{
|
||||
$app['controller.admin.root'] = $app->share(function (PhraseaApplication $app) {
|
||||
return new RootController($app);
|
||||
});
|
||||
}
|
||||
|
||||
public function boot(Application $app)
|
||||
{
|
||||
}
|
||||
|
||||
public function connect(Application $app)
|
||||
{
|
||||
$app['controller.admin.root'] = $this;
|
||||
|
||||
/** @var ControllerCollection $controllers */
|
||||
$controllers = $app['controllers_factory'];
|
||||
$app['firewall']->addMandatoryAuthentication($controllers);
|
||||
|
||||
$controllers->before(function (Request $request) use ($app) {
|
||||
$app['firewall']->requireAccessToModule('admin');
|
||||
/** @var Firewall $firewall */
|
||||
$firewall = $app['firewall'];
|
||||
$firewall->addMandatoryAuthentication($controllers);
|
||||
|
||||
$controllers->before(function () use ($firewall) {
|
||||
$firewall->requireAccessToModule('admin');
|
||||
});
|
||||
|
||||
$controllers->get('/', function (Application $app, Request $request) {
|
||||
try {
|
||||
\Session_Logger::updateClientInfos($app, 3);
|
||||
} catch (SessionNotFound $e) {
|
||||
return $app->redirectPath('logout');
|
||||
}
|
||||
$controllers->get('/', 'controller.admin.root:indexAction')
|
||||
->bind('admin');
|
||||
|
||||
$section = $request->query->get('section', false);
|
||||
$controllers->get('/tree/', 'controller.admin.root:displayTreeAction')
|
||||
->bind('admin_display_tree');
|
||||
|
||||
$available = [
|
||||
'connected',
|
||||
'registrations',
|
||||
'taskmanager',
|
||||
'base',
|
||||
'bases',
|
||||
'collection',
|
||||
'user',
|
||||
'users'
|
||||
];
|
||||
|
||||
$feature = 'connected';
|
||||
$featured = false;
|
||||
$position = explode(':', $section);
|
||||
if (count($position) > 0) {
|
||||
if (in_array($position[0], $available)) {
|
||||
$feature = $position[0];
|
||||
|
||||
if (isset($position[1])) {
|
||||
$featured = $position[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$databoxes = $off_databoxes = [];
|
||||
foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) {
|
||||
try {
|
||||
if (!$app['acl']->get($app['authentication']->getUser())->has_access_to_sbas($databox->get_sbas_id())) {
|
||||
continue;
|
||||
}
|
||||
$databox->get_connection();
|
||||
} catch (\Exception $e) {
|
||||
$off_databoxes[] = $databox;
|
||||
continue;
|
||||
}
|
||||
|
||||
$databoxes[] = $databox;
|
||||
}
|
||||
|
||||
$params = [
|
||||
'feature' => $feature,
|
||||
'featured' => $featured,
|
||||
'databoxes' => $databoxes,
|
||||
'off_databoxes' => $off_databoxes
|
||||
];
|
||||
|
||||
return $app['twig']->render('admin/index.html.twig', [
|
||||
'module' => 'admin',
|
||||
'events' => $app['events-manager'],
|
||||
'module_name' => 'Admin',
|
||||
'notice' => $request->query->get("notice"),
|
||||
'feature' => $feature,
|
||||
'featured' => $featured,
|
||||
'databoxes' => $databoxes,
|
||||
'off_databoxes' => $off_databoxes,
|
||||
'tree' => $app['twig']->render('admin/tree.html.twig', $params),
|
||||
]);
|
||||
})->bind('admin');
|
||||
|
||||
$controllers->get('/tree/', function (Application $app, Request $request) {
|
||||
try {
|
||||
\Session_Logger::updateClientInfos($app, 3);
|
||||
} catch (SessionNotFound $e) {
|
||||
return $app->redirectPath('logout');
|
||||
}
|
||||
|
||||
$available = [
|
||||
'connected',
|
||||
'registrations',
|
||||
'taskmanager',
|
||||
'base',
|
||||
'bases',
|
||||
'collection',
|
||||
'user',
|
||||
'users'
|
||||
];
|
||||
|
||||
$feature = 'connected';
|
||||
$featured = false;
|
||||
|
||||
$position = explode(':', $request->query->get('position', false));
|
||||
if (count($position) > 0) {
|
||||
if (in_array($position[0], $available)) {
|
||||
$feature = $position[0];
|
||||
|
||||
if (isset($position[1])) {
|
||||
$featured = $position[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$databoxes = $off_databoxes = [];
|
||||
foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) {
|
||||
try {
|
||||
if (!$app['acl']->get($app['authentication']->getUser())->has_access_to_sbas($databox->get_sbas_id())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$databox->get_connection();
|
||||
} catch (\Exception $e) {
|
||||
$off_databoxes[] = $databox;
|
||||
continue;
|
||||
}
|
||||
|
||||
$databoxes[] = $databox;
|
||||
}
|
||||
|
||||
$params = [
|
||||
'feature' => $feature,
|
||||
'featured' => $featured,
|
||||
'databoxes' => $databoxes,
|
||||
'off_databoxes' => $off_databoxes
|
||||
];
|
||||
|
||||
return $app['twig']->render('admin/tree.html.twig', $params);
|
||||
})->bind('admin_display_tree');
|
||||
|
||||
$controllers->get('/test-paths/', function (Application $app, Request $request) {
|
||||
if (!$request->isXmlHttpRequest()) {
|
||||
$app->abort(400);
|
||||
}
|
||||
if (!array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) {
|
||||
$app->abort(400, $app->trans('Bad request format, only JSON is allowed'));
|
||||
}
|
||||
|
||||
if (0 === count($tests = $request->query->get('tests', []))) {
|
||||
$app->abort(400, $app->trans('Missing tests parameter'));
|
||||
}
|
||||
|
||||
if (null === $path = $request->query->get('path')) {
|
||||
$app->abort(400, $app->trans('Missing path parameter'));
|
||||
}
|
||||
|
||||
foreach ($tests as $test) {
|
||||
switch ($test) {
|
||||
case 'writeable':
|
||||
$result = is_writable($path);
|
||||
break;
|
||||
case 'readable':
|
||||
default:
|
||||
$result = is_readable($path);
|
||||
}
|
||||
}
|
||||
|
||||
return $app->json(['results' => $result]);
|
||||
})
|
||||
$controllers->get('/test-paths/', 'controller.admin.root:testPathsAction')
|
||||
->bind('admin_test_paths');
|
||||
|
||||
$controllers->get('/structure/{databox_id}/', function (Application $app, Request $request, $databox_id) {
|
||||
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$app->abort(403);
|
||||
}
|
||||
$controllers->get('/structure/{databox_id}/', 'controller.admin.root:displayDataboxStructureAction')
|
||||
->assert('databox_id', '\d+')
|
||||
->bind('database_display_stucture');
|
||||
|
||||
$databox = $app['phraseanet.appbox']->get_databox((int) $databox_id);
|
||||
$structure = $databox->get_structure();
|
||||
$errors = \databox::get_structure_errors($app['translator'], $structure);
|
||||
$controllers->post('/structure/{databox_id}/', 'controller.admin.root:submitDatabaseStructureAction')
|
||||
->assert('databox_id', '\d+')
|
||||
->bind('database_submit_stucture');
|
||||
|
||||
if ($updateOk = !!$request->query->get('success', false)) {
|
||||
$updateOk = true;
|
||||
}
|
||||
$controllers->get('/statusbit/{databox_id}/', 'controller.admin.root:displayStatusBitAction')
|
||||
->assert('databox_id', '\d+')
|
||||
->bind('database_display_statusbit');
|
||||
|
||||
if (false !== $errorsStructure = $request->query->get('error', false)) {
|
||||
$errorsStructure = true;
|
||||
}
|
||||
$controllers
|
||||
->get('/statusbit/{databox_id}/status/{bit}/', 'controller.admin.root:displayDatabaseStatusBitFormAction')
|
||||
->assert('databox_id', '\d+')
|
||||
->assert('bit', '\d+')
|
||||
->bind('database_display_statusbit_form');
|
||||
|
||||
return $app['twig']->render('admin/structure.html.twig', [
|
||||
'databox' => $databox,
|
||||
'errors' => $errors,
|
||||
'structure' => $structure,
|
||||
'errorsStructure' => $errorsStructure,
|
||||
'updateOk' => $updateOk
|
||||
]);
|
||||
})->assert('databox_id', '\d+')
|
||||
->bind('database_display_stucture');
|
||||
|
||||
$controllers->post('/structure/{databox_id}/', function (Application $app, Request $request, $databox_id) {
|
||||
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$app->abort(403);
|
||||
}
|
||||
|
||||
if (null === $structure = $request->request->get('structure')) {
|
||||
$app->abort(400, $app->trans('Missing "structure" parameter'));
|
||||
}
|
||||
|
||||
$errors = \databox::get_structure_errors($app['translator'], $structure);
|
||||
|
||||
$domst = new \DOMDocument('1.0', 'UTF-8');
|
||||
$domst->preserveWhiteSpace = false;
|
||||
$domst->formatOutput = true;
|
||||
|
||||
if (count($errors) == 0 && $domst->loadXML($structure)) {
|
||||
$databox = $app['phraseanet.appbox']->get_databox($databox_id);
|
||||
$databox->saveStructure($domst);
|
||||
|
||||
return $app->redirectPath('database_display_stucture', ['databox_id' => $databox_id, 'success' => 1]);
|
||||
} else {
|
||||
return $app->redirectPath('database_display_stucture', ['databox_id' => $databox_id, 'success' => 0, 'error' => 'struct']);
|
||||
}
|
||||
})->assert('databox_id', '\d+')
|
||||
->bind('database_submit_stucture');
|
||||
|
||||
$controllers->get('/statusbit/{databox_id}/', function (Application $app, Request $request, $databox_id) {
|
||||
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$app->abort(403);
|
||||
}
|
||||
|
||||
return $app['twig']->render('admin/statusbit.html.twig', [
|
||||
'databox' => $app['phraseanet.appbox']->get_databox($databox_id),
|
||||
]);
|
||||
})->assert('databox_id', '\d+')
|
||||
->bind('database_display_statusbit');
|
||||
|
||||
$controllers->get('/statusbit/{databox_id}/status/{bit}/', function (Application $app, Request $request, $databox_id, $bit) {
|
||||
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$app->abort(403);
|
||||
}
|
||||
|
||||
$databox = $app['phraseanet.appbox']->get_databox($databox_id);
|
||||
|
||||
$statusStructure = $databox->getStatusStructure();
|
||||
|
||||
switch ($errorMsg = $request->query->get('error')) {
|
||||
case 'rights':
|
||||
$errorMsg = $app->trans('You do not enough rights to update status');
|
||||
break;
|
||||
case 'too-big':
|
||||
$errorMsg = $app->trans('File is too big : 64k max');
|
||||
break;
|
||||
case 'upload-error':
|
||||
$errorMsg = $app->trans('Status icon upload failed : upload error');
|
||||
break;
|
||||
case 'wright-error':
|
||||
$errorMsg = $app->trans('Status icon upload failed : can not write on disk');
|
||||
break;
|
||||
case 'unknow-error':
|
||||
$errorMsg = $app->trans('Something wrong happend');
|
||||
break;
|
||||
}
|
||||
|
||||
if ($statusStructure->hasStatus($bit)) {
|
||||
$status = $statusStructure->getStatus($bit);
|
||||
} else {
|
||||
$status = [
|
||||
"labeloff" => '',
|
||||
"labelon" => '',
|
||||
"img_off" => '',
|
||||
"img_on" => '',
|
||||
"path_off" => '',
|
||||
"path_on" => '',
|
||||
"searchable" => false,
|
||||
"printable" => false,
|
||||
];
|
||||
|
||||
foreach ($app['locales.available'] as $code => $language) {
|
||||
$status['labels_on'][$code] = null;
|
||||
$status['labels_off'][$code] = null;
|
||||
}
|
||||
}
|
||||
|
||||
return $app['twig']->render('admin/statusbit/edit.html.twig', [
|
||||
'status' => $status,
|
||||
'errorMsg' => $errorMsg
|
||||
]);
|
||||
})->assert('databox_id', '\d+')
|
||||
->assert('bit', '\d+')
|
||||
->bind('database_display_statusbit_form');
|
||||
|
||||
$controllers->post('/statusbit/{databox_id}/status/{bit}/delete/', function (Application $app, Request $request, $databox_id, $bit) {
|
||||
if (!$request->isXmlHttpRequest() || !array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) {
|
||||
$app->abort(400, $app->trans('Bad request format, only JSON is allowed'));
|
||||
}
|
||||
|
||||
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$app->abort(403);
|
||||
}
|
||||
|
||||
$databox = $app['phraseanet.appbox']->get_databox($databox_id);
|
||||
|
||||
$error = false;
|
||||
|
||||
try {
|
||||
$app['status.provider']->deleteStatus($databox->getStatusStructure(), $bit);
|
||||
} catch (\Exception $e) {
|
||||
$error = true;
|
||||
}
|
||||
|
||||
return $app->json(['success' => !$error]);
|
||||
})
|
||||
$controllers
|
||||
->post('/statusbit/{databox_id}/status/{bit}/delete/', 'controller.admin.root:deleteStatusBitAction')
|
||||
->bind('admin_statusbit_delete')
|
||||
->assert('databox_id', '\d+')
|
||||
->assert('bit', '\d+');
|
||||
|
||||
$controllers->post('/statusbit/{databox_id}/status/{bit}/', function (Application $app, Request $request, $databox_id, $bit) {
|
||||
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
|
||||
$app->abort(403);
|
||||
}
|
||||
|
||||
$properties = [
|
||||
'searchable' => $request->request->get('searchable') ? '1' : '0',
|
||||
'printable' => $request->request->get('printable') ? '1' : '0',
|
||||
'name' => $request->request->get('name', ''),
|
||||
'labelon' => $request->request->get('label_on', ''),
|
||||
'labeloff' => $request->request->get('label_off', ''),
|
||||
'labels_on' => $request->request->get('labels_on', []),
|
||||
'labels_off' => $request->request->get('labels_off', []),
|
||||
];
|
||||
|
||||
$databox = $app['phraseanet.appbox']->get_databox($databox_id);
|
||||
|
||||
$app['status.provider']->updateStatus($databox->getStatusStructure(), $bit, $properties);
|
||||
|
||||
if (null !== $request->request->get('delete_icon_off')) {
|
||||
\databox_status::deleteIcon($app, $databox_id, $bit, 'off');
|
||||
}
|
||||
|
||||
if (null !== $file = $request->files->get('image_off')) {
|
||||
try {
|
||||
\databox_status::updateIcon($app, $databox_id, $bit, 'off', $file);
|
||||
} catch (AccessDeniedHttpException $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'rights',
|
||||
]);
|
||||
} catch (\Exception_InvalidArgument $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'unknow-error',
|
||||
]);
|
||||
} catch (\Exception_Upload_FileTooBig $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'too-big',
|
||||
]);
|
||||
} catch (\Exception_Upload_Error $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'upload-error',
|
||||
]);
|
||||
} catch (\Exception_Upload_CannotWriteFile $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'wright-error',
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'unknow-error',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
if (null !== $request->request->get('delete_icon_on')) {
|
||||
\databox_status::deleteIcon($app, $databox_id, $bit, 'on');
|
||||
}
|
||||
|
||||
if (null !== $file = $request->files->get('image_on')) {
|
||||
try {
|
||||
\databox_status::updateIcon($app, $databox_id, $bit, 'on', $file);
|
||||
} catch (AccessDeniedHttpException $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'rights',
|
||||
]);
|
||||
} catch (\Exception_InvalidArgument $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'unknow-error',
|
||||
]);
|
||||
} catch (\Exception_Upload_FileTooBig $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'too-big',
|
||||
]);
|
||||
} catch (\Exception_Upload_Error $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'upload-error',
|
||||
]);
|
||||
} catch (\Exception_Upload_CannotWriteFile $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'wright-error',
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return $app->redirectPath('database_display_statusbit_form', [
|
||||
'databox_id' => $databox_id,
|
||||
'bit' => $bit,
|
||||
'error' => 'unknow-error',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return $app->redirectPath('database_display_statusbit', ['databox_id' => $databox_id, 'success' => 1]);
|
||||
})->assert('databox_id', '\d+')
|
||||
->assert('bit', '\d+')
|
||||
->bind('database_submit_statusbit');
|
||||
$controllers->post('/statusbit/{databox_id}/status/{bit}/', 'controller.admin.root:submitStatusBitAction')
|
||||
->assert('databox_id', '\d+')
|
||||
->assert('bit', '\d+')
|
||||
->bind('database_submit_statusbit');
|
||||
|
||||
return $controllers;
|
||||
}
|
||||
|
@@ -12,6 +12,8 @@
|
||||
use Alchemy\Phrasea\Application;
|
||||
use Alchemy\Phrasea\Model\Entities\User;
|
||||
use Alchemy\Phrasea\Exception\InvalidArgumentException;
|
||||
use Alchemy\Phrasea\Status\StatusStructure;
|
||||
use Alchemy\Phrasea\Status\StatusStructureFactory;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\Driver\Statement;
|
||||
use Symfony\Component\Filesystem\Filesystem;
|
||||
@@ -305,12 +307,13 @@ class databox extends base
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return databox_status
|
||||
* @return StatusStructure
|
||||
*/
|
||||
public function getStatusStructure()
|
||||
{
|
||||
return $this->app['factory.status-structure']->getStructure($this);
|
||||
/** @var StatusStructureFactory $structureFactory */
|
||||
$structureFactory = $this->app['factory.status-structure'];
|
||||
return $structureFactory->getStructure($this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1348,8 +1351,8 @@ class databox extends base
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string $structure
|
||||
* @param TranslatorInterface $translator
|
||||
* @param string $structure
|
||||
* @return Array
|
||||
*/
|
||||
public static function get_structure_errors(TranslatorInterface $translator, $structure)
|
||||
|
Reference in New Issue
Block a user