Split Workzone into provider/controller

This commit is contained in:
Benoît Burnichon
2015-06-08 12:16:19 +02:00
parent 4529c4dd6b
commit b1583528b1
3 changed files with 189 additions and 159 deletions

View File

@@ -12,7 +12,6 @@
namespace Alchemy\Phrasea;
use Alchemy\Geonames\GeonamesServiceProvider;
use Alchemy\Phrasea\ControllerProvider\Prod\WorkZone;
use Alchemy\Phrasea\ControllerProvider\Report\Activity as ReportActivity;
use Alchemy\Phrasea\ControllerProvider\Report\Informations as ReportInformations;
use Alchemy\Phrasea\ControllerProvider\Report\Root as ReportRoot;
@@ -315,6 +314,7 @@ class Application extends SilexApplication
'Alchemy\Phrasea\ControllerProvider\Prod\TOU' => [],
'Alchemy\Phrasea\ControllerProvider\Prod\Upload' => [],
'Alchemy\Phrasea\ControllerProvider\Prod\UsrLists' => [],
'Alchemy\Phrasea\ControllerProvider\Prod\WorkZone' => [],
'Alchemy\Phrasea\ControllerProvider\Datafiles' => [],
'Alchemy\Phrasea\ControllerProvider\Lightbox' => [],
'Alchemy\Phrasea\ControllerProvider\MediaAccessor' => [],
@@ -625,8 +625,6 @@ class Application extends SilexApplication
$this->mount('/login/', new Login());
$this->mount('/developers/', new Developers());
$this->mount('/prod/WorkZone', new WorkZone());
$this->mount('/user/preferences/', new Preferences());
$this->mount('/user/notifications/', new Notifications());
@@ -681,6 +679,7 @@ class Application extends SilexApplication
'/prod/tooltip' => 'Alchemy\Phrasea\ControllerProvider\Prod\Tooltip',
'/prod/TOU/' => 'Alchemy\Phrasea\ControllerProvider\Prod\TOU',
'/prod/upload/' => 'Alchemy\Phrasea\ControllerProvider\Prod\Upload',
'/prod/WorkZone' => 'Alchemy\Phrasea\ControllerProvider\Prod\WorkZone',
'/prod/' => 'Alchemy\Phrasea\ControllerProvider\Prod\Root',
'/setup' => 'Alchemy\Phrasea\ControllerProvider\Setup',
];

View File

@@ -0,0 +1,170 @@
<?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\Prod;
use Alchemy\Phrasea\Application;
use Alchemy\Phrasea\Controller\Controller;
use Alchemy\Phrasea\Helper\WorkZone as WorkzoneHelper;
use Alchemy\Phrasea\Model\Entities\Basket;
use Alchemy\Phrasea\Model\Entities\StoryWZ;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class WorkzoneController extends Controller
{
public function displayWorkzone(Application $app)
{
$params = [
'WorkZone' => new WorkzoneHelper($app, $app['request'])
, 'selected_type' => $app['request']->query->get('type')
, 'selected_id' => $app['request']->query->get('id')
, 'srt' => $app['request']->query->get('sort')
];
return $app['twig']->render('prod/WorkZone/WorkZone.html.twig', $params);
}
public function browse(Application $app)
{
return $app['twig']->render('prod/WorkZone/Browser/Browser.html.twig');
}
public function browserSearch(Application $app)
{
$request = $app['request'];
$BasketRepo = $app['repo.baskets'];
$Page = (int) $request->query->get('Page', 0);
$PerPage = 10;
$offsetStart = max(($Page - 1) * $PerPage, 0);
$Baskets = $BasketRepo->findWorkzoneBasket(
$app['authentication']->getUser()
, $request->query->get('Query')
, $request->query->get('Year')
, $request->query->get('Type')
, $offsetStart
, $PerPage
);
$page = floor($offsetStart / $PerPage) + 1;
$maxPage = floor(count($Baskets) / $PerPage) + 1;
$params = [
'Baskets' => $Baskets
, 'Page' => $page
, 'MaxPage' => $maxPage
, 'Total' => count($Baskets)
, 'Query' => $request->query->get('Query')
, 'Year' => $request->query->get('Year')
, 'Type' => $request->query->get('Type')
];
return $app['twig']->render('prod/WorkZone/Browser/Results.html.twig', $params);
}
public function browseBasket(Application $app, Request $request, Basket $basket)
{
return $app['twig']->render('prod/WorkZone/Browser/Basket.html.twig', ['Basket' => $basket]);
}
public function attachStories(Application $app, Request $request)
{
if (!$request->request->get('stories')) {
throw new BadRequestHttpException('Missing parameters stories');
}
$StoryWZRepo = $app['repo.story-wz'];
$alreadyFixed = $done = 0;
$stories = $request->request->get('stories', []);
foreach ($stories as $element) {
$element = explode('_', $element);
$Story = new \record_adapter($app, $element[0], $element[1]);
if (!$Story->is_grouping()) {
throw new \Exception('You can only attach stories');
}
if (!$app['acl']->get($app['authentication']->getUser())->has_access_to_base($Story->get_base_id())) {
throw new AccessDeniedHttpException('You do not have access to this Story');
}
if ($StoryWZRepo->findUserStory($app, $app['authentication']->getUser(), $Story)) {
$alreadyFixed++;
continue;
}
$StoryWZ = new StoryWZ();
$StoryWZ->setUser($app['authentication']->getUser());
$StoryWZ->setRecord($Story);
$app['orm.em']->persist($StoryWZ);
$done++;
}
$app['orm.em']->flush();
if ($alreadyFixed === 0) {
if ($done <= 1) {
$message = $app->trans('%quantity% Story attached to the WorkZone', ['%quantity%' => $done]);
} else {
$message = $app->trans('%quantity% Stories attached to the WorkZone', ['%quantity%' => $done]);
}
} else {
if ($done <= 1) {
$message = $app->trans('%quantity% Story attached to the WorkZone, %quantity_already% already attached', ['%quantity%' => $done, '%quantity_already%' => $alreadyFixed]);
} else {
$message = $app->trans('%quantity% Stories attached to the WorkZone, %quantity_already% already attached', ['%quantity%' => $done, '%quantity_already%' => $alreadyFixed]);
}
}
if ($request->getRequestFormat() == 'json') {
return $app->json([
'success' => true
, 'message' => $message
]);
}
return $app->redirectPath('prod_workzone_show');
}
public function detachStory(Application $app, Request $request, $sbas_id, $record_id)
{
$Story = new \record_adapter($app, $sbas_id, $record_id);
$repository = $app['repo.story-wz'];
$StoryWZ = $repository->findUserStory($app, $app['authentication']->getUser(), $Story);
if (!$StoryWZ) {
throw new NotFoundHttpException('Story not found');
}
$app['orm.em']->remove($StoryWZ);
$app['orm.em']->flush();
if ($request->getRequestFormat() == 'json') {
return $app->json([
'success' => true
, 'message' => $app->trans('Story detached from the WorkZone')
]);
}
return $app->redirectPath('prod_workzone_show');
}
}

View File

@@ -11,25 +11,32 @@
namespace Alchemy\Phrasea\ControllerProvider\Prod;
use Alchemy\Phrasea\Application as PhraseaApplication;
use Alchemy\Phrasea\Controller\Prod\WorkzoneController;
use Alchemy\Phrasea\ControllerProvider\ControllerProviderTrait;
use Alchemy\Phrasea\Model\Entities\Basket;
use Alchemy\Phrasea\Model\Entities\StoryWZ;
use Alchemy\Phrasea\Helper\WorkZone as WorkzoneHelper;
use Silex\Application;
use Silex\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Silex\ServiceProviderInterface;
class WorkZone implements ControllerProviderInterface
class WorkZone implements ControllerProviderInterface, ServiceProviderInterface
{
use ControllerProviderTrait;
public function register(Application $app)
{
$app['controller.prod.workzone'] = $app->share(function (PhraseaApplication $app) {
return (new WorkzoneController($app))
;
});
}
public function boot(Application $app)
{
// no-op
}
public function connect(Application $app)
{
$app['controller.prod.workzone'] = $this;
$controllers = $this->createAuthenticatedCollection($app);
$controllers
@@ -59,150 +66,4 @@ class WorkZone implements ControllerProviderInterface
return $controllers;
}
public function displayWorkzone(Application $app)
{
$params = [
'WorkZone' => new WorkzoneHelper($app, $app['request'])
, 'selected_type' => $app['request']->query->get('type')
, 'selected_id' => $app['request']->query->get('id')
, 'srt' => $app['request']->query->get('sort')
];
return $app['twig']->render('prod/WorkZone/WorkZone.html.twig', $params);
}
public function browse(Application $app)
{
return $app['twig']->render('prod/WorkZone/Browser/Browser.html.twig');
}
public function browserSearch(Application $app)
{
$request = $app['request'];
$BasketRepo = $app['repo.baskets'];
$Page = (int) $request->query->get('Page', 0);
$PerPage = 10;
$offsetStart = max(($Page - 1) * $PerPage, 0);
$Baskets = $BasketRepo->findWorkzoneBasket(
$app['authentication']->getUser()
, $request->query->get('Query')
, $request->query->get('Year')
, $request->query->get('Type')
, $offsetStart
, $PerPage
);
$page = floor($offsetStart / $PerPage) + 1;
$maxPage = floor(count($Baskets) / $PerPage) + 1;
$params = [
'Baskets' => $Baskets
, 'Page' => $page
, 'MaxPage' => $maxPage
, 'Total' => count($Baskets)
, 'Query' => $request->query->get('Query')
, 'Year' => $request->query->get('Year')
, 'Type' => $request->query->get('Type')
];
return $app['twig']->render('prod/WorkZone/Browser/Results.html.twig', $params);
}
public function browseBasket(Application $app, Request $request, Basket $basket)
{
return $app['twig']->render('prod/WorkZone/Browser/Basket.html.twig', ['Basket' => $basket]);
}
public function attachStories(Application $app, Request $request)
{
if (!$request->request->get('stories')) {
throw new BadRequestHttpException('Missing parameters stories');
}
$StoryWZRepo = $app['repo.story-wz'];
$alreadyFixed = $done = 0;
$stories = $request->request->get('stories', []);
foreach ($stories as $element) {
$element = explode('_', $element);
$Story = new \record_adapter($app, $element[0], $element[1]);
if (!$Story->is_grouping()) {
throw new \Exception('You can only attach stories');
}
if (!$app['acl']->get($app['authentication']->getUser())->has_access_to_base($Story->get_base_id())) {
throw new AccessDeniedHttpException('You do not have access to this Story');
}
if ($StoryWZRepo->findUserStory($app, $app['authentication']->getUser(), $Story)) {
$alreadyFixed++;
continue;
}
$StoryWZ = new StoryWZ();
$StoryWZ->setUser($app['authentication']->getUser());
$StoryWZ->setRecord($Story);
$app['orm.em']->persist($StoryWZ);
$done++;
}
$app['orm.em']->flush();
if ($alreadyFixed === 0) {
if ($done <= 1) {
$message = $app->trans('%quantity% Story attached to the WorkZone', ['%quantity%' => $done]);
} else {
$message = $app->trans('%quantity% Stories attached to the WorkZone', ['%quantity%' => $done]);
}
} else {
if ($done <= 1) {
$message = $app->trans('%quantity% Story attached to the WorkZone, %quantity_already% already attached', ['%quantity%' => $done, '%quantity_already%' => $alreadyFixed]);
} else {
$message = $app->trans('%quantity% Stories attached to the WorkZone, %quantity_already% already attached', ['%quantity%' => $done, '%quantity_already%' => $alreadyFixed]);
}
}
if ($request->getRequestFormat() == 'json') {
return $app->json([
'success' => true
, 'message' => $message
]);
}
return $app->redirectPath('prod_workzone_show');
}
public function detachStory(Application $app, Request $request, $sbas_id, $record_id)
{
$Story = new \record_adapter($app, $sbas_id, $record_id);
$repository = $app['repo.story-wz'];
$StoryWZ = $repository->findUserStory($app, $app['authentication']->getUser(), $Story);
if (!$StoryWZ) {
throw new NotFoundHttpException('Story not found');
}
$app['orm.em']->remove($StoryWZ);
$app['orm.em']->flush();
if ($request->getRequestFormat() == 'json') {
return $app->json([
'success' => true
, 'message' => $app->trans('Story detached from the WorkZone')
]);
}
return $app->redirectPath('prod_workzone_show');
}
}