diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index 3a50fa8eda..06289d410a 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -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', ]; diff --git a/lib/Alchemy/Phrasea/Controller/Prod/WorkzoneController.php b/lib/Alchemy/Phrasea/Controller/Prod/WorkzoneController.php new file mode 100644 index 0000000000..d152e483ba --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Prod/WorkzoneController.php @@ -0,0 +1,170 @@ + 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'); + } +} diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Prod/WorkZone.php b/lib/Alchemy/Phrasea/ControllerProvider/Prod/WorkZone.php index 70c176be18..60b22981e3 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Prod/WorkZone.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Prod/WorkZone.php @@ -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'); - } }