From f91926c730a561feeb1a97a862e61adfac87e787 Mon Sep 17 00:00:00 2001 From: gjacobjn <52928254+gjacobjn@users.noreply.github.com> Date: Wed, 13 May 2020 18:00:23 +0200 Subject: [PATCH 001/165] Add GS1 database model Add GS1 database model --- lib/conf.d/data_templates/gs1.xml | 235 ++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 lib/conf.d/data_templates/gs1.xml diff --git a/lib/conf.d/data_templates/gs1.xml b/lib/conf.d/data_templates/gs1.xml new file mode 100644 index 0000000000..a4ff9a6612 --- /dev/null +++ b/lib/conf.d/data_templates/gs1.xml @@ -0,0 +1,235 @@ + + + {{datapathnoweb}}{{basename}}/documents + + + + {{datapathnoweb}}{{basename}}/subdefs + 1024 + resample + 72 + no + 75 + yes + screen + image + + + + + {{datapathnoweb}}{{basename}}/subdefs + 240 + resample + 72 + yes + 75 + no + screen + image + + + + + 480 + 72 + yes + 75 + {{datapathnoweb}}{{basename}}/subdefs + image + no + handheld + + + + + 150 + 72 + yes + 75 + {{datapathnoweb}}{{basename}}/subdefs + image + no + handheld + + + + + + + {{datapathnoweb}}{{basename}}/subdefs + 240 + screen + image + no + + + + + {{datapathnoweb}}{{basename}}/subdefs + 240 + gif + 150 + screen + no + + + + + {{datapathnoweb}}{{basename}}/subdefs + 748 + video + yes + libfaac + libx264 + screen + 1000 + 128 + 48000 + 25 + 25 + + + + + {{datapathnoweb}}{{basename}}/subdefs + 748 + video + screen + 1000 + 128 + 48000 + libvorbis + 25 + 25 + libvpx + + + + + + + {{datapathnoweb}}{{basename}}/subdefs + image + 240 + screen + no + + + + + {{datapathnoweb}}{{basename}}/subdefs + audio + yes + 128 + 48000 + screen + + + + + {{datapathnoweb}}{{basename}}/subdefs + audio + handheld + + + + + + + {{datapathnoweb}}{{basename}}/subdefs + image + resample + 72 + 240 + no + screen + + + + + {{datapathnoweb}}{{basename}}/subdefs + flexpaper + no + screen + + + + + + + {{datapathnoweb}}{{basename}}/subdefs + image + 240 + no + resample + 72 + screen + + + + + {{datapathnoweb}}{{basename}}/subdefs + image + 800 + no + resample + 72 + screen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From b67c37c340c32cb1a0a44909ebfa4ddba3086e2f Mon Sep 17 00:00:00 2001 From: jygaulier Date: Tue, 2 Jun 2020 20:26:30 +0200 Subject: [PATCH 002/165] WIP --- .../Phrasea/Controller/Api/V3Controller.php | 278 ++++++++++++++++++ .../Phrasea/ControllerProvider/Api/V3.php | 10 +- 2 files changed, 287 insertions(+), 1 deletion(-) diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php index 4dcab291fe..69ad88995e 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php @@ -2,6 +2,7 @@ namespace Alchemy\Phrasea\Controller\Api; +use Alchemy\Phrasea\Application\Helper\JsonBodyAware; use Alchemy\Phrasea\Collection\Reference\CollectionReference; use Alchemy\Phrasea\Controller\Controller; use Alchemy\Phrasea\Databox\DataboxGroupable; @@ -36,8 +37,285 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use databox_field; + + class V3Controller extends Controller { + use JsonBodyAware; + + /** + * Return detailed information about one story + * + * @param Request $request + * @param int $databox_id + * @param int $record_id + * + * @return Response + */ + public function setmetadatasAction(Request $request, $databox_id, $record_id) + { + $struct = $this->findDataboxById($databox_id)->get_meta_structure(); + $record = $this->findDataboxById($databox_id)->get_record($record_id); + + //$record->set_metadatas() + + $structByKey = []; + $nameToStrucId = []; + foreach($struct as $f) { + $nameToStrucId[$f->get_name()] = $f->get_id(); + $structByKey[$f->get_id()] = $f; + $structByKey[$f->get_name()] = &$structByKey[$f->get_id()]; + } + + try { + $b = $this->decodeJsonBody($request); + } + catch(\Exception $e) { + return $this->app['controller.api.v1']->getBadRequestAction($request, 'Bad JSON'); + } + + $metadatas_ops = []; + foreach ($b->metadatas as $_m) { + // sanity + if($_m->meta_struct_id && $_m->field_name) { + return $this->app['controller.api.v1']->getBadRequestAction( + $request, + "define meta_struct_id OR field_name, not both." + ); + } + // select fields that match meta_struct_id or field_name (can be arrays) + $fields_list = null; // to filter caption_fields from record, default all + $struct_fields = []; // struct fields that match meta_struct_id or field_name + if(($field_keys = $_m->meta_struct_id ? $_m->meta_struct_id : $_m->field_name) !== null) { // can be null if none defined (=match all) + if (!is_array($field_keys)) { + $field_keys = [$field_keys]; + } + $fields_list = []; + foreach ($field_keys as $k) { + if(array_key_exists($k, $structByKey)) { + $fields_list[] = $structByKey[$k]->get_name(); + $struct_fields[$structByKey[$k]->get_id()] = $structByKey[$k]; + } + } + } + $caption_fields = $record->get_caption()->get_fields($fields_list, true); + + $meta_id = is_null($_m->meta_id) ? null : (int)($_m->meta_id); + + if(!($match_method = (string)($_m->match_method))) { + $match_method = 'ignore_case'; + } + if(!in_array($match_method, ['strict', 'ignore_case', 'regexp'])) { + return $this->app['controller.api.v1']->getBadRequestAction( + $request, + sprintf("bad match_method (%s).", $match_method) + ); + } + + $values = []; + if(is_array($_m->value)) { + foreach ($_m->value as $v) { + $values[] = is_null($v) ? null : (string)$v; + } + } + else { + $values = is_null($_m->value) ? [] : [(string)($_m->value)]; + } + + if(!($action = (string)($_m->action))) { + $action = 'set'; + } + switch($_m->action) { + case 'set': + $metadatas_ops = array_merge( + $metadatas_ops, + $this->setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values) + ); + break; + case 'add': + $metadatas_ops = array_merge( + $metadatas_ops, + $this->setmetadatasAction_add($struct_fields, $values) + ); + break; + case 'delete': + $metadatas_ops = array_merge( + $metadatas_ops, + $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, null) + ); + break; + case 'replace': + if(!is_string($_m->replace_with) && !is_null($_m->replace_with)) { + return $this->app['controller.api.v1']->getBadRequestAction( + $request, + "bad \"replace_with\" for action \"replace\"." + ); + } + $metadatas_ops = array_merge( + $metadatas_ops, + $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $_m->replace_with) + ); + break; + default: + return $this->app['controller.api.v1']->getBadRequestAction( + $request, + sprintf("bad action (%s).", $action) + ); + } + } + + return Result::create($request, $metadatas_ops)->createResponse(); + } + + private function match($pattern, $method, $value) + { + switch ($method) { + case 'strict': + return $value === $pattern; + case 'ignore_case': + return strtolower($value) === strtolower($pattern); + case 'regexp': + return preg_match($pattern, $value) == 1; + } + } + + /** + * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name + * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) + * @param int|null $meta_id + * @param string[] $values + * + * @return array ops to execute + */ + private function setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values) + { + $ops = []; + + // if one field was multi-valued and no meta_id was set, we must delete all values + foreach ($caption_fields as $cf) { + if ($cf->is_multi() && is_null($meta_id)) { + foreach ($cf->get_values() as $field_value) { + $a[] = [ + 'meta_struct_id' => $cf->get_meta_struct_id(), + 'meta_id' => $field_value->getId(), + 'value' => null + ]; + } + } + } + // now set values to matching struct_fields + foreach ($struct_fields as $sf) { + if($sf->is_multi()) { + // add the non-null value(s) + foreach ($values as $value) { + if (!is_null($value)) { + $ops[] = [ + 'meta_struct_id' => $sf->get_id(), + 'meta_id' => $meta_id, // can be null + 'value' => $value + ]; + } + } + } + else { + // mono-valued + $ops[] = [ + 'meta_struct_id' => $sf->get_id(), + 'meta_id' => $meta_id, // probably null, + 'value' => $values[0] + ]; + } + } + + return $ops; + } + + /** + * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name + * @param string[] $values + * + * @return array ops to execute + */ + private function setmetadatasAction_add($struct_fields, $values) + { + $ops = []; + + // now set values to matching struct_fields + foreach ($struct_fields as $sf) { + if(!$sf->is_multi()) { + // todo : return error "cant add to mono-valued" + continue; + } + // add the non-null value(s) + foreach ($values as $value) { + if (!is_null($value)) { + $ops[] = [ + 'meta_struct_id' => $sf->get_id(), + 'meta_id' => null, + 'value' => $value + ]; + } + } + } + + return $ops; + } + + /** + * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) + * @param int|null $meta_id + * @param string $match_method "strict" | "ignore_case" | "regexp" + * @param string[] $values + * @param string|null $replace_with + * + * @return array ops to execute + */ + private function setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $replace_with) + { + $ops = []; + + foreach ($caption_fields as $cf) { + // match all ? + if(is_null($meta_id) && count($values) == 0) { + foreach ($cf->get_values() as $field_value) { + $ops[] = [ + 'meta_struct_id' => $cf->get_meta_struct_id(), + 'meta_id' => $field_value->getId(), + 'value' => $replace_with + ]; + } + } + // match by meta-id ? + if (!is_null($meta_id)) { + foreach ($cf->get_values() as $field_value) { + if ($field_value->getId() === $meta_id) { + $a[] = [ + 'meta_struct_id' => $cf->get_meta_struct_id(), + 'meta_id' => $field_value->getId(), + 'value' => $replace_with + ]; + } + } + } + // match by value(s) ? + foreach ($values as $value) { + foreach ($cf->get_values() as $field_value) { + if ($this->match($value, $match_method, $field_value->getValue())) { + $ops[] = [ + 'meta_struct_id' => $cf->get_meta_struct_id(), + 'meta_id' => $field_value->getId(), + 'value' => $match_method=='regexp' ? preg_replace($value, $replace_with, $field_value->getValue()): $replace_with + ]; + } + } + } + } + + return $ops; + } + + /** * Return detailed information about one story * diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php b/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php index 5925c74921..f59696ddbe 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php @@ -17,7 +17,8 @@ class V3 extends Api implements ControllerProviderInterface, ServiceProviderInte public function register(Application $app) { $app['controller.api.v3'] = $app->share(function (PhraseaApplication $app) { - return (new V3Controller($app)); + return (new V3Controller($app)) + ->setJsonBodyHelper($app['json.body_helper']); }); } @@ -43,6 +44,13 @@ class V3 extends Api implements ControllerProviderInterface, ServiceProviderInte $controllers->match('/search/', 'controller.api.v3:searchAction'); + $controllers->patch('/records/{databox_id}/{record_id}/setmetadatas/', 'controller.api.v3:setmetadatasAction') + ->before('controller.api.v1:ensureCanAccessToRecord') + ->before('controller.api.v1:ensureCanModifyRecord') + ->assert('databox_id', '\d+') + ->assert('record_id', '\d+'); + $controllers->match('/records/{any_id}/{anyother_id}/setmetadatas/', 'controller.api.v1:getBadRequestAction'); + return $controllers; } } From 19d0d1901bfad66567e249989072ca096dfcacd2 Mon Sep 17 00:00:00 2001 From: Nicolas Maillat Date: Wed, 3 Jun 2020 01:49:46 +0200 Subject: [PATCH 003/165] PHRAS-3120 fix storage file path for subview fix for audiovideowav and audiovideomp3 --- lib/conf.d/data_templates/DublinCore.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/conf.d/data_templates/DublinCore.xml b/lib/conf.d/data_templates/DublinCore.xml index ffd40733f8..83e7e139fc 100644 --- a/lib/conf.d/data_templates/DublinCore.xml +++ b/lib/conf.d/data_templates/DublinCore.xml @@ -119,7 +119,7 @@ libvpx - {{datapathnoweb}}{{basename}}/subview + {{datapathnoweb}}{{basename}}/subdefs no audio 128 @@ -131,7 +131,7 @@ - {{datapathnoweb}}{{basename}}/subview + {{datapathnoweb}}{{basename}}/subdefs no audio 180 From a007b8dbb32e79f21771cd21997af272112a74de Mon Sep 17 00:00:00 2001 From: aynsix Date: Wed, 3 Jun 2020 10:33:22 +0300 Subject: [PATCH 004/165] fix xml content --- lib/conf.d/data_templates/gs1.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/conf.d/data_templates/gs1.xml b/lib/conf.d/data_templates/gs1.xml index a4ff9a6612..8c823a8906 100644 --- a/lib/conf.d/data_templates/gs1.xml +++ b/lib/conf.d/data_templates/gs1.xml @@ -198,8 +198,7 @@ - - + @@ -225,11 +224,11 @@ - + - \ No newline at end of file + From aeb7b4e60b7269e3af06274cd9364e8869c84b47 Mon Sep 17 00:00:00 2001 From: jygaulier Date: Wed, 3 Jun 2020 12:48:13 +0200 Subject: [PATCH 005/165] WIP fix ; add errors catch todo : - status-bits - apply changes to record - json output --- .../Phrasea/Controller/Api/V3Controller.php | 89 ++++++++++--------- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php index 69ad88995e..686328bb3c 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php @@ -126,43 +126,36 @@ class V3Controller extends Controller if(!($action = (string)($_m->action))) { $action = 'set'; } - switch($_m->action) { - case 'set': - $metadatas_ops = array_merge( - $metadatas_ops, - $this->setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values) - ); - break; - case 'add': - $metadatas_ops = array_merge( - $metadatas_ops, - $this->setmetadatasAction_add($struct_fields, $values) - ); - break; - case 'delete': - $metadatas_ops = array_merge( - $metadatas_ops, - $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, null) - ); - break; - case 'replace': - if(!is_string($_m->replace_with) && !is_null($_m->replace_with)) { - return $this->app['controller.api.v1']->getBadRequestAction( - $request, - "bad \"replace_with\" for action \"replace\"." - ); - } - $metadatas_ops = array_merge( - $metadatas_ops, - $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $_m->replace_with) - ); - break; - default: - return $this->app['controller.api.v1']->getBadRequestAction( - $request, - sprintf("bad action (%s).", $action) - ); + + try { + switch ($_m->action) { + case 'set': + $ops = $this->setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values); + break; + case 'add': + $ops = $this->setmetadatasAction_add($struct_fields, $values); + break; + case 'delete': + $ops = $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, null); + break; + case 'replace': + if (!is_string($_m->replace_with) && !is_null($_m->replace_with)) { + throw new \Exception("bad \"replace_with\" for action \"replace\"."); + } + $ops = $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $_m->replace_with); + break; + default: + throw new \Exception(sprintf("bad action (%s).", $action)); + } } + catch (\Exception $e) { + return $this->app['controller.api.v1']->getBadRequestAction( + $request, + $e->getMessage() + ); + } + + $metadatas_ops = array_merge($metadatas_ops, $ops); } return Result::create($request, $metadatas_ops)->createResponse(); @@ -181,12 +174,13 @@ class V3Controller extends Controller } /** - * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name - * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) + * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name + * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) * @param int|null $meta_id * @param string[] $values * * @return array ops to execute + * @throws \Exception */ private function setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values) { @@ -196,7 +190,7 @@ class V3Controller extends Controller foreach ($caption_fields as $cf) { if ($cf->is_multi() && is_null($meta_id)) { foreach ($cf->get_values() as $field_value) { - $a[] = [ + $ops[] = [ 'meta_struct_id' => $cf->get_meta_struct_id(), 'meta_id' => $field_value->getId(), 'value' => null @@ -220,6 +214,9 @@ class V3Controller extends Controller } else { // mono-valued + if(count($values) > 1) { + throw new \Exception(sprintf("setting mono-valued (%s) requires only one value.", $sf->get_name())); + } $ops[] = [ 'meta_struct_id' => $sf->get_id(), 'meta_id' => $meta_id, // probably null, @@ -232,10 +229,11 @@ class V3Controller extends Controller } /** - * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name + * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name * @param string[] $values * * @return array ops to execute + * @throws \Exception */ private function setmetadatasAction_add($struct_fields, $values) { @@ -244,8 +242,7 @@ class V3Controller extends Controller // now set values to matching struct_fields foreach ($struct_fields as $sf) { if(!$sf->is_multi()) { - // todo : return error "cant add to mono-valued" - continue; + throw new \Exception(sprintf("can't \"add\" to mono-valued (%s).", $sf->get_name())); } // add the non-null value(s) foreach ($values as $value) { @@ -290,7 +287,7 @@ class V3Controller extends Controller if (!is_null($meta_id)) { foreach ($cf->get_values() as $field_value) { if ($field_value->getId() === $meta_id) { - $a[] = [ + $ops[] = [ 'meta_struct_id' => $cf->get_meta_struct_id(), 'meta_id' => $field_value->getId(), 'value' => $replace_with @@ -301,11 +298,15 @@ class V3Controller extends Controller // match by value(s) ? foreach ($values as $value) { foreach ($cf->get_values() as $field_value) { + $rw = $replace_with; + if($match_method=='regexp' && !is_null($replace_with)) { + $rw = preg_replace($value, $replace_with, $field_value->getValue()); + } if ($this->match($value, $match_method, $field_value->getValue())) { $ops[] = [ 'meta_struct_id' => $cf->get_meta_struct_id(), 'meta_id' => $field_value->getId(), - 'value' => $match_method=='regexp' ? preg_replace($value, $replace_with, $field_value->getValue()): $replace_with + 'value' => $rw ]; } } From 627bf104a90461fc525554846df1ac6a59698ae3 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Wed, 3 Jun 2020 00:22:13 +0200 Subject: [PATCH 006/165] change volumes path in docker-compose and in override --- docker-compose.override.yml | 19 +------------------ docker-compose.yml | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 838e32e64c..1471f077d1 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -13,10 +13,6 @@ services: - ../:/var/alchemy - .:/var/alchemy/Phraseanet - ./docker/nginx/root/entrypoint.sh:/entrypoint.sh - - ${PHRASEANET_DATA_DIR}:/var/alchemy/Phraseanet/datas:rw - - ${PHRASEANET_THUMBNAILS_DIR}:/var/alchemy/Phraseanet/www/thumbnails:rw - - ${PHRASEANET_TMP_DIR}:/var/alchemy/Phraseanet/tmp:rw - - ${PHRASEANET_CUSTOM_DIR}:/var/alchemy/Phraseanet/www/custom:rw builder: build: @@ -50,25 +46,12 @@ services: volumes: - ../:/var/alchemy - .:/var/alchemy/Phraseanet - - ${PHRASEANET_CONFIG_DIR}:/var/alchemy/Phraseanet/config:rw - - ${PHRASEANET_LOGS_DIR}:/var/alchemy/Phraseanet/logs:rw - - ${PHRASEANET_DATA_DIR}:/var/alchemy/Phraseanet/datas:rw - - ${PHRASEANET_THUMBNAILS_DIR}:/var/alchemy/Phraseanet/www/thumbnails:rw - - ${PHRASEANET_CUSTOM_DIR}:/var/alchemy/Phraseanet/www/custom:rw - - ${PHRASEANET_CACHE_DIR}:/var/alchemy/Phraseanet/cache:rw - - ${PHRASEANET_TMP_DIR}:/var/alchemy/Phraseanet/tmp:rw worker: volumes: - ../:/var/alchemy - .:/var/alchemy/Phraseanet - - ${PHRASEANET_CONFIG_DIR}:/var/alchemy/Phraseanet/config:rw - - ${PHRASEANET_LOGS_DIR}:/var/alchemy/Phraseanet/logs:rw - - ${PHRASEANET_DATA_DIR}:/var/alchemy/Phraseanet/datas:rw - - ${PHRASEANET_THUMBNAILS_DIR}:/var/alchemy/Phraseanet/www/thumbnails:rw - - ${PHRASEANET_CUSTOM_DIR}:/var/alchemy/Phraseanet/www/custom:rw - - ${PHRASEANET_CACHE_DIR}:/var/alchemy/Phraseanet/cache:rw - - ${PHRASEANET_TMP_DIR}:/var/alchemy/Phraseanet/tmp:rw + rabbitmq: ports: diff --git a/docker-compose.yml b/docker-compose.yml index d8d716cb4e..699f159482 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,7 @@ services: volumes: - ${PHRASEANET_DATA_DIR}:/var/alchemy/Phraseanet/datas:rw - ${PHRASEANET_THUMBNAILS_DIR}:/var/alchemy/Phraseanet/www/thumbnails:rw + - ${PHRASEANET_TMP_DIR}:/var/alchemy/Phraseanet/tmp:rw - ${PHRASEANET_CUSTOM_DIR}:/var/alchemy/Phraseanet/www/custom:rw depends_on: - phraseanet @@ -64,13 +65,13 @@ services: - PHRASEANET_SMTP_USER - PHRASEANET_SMTP_PASSWORD volumes: - - config_vol:/var/alchemy/Phraseanet/config:rw - - data_vol:/var/alchemy/Phraseanet/datas:rw - - tmp_vol:/var/alchemy/Phraseanet/tmp:rw - - logs_vol:/var/alchemy/Phraseanet/logs:rw - - thumbnails_vol:/var/alchemy/Phraseanet/www/thumbnails:rw - - custom_vol:/var/alchemy/Phraseanet/www/custom:rw - - cache_vol:/var/alchemy/Phraseanet/cache:rw + - ${PHRASEANET_CONFIG_DIR}:/var/alchemy/Phraseanet/config:rw + - ${PHRASEANET_LOGS_DIR}:/var/alchemy/Phraseanet/logs:rw + - ${PHRASEANET_DATA_DIR}:/var/alchemy/Phraseanet/datas:rw + - ${PHRASEANET_THUMBNAILS_DIR}:/var/alchemy/Phraseanet/www/thumbnails:rw + - ${PHRASEANET_CUSTOM_DIR}:/var/alchemy/Phraseanet/www/custom:rw + - ${PHRASEANET_CACHE_DIR}:/var/alchemy/Phraseanet/cache:rw + - ${PHRASEANET_TMP_DIR}:/var/alchemy/Phraseanet/tmp:rw worker: build: @@ -94,13 +95,13 @@ services: - SESSION_CACHE_LIMITER - PHP_LOG_LEVEL volumes: - - config_vol:/var/alchemy/Phraseanet/config:rw - - data_vol:/var/alchemy/Phraseanet/datas:rw - - tmp_vol:/var/alchemy/Phraseanet/tmp:rw - - logs_vol:/var/alchemy/Phraseanet/logs:rw - - thumbnails_vol:/var/alchemy/Phraseanet/www/thumbnails:rw - - custom_vol:/var/alchemy/Phraseanet/www/custom:rw - - cache_vol:/var/alchemy/Phraseanet/cache:rw + - ${PHRASEANET_CONFIG_DIR}:/var/alchemy/Phraseanet/config:rw + - ${PHRASEANET_LOGS_DIR}:/var/alchemy/Phraseanet/logs:rw + - ${PHRASEANET_DATA_DIR}:/var/alchemy/Phraseanet/datas:rw + - ${PHRASEANET_THUMBNAILS_DIR}:/var/alchemy/Phraseanet/www/thumbnails:rw + - ${PHRASEANET_CUSTOM_DIR}:/var/alchemy/Phraseanet/www/custom:rw + - ${PHRASEANET_CACHE_DIR}:/var/alchemy/Phraseanet/cache:rw + - ${PHRASEANET_TMP_DIR}:/var/alchemy/Phraseanet/tmp:rw db: image: $PHRASEANET_DOCKER_REGISTRY/phraseanet-db:$PHRASEANET_DOCKER_TAG From c1448f7bb2781211f8d3280cc2c028eb74dd1387 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Wed, 3 Jun 2020 13:56:10 +0200 Subject: [PATCH 007/165] fix email setting in conf,remove tmp volume form gateway --- docker-compose.yml | 1 - docker/phraseanet/entrypoint.sh | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 699f159482..6a16aa136a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,6 @@ services: volumes: - ${PHRASEANET_DATA_DIR}:/var/alchemy/Phraseanet/datas:rw - ${PHRASEANET_THUMBNAILS_DIR}:/var/alchemy/Phraseanet/www/thumbnails:rw - - ${PHRASEANET_TMP_DIR}:/var/alchemy/Phraseanet/tmp:rw - ${PHRASEANET_CUSTOM_DIR}:/var/alchemy/Phraseanet/www/custom:rw depends_on: - phraseanet diff --git a/docker/phraseanet/entrypoint.sh b/docker/phraseanet/entrypoint.sh index 9d22cef4ff..e4b4451062 100755 --- a/docker/phraseanet/entrypoint.sh +++ b/docker/phraseanet/entrypoint.sh @@ -24,8 +24,8 @@ if [ -f "$FILE" ]; then bin/setup system:config set registry.email.smtp-enabled $PHRASEANET_SMTP_ENABLED bin/setup system:config set registry.email.smtp-auth-enabled $PHRASEANET_SMTP_AUTH_ENABLED bin/setup system:config set registry.email.smtp-auth-secure-mode $PHRASEANET_SMTP_SECURE_MODE - bin/setup system:config set registry.email.smtp-auth-host $PHRASEANET_SMTP_HOST - bin/setup system:config set registry.email.smtp-auth-port $PHRASEANET_SMTP_PORT + bin/setup system:config set registry.email.smtp-host $PHRASEANET_SMTP_HOST + bin/setup system:config set registry.email.smtp-port $PHRASEANET_SMTP_PORT bin/setup system:config set registry.email.smtp-user $PHRASEANET_SMTP_USER bin/setup system:config set registry.email.smtp-password $PHRASEANET_SMTP_PASSWORD bin/setup system:config set registry.email.emitter-email $PHRASEANET_EMITTER_EMAIL From 1057cb0493d4bb2783c48771c25aed44a1f3726d Mon Sep 17 00:00:00 2001 From: aynsix Date: Wed, 3 Jun 2020 17:52:21 +0300 Subject: [PATCH 008/165] fix issuee whe trying to rebuild subdef from tool --- .../Subscriber/RecordSubscriber.php | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/RecordSubscriber.php b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/RecordSubscriber.php index c0df49717d..429aebe46c 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/RecordSubscriber.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/RecordSubscriber.php @@ -54,18 +54,20 @@ class RecordSubscriber implements EventSubscriberInterface if (!$record->isStory()) { $subdefs = $record->getDatabox()->get_subdef_structure()->getSubdefGroup($record->getType()); - foreach ($subdefs as $subdef) { - $payload = [ - 'message_type' => MessagePublisher::SUBDEF_CREATION_TYPE, - 'payload' => [ - 'recordId' => $event->getRecord()->getRecordId(), - 'databoxId' => $event->getRecord()->getDataboxId(), - 'subdefName' => $subdef->get_name(), - 'status' => $event->isNewRecord() ? MessagePublisher::NEW_RECORD_MESSAGE : '' - ] - ]; + if ($subdefs !==null) { + foreach ($subdefs as $subdef) { + $payload = [ + 'message_type' => MessagePublisher::SUBDEF_CREATION_TYPE, + 'payload' => [ + 'recordId' => $event->getRecord()->getRecordId(), + 'databoxId' => $event->getRecord()->getDataboxId(), + 'subdefName' => $subdef->get_name(), + 'status' => $event->isNewRecord() ? MessagePublisher::NEW_RECORD_MESSAGE : '' + ] + ]; - $this->messagePublisher->publishMessage($payload, MessagePublisher::SUBDEF_QUEUE); + $this->messagePublisher->publishMessage($payload, MessagePublisher::SUBDEF_QUEUE); + } } } } From 952388aba1dc08624155f939d1570d60dc90d7c6 Mon Sep 17 00:00:00 2001 From: aynsix Date: Wed, 3 Jun 2020 17:55:39 +0300 Subject: [PATCH 009/165] add espace --- .../Phrasea/WorkerManager/Subscriber/RecordSubscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/RecordSubscriber.php b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/RecordSubscriber.php index 429aebe46c..cf0a3b940c 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/RecordSubscriber.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/RecordSubscriber.php @@ -54,7 +54,7 @@ class RecordSubscriber implements EventSubscriberInterface if (!$record->isStory()) { $subdefs = $record->getDatabox()->get_subdef_structure()->getSubdefGroup($record->getType()); - if ($subdefs !==null) { + if ($subdefs !== null) { foreach ($subdefs as $subdef) { $payload = [ 'message_type' => MessagePublisher::SUBDEF_CREATION_TYPE, From 9272f3642fb5957849f13e4045a73b3807283ce4 Mon Sep 17 00:00:00 2001 From: jygaulier Date: Wed, 3 Jun 2020 20:32:10 +0200 Subject: [PATCH 010/165] WIP refacto : explode v3 controller, fix warnings --- .../Api/V3/V3MetadatasController.php | 371 ++++++ .../Controller/Api/V3/V3ResultHelpers.php | 52 + .../Controller/Api/V3/V3SearchController.php | 488 ++++++++ .../Controller/Api/V3/V3StoriesController.php | 359 ++++++ .../Phrasea/Controller/Api/V3Controller.php | 1086 ----------------- .../Phrasea/ControllerProvider/Api/V3.php | 31 +- 6 files changed, 1294 insertions(+), 1093 deletions(-) create mode 100644 lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php create mode 100644 lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php create mode 100644 lib/Alchemy/Phrasea/Controller/Api/V3/V3SearchController.php create mode 100644 lib/Alchemy/Phrasea/Controller/Api/V3/V3StoriesController.php delete mode 100644 lib/Alchemy/Phrasea/Controller/Api/V3Controller.php diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php new file mode 100644 index 0000000000..b016dcfcd7 --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php @@ -0,0 +1,371 @@ +findDataboxById($databox_id)->get_meta_structure(); + $record = $this->findDataboxById($databox_id)->get_record($record_id); + + //$record->set_metadatas() + + //setRecordStatusAction + + try { + $b = $this->decodeJsonBody($request); + } + catch (Exception $e) { + return $this->app['controller.api.v1']->getBadRequestAction($request, 'Bad JSON'); + } + + $ret = [ + 'metadatas_ops' => null, + 'sb_ops' => null, + ]; + try { + // do metadatas ops + if (is_array($b->metadatas)) { + $ret['metadatas_ops'] = $this->setmetadatasAction_meta($struct, $record, $b->metadatas); + } + // do sb ops + if (is_array($b->status)) { + $ret['sb_ops'] = $this->setmetadatasAction_sb($struct, $record, $b->status); + } + } + catch (Exception $e) { + return $this->app['controller.api.v1']->getBadRequestAction( + $request, + $e->getMessage() + ); + } + + return Result::create($request, $ret)->createResponse(); + } + + /** + * @param $struct + * @param $record + * @param $metadatas + * @return array + * @throws Exception + */ + private function setmetadatasAction_meta($struct, $record, $metadatas) + { + $structByKey = []; + $nameToStrucId = []; + foreach ($struct as $f) { + $nameToStrucId[$f->get_name()] = $f->get_id(); + $structByKey[$f->get_id()] = $f; + $structByKey[$f->get_name()] = &$structByKey[$f->get_id()]; + } + + $metadatas_ops = []; + foreach ($metadatas as $_m) { + // sanity + if($_m->meta_struct_id && $_m->field_name) { + throw new Exception("define meta_struct_id OR field_name, not both."); + } + // select fields that match meta_struct_id or field_name (can be arrays) + $fields_list = null; // to filter caption_fields from record, default all + $struct_fields = []; // struct fields that match meta_struct_id or field_name + if(($field_keys = $_m->meta_struct_id ? $_m->meta_struct_id : $_m->field_name) !== null) { // can be null if none defined (=match all) + if (!is_array($field_keys)) { + $field_keys = [$field_keys]; + } + $fields_list = []; + foreach ($field_keys as $k) { + if(array_key_exists($k, $structByKey)) { + $fields_list[] = $structByKey[$k]->get_name(); + $struct_fields[$structByKey[$k]->get_id()] = $structByKey[$k]; + } + } + } + $caption_fields = $record->get_caption()->get_fields($fields_list, true); + + $meta_id = is_null($_m->meta_id) ? null : (int)($_m->meta_id); + + if(!($match_method = (string)($_m->match_method))) { + $match_method = 'ignore_case'; + } + if(!in_array($match_method, ['strict', 'ignore_case', 'regexp'])) { + throw new Exception(sprintf("bad match_method (%s).", $match_method)); + } + + $values = []; + if(is_array($_m->value)) { + foreach ($_m->value as $v) { + $values[] = is_null($v) ? null : (string)$v; + } + } + else { + $values = is_null($_m->value) ? [] : [(string)($_m->value)]; + } + + if(!($action = (string)($_m->action))) { + $action = 'set'; + } + + switch ($_m->action) { + case 'set': + $ops = $this->setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values); + break; + case 'add': + $ops = $this->setmetadatasAction_add($struct_fields, $values); + break; + case 'delete': + $ops = $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, null); + break; + case 'replace': + if (!is_string($_m->replace_with) && !is_null($_m->replace_with)) { + throw new Exception("bad \"replace_with\" for action \"replace\"."); + } + $ops = $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $_m->replace_with); + break; + default: + throw new Exception(sprintf("bad action (%s).", $action)); + } + + $metadatas_ops = array_merge($metadatas_ops, $ops); + } + + return $metadatas_ops; + } + + /** + * @param $struct + * @param $record + * @param $statuses + * @return array + * @throws Exception + */ + private function setmetadatasAction_sb($struct, $record, $statuses) + { + $datas = strrev($record->getStatus()); + + foreach ($statuses as $status) { + $n = (int)($status->bit); + $value = (int)($status->state); + if ($n > 31 || $n < 4) { + throw new Exception(sprintf("Invalid status bit number (%s).", $n)); + } + if ($value < 0 || $value > 1) { + throw new Exception(sprintf("Invalid status bit state (%s) for bit (%s).", $value, $n)); + } + + $datas = substr($datas, 0, ($n)) . $value . substr($datas, ($n + 1)); + } + + // $record->setStatus(strrev($datas)); + + // @todo Move event dispatch inside record_adapter class (keeps things encapsulated) + $this->dispatch(PhraseaEvents::RECORD_EDIT, new RecordEdit($record)); + + return ["status" => $this->getResultHelpers()->listRecordStatus($record)]; + } + + private function match($pattern, $method, $value) + { + switch ($method) { + case 'strict': + return $value === $pattern; + case 'ignore_case': + return strtolower($value) === strtolower($pattern); + case 'regexp': + return preg_match($pattern, $value) == 1; + } + return false; + } + + ////////////////////////////////// + /// TODO : keep multi-values uniques ! + /// it should be done in record_adapter + ////////////////////////////////// + + /** + * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name + * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) + * @param int|null $meta_id + * @param string[] $values + * + * @return array ops to execute + * @throws Exception + */ + private function setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values) + { + $ops = []; + + // if one field was multi-valued and no meta_id was set, we must delete all values + foreach ($caption_fields as $cf) { + if ($cf->is_multi() && is_null($meta_id)) { + foreach ($cf->get_values() as $field_value) { + $ops[] = [ + 'meta_struct_id' => $cf->get_meta_struct_id(), + 'meta_id' => $field_value->getId(), + 'value' => null + ]; + } + } + } + // now set values to matching struct_fields + foreach ($struct_fields as $sf) { + if($sf->is_multi()) { + // add the non-null value(s) + foreach ($values as $value) { + if (!is_null($value)) { + $ops[] = [ + 'meta_struct_id' => $sf->get_id(), + 'meta_id' => $meta_id, // can be null + 'value' => $value + ]; + } + } + } + else { + // mono-valued + if(count($values) > 1) { + throw new Exception(sprintf("setting mono-valued (%s) requires only one value.", $sf->get_name())); + } + $ops[] = [ + 'meta_struct_id' => $sf->get_id(), + 'meta_id' => $meta_id, // probably null, + 'value' => $values[0] + ]; + } + } + + return $ops; + } + + /** + * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name + * @param string[] $values + * + * @return array ops to execute + * @throws Exception + */ + private function setmetadatasAction_add($struct_fields, $values) + { + $ops = []; + + // now set values to matching struct_fields + foreach ($struct_fields as $sf) { + if(!$sf->is_multi()) { + throw new Exception(sprintf("can't \"add\" to mono-valued (%s).", $sf->get_name())); + } + // add the non-null value(s) + foreach ($values as $value) { + if (!is_null($value)) { + $ops[] = [ + 'meta_struct_id' => $sf->get_id(), + 'meta_id' => null, + 'value' => $value + ]; + } + } + } + + return $ops; + } + + /** + * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) + * @param int|null $meta_id + * @param string $match_method "strict" | "ignore_case" | "regexp" + * @param string[] $values + * @param string|null $replace_with + * + * @return array ops to execute + */ + private function setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $replace_with) + { + $ops = []; + + foreach ($caption_fields as $cf) { + // match all ? + if(is_null($meta_id) && count($values) == 0) { + foreach ($cf->get_values() as $field_value) { + $ops[] = [ + 'meta_struct_id' => $cf->get_meta_struct_id(), + 'meta_id' => $field_value->getId(), + 'value' => $replace_with + ]; + } + } + // match by meta-id ? + if (!is_null($meta_id)) { + foreach ($cf->get_values() as $field_value) { + if ($field_value->getId() === $meta_id) { + $ops[] = [ + 'meta_struct_id' => $cf->get_meta_struct_id(), + 'meta_id' => $field_value->getId(), + 'value' => $replace_with + ]; + } + } + } + // match by value(s) ? + foreach ($values as $value) { + foreach ($cf->get_values() as $field_value) { + $rw = $replace_with; + if($match_method=='regexp' && !is_null($replace_with)) { + $rw = preg_replace($value, $replace_with, $field_value->getValue()); + } + if ($this->match($value, $match_method, $field_value->getValue())) { + $ops[] = [ + 'meta_struct_id' => $cf->get_meta_struct_id(), + 'meta_id' => $field_value->getId(), + 'value' => $rw + ]; + } + } + } + } + + return $ops; + } + + /** + * @return V3ResultHelpers + */ + private function getResultHelpers() + { + static $rh = null; + + if(is_null($rh)) { + $rh = new V3ResultHelpers( + $this, + $this->getConf(), + $this->app['media_accessor.subdef_url_generator'] + ); + } + return $rh; + } +} diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php new file mode 100644 index 0000000000..38a6da1c1b --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php @@ -0,0 +1,52 @@ +controller = $controller; + $this->urlgenerator = $urlgenerator; + $this->conf = $conf; + } + + + /** + * Retrieve detailed information about one status + * + * @param record_adapter $record + * @return array + */ + public function listRecordStatus(record_adapter $record) + { + $ret = []; + foreach ($record->getStatusStructure() as $bit => $status) { + $ret[] = [ + 'bit' => $bit, + 'state' => databox_status::bitIsSet($record->getStatusBitField(), $bit), + ]; + } + + return $ret; + } + +} diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3SearchController.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3SearchController.php new file mode 100644 index 0000000000..c040bde5a5 --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3SearchController.php @@ -0,0 +1,488 @@ +app['acl'], $this->getAuthenticatedUser(), new PermalinkTransformer()); + $technicalDataTransformer = new TechnicalDataTransformer(); + $recordTransformer = new RecordTransformer($subdefTransformer, $technicalDataTransformer); + $storyTransformer = new StoryTransformer($subdefTransformer, $recordTransformer); + $compositeTransformer = new V1SearchCompositeResultTransformer($recordTransformer, $storyTransformer); + $searchTransformer = new V1SearchResultTransformer($compositeTransformer); + + $transformerResolver = new SearchResultTransformerResolver([ + '' => $searchTransformer, + 'results' => $compositeTransformer, + 'results.stories' => $storyTransformer, + 'results.stories.thumbnail' => $subdefTransformer, + 'results.stories.metadatas' => new CallbackTransformer(), + 'results.stories.caption' => new CallbackTransformer(), + 'results.stories.records' => $recordTransformer, + 'results.stories.records.thumbnail' => $subdefTransformer, + 'results.stories.records.technical_informations' => $technicalDataTransformer, + 'results.stories.records.subdefs' => $subdefTransformer, + 'results.stories.records.metadata' => new CallbackTransformer(), + 'results.stories.records.status' => new CallbackTransformer(), + 'results.stories.records.caption' => new CallbackTransformer(), + 'results.records' => $recordTransformer, + 'results.records.thumbnail' => $subdefTransformer, + 'results.records.technical_informations' => $technicalDataTransformer, + 'results.records.subdefs' => $subdefTransformer, + 'results.records.metadata' => new CallbackTransformer(), + 'results.records.status' => new CallbackTransformer(), + 'results.records.caption' => new CallbackTransformer(), + ]); + + $includeResolver = new IncludeResolver($transformerResolver); + + $fractal = new FractalManager(); + $fractal->setSerializer(new TraceableArraySerializer($this->app['dispatcher'])); + $fractal->parseIncludes($this->resolveSearchIncludes($request)); + + $result = $this->doSearch($request); + + $story_max_records = null; + // if search on story + if ($request->get('search_type') == 1) { + $story_max_records = (int)$request->get('story_max_records') ?: 10; + } + + $searchView = $this->buildSearchView( + $result, + $includeResolver->resolve($fractal), + $this->resolveSubdefUrlTTL($request), + $story_max_records + ); + + $ret = $fractal->createData(new Item($searchView, $searchTransformer))->toArray(); + + return Result::create($request, $ret)->createResponse(); + } + + /** + * Returns requested includes + * + * @param Request $request + * @return string[] + */ + private function resolveSearchIncludes(Request $request) + { + $includes = [ + 'results.stories.records' + ]; + + if ($request->attributes->get('_extended', false)) { + if ($request->get('search_type') != SearchEngineOptions::RECORD_STORY) { + $includes = array_merge($includes, [ + 'results.stories.records.subdefs', + 'results.stories.records.metadata', + 'results.stories.records.caption', + 'results.stories.records.status' + ]); + } + else { + $includes = [ 'results.stories.caption' ]; + } + + $includes = array_merge($includes, [ + 'results.records.subdefs', + 'results.records.metadata', + 'results.records.caption', + 'results.records.status' + ]); + } + + return $includes; + } + + /** + * @param SearchEngineResult $result + * @param string[] $includes + * @param int $urlTTL + * @param int|null $story_max_records + * @return SearchResultView + */ + private function buildSearchView(SearchEngineResult $result, array $includes, $urlTTL, $story_max_records = null) + { + $references = new RecordReferenceCollection($result->getResults()); + + $records = new RecordCollection(); + $stories = new RecordCollection(); + + foreach ($references->toRecords($this->getApplicationBox()) as $record) { + if ($record->isStory()) { + $stories[$record->getId()] = $record; + } else { + $records[$record->getId()] = $record; + } + } + + $resultView = new SearchResultView($result); + + if ($stories->count() > 0) { + $user = $this->getAuthenticatedUser(); + $children = []; + + foreach ($stories->getDataboxIds() as $databoxId) { + $storyIds = $stories->getDataboxRecordIds($databoxId); + + $selections = $this->findDataboxById($databoxId) + ->getRecordRepository() + ->findChildren($storyIds, $user,1, $story_max_records); + $children[$databoxId] = array_combine($storyIds, $selections); + } + + /** @var StoryView[] $storyViews */ + $storyViews = []; + /** @var RecordView[] $childrenViews */ + $childrenViews = []; + + foreach ($stories as $index => $story) { + $storyView = new StoryView($story); + + $selection = $children[$story->getDataboxId()][$story->getRecordId()]; + + $childrenView = $this->buildRecordViews($selection); + + foreach ($childrenView as $view) { + $childrenViews[spl_object_hash($view)] = $view; + } + + $storyView->setChildren($childrenView); + + $storyViews[$index] = $storyView; + } + + if (in_array('results.stories.thumbnail', $includes, true)) { + $subdefViews = $this->buildSubdefsViews($stories, ['thumbnail'], $urlTTL); + + foreach ($storyViews as $index => $storyView) { + $storyView->setSubdefs($subdefViews[$index]); + } + } + + if (in_array('results.stories.metadatas', $includes, true) || + in_array('results.stories.caption', $includes, true)) { + $captions = $this->app['service.caption']->findByReferenceCollection($stories); + $canSeeBusiness = $this->retrieveSeeBusinessPerDatabox($stories); + + $this->buildCaptionViews($storyViews, $captions, $canSeeBusiness); + } + + $allChildren = new RecordCollection(); + foreach ($childrenViews as $index => $childrenView) { + $allChildren[$index] = $childrenView->getRecord(); + } + + $names = in_array('results.stories.records.subdefs', $includes, true) ? null : ['thumbnail']; + $subdefViews = $this->buildSubdefsViews($allChildren, $names, $urlTTL); + $technicalDatasets = $this->app['service.technical_data']->fetchRecordsTechnicalData($allChildren); + + foreach ($childrenViews as $index => $recordView) { + $recordView->setSubdefs($subdefViews[$index]); + $recordView->setTechnicalDataView(new TechnicalDataView($technicalDatasets[$index])); + } + + if (array_intersect($includes, ['results.stories.records.metadata', 'results.stories.records.caption'])) { + $captions = $this->app['service.caption']->findByReferenceCollection($allChildren); + $canSeeBusiness = $this->retrieveSeeBusinessPerDatabox($allChildren); + + $this->buildCaptionViews($childrenViews, $captions, $canSeeBusiness); + } + + $resultView->setStories($storyViews); + } + + if ($records->count() > 0) { + $names = in_array('results.records.subdefs', $includes, true) ? null : ['thumbnail']; + $recordViews = $this->buildRecordViews($records); + $subdefViews = $this->buildSubdefsViews($records, $names, $urlTTL); + + $technicalDatasets = $this->app['service.technical_data']->fetchRecordsTechnicalData($records); + + foreach ($recordViews as $index => $recordView) { + $recordView->setSubdefs($subdefViews[$index]); + $recordView->setTechnicalDataView(new TechnicalDataView($technicalDatasets[$index])); + } + + if (array_intersect($includes, ['results.records.metadata', 'results.records.caption'])) { + $captions = $this->app['service.caption']->findByReferenceCollection($records); + $canSeeBusiness = $this->retrieveSeeBusinessPerDatabox($records); + + $this->buildCaptionViews($recordViews, $captions, $canSeeBusiness); + } + + $resultView->setRecords($recordViews); + } + + return $resultView; + } + + /** + * @param Request $request + * @return SearchEngineResult + */ + private function doSearch(Request $request) + { + $options = SearchEngineOptions::fromRequest($this->app, $request); + $options->setFirstResult((int)($request->get('offset_start') ?: 0)); + $options->setMaxResults((int)$request->get('per_page') ?: 10); + + $this->getSearchEngine()->resetCache(); + + $search_result = $this->getSearchEngine()->query((string)$request->get('query'), $options); + + $this->getUserManipulator()->logQuery($this->getAuthenticatedUser(), $search_result->getQueryText()); + + // log array of collectionIds (from $options) for each databox + $collectionsReferencesByDatabox = $options->getCollectionsReferencesByDatabox(); + foreach ($collectionsReferencesByDatabox as $sbid => $references) { + $databox = $this->findDataboxById($sbid); + $collectionsIds = array_map(function(CollectionReference $ref){return $ref->getCollectionId();}, $references); + $this->getSearchEngineLogger()->log($databox, $search_result->getQueryText(), $search_result->getTotal(), $collectionsIds); + } + + $this->getSearchEngine()->clearCache(); + + return $search_result; + } + + /** + * @return SearchEngineInterface + */ + private function getSearchEngine() + { + return $this->app['phraseanet.SE']; + } + + /** + * @return UserManipulator + */ + private function getUserManipulator() + { + return $this->app['manipulator.user']; + } + + /** + * @return SearchEngineLogger + */ + private function getSearchEngineLogger() + { + return $this->app['phraseanet.SE.logger']; + } + + /** + * @param Request $request + * @return int + */ + private function resolveSubdefUrlTTL(Request $request) + { + $urlTTL = $request->query->get('subdef_url_ttl'); + + if (null !== $urlTTL) { + return (int)$urlTTL; + } + + return $this->getConf()->get(['registry', 'general', 'default-subdef-url-ttl']); + } + + /** + * @param RecordCollection|record_adapter[] $references + * @return RecordView[] + */ + private function buildRecordViews($references) + { + if (!$references instanceof RecordCollection) { + $references = new RecordCollection($references); + } + + $recordViews = []; + + foreach ($references as $index => $record) { + $recordViews[$index] = new RecordView($record); + } + + return $recordViews; + } + + /** + * @param RecordReferenceInterface[]|RecordReferenceCollection|DataboxGroupable $references + * @param array|null $names + * @param int $urlTTL + * @return SubdefView[][] + */ + private function buildSubdefsViews($references, array $names = null, $urlTTL) + { + $subdefGroups = $this->app['service.media_subdef'] + ->findSubdefsByRecordReferenceFromCollection($references, $names); + + $fakeSubdefs = []; + + foreach ($subdefGroups as $index => $subdefGroup) { + if (!isset($subdefGroup['thumbnail'])) { + $fakeSubdef = new media_subdef($this->app, $references[$index], 'thumbnail', true, []); + $fakeSubdefs[spl_object_hash($fakeSubdef)] = $fakeSubdef; + + $subdefGroups[$index]['thumbnail'] = $fakeSubdef; + } + } + + $allSubdefs = $this->mergeGroupsIntoOneList($subdefGroups); + $allPermalinks = media_Permalink_Adapter::getMany( + $this->app, + array_filter($allSubdefs, function (media_subdef $subdef) use ($fakeSubdefs) { + return !isset($fakeSubdefs[spl_object_hash($subdef)]); + }) + ); + $urls = $this->app['media_accessor.subdef_url_generator'] + ->generateMany($this->getAuthenticatedUser(), $allSubdefs, $urlTTL); + + $subdefViews = []; + + /** @var media_subdef $subdef */ + foreach ($allSubdefs as $index => $subdef) { + $subdefView = new SubdefView($subdef); + + if (isset($allPermalinks[$index])) { + $subdefView->setPermalinkView(new PermalinkView($allPermalinks[$index])); + } + + $subdefView->setUrl($urls[$index]); + $subdefView->setUrlTTL($urlTTL); + + $subdefViews[spl_object_hash($subdef)] = $subdefView; + } + + $reorderedGroups = []; + + /** @var media_subdef[] $subdefGroup */ + foreach ($subdefGroups as $index => $subdefGroup) { + $reordered = []; + + foreach ($subdefGroup as $subdef) { + $reordered[] = $subdefViews[spl_object_hash($subdef)]; + } + + $reorderedGroups[$index] = $reordered; + } + + return $reorderedGroups; + } + + /** + * @param array $groups + * @return array|mixed + */ + private function mergeGroupsIntoOneList(array $groups) + { + // Strips keys from the internal array + array_walk($groups, function (array &$group) { + $group = array_values($group); + }); + + if ($groups) { + return call_user_func_array('array_merge', $groups); + } + + return []; + } + + /** + * @param RecordReferenceInterface[]|DataboxGroupable $references + * @return array + */ + private function retrieveSeeBusinessPerDatabox($references) + { + if (!$references instanceof DataboxGroupable) { + $references = new RecordReferenceCollection($references); + } + + $acl = $this->getAclForUser(); + + $canSeeBusiness = []; + + foreach ($references->getDataboxIds() as $databoxId) { + $canSeeBusiness[$databoxId] = $acl->can_see_business_fields($this->findDataboxById($databoxId)); + } + + $rights = []; + + foreach ($references as $index => $reference) { + $rights[$index] = $canSeeBusiness[$reference->getDataboxId()]; + } + + return $rights; + } + + /** + * @param RecordView[] $recordViews + * @param caption_record[] $captions + * @param bool[] $canSeeBusiness + */ + private function buildCaptionViews($recordViews, $captions, $canSeeBusiness) + { + foreach ($recordViews as $index => $recordView) { + $caption = $captions[$index]; + + $captionView = new CaptionView($caption); + + $captionView->setFields($caption->get_fields(null, isset($canSeeBusiness[$index]) && (bool)$canSeeBusiness[$index])); + + $recordView->setCaption($captionView); + } + } +} diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3StoriesController.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3StoriesController.php new file mode 100644 index 0000000000..14fccc741d --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3StoriesController.php @@ -0,0 +1,359 @@ +findDataboxById($databox_id)->get_record($record_id); + + return Result::create($request, ['story' => $this->listStory($request, $story)])->createResponse(); + } + catch (NotFoundHttpException $e) { + return Result::createError($request, 404, 'Story Not Found')->createResponse(); + } + catch (Exception $e) { + return $this->app['controller.api.v1']->getBadRequestAction($request, 'An error occurred'); + } + } + + /** + * @return V3ResultHelpers + */ + private function getResultHelpers() + { + static $rh = null; + + if(is_null($rh)) { + $rh = new V3ResultHelpers( + $this, + $this->getConf(), + $this->app['media_accessor.subdef_url_generator'] + ); + } + return $rh; + } + + /** + * Retrieve detailed information about one story + * + * @param Request $request + * @param record_adapter $story + * @return array + * @throws Exception + */ + private function listStory(Request $request, record_adapter $story) + { + if (!$story->isStory()) { + return Result::createError($request, 404, 'Story not found')->createResponse(); + } + + $per_page = (int)$request->get('per_page')?:10; + $page = (int)$request->get('page')?:1; + $offset = ($per_page * ($page - 1)) + 1; + + $caption = $story->get_caption(); + + $format = function (caption_record $caption, $dcField) { + + $field = $caption->get_dc_field($dcField); + + if (!$field) { + return null; + } + + return $field->get_serialized_values(); + }; + + return [ + '@entity@' => V1Controller::OBJECT_TYPE_STORY, + 'databox_id' => $story->getDataboxId(), + 'story_id' => $story->getRecordId(), + 'updated_on' => $story->getUpdated()->format(DATE_ATOM), + 'created_on' => $story->getCreated()->format(DATE_ATOM), + 'collection_id' => $story->getCollectionId(), + 'base_id' => $story->getBaseId(), + 'thumbnail' => $this->listEmbeddableMedia($request, $story, $story->get_thumbnail()), + 'uuid' => $story->getUuid(), + 'metadatas' => [ + '@entity@' => V1Controller::OBJECT_TYPE_STORY_METADATA_BAG, + 'dc:contributor' => $format($caption, databox_Field_DCESAbstract::Contributor), + 'dc:coverage' => $format($caption, databox_Field_DCESAbstract::Coverage), + 'dc:creator' => $format($caption, databox_Field_DCESAbstract::Creator), + 'dc:date' => $format($caption, databox_Field_DCESAbstract::Date), + 'dc:description' => $format($caption, databox_Field_DCESAbstract::Description), + 'dc:format' => $format($caption, databox_Field_DCESAbstract::Format), + 'dc:identifier' => $format($caption, databox_Field_DCESAbstract::Identifier), + 'dc:language' => $format($caption, databox_Field_DCESAbstract::Language), + 'dc:publisher' => $format($caption, databox_Field_DCESAbstract::Publisher), + 'dc:relation' => $format($caption, databox_Field_DCESAbstract::Relation), + 'dc:rights' => $format($caption, databox_Field_DCESAbstract::Rights), + 'dc:source' => $format($caption, databox_Field_DCESAbstract::Source), + 'dc:subject' => $format($caption, databox_Field_DCESAbstract::Subject), + 'dc:title' => $format($caption, databox_Field_DCESAbstract::Title), + 'dc:type' => $format($caption, databox_Field_DCESAbstract::Type), + ], + 'records' => $this->listRecords($request, array_values($story->getChildren($offset, $per_page)->get_elements())), + ]; + } + + /** + * @param Request $request + * @param RecordReferenceInterface[]|RecordReferenceCollection $records + * @return array + */ + private function listRecords(Request $request, $records) + { + if (!$records instanceof RecordReferenceCollection) { + $records = new RecordReferenceCollection($records); + } + + $technicalData = $this->app['service.technical_data']->fetchRecordsTechnicalData($records); + + $data = []; + + foreach ($records->toRecords($this->getApplicationBox()) as $index => $record) { + $record->setTechnicalDataSet($technicalData[$index]); + + $data[$index] = $this->listRecord($request, $record); + } + + return $data; + } + public function listEmbeddableMedia(Request $request, record_adapter $record, media_subdef $media) + { + if (!$media->is_physically_present()) { + return null; + } + + if ($this->getAuthenticator()->isAuthenticated()) { + $acl = $this->getAclForUser(); + if ($media->get_name() !== 'document' + && false === $acl->has_access_to_subdef($record, $media->get_name()) + ) { + return null; + } + if ($media->get_name() === 'document' + && !$acl->has_right_on_base($record->getBaseId(), ACL::CANDWNLDHD) + && !$acl->has_hd_grant($record) + ) { + return null; + } + } + + if ($media->get_permalink() instanceof media_Permalink_Adapter) { + $permalink = $this->listPermalink($media->get_permalink()); + } else { + $permalink = null; + } + + $urlTTL = (int) $request->get( + 'subdef_url_ttl', + $this->getConf()->get(['registry', 'general', 'default-subdef-url-ttl']) + ); + if ($urlTTL < 0) { + $urlTTL = -1; + } + $issuer = $this->getAuthenticatedUser(); + + return [ + 'name' => $media->get_name(), + 'permalink' => $permalink, + 'height' => $media->get_height(), + 'width' => $media->get_width(), + 'filesize' => $media->get_size(), + 'devices' => $media->getDevices(), + 'player_type' => $media->get_type(), + 'mime_type' => $media->get_mime(), + 'substituted' => $media->is_substituted(), + 'created_on' => $media->get_creation_date()->format(DATE_ATOM), + 'updated_on' => $media->get_modification_date()->format(DATE_ATOM), + 'url' => $this->app['media_accessor.subdef_url_generator']->generate($issuer, $media, $urlTTL), + 'url_ttl' => $urlTTL, + ]; + } + + private function listPermalink(media_Permalink_Adapter $permalink) + { + $downloadUrl = $permalink->get_url(); + $downloadUrl->getQuery()->set('download', '1'); + + return [ + 'created_on' => $permalink->get_created_on()->format(DATE_ATOM), + 'id' => $permalink->get_id(), + 'is_activated' => $permalink->get_is_activated(), + /** @Ignore */ + 'label' => $permalink->get_label(), + 'updated_on' => $permalink->get_last_modified()->format(DATE_ATOM), + 'page_url' => $permalink->get_page(), + 'download_url' => (string)$downloadUrl, + 'url' => (string)$permalink->get_url(), + ]; + } + + + /** + * Retrieve detailed information about one record + * + * @param Request $request + * @param record_adapter $record + * @return array + */ + public function listRecord(Request $request, record_adapter $record) + { + $technicalInformation = []; + foreach ($record->get_technical_infos()->getValues() as $name => $value) { + $technicalInformation[] = ['name' => $name, 'value' => $value]; + } + + $data = [ + 'databox_id' => $record->getDataboxId(), + 'record_id' => $record->getRecordId(), + 'mime_type' => $record->getMimeType(), + 'title' => $record->get_title(), + 'original_name' => $record->get_original_name(), + 'updated_on' => $record->getUpdated()->format(DATE_ATOM), + 'created_on' => $record->getCreated()->format(DATE_ATOM), + 'collection_id' => $record->getCollectionId(), + 'base_id' => $record->getBaseId(), + 'sha256' => $record->getSha256(), + 'thumbnail' => $this->listEmbeddableMedia($request, $record, $record->get_thumbnail()), + 'technical_informations' => $technicalInformation, + 'phrasea_type' => $record->getType(), + 'uuid' => $record->getUuid(), + ]; + + if ($request->attributes->get('_extended', false)) { + $data = array_merge($data, [ + 'subdefs' => $this->listRecordEmbeddableMedias($request, $record), + 'metadata' => $this->listRecordMetadata($record), + 'status' => $this->getResultHelpers()->listRecordStatus($record), + 'caption' => $this->listRecordCaption($record), + ]); + } + + return $data; + } + + /** + * @param Request $request + * @param record_adapter $record + * @return array + */ + private function listRecordEmbeddableMedias(Request $request, record_adapter $record) + { + $subdefs = []; + + foreach ($record->get_embedable_medias([], []) as $name => $media) { + if (null !== $subdef = $this->listEmbeddableMedia($request, $record, $media)) { + $subdefs[] = $subdef; + } + } + + return $subdefs; + } + + /** + * List all fields of given record + * + * @param record_adapter $record + * @return array + */ + private function listRecordMetadata(record_adapter $record) + { + $includeBusiness = $this->getAclForUser()->can_see_business_fields($record->getDatabox()); + + return $this->listRecordCaptionFields($record->get_caption()->get_fields(null, $includeBusiness)); + } + + /** + * @param caption_field[] $fields + * @return array + */ + private function listRecordCaptionFields($fields) + { + $ret = []; + + foreach ($fields as $field) { + $databox_field = $field->get_databox_field(); + + $fieldData = [ + 'meta_structure_id' => $field->get_meta_struct_id(), + 'name' => $field->get_name(), + 'labels' => [ + 'fr' => $databox_field->get_label('fr'), + 'en' => $databox_field->get_label('en'), + 'de' => $databox_field->get_label('de'), + 'nl' => $databox_field->get_label('nl'), + ], + ]; + + foreach ($field->get_values() as $value) { + $data = [ + 'meta_id' => $value->getId(), + 'value' => $value->getValue(), + ]; + + $ret[] = $fieldData + $data; + } + } + + return $ret; + } + + /** + * @param record_adapter $record + * @return array + */ + private function listRecordCaption(record_adapter $record) + { + $includeBusiness = $this->getAclForUser()->can_see_business_fields($record->getDatabox()); + + $caption = []; + + foreach ($record->get_caption()->get_fields(null, $includeBusiness) as $field) { + $caption[] = [ + 'meta_structure_id' => $field->get_meta_struct_id(), + 'name' => $field->get_name(), + 'value' => $field->get_serialized_values(';'), + ]; + } + + return $caption; + } + +} diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php deleted file mode 100644 index 686328bb3c..0000000000 --- a/lib/Alchemy/Phrasea/Controller/Api/V3Controller.php +++ /dev/null @@ -1,1086 +0,0 @@ -findDataboxById($databox_id)->get_meta_structure(); - $record = $this->findDataboxById($databox_id)->get_record($record_id); - - //$record->set_metadatas() - - $structByKey = []; - $nameToStrucId = []; - foreach($struct as $f) { - $nameToStrucId[$f->get_name()] = $f->get_id(); - $structByKey[$f->get_id()] = $f; - $structByKey[$f->get_name()] = &$structByKey[$f->get_id()]; - } - - try { - $b = $this->decodeJsonBody($request); - } - catch(\Exception $e) { - return $this->app['controller.api.v1']->getBadRequestAction($request, 'Bad JSON'); - } - - $metadatas_ops = []; - foreach ($b->metadatas as $_m) { - // sanity - if($_m->meta_struct_id && $_m->field_name) { - return $this->app['controller.api.v1']->getBadRequestAction( - $request, - "define meta_struct_id OR field_name, not both." - ); - } - // select fields that match meta_struct_id or field_name (can be arrays) - $fields_list = null; // to filter caption_fields from record, default all - $struct_fields = []; // struct fields that match meta_struct_id or field_name - if(($field_keys = $_m->meta_struct_id ? $_m->meta_struct_id : $_m->field_name) !== null) { // can be null if none defined (=match all) - if (!is_array($field_keys)) { - $field_keys = [$field_keys]; - } - $fields_list = []; - foreach ($field_keys as $k) { - if(array_key_exists($k, $structByKey)) { - $fields_list[] = $structByKey[$k]->get_name(); - $struct_fields[$structByKey[$k]->get_id()] = $structByKey[$k]; - } - } - } - $caption_fields = $record->get_caption()->get_fields($fields_list, true); - - $meta_id = is_null($_m->meta_id) ? null : (int)($_m->meta_id); - - if(!($match_method = (string)($_m->match_method))) { - $match_method = 'ignore_case'; - } - if(!in_array($match_method, ['strict', 'ignore_case', 'regexp'])) { - return $this->app['controller.api.v1']->getBadRequestAction( - $request, - sprintf("bad match_method (%s).", $match_method) - ); - } - - $values = []; - if(is_array($_m->value)) { - foreach ($_m->value as $v) { - $values[] = is_null($v) ? null : (string)$v; - } - } - else { - $values = is_null($_m->value) ? [] : [(string)($_m->value)]; - } - - if(!($action = (string)($_m->action))) { - $action = 'set'; - } - - try { - switch ($_m->action) { - case 'set': - $ops = $this->setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values); - break; - case 'add': - $ops = $this->setmetadatasAction_add($struct_fields, $values); - break; - case 'delete': - $ops = $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, null); - break; - case 'replace': - if (!is_string($_m->replace_with) && !is_null($_m->replace_with)) { - throw new \Exception("bad \"replace_with\" for action \"replace\"."); - } - $ops = $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $_m->replace_with); - break; - default: - throw new \Exception(sprintf("bad action (%s).", $action)); - } - } - catch (\Exception $e) { - return $this->app['controller.api.v1']->getBadRequestAction( - $request, - $e->getMessage() - ); - } - - $metadatas_ops = array_merge($metadatas_ops, $ops); - } - - return Result::create($request, $metadatas_ops)->createResponse(); - } - - private function match($pattern, $method, $value) - { - switch ($method) { - case 'strict': - return $value === $pattern; - case 'ignore_case': - return strtolower($value) === strtolower($pattern); - case 'regexp': - return preg_match($pattern, $value) == 1; - } - } - - /** - * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name - * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) - * @param int|null $meta_id - * @param string[] $values - * - * @return array ops to execute - * @throws \Exception - */ - private function setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values) - { - $ops = []; - - // if one field was multi-valued and no meta_id was set, we must delete all values - foreach ($caption_fields as $cf) { - if ($cf->is_multi() && is_null($meta_id)) { - foreach ($cf->get_values() as $field_value) { - $ops[] = [ - 'meta_struct_id' => $cf->get_meta_struct_id(), - 'meta_id' => $field_value->getId(), - 'value' => null - ]; - } - } - } - // now set values to matching struct_fields - foreach ($struct_fields as $sf) { - if($sf->is_multi()) { - // add the non-null value(s) - foreach ($values as $value) { - if (!is_null($value)) { - $ops[] = [ - 'meta_struct_id' => $sf->get_id(), - 'meta_id' => $meta_id, // can be null - 'value' => $value - ]; - } - } - } - else { - // mono-valued - if(count($values) > 1) { - throw new \Exception(sprintf("setting mono-valued (%s) requires only one value.", $sf->get_name())); - } - $ops[] = [ - 'meta_struct_id' => $sf->get_id(), - 'meta_id' => $meta_id, // probably null, - 'value' => $values[0] - ]; - } - } - - return $ops; - } - - /** - * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name - * @param string[] $values - * - * @return array ops to execute - * @throws \Exception - */ - private function setmetadatasAction_add($struct_fields, $values) - { - $ops = []; - - // now set values to matching struct_fields - foreach ($struct_fields as $sf) { - if(!$sf->is_multi()) { - throw new \Exception(sprintf("can't \"add\" to mono-valued (%s).", $sf->get_name())); - } - // add the non-null value(s) - foreach ($values as $value) { - if (!is_null($value)) { - $ops[] = [ - 'meta_struct_id' => $sf->get_id(), - 'meta_id' => null, - 'value' => $value - ]; - } - } - } - - return $ops; - } - - /** - * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) - * @param int|null $meta_id - * @param string $match_method "strict" | "ignore_case" | "regexp" - * @param string[] $values - * @param string|null $replace_with - * - * @return array ops to execute - */ - private function setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $replace_with) - { - $ops = []; - - foreach ($caption_fields as $cf) { - // match all ? - if(is_null($meta_id) && count($values) == 0) { - foreach ($cf->get_values() as $field_value) { - $ops[] = [ - 'meta_struct_id' => $cf->get_meta_struct_id(), - 'meta_id' => $field_value->getId(), - 'value' => $replace_with - ]; - } - } - // match by meta-id ? - if (!is_null($meta_id)) { - foreach ($cf->get_values() as $field_value) { - if ($field_value->getId() === $meta_id) { - $ops[] = [ - 'meta_struct_id' => $cf->get_meta_struct_id(), - 'meta_id' => $field_value->getId(), - 'value' => $replace_with - ]; - } - } - } - // match by value(s) ? - foreach ($values as $value) { - foreach ($cf->get_values() as $field_value) { - $rw = $replace_with; - if($match_method=='regexp' && !is_null($replace_with)) { - $rw = preg_replace($value, $replace_with, $field_value->getValue()); - } - if ($this->match($value, $match_method, $field_value->getValue())) { - $ops[] = [ - 'meta_struct_id' => $cf->get_meta_struct_id(), - 'meta_id' => $field_value->getId(), - 'value' => $rw - ]; - } - } - } - } - - return $ops; - } - - - /** - * Return detailed information about one story - * - * @param Request $request - * @param int $databox_id - * @param int $record_id - * - * @return Response - */ - public function getStoryAction(Request $request, $databox_id, $record_id) - { - try { - $story = $this->findDataboxById($databox_id)->get_record($record_id); - - return Result::create($request, ['story' => $this->listStory($request, $story)])->createResponse(); - } catch (NotFoundHttpException $e) { - return Result::createError($request, 404, $this->app->trans('Story Not Found'))->createResponse(); - } catch (\Exception $e) { - return $this->app['controller.api.v1']->getBadRequestAction($request, $this->app->trans('An error occurred')); - } - } - - /** - * Search for results - * - * @param Request $request - * - * @return Response - */ - public function searchAction(Request $request) - { - $subdefTransformer = new SubdefTransformer($this->app['acl'], $this->getAuthenticatedUser(), new PermalinkTransformer()); - $technicalDataTransformer = new TechnicalDataTransformer(); - $recordTransformer = new RecordTransformer($subdefTransformer, $technicalDataTransformer); - $storyTransformer = new StoryTransformer($subdefTransformer, $recordTransformer); - $compositeTransformer = new V1SearchCompositeResultTransformer($recordTransformer, $storyTransformer); - $searchTransformer = new V1SearchResultTransformer($compositeTransformer); - - $transformerResolver = new SearchResultTransformerResolver([ - '' => $searchTransformer, - 'results' => $compositeTransformer, - 'results.stories' => $storyTransformer, - 'results.stories.thumbnail' => $subdefTransformer, - 'results.stories.metadatas' => new CallbackTransformer(), - 'results.stories.caption' => new CallbackTransformer(), - 'results.stories.records' => $recordTransformer, - 'results.stories.records.thumbnail' => $subdefTransformer, - 'results.stories.records.technical_informations' => $technicalDataTransformer, - 'results.stories.records.subdefs' => $subdefTransformer, - 'results.stories.records.metadata' => new CallbackTransformer(), - 'results.stories.records.status' => new CallbackTransformer(), - 'results.stories.records.caption' => new CallbackTransformer(), - 'results.records' => $recordTransformer, - 'results.records.thumbnail' => $subdefTransformer, - 'results.records.technical_informations' => $technicalDataTransformer, - 'results.records.subdefs' => $subdefTransformer, - 'results.records.metadata' => new CallbackTransformer(), - 'results.records.status' => new CallbackTransformer(), - 'results.records.caption' => new CallbackTransformer(), - ]); - - $includeResolver = new IncludeResolver($transformerResolver); - - $fractal = new \League\Fractal\Manager(); - $fractal->setSerializer(new TraceableArraySerializer($this->app['dispatcher'])); - $fractal->parseIncludes($this->resolveSearchIncludes($request)); - - $result = $this->doSearch($request); - - $story_max_records = null; - // if search on story - if ($request->get('search_type') == 1) { - $story_max_records = (int)$request->get('story_max_records') ?: 10; - } - - $searchView = $this->buildSearchView( - $result, - $includeResolver->resolve($fractal), - $this->resolveSubdefUrlTTL($request), - $story_max_records - ); - - $ret = $fractal->createData(new Item($searchView, $searchTransformer))->toArray(); - - return Result::create($request, $ret)->createResponse(); - } - - /** - * Retrieve detailed information about one story - * - * @param Request $request - * @param \record_adapter $story - * @return array - * @throws \Exception - */ - private function listStory(Request $request, \record_adapter $story) - { - if (!$story->isStory()) { - return Result::createError($request, 404, 'Story not found')->createResponse(); - } - - $per_page = (int)$request->get('per_page')?:10; - $page = (int)$request->get('page')?:1; - $offset = ($per_page * ($page - 1)) + 1; - - $caption = $story->get_caption(); - - $format = function (\caption_record $caption, $dcField) { - - $field = $caption->get_dc_field($dcField); - - if (!$field) { - return null; - } - - return $field->get_serialized_values(); - }; - - return [ - '@entity@' => V1Controller::OBJECT_TYPE_STORY, - 'databox_id' => $story->getDataboxId(), - 'story_id' => $story->getRecordId(), - 'updated_on' => $story->getUpdated()->format(DATE_ATOM), - 'created_on' => $story->getCreated()->format(DATE_ATOM), - 'collection_id' => $story->getCollectionId(), - 'base_id' => $story->getBaseId(), - 'thumbnail' => $this->listEmbeddableMedia($request, $story, $story->get_thumbnail()), - 'uuid' => $story->getUuid(), - 'metadatas' => [ - '@entity@' => V1Controller::OBJECT_TYPE_STORY_METADATA_BAG, - 'dc:contributor' => $format($caption, \databox_Field_DCESAbstract::Contributor), - 'dc:coverage' => $format($caption, \databox_Field_DCESAbstract::Coverage), - 'dc:creator' => $format($caption, \databox_Field_DCESAbstract::Creator), - 'dc:date' => $format($caption, \databox_Field_DCESAbstract::Date), - 'dc:description' => $format($caption, \databox_Field_DCESAbstract::Description), - 'dc:format' => $format($caption, \databox_Field_DCESAbstract::Format), - 'dc:identifier' => $format($caption, \databox_Field_DCESAbstract::Identifier), - 'dc:language' => $format($caption, \databox_Field_DCESAbstract::Language), - 'dc:publisher' => $format($caption, \databox_Field_DCESAbstract::Publisher), - 'dc:relation' => $format($caption, \databox_Field_DCESAbstract::Relation), - 'dc:rights' => $format($caption, \databox_Field_DCESAbstract::Rights), - 'dc:source' => $format($caption, \databox_Field_DCESAbstract::Source), - 'dc:subject' => $format($caption, \databox_Field_DCESAbstract::Subject), - 'dc:title' => $format($caption, \databox_Field_DCESAbstract::Title), - 'dc:type' => $format($caption, \databox_Field_DCESAbstract::Type), - ], - 'records' => $this->listRecords($request, array_values($story->getChildren($offset, $per_page)->get_elements())), - ]; - } - - private function listEmbeddableMedia(Request $request, \record_adapter $record, \media_subdef $media) - { - if (!$media->is_physically_present()) { - return null; - } - - if ($this->getAuthenticator()->isAuthenticated()) { - $acl = $this->getAclForUser(); - if ($media->get_name() !== 'document' - && false === $acl->has_access_to_subdef($record, $media->get_name()) - ) { - return null; - } - if ($media->get_name() === 'document' - && !$acl->has_right_on_base($record->getBaseId(), \ACL::CANDWNLDHD) - && !$acl->has_hd_grant($record) - ) { - return null; - } - } - - if ($media->get_permalink() instanceof \media_Permalink_Adapter) { - $permalink = $this->listPermalink($media->get_permalink()); - } else { - $permalink = null; - } - - $urlTTL = (int) $request->get( - 'subdef_url_ttl', - $this->getConf()->get(['registry', 'general', 'default-subdef-url-ttl']) - ); - if ($urlTTL < 0) { - $urlTTL = -1; - } - $issuer = $this->getAuthenticatedUser(); - - return [ - 'name' => $media->get_name(), - 'permalink' => $permalink, - 'height' => $media->get_height(), - 'width' => $media->get_width(), - 'filesize' => $media->get_size(), - 'devices' => $media->getDevices(), - 'player_type' => $media->get_type(), - 'mime_type' => $media->get_mime(), - 'substituted' => $media->is_substituted(), - 'created_on' => $media->get_creation_date()->format(DATE_ATOM), - 'updated_on' => $media->get_modification_date()->format(DATE_ATOM), - 'url' => $this->app['media_accessor.subdef_url_generator']->generate($issuer, $media, $urlTTL), - 'url_ttl' => $urlTTL, - ]; - } - - private function listPermalink(\media_Permalink_Adapter $permalink) - { - $downloadUrl = $permalink->get_url(); - $downloadUrl->getQuery()->set('download', '1'); - - return [ - 'created_on' => $permalink->get_created_on()->format(DATE_ATOM), - 'id' => $permalink->get_id(), - 'is_activated' => $permalink->get_is_activated(), - /** @Ignore */ - 'label' => $permalink->get_label(), - 'updated_on' => $permalink->get_last_modified()->format(DATE_ATOM), - 'page_url' => $permalink->get_page(), - 'download_url' => (string)$downloadUrl, - 'url' => (string)$permalink->get_url(), - ]; - } - - /** - * @param Request $request - * @param RecordReferenceInterface[]|RecordReferenceCollection $records - * @return array - */ - private function listRecords(Request $request, $records) - { - if (!$records instanceof RecordReferenceCollection) { - $records = new RecordReferenceCollection($records); - } - - $technicalData = $this->app['service.technical_data']->fetchRecordsTechnicalData($records); - - $data = []; - - foreach ($records->toRecords($this->getApplicationBox()) as $index => $record) { - $record->setTechnicalDataSet($technicalData[$index]); - - $data[$index] = $this->listRecord($request, $record); - } - - return $data; - } - - /** - * Retrieve detailed information about one record - * - * @param Request $request - * @param \record_adapter $record - * @return array - */ - private function listRecord(Request $request, \record_adapter $record) - { - $technicalInformation = []; - foreach ($record->get_technical_infos()->getValues() as $name => $value) { - $technicalInformation[] = ['name' => $name, 'value' => $value]; - } - - $data = [ - 'databox_id' => $record->getDataboxId(), - 'record_id' => $record->getRecordId(), - 'mime_type' => $record->getMimeType(), - 'title' => $record->get_title(), - 'original_name' => $record->get_original_name(), - 'updated_on' => $record->getUpdated()->format(DATE_ATOM), - 'created_on' => $record->getCreated()->format(DATE_ATOM), - 'collection_id' => $record->getCollectionId(), - 'base_id' => $record->getBaseId(), - 'sha256' => $record->getSha256(), - 'thumbnail' => $this->listEmbeddableMedia($request, $record, $record->get_thumbnail()), - 'technical_informations' => $technicalInformation, - 'phrasea_type' => $record->getType(), - 'uuid' => $record->getUuid(), - ]; - - if ($request->attributes->get('_extended', false)) { - $data = array_merge($data, [ - 'subdefs' => $this->listRecordEmbeddableMedias($request, $record), - 'metadata' => $this->listRecordMetadata($record), - 'status' => $this->listRecordStatus($record), - 'caption' => $this->listRecordCaption($record), - ]); - } - - return $data; - } - - /** - * @param Request $request - * @param \record_adapter $record - * @return array - */ - private function listRecordEmbeddableMedias(Request $request, \record_adapter $record) - { - $subdefs = []; - - foreach ($record->get_embedable_medias([], []) as $name => $media) { - if (null !== $subdef = $this->listEmbeddableMedia($request, $record, $media)) { - $subdefs[] = $subdef; - } - } - - return $subdefs; - } - - /** - * List all fields of given record - * - * @param \record_adapter $record - * @return array - */ - private function listRecordMetadata(\record_adapter $record) - { - $includeBusiness = $this->getAclForUser()->can_see_business_fields($record->getDatabox()); - - return $this->listRecordCaptionFields($record->get_caption()->get_fields(null, $includeBusiness)); - } - - /** - * @param \caption_field[] $fields - * @return array - */ - private function listRecordCaptionFields($fields) - { - $ret = []; - - foreach ($fields as $field) { - $databox_field = $field->get_databox_field(); - - $fieldData = [ - 'meta_structure_id' => $field->get_meta_struct_id(), - 'name' => $field->get_name(), - 'labels' => [ - 'fr' => $databox_field->get_label('fr'), - 'en' => $databox_field->get_label('en'), - 'de' => $databox_field->get_label('de'), - 'nl' => $databox_field->get_label('nl'), - ], - ]; - - foreach ($field->get_values() as $value) { - $data = [ - 'meta_id' => $value->getId(), - 'value' => $value->getValue(), - ]; - - $ret[] = $fieldData + $data; - } - } - - return $ret; - } - - /** - * Retrieve detailed information about one status - * - * @param \record_adapter $record - * @return array - */ - private function listRecordStatus(\record_adapter $record) - { - $ret = []; - foreach ($record->getStatusStructure() as $bit => $status) { - $ret[] = [ - 'bit' => $bit, - 'state' => \databox_status::bitIsSet($record->getStatusBitField(), $bit), - ]; - } - - return $ret; - } - - /** - * @param \record_adapter $record - * @return array - */ - private function listRecordCaption(\record_adapter $record) - { - $includeBusiness = $this->getAclForUser()->can_see_business_fields($record->getDatabox()); - - $caption = []; - - foreach ($record->get_caption()->get_fields(null, $includeBusiness) as $field) { - $caption[] = [ - 'meta_structure_id' => $field->get_meta_struct_id(), - 'name' => $field->get_name(), - 'value' => $field->get_serialized_values(';'), - ]; - } - - return $caption; - } - - /** - * Returns requested includes - * - * @param Request $request - * @return string[] - */ - private function resolveSearchIncludes(Request $request) - { - $includes = [ - 'results.stories.records' - ]; - - if ($request->attributes->get('_extended', false)) { - if ($request->get('search_type') != SearchEngineOptions::RECORD_STORY) { - $includes = array_merge($includes, [ - 'results.stories.records.subdefs', - 'results.stories.records.metadata', - 'results.stories.records.caption', - 'results.stories.records.status' - ]); - } - else { - $includes = [ 'results.stories.caption' ]; - } - - $includes = array_merge($includes, [ - 'results.records.subdefs', - 'results.records.metadata', - 'results.records.caption', - 'results.records.status' - ]); - } - - return $includes; - } - - /** - * @param SearchEngineResult $result - * @param string[] $includes - * @param int $urlTTL - * @param int|null $story_max_records - * @return SearchResultView - */ - private function buildSearchView(SearchEngineResult $result, array $includes, $urlTTL, $story_max_records = null) - { - $references = new RecordReferenceCollection($result->getResults()); - - $records = new RecordCollection(); - $stories = new RecordCollection(); - - foreach ($references->toRecords($this->getApplicationBox()) as $record) { - if ($record->isStory()) { - $stories[$record->getId()] = $record; - } else { - $records[$record->getId()] = $record; - } - } - - $resultView = new SearchResultView($result); - - if ($stories->count() > 0) { - $user = $this->getAuthenticatedUser(); - $children = []; - - foreach ($stories->getDataboxIds() as $databoxId) { - $storyIds = $stories->getDataboxRecordIds($databoxId); - - $selections = $this->findDataboxById($databoxId) - ->getRecordRepository() - ->findChildren($storyIds, $user,1, $story_max_records); - $children[$databoxId] = array_combine($storyIds, $selections); - } - - /** @var StoryView[] $storyViews */ - $storyViews = []; - /** @var RecordView[] $childrenViews */ - $childrenViews = []; - - foreach ($stories as $index => $story) { - $storyView = new StoryView($story); - - $selection = $children[$story->getDataboxId()][$story->getRecordId()]; - - $childrenView = $this->buildRecordViews($selection); - - foreach ($childrenView as $view) { - $childrenViews[spl_object_hash($view)] = $view; - } - - $storyView->setChildren($childrenView); - - $storyViews[$index] = $storyView; - } - - if (in_array('results.stories.thumbnail', $includes, true)) { - $subdefViews = $this->buildSubdefsViews($stories, ['thumbnail'], $urlTTL); - - foreach ($storyViews as $index => $storyView) { - $storyView->setSubdefs($subdefViews[$index]); - } - } - - if (in_array('results.stories.metadatas', $includes, true) || - in_array('results.stories.caption', $includes, true)) { - $captions = $this->app['service.caption']->findByReferenceCollection($stories); - $canSeeBusiness = $this->retrieveSeeBusinessPerDatabox($stories); - - $this->buildCaptionViews($storyViews, $captions, $canSeeBusiness); - } - - $allChildren = new RecordCollection(); - foreach ($childrenViews as $index => $childrenView) { - $allChildren[$index] = $childrenView->getRecord(); - } - - $names = in_array('results.stories.records.subdefs', $includes, true) ? null : ['thumbnail']; - $subdefViews = $this->buildSubdefsViews($allChildren, $names, $urlTTL); - $technicalDatasets = $this->app['service.technical_data']->fetchRecordsTechnicalData($allChildren); - - foreach ($childrenViews as $index => $recordView) { - $recordView->setSubdefs($subdefViews[$index]); - $recordView->setTechnicalDataView(new TechnicalDataView($technicalDatasets[$index])); - } - - if (array_intersect($includes, ['results.stories.records.metadata', 'results.stories.records.caption'])) { - $captions = $this->app['service.caption']->findByReferenceCollection($allChildren); - $canSeeBusiness = $this->retrieveSeeBusinessPerDatabox($allChildren); - - $this->buildCaptionViews($childrenViews, $captions, $canSeeBusiness); - } - - $resultView->setStories($storyViews); - } - - if ($records->count() > 0) { - $names = in_array('results.records.subdefs', $includes, true) ? null : ['thumbnail']; - $recordViews = $this->buildRecordViews($records); - $subdefViews = $this->buildSubdefsViews($records, $names, $urlTTL); - - $technicalDatasets = $this->app['service.technical_data']->fetchRecordsTechnicalData($records); - - foreach ($recordViews as $index => $recordView) { - $recordView->setSubdefs($subdefViews[$index]); - $recordView->setTechnicalDataView(new TechnicalDataView($technicalDatasets[$index])); - } - - if (array_intersect($includes, ['results.records.metadata', 'results.records.caption'])) { - $captions = $this->app['service.caption']->findByReferenceCollection($records); - $canSeeBusiness = $this->retrieveSeeBusinessPerDatabox($records); - - $this->buildCaptionViews($recordViews, $captions, $canSeeBusiness); - } - - $resultView->setRecords($recordViews); - } - - return $resultView; - } - - /** - * @param Request $request - * @return SearchEngineResult - */ - private function doSearch(Request $request) - { - $options = SearchEngineOptions::fromRequest($this->app, $request); - $options->setFirstResult((int)($request->get('offset_start') ?: 0)); - $options->setMaxResults((int)$request->get('per_page') ?: 10); - - $this->getSearchEngine()->resetCache(); - - $search_result = $this->getSearchEngine()->query((string)$request->get('query'), $options); - - $this->getUserManipulator()->logQuery($this->getAuthenticatedUser(), $search_result->getQueryText()); - - // log array of collectionIds (from $options) for each databox - $collectionsReferencesByDatabox = $options->getCollectionsReferencesByDatabox(); - foreach ($collectionsReferencesByDatabox as $sbid => $references) { - $databox = $this->findDataboxById($sbid); - $collectionsIds = array_map(function(CollectionReference $ref){return $ref->getCollectionId();}, $references); - $this->getSearchEngineLogger()->log($databox, $search_result->getQueryText(), $search_result->getTotal(), $collectionsIds); - } - - $this->getSearchEngine()->clearCache(); - - return $search_result; - } - - /** - * @return SearchEngineInterface - */ - private function getSearchEngine() - { - return $this->app['phraseanet.SE']; - } - - /** - * @return UserManipulator - */ - private function getUserManipulator() - { - return $this->app['manipulator.user']; - } - - /** - * @return SearchEngineLogger - */ - private function getSearchEngineLogger() - { - return $this->app['phraseanet.SE.logger']; - } - - /** - * @param Request $request - * @return int - */ - private function resolveSubdefUrlTTL(Request $request) - { - $urlTTL = $request->query->get('subdef_url_ttl'); - - if (null !== $urlTTL) { - return (int)$urlTTL; - } - - return $this->getConf()->get(['registry', 'general', 'default-subdef-url-ttl']); - } - - /** - * @param RecordCollection|\record_adapter[] $references - * @return RecordView[] - */ - private function buildRecordViews($references) - { - if (!$references instanceof RecordCollection) { - $references = new RecordCollection($references); - } - - $recordViews = []; - - foreach ($references as $index => $record) { - $recordViews[$index] = new RecordView($record); - } - - return $recordViews; - } - - /** - * @param RecordReferenceInterface[]|RecordReferenceCollection|DataboxGroupable $references - * @param array|null $names - * @param int $urlTTL - * @return SubdefView[][] - */ - private function buildSubdefsViews($references, array $names = null, $urlTTL) - { - $subdefGroups = $this->app['service.media_subdef'] - ->findSubdefsByRecordReferenceFromCollection($references, $names); - - $fakeSubdefs = []; - - foreach ($subdefGroups as $index => $subdefGroup) { - if (!isset($subdefGroup['thumbnail'])) { - $fakeSubdef = new \media_subdef($this->app, $references[$index], 'thumbnail', true, []); - $fakeSubdefs[spl_object_hash($fakeSubdef)] = $fakeSubdef; - - $subdefGroups[$index]['thumbnail'] = $fakeSubdef; - } - } - - $allSubdefs = $this->mergeGroupsIntoOneList($subdefGroups); - $allPermalinks = \media_Permalink_Adapter::getMany( - $this->app, - array_filter($allSubdefs, function (\media_subdef $subdef) use ($fakeSubdefs) { - return !isset($fakeSubdefs[spl_object_hash($subdef)]); - }) - ); - $urls = $this->app['media_accessor.subdef_url_generator'] - ->generateMany($this->getAuthenticatedUser(), $allSubdefs, $urlTTL); - - $subdefViews = []; - - /** @var \media_subdef $subdef */ - foreach ($allSubdefs as $index => $subdef) { - $subdefView = new SubdefView($subdef); - - if (isset($allPermalinks[$index])) { - $subdefView->setPermalinkView(new PermalinkView($allPermalinks[$index])); - } - - $subdefView->setUrl($urls[$index]); - $subdefView->setUrlTTL($urlTTL); - - $subdefViews[spl_object_hash($subdef)] = $subdefView; - } - - $reorderedGroups = []; - - /** @var \media_subdef[] $subdefGroup */ - foreach ($subdefGroups as $index => $subdefGroup) { - $reordered = []; - - foreach ($subdefGroup as $subdef) { - $reordered[] = $subdefViews[spl_object_hash($subdef)]; - } - - $reorderedGroups[$index] = $reordered; - } - - return $reorderedGroups; - } - - /** - * @param array $groups - * @return array|mixed - */ - private function mergeGroupsIntoOneList(array $groups) - { - // Strips keys from the internal array - array_walk($groups, function (array &$group) { - $group = array_values($group); - }); - - if ($groups) { - return call_user_func_array('array_merge', $groups); - } - - return []; - } - - /** - * @param RecordReferenceInterface[]|DataboxGroupable $references - * @return array - */ - private function retrieveSeeBusinessPerDatabox($references) - { - if (!$references instanceof DataboxGroupable) { - $references = new RecordReferenceCollection($references); - } - - $acl = $this->getAclForUser(); - - $canSeeBusiness = []; - - foreach ($references->getDataboxIds() as $databoxId) { - $canSeeBusiness[$databoxId] = $acl->can_see_business_fields($this->findDataboxById($databoxId)); - } - - $rights = []; - - foreach ($references as $index => $reference) { - $rights[$index] = $canSeeBusiness[$reference->getDataboxId()]; - } - - return $rights; - } - - /** - * @param RecordView[] $recordViews - * @param \caption_record[] $captions - * @param bool[] $canSeeBusiness - */ - private function buildCaptionViews($recordViews, $captions, $canSeeBusiness) - { - foreach ($recordViews as $index => $recordView) { - $caption = $captions[$index]; - - $captionView = new CaptionView($caption); - - $captionView->setFields($caption->get_fields(null, isset($canSeeBusiness[$index]) && (bool)$canSeeBusiness[$index])); - - $recordView->setCaption($captionView); - } - } -} diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php b/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php index f59696ddbe..44828c0cb7 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php @@ -3,22 +3,39 @@ namespace Alchemy\Phrasea\ControllerProvider\Api; use Alchemy\Phrasea\Application as PhraseaApplication; -use Alchemy\Phrasea\Controller\Api\V3Controller; +use Alchemy\Phrasea\Controller\Api\V3\V3MetadatasController; +use Alchemy\Phrasea\Controller\Api\V3\V3SearchController; +use Alchemy\Phrasea\Controller\Api\V3\V3StoriesController; use Alchemy\Phrasea\Core\Event\Listener\OAuthListener; use Silex\Application; use Silex\ControllerCollection; use Silex\ControllerProviderInterface; use Silex\ServiceProviderInterface; + class V3 extends Api implements ControllerProviderInterface, ServiceProviderInterface { const VERSION = '3.0.0'; + /** + * @param Application $app + * + * @uses V3MetadatasController::setmetadatasAction() + * @uses V3SearchController::searchAction() + * @uses V3StoriesController::getStoryAction() + */ public function register(Application $app) { - $app['controller.api.v3'] = $app->share(function (PhraseaApplication $app) { - return (new V3Controller($app)) - ->setJsonBodyHelper($app['json.body_helper']); + $app['controller.api.v3.metadatas'] = $app->share(function (PhraseaApplication $app) { + return (new V3MetadatasController($app)) + ->setJsonBodyHelper($app['json.body_helper']) + ; + }); + $app['controller.api.v3.search'] = $app->share(function (PhraseaApplication $app) { + return (new V3SearchController($app)); + }); + $app['controller.api.v3.stories'] = $app->share(function (PhraseaApplication $app) { + return (new V3StoriesController($app)); }); } @@ -37,14 +54,14 @@ class V3 extends Api implements ControllerProviderInterface, ServiceProviderInte $controllers->before(new OAuthListener()); - $controllers->get('/stories/{databox_id}/{record_id}/', 'controller.api.v3:getStoryAction') + $controllers->get('/stories/{databox_id}/{record_id}/', 'controller.api.v3.stories:getStoryAction') ->before('controller.api.v1:ensureCanAccessToRecord') ->assert('databox_id', '\d+') ->assert('record_id', '\d+'); - $controllers->match('/search/', 'controller.api.v3:searchAction'); + $controllers->match('/search/', 'controller.api.v3.search:searchAction'); - $controllers->patch('/records/{databox_id}/{record_id}/setmetadatas/', 'controller.api.v3:setmetadatasAction') + $controllers->patch('/records/{databox_id}/{record_id}/setmetadatas/', 'controller.api.v3.metadatas:setmetadatasAction') ->before('controller.api.v1:ensureCanAccessToRecord') ->before('controller.api.v1:ensureCanModifyRecord') ->assert('databox_id', '\d+') From da2ce2471a1e3f5a1e3dca257357fbba1e26f734 Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 4 Jun 2020 10:50:26 +0300 Subject: [PATCH 011/165] webhook privacy --- .../Event/Subscriber/WebhookSubdefEventSubscriber.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookSubdefEventSubscriber.php b/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookSubdefEventSubscriber.php index ca5d88b2ab..04af58cf3c 100644 --- a/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookSubdefEventSubscriber.php +++ b/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookSubdefEventSubscriber.php @@ -30,7 +30,8 @@ class WebhookSubdefEventSubscriber implements EventSubscriberInterface $this->app['manipulator.webhook-event']->create( WebhookEvent::RECORD_SUBDEF_CREATED, WebhookEvent::RECORD_SUBDEF_TYPE, - $eventData + $eventData, + [$event->getRecord()->getBaseId()] ); } @@ -45,7 +46,8 @@ class WebhookSubdefEventSubscriber implements EventSubscriberInterface $this->app['manipulator.webhook-event']->create( WebhookEvent::RECORD_SUBDEF_FAILED, WebhookEvent::RECORD_SUBDEF_TYPE, - $eventData + $eventData, + [$event->getRecord()->getBaseId()] ); } @@ -60,7 +62,8 @@ class WebhookSubdefEventSubscriber implements EventSubscriberInterface $this->app['manipulator.webhook-event']->create( WebhookEvent::RECORD_SUBDEFS_CREATED, WebhookEvent::RECORD_SUBDEF_TYPE, - $eventData + $eventData, + [$event->getRecord()->getBaseId()] ); } From 7ea8e95549f448367fbaf7176104a7bdcfef08b9 Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 4 Jun 2020 12:02:52 +0300 Subject: [PATCH 012/165] remove unused webhook subdef_count --- .../WebhookSubdefEventSubscriber.php | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookSubdefEventSubscriber.php b/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookSubdefEventSubscriber.php index 04af58cf3c..dd676f92f3 100644 --- a/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookSubdefEventSubscriber.php +++ b/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookSubdefEventSubscriber.php @@ -5,7 +5,6 @@ namespace Alchemy\Phrasea\Core\Event\Subscriber; use Alchemy\Phrasea\Core\Event\Record\RecordEvents; use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreatedEvent; use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreationFailedEvent; -use Alchemy\Phrasea\Core\Event\Record\SubDefinitionsCreatedEvent; use Alchemy\Phrasea\Model\Entities\WebhookEvent; use Silex\Application; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -51,27 +50,10 @@ class WebhookSubdefEventSubscriber implements EventSubscriberInterface ); } - public function onSubdefsCreated(SubDefinitionsCreatedEvent $event) - { - $eventData = [ - 'databox_id' => $event->getRecord()->getDataboxId(), - 'record_id' => $event->getRecord()->getRecordId(), - 'subdef_count' => count($event->getMedia()) - ]; - - $this->app['manipulator.webhook-event']->create( - WebhookEvent::RECORD_SUBDEFS_CREATED, - WebhookEvent::RECORD_SUBDEF_TYPE, - $eventData, - [$event->getRecord()->getBaseId()] - ); - } - public static function getSubscribedEvents() { return [ RecordEvents::SUB_DEFINITION_CREATED => 'onSubdefCreated', - RecordEvents::SUB_DEFINITIONS_CREATED => 'onSubdefsCreated', RecordEvents::SUB_DEFINITION_CREATION_FAILED => 'onSubdefCreationFailed' ]; } From 944f78fbf60e7ac7064264d20d096d92247181ea Mon Sep 17 00:00:00 2001 From: nmaillat Date: Thu, 4 Jun 2020 12:39:19 +0200 Subject: [PATCH 013/165] phraseanet entrypoint move chown --- docker/phraseanet/entrypoint.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docker/phraseanet/entrypoint.sh b/docker/phraseanet/entrypoint.sh index e4b4451062..a0dabfc5fc 100755 --- a/docker/phraseanet/entrypoint.sh +++ b/docker/phraseanet/entrypoint.sh @@ -44,4 +44,13 @@ fi ./docker/phraseanet/plugins/console init +chown -R app:app \ + cache \ + config \ + datas \ + tmp \ + logs \ + www/thumbnails \ + www/custom + bash -e docker-php-entrypoint $@ From 68085f151190a994d496a5683ce5ba4bc96aa5a9 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 4 Jun 2020 14:52:46 +0400 Subject: [PATCH 014/165] PHRAS-2773 Prod add notification on downloading large files --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 062865c82a..9182e782d4 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.214-d", + "phraseanet-production-client": "0.34.216-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/yarn.lock b/yarn.lock index f641a68101..cbf1a98db1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7578,10 +7578,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.214-d: - version "0.34.214-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.214-d.tgz#55675c3925c81626ddd8b9498e02c9d106a51d93" - integrity sha512-RXg7KMgpPtv4rR3c2tCNMr7RgneAZjvBbFyGVx+a42nPkkZMnulweDm1R2o5d/eOcW6uJWPWczSmCCS0GqNnVQ== +phraseanet-production-client@0.34.216-d: + version "0.34.216-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.216-d.tgz#c7ba0c6f3e1914c270a589214e8b7e0e5a824e1f" + integrity sha512-JE9vKZp5RAbRyhSNkuY4M8gIpfF0OBt/V0Q3/vHVcKAWv4HgZYtNc4itkWTGDwjKfbPPDmQ67PTkmFpec13+ig== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 733d97b5d57d385e285e6756b769f8b88aefccf9 Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 4 Jun 2020 14:13:11 +0300 Subject: [PATCH 015/165] fix test --- .../Phrasea/Model/Repositories/WebhookEventRepositoryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Alchemy/Tests/Phrasea/Model/Repositories/WebhookEventRepositoryTest.php b/tests/Alchemy/Tests/Phrasea/Model/Repositories/WebhookEventRepositoryTest.php index d27c00738e..b1f25ba585 100644 --- a/tests/Alchemy/Tests/Phrasea/Model/Repositories/WebhookEventRepositoryTest.php +++ b/tests/Alchemy/Tests/Phrasea/Model/Repositories/WebhookEventRepositoryTest.php @@ -12,6 +12,6 @@ class WebhookEventRepositoryTest extends \PhraseanetTestCase { $events = self::$DI['app']['orm.em']->getRepository('Phraseanet:WebhookEvent')->findUnprocessedEvents(); // I have no clue as to why this magic number is here, probably best to discard test - $this->assertCount(41, $events); + $this->assertCount(34, $events); } } From cdadb3acc4dda01c1ee23d5562f5254323140cf0 Mon Sep 17 00:00:00 2001 From: jygaulier Date: Thu, 4 Jun 2020 14:08:08 +0200 Subject: [PATCH 016/165] WIP refacto common code --- .../Api/V3/V3MetadatasController.php | 57 +++-- .../Controller/Api/V3/V3ResultHelpers.php | 241 +++++++++++++++++- .../Controller/Api/V3/V3StoriesController.php | 223 +--------------- .../Phrasea/ControllerProvider/Api/V3.php | 31 ++- .../Phrasea/Search/PermalinkTransformer.php | 1 - 5 files changed, 295 insertions(+), 258 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php index b016dcfcd7..ee9df9dd93 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php @@ -9,8 +9,10 @@ use Alchemy\Phrasea\Controller\Api\Result; use Alchemy\Phrasea\Controller\Controller; use Alchemy\Phrasea\Core\Event\RecordEdit; use Alchemy\Phrasea\Core\PhraseaEvents; +use caption_field; use databox_field; use Exception; +use record_adapter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -53,11 +55,11 @@ class V3MetadatasController extends Controller try { // do metadatas ops if (is_array($b->metadatas)) { - $ret['metadatas_ops'] = $this->setmetadatasAction_meta($struct, $record, $b->metadatas); + $ret['metadatas_ops'] = $this->do_metadatas($struct, $record, $b->metadatas); } // do sb ops if (is_array($b->status)) { - $ret['sb_ops'] = $this->setmetadatasAction_sb($struct, $record, $b->status); + $ret['sb_ops'] = $this->do_status($struct, $record, $b->status); } } catch (Exception $e) { @@ -67,17 +69,26 @@ class V3MetadatasController extends Controller ); } + $ret = $this->getResultHelpers()->listRecord($request, $record, $this->getAclForUser()); + return Result::create($request, $ret)->createResponse(); } + + ////////////////////////////////// + /// TODO : keep multi-values uniques ! + /// it should be done in record_adapter + ////////////////////////////////// + + /** - * @param $struct - * @param $record + * @param databox_field[] $struct + * @param record_adapter $record * @param $metadatas * @return array * @throws Exception */ - private function setmetadatasAction_meta($struct, $record, $metadatas) + private function do_metadatas($struct, record_adapter $record, $metadatas) { $structByKey = []; $nameToStrucId = []; @@ -135,19 +146,19 @@ class V3MetadatasController extends Controller switch ($_m->action) { case 'set': - $ops = $this->setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values); + $ops = $this->metadata_set($struct_fields, $caption_fields, $meta_id, $values); break; case 'add': - $ops = $this->setmetadatasAction_add($struct_fields, $values); + $ops = $this->metadata_add($struct_fields, $values); break; case 'delete': - $ops = $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, null); + $ops = $this->metadata_replace($caption_fields, $meta_id, $match_method, $values, null); break; case 'replace': if (!is_string($_m->replace_with) && !is_null($_m->replace_with)) { throw new Exception("bad \"replace_with\" for action \"replace\"."); } - $ops = $this->setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $_m->replace_with); + $ops = $this->metadata_replace($caption_fields, $meta_id, $match_method, $values, $_m->replace_with); break; default: throw new Exception(sprintf("bad action (%s).", $action)); @@ -156,6 +167,8 @@ class V3MetadatasController extends Controller $metadatas_ops = array_merge($metadatas_ops, $ops); } + // $record->set_metadatas($metadatas_ops, true); + return $metadatas_ops; } @@ -166,7 +179,7 @@ class V3MetadatasController extends Controller * @return array * @throws Exception */ - private function setmetadatasAction_sb($struct, $record, $statuses) + private function do_status($struct, $record, $statuses) { $datas = strrev($record->getStatus()); @@ -183,7 +196,7 @@ class V3MetadatasController extends Controller $datas = substr($datas, 0, ($n)) . $value . substr($datas, ($n + 1)); } - // $record->setStatus(strrev($datas)); + $record->setStatus(strrev($datas)); // @todo Move event dispatch inside record_adapter class (keeps things encapsulated) $this->dispatch(PhraseaEvents::RECORD_EDIT, new RecordEdit($record)); @@ -204,21 +217,16 @@ class V3MetadatasController extends Controller return false; } - ////////////////////////////////// - /// TODO : keep multi-values uniques ! - /// it should be done in record_adapter - ////////////////////////////////// - /** * @param databox_field[] $struct_fields struct-fields (from struct) matching meta_struct_id or field_name - * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) + * @param caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) * @param int|null $meta_id * @param string[] $values * * @return array ops to execute * @throws Exception */ - private function setmetadatasAction_set($struct_fields, $caption_fields, $meta_id, $values) + private function metadata_set($struct_fields, $caption_fields, $meta_id, $values) { $ops = []; @@ -271,7 +279,7 @@ class V3MetadatasController extends Controller * @return array ops to execute * @throws Exception */ - private function setmetadatasAction_add($struct_fields, $values) + private function metadata_add($struct_fields, $values) { $ops = []; @@ -296,7 +304,7 @@ class V3MetadatasController extends Controller } /** - * @param \caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) + * @param caption_field[] $caption_fields caption-fields (from record) matching meta_struct_id or field_name (or all if not set) * @param int|null $meta_id * @param string $match_method "strict" | "ignore_case" | "regexp" * @param string[] $values @@ -304,7 +312,7 @@ class V3MetadatasController extends Controller * * @return array ops to execute */ - private function setmetadatasAction_replace($caption_fields, $meta_id, $match_method, $values, $replace_with) + private function metadata_replace($caption_fields, $meta_id, $match_method, $values, $replace_with) { $ops = []; @@ -357,15 +365,18 @@ class V3MetadatasController extends Controller */ private function getResultHelpers() { + return $this->app['controller.api.v3.resulthelpers']; + /* static $rh = null; if(is_null($rh)) { $rh = new V3ResultHelpers( - $this, $this->getConf(), - $this->app['media_accessor.subdef_url_generator'] + $this->app['media_accessor.subdef_url_generator'], + $this->getAuthenticator() ); } return $rh; + */ } } diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php index 38a6da1c1b..0438749d98 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3ResultHelpers.php @@ -3,33 +3,37 @@ namespace Alchemy\Phrasea\Controller\Api\V3; -use Alchemy\Phrasea\Controller\Controller; +use ACL; +use Alchemy\Phrasea\Authentication\Authenticator; use Alchemy\Phrasea\Core\Configuration\PropertyAccess; use Alchemy\Phrasea\Media\MediaSubDefinitionUrlGenerator; +use caption_field; use databox_status; +use media_Permalink_Adapter; +use media_subdef; use record_adapter; +use Symfony\Component\HttpFoundation\Request; class V3ResultHelpers { - /** @var controller */ - private $controller; + /** @var PropertyAccess */ + private $conf; /** @var MediaSubDefinitionUrlGenerator */ private $urlgenerator; - /** @var PropertyAccess */ - private $conf; + /** @var Authenticator */ + private $authenticator; - public function __construct($controller, $conf, $urlgenerator) + public function __construct($conf, $urlgenerator, Authenticator $authenticator) { - $this->controller = $controller; $this->urlgenerator = $urlgenerator; $this->conf = $conf; + $this->authenticator = $authenticator; } - /** * Retrieve detailed information about one status * @@ -49,4 +53,225 @@ class V3ResultHelpers return $ret; } + public function listEmbeddableMedia(Request $request, record_adapter $record, media_subdef $media, ACL $acl) + { + if (!$media->is_physically_present()) { + return null; + } + + if ($this->getAuthenticator()->isAuthenticated()) { + if ($media->get_name() !== 'document' + && false === $acl->has_access_to_subdef($record, $media->get_name()) + ) { + return null; + } + if ($media->get_name() === 'document' + && !$acl->has_right_on_base($record->getBaseId(), ACL::CANDWNLDHD) + && !$acl->has_hd_grant($record) + ) { + return null; + } + } + + if ($media->get_permalink() instanceof media_Permalink_Adapter) { + $permalink = $this->listPermalink($media->get_permalink()); + } else { + $permalink = null; + } + + $urlTTL = (int) $request->get( + 'subdef_url_ttl', + $this->getConf()->get(['registry', 'general', 'default-subdef-url-ttl']) + ); + if ($urlTTL < 0) { + $urlTTL = -1; + } + $issuer = $this->getAuthenticator()->getUser(); + + return [ + 'name' => $media->get_name(), + 'permalink' => $permalink, + 'height' => $media->get_height(), + 'width' => $media->get_width(), + 'filesize' => $media->get_size(), + 'devices' => $media->getDevices(), + 'player_type' => $media->get_type(), + 'mime_type' => $media->get_mime(), + 'substituted' => $media->is_substituted(), + 'created_on' => $media->get_creation_date()->format(DATE_ATOM), + 'updated_on' => $media->get_modification_date()->format(DATE_ATOM), + 'url' => $this->urlgenerator->generate($issuer, $media, $urlTTL), + 'url_ttl' => $urlTTL, + ]; + } + + /** + * @param media_Permalink_Adapter $permalink + * @return array + * + * @todo fix duplicated code + * @noinspection DuplicatedCode + */ + public function listPermalink(media_Permalink_Adapter $permalink) + { + $downloadUrl = $permalink->get_url(); + $downloadUrl->getQuery()->set('download', '1'); + + return [ + 'created_on' => $permalink->get_created_on()->format(DATE_ATOM), + 'id' => $permalink->get_id(), + 'is_activated' => $permalink->get_is_activated(), + 'label' => $permalink->get_label(), + 'updated_on' => $permalink->get_last_modified()->format(DATE_ATOM), + 'page_url' => $permalink->get_page(), + 'download_url' => (string)$downloadUrl, + 'url' => (string)$permalink->get_url(), + ]; + } + + /** + * Retrieve detailed information about one record + * + * @param Request $request + * @param record_adapter $record + * @param ACL $aclforuser + * @return array + */ + public function listRecord(Request $request, record_adapter $record, ACL $aclforuser) + { + $technicalInformation = []; + foreach ($record->get_technical_infos()->getValues() as $name => $value) { + $technicalInformation[] = ['name' => $name, 'value' => $value]; + } + + $data = [ + 'databox_id' => $record->getDataboxId(), + 'record_id' => $record->getRecordId(), + 'mime_type' => $record->getMimeType(), + 'title' => $record->get_title(), + 'original_name' => $record->get_original_name(), + 'updated_on' => $record->getUpdated()->format(DATE_ATOM), + 'created_on' => $record->getCreated()->format(DATE_ATOM), + 'collection_id' => $record->getCollectionId(), + 'base_id' => $record->getBaseId(), + 'sha256' => $record->getSha256(), + 'thumbnail' => $this->listEmbeddableMedia($request, $record, $record->get_thumbnail(), $aclforuser), + 'technical_informations' => $technicalInformation, + 'phrasea_type' => $record->getType(), + 'uuid' => $record->getUuid(), + ]; + + if ($request->attributes->get('_extended', false)) { + $data = array_merge($data, [ + 'subdefs' => $this->listRecordEmbeddableMedias($request, $record, $aclforuser), + 'metadata' => $this->listRecordMetadata($record, $aclforuser), + 'status' => $this->listRecordStatus($record), + 'caption' => $this->listRecordCaption($record, $aclforuser), + ]); + } + + return $data; + } + + /** + * @param Request $request + * @param record_adapter $record + * @return array + */ + private function listRecordEmbeddableMedias(Request $request, record_adapter $record, ACL $acl) + { + $subdefs = []; + + foreach ($record->get_embedable_medias([], []) as $name => $media) { + if (null !== $subdef = $this->listEmbeddableMedia($request, $record, $media, $acl)) { + $subdefs[] = $subdef; + } + } + + return $subdefs; + } + + /** + * List all fields of given record + * + * @param record_adapter $record + * @param ACL $acl + * @return array + */ + private function listRecordMetadata(record_adapter $record, ACL $acl) + { + $includeBusiness = $acl->can_see_business_fields($record->getDatabox()); + + return $this->listRecordCaptionFields($record->get_caption()->get_fields(null, $includeBusiness)); + } + + /** + * @param caption_field[] $fields + * @return array + */ + private function listRecordCaptionFields($fields) + { + $ret = []; + + foreach ($fields as $field) { + $databox_field = $field->get_databox_field(); + + $fieldData = [ + 'meta_structure_id' => $field->get_meta_struct_id(), + 'name' => $field->get_name(), + 'labels' => [ + 'fr' => $databox_field->get_label('fr'), + 'en' => $databox_field->get_label('en'), + 'de' => $databox_field->get_label('de'), + 'nl' => $databox_field->get_label('nl'), + ], + ]; + + foreach ($field->get_values() as $value) { + $data = [ + 'meta_id' => $value->getId(), + 'value' => $value->getValue(), + ]; + + $ret[] = $fieldData + $data; + } + } + + return $ret; + } + + /** + * @param record_adapter $record + * @param ACL $acl + * @return array + */ + private function listRecordCaption(record_adapter $record, ACL $acl) + { + $includeBusiness = $acl->can_see_business_fields($record->getDatabox()); + + $caption = []; + + foreach ($record->get_caption()->get_fields(null, $includeBusiness) as $field) { + $caption[] = [ + 'meta_structure_id' => $field->get_meta_struct_id(), + 'name' => $field->get_name(), + 'value' => $field->get_serialized_values(';'), + ]; + } + + return $caption; + } + + + //////////////////////// + private function getAuthenticator() + { + return $this->authenticator; + } + + protected function getConf() + { + return $this->conf; + } + } diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3StoriesController.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3StoriesController.php index 14fccc741d..2033c03fed 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V3/V3StoriesController.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3StoriesController.php @@ -2,7 +2,6 @@ namespace Alchemy\Phrasea\Controller\Api\V3; -use ACL; use Alchemy\Phrasea\Application\Helper\DispatcherAware; use Alchemy\Phrasea\Application\Helper\JsonBodyAware; use Alchemy\Phrasea\Controller\Api\Result; @@ -10,12 +9,9 @@ use Alchemy\Phrasea\Controller\Api\V1Controller; use Alchemy\Phrasea\Controller\Controller; use Alchemy\Phrasea\Model\RecordReferenceInterface; use Alchemy\Phrasea\Record\RecordReferenceCollection; -use caption_field; use caption_record; use databox_Field_DCESAbstract; use Exception; -use media_Permalink_Adapter; -use media_subdef; use record_adapter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -51,23 +47,6 @@ class V3StoriesController extends Controller } } - /** - * @return V3ResultHelpers - */ - private function getResultHelpers() - { - static $rh = null; - - if(is_null($rh)) { - $rh = new V3ResultHelpers( - $this, - $this->getConf(), - $this->app['media_accessor.subdef_url_generator'] - ); - } - return $rh; - } - /** * Retrieve detailed information about one story * @@ -107,7 +86,7 @@ class V3StoriesController extends Controller 'created_on' => $story->getCreated()->format(DATE_ATOM), 'collection_id' => $story->getCollectionId(), 'base_id' => $story->getBaseId(), - 'thumbnail' => $this->listEmbeddableMedia($request, $story, $story->get_thumbnail()), + 'thumbnail' => $this->getResultHelpers()->listEmbeddableMedia($request, $story, $story->get_thumbnail(), $this->getAclForUser()), 'uuid' => $story->getUuid(), 'metadatas' => [ '@entity@' => V1Controller::OBJECT_TYPE_STORY_METADATA_BAG, @@ -149,211 +128,19 @@ class V3StoriesController extends Controller foreach ($records->toRecords($this->getApplicationBox()) as $index => $record) { $record->setTechnicalDataSet($technicalData[$index]); - $data[$index] = $this->listRecord($request, $record); - } - - return $data; - } - public function listEmbeddableMedia(Request $request, record_adapter $record, media_subdef $media) - { - if (!$media->is_physically_present()) { - return null; - } - - if ($this->getAuthenticator()->isAuthenticated()) { - $acl = $this->getAclForUser(); - if ($media->get_name() !== 'document' - && false === $acl->has_access_to_subdef($record, $media->get_name()) - ) { - return null; - } - if ($media->get_name() === 'document' - && !$acl->has_right_on_base($record->getBaseId(), ACL::CANDWNLDHD) - && !$acl->has_hd_grant($record) - ) { - return null; - } - } - - if ($media->get_permalink() instanceof media_Permalink_Adapter) { - $permalink = $this->listPermalink($media->get_permalink()); - } else { - $permalink = null; - } - - $urlTTL = (int) $request->get( - 'subdef_url_ttl', - $this->getConf()->get(['registry', 'general', 'default-subdef-url-ttl']) - ); - if ($urlTTL < 0) { - $urlTTL = -1; - } - $issuer = $this->getAuthenticatedUser(); - - return [ - 'name' => $media->get_name(), - 'permalink' => $permalink, - 'height' => $media->get_height(), - 'width' => $media->get_width(), - 'filesize' => $media->get_size(), - 'devices' => $media->getDevices(), - 'player_type' => $media->get_type(), - 'mime_type' => $media->get_mime(), - 'substituted' => $media->is_substituted(), - 'created_on' => $media->get_creation_date()->format(DATE_ATOM), - 'updated_on' => $media->get_modification_date()->format(DATE_ATOM), - 'url' => $this->app['media_accessor.subdef_url_generator']->generate($issuer, $media, $urlTTL), - 'url_ttl' => $urlTTL, - ]; - } - - private function listPermalink(media_Permalink_Adapter $permalink) - { - $downloadUrl = $permalink->get_url(); - $downloadUrl->getQuery()->set('download', '1'); - - return [ - 'created_on' => $permalink->get_created_on()->format(DATE_ATOM), - 'id' => $permalink->get_id(), - 'is_activated' => $permalink->get_is_activated(), - /** @Ignore */ - 'label' => $permalink->get_label(), - 'updated_on' => $permalink->get_last_modified()->format(DATE_ATOM), - 'page_url' => $permalink->get_page(), - 'download_url' => (string)$downloadUrl, - 'url' => (string)$permalink->get_url(), - ]; - } - - - /** - * Retrieve detailed information about one record - * - * @param Request $request - * @param record_adapter $record - * @return array - */ - public function listRecord(Request $request, record_adapter $record) - { - $technicalInformation = []; - foreach ($record->get_technical_infos()->getValues() as $name => $value) { - $technicalInformation[] = ['name' => $name, 'value' => $value]; - } - - $data = [ - 'databox_id' => $record->getDataboxId(), - 'record_id' => $record->getRecordId(), - 'mime_type' => $record->getMimeType(), - 'title' => $record->get_title(), - 'original_name' => $record->get_original_name(), - 'updated_on' => $record->getUpdated()->format(DATE_ATOM), - 'created_on' => $record->getCreated()->format(DATE_ATOM), - 'collection_id' => $record->getCollectionId(), - 'base_id' => $record->getBaseId(), - 'sha256' => $record->getSha256(), - 'thumbnail' => $this->listEmbeddableMedia($request, $record, $record->get_thumbnail()), - 'technical_informations' => $technicalInformation, - 'phrasea_type' => $record->getType(), - 'uuid' => $record->getUuid(), - ]; - - if ($request->attributes->get('_extended', false)) { - $data = array_merge($data, [ - 'subdefs' => $this->listRecordEmbeddableMedias($request, $record), - 'metadata' => $this->listRecordMetadata($record), - 'status' => $this->getResultHelpers()->listRecordStatus($record), - 'caption' => $this->listRecordCaption($record), - ]); + $data[$index] = $this->getResultHelpers()->listRecord($request, $record, $this->getAclForUser()); } return $data; } - /** - * @param Request $request - * @param record_adapter $record - * @return array - */ - private function listRecordEmbeddableMedias(Request $request, record_adapter $record) - { - $subdefs = []; - - foreach ($record->get_embedable_medias([], []) as $name => $media) { - if (null !== $subdef = $this->listEmbeddableMedia($request, $record, $media)) { - $subdefs[] = $subdef; - } - } - - return $subdefs; - } /** - * List all fields of given record - * - * @param record_adapter $record - * @return array + * @return V3ResultHelpers */ - private function listRecordMetadata(record_adapter $record) + private function getResultHelpers() { - $includeBusiness = $this->getAclForUser()->can_see_business_fields($record->getDatabox()); - - return $this->listRecordCaptionFields($record->get_caption()->get_fields(null, $includeBusiness)); - } - - /** - * @param caption_field[] $fields - * @return array - */ - private function listRecordCaptionFields($fields) - { - $ret = []; - - foreach ($fields as $field) { - $databox_field = $field->get_databox_field(); - - $fieldData = [ - 'meta_structure_id' => $field->get_meta_struct_id(), - 'name' => $field->get_name(), - 'labels' => [ - 'fr' => $databox_field->get_label('fr'), - 'en' => $databox_field->get_label('en'), - 'de' => $databox_field->get_label('de'), - 'nl' => $databox_field->get_label('nl'), - ], - ]; - - foreach ($field->get_values() as $value) { - $data = [ - 'meta_id' => $value->getId(), - 'value' => $value->getValue(), - ]; - - $ret[] = $fieldData + $data; - } - } - - return $ret; - } - - /** - * @param record_adapter $record - * @return array - */ - private function listRecordCaption(record_adapter $record) - { - $includeBusiness = $this->getAclForUser()->can_see_business_fields($record->getDatabox()); - - $caption = []; - - foreach ($record->get_caption()->get_fields(null, $includeBusiness) as $field) { - $caption[] = [ - 'meta_structure_id' => $field->get_meta_struct_id(), - 'name' => $field->get_name(), - 'value' => $field->get_serialized_values(';'), - ]; - } - - return $caption; + return $this->app['controller.api.v3.resulthelpers']; } } diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php b/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php index 44828c0cb7..64373dedff 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Api/V3.php @@ -4,6 +4,7 @@ namespace Alchemy\Phrasea\ControllerProvider\Api; use Alchemy\Phrasea\Application as PhraseaApplication; use Alchemy\Phrasea\Controller\Api\V3\V3MetadatasController; +use Alchemy\Phrasea\Controller\Api\V3\V3ResultHelpers; use Alchemy\Phrasea\Controller\Api\V3\V3SearchController; use Alchemy\Phrasea\Controller\Api\V3\V3StoriesController; use Alchemy\Phrasea\Core\Event\Listener\OAuthListener; @@ -17,19 +18,20 @@ class V3 extends Api implements ControllerProviderInterface, ServiceProviderInte { const VERSION = '3.0.0'; - /** - * @param Application $app - * - * @uses V3MetadatasController::setmetadatasAction() - * @uses V3SearchController::searchAction() - * @uses V3StoriesController::getStoryAction() - */ public function register(Application $app) { + $app['controller.api.v3.resulthelpers'] = $app->share(function (PhraseaApplication $app) { + return (new V3ResultHelpers( + $app['conf'], + $app['media_accessor.subdef_url_generator'], + $app['authentication'] + )); + }); $app['controller.api.v3.metadatas'] = $app->share(function (PhraseaApplication $app) { return (new V3MetadatasController($app)) ->setJsonBodyHelper($app['json.body_helper']) - ; + ->setDispatcher($app['dispatcher']) + ; }); $app['controller.api.v3.search'] = $app->share(function (PhraseaApplication $app) { return (new V3SearchController($app)); @@ -54,18 +56,31 @@ class V3 extends Api implements ControllerProviderInterface, ServiceProviderInte $controllers->before(new OAuthListener()); + /** + * @uses V3StoriesController::getStoryAction() + */ $controllers->get('/stories/{databox_id}/{record_id}/', 'controller.api.v3.stories:getStoryAction') ->before('controller.api.v1:ensureCanAccessToRecord') ->assert('databox_id', '\d+') ->assert('record_id', '\d+'); + /** + * @uses V3SearchController::searchAction() + */ $controllers->match('/search/', 'controller.api.v3.search:searchAction'); + /** + * @uses V3MetadatasController::setmetadatasAction() + */ $controllers->patch('/records/{databox_id}/{record_id}/setmetadatas/', 'controller.api.v3.metadatas:setmetadatasAction') ->before('controller.api.v1:ensureCanAccessToRecord') ->before('controller.api.v1:ensureCanModifyRecord') ->assert('databox_id', '\d+') ->assert('record_id', '\d+'); + + /** + * @uses \Alchemy\Phrasea\Controller\Api\V1Controller::getBadRequestAction() + */ $controllers->match('/records/{any_id}/{anyother_id}/setmetadatas/', 'controller.api.v1:getBadRequestAction'); return $controllers; diff --git a/lib/Alchemy/Phrasea/Search/PermalinkTransformer.php b/lib/Alchemy/Phrasea/Search/PermalinkTransformer.php index 6bb22be37d..c192b769be 100644 --- a/lib/Alchemy/Phrasea/Search/PermalinkTransformer.php +++ b/lib/Alchemy/Phrasea/Search/PermalinkTransformer.php @@ -25,7 +25,6 @@ class PermalinkTransformer extends TransformerAbstract 'created_on' => $permalink->get_created_on()->format(DATE_ATOM), 'id' => $permalink->get_id(), 'is_activated' => $permalink->get_is_activated(), - /** @Ignore */ 'label' => $permalink->get_label(), 'updated_on' => $permalink->get_last_modified()->format(DATE_ATOM), 'page_url' => $permalink->get_page(), From 0b099878f52b4b09fc2adc01cf942a6f05215488 Mon Sep 17 00:00:00 2001 From: jygaulier Date: Thu, 4 Jun 2020 20:54:21 +0200 Subject: [PATCH 017/165] OK to test --- .../Api/V3/V3MetadatasController.php | 86 +++++++++---------- lib/classes/record/adapter.php | 16 ++-- 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php b/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php index ee9df9dd93..a187ad4d47 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V3/V3MetadatasController.php @@ -48,18 +48,18 @@ class V3MetadatasController extends Controller return $this->app['controller.api.v1']->getBadRequestAction($request, 'Bad JSON'); } - $ret = [ + $debug = [ 'metadatas_ops' => null, 'sb_ops' => null, ]; try { // do metadatas ops if (is_array($b->metadatas)) { - $ret['metadatas_ops'] = $this->do_metadatas($struct, $record, $b->metadatas); + $debug['metadatas_ops'] = $this->do_metadatas($struct, $record, $b->metadatas); } // do sb ops if (is_array($b->status)) { - $ret['sb_ops'] = $this->do_status($struct, $record, $b->status); + $debug['sb_ops'] = $this->do_status($struct, $record, $b->status); } } catch (Exception $e) { @@ -69,6 +69,9 @@ class V3MetadatasController extends Controller ); } + // @todo Move event dispatch inside record_adapter class (keeps things encapsulated) + $this->dispatch(PhraseaEvents::RECORD_EDIT, new RecordEdit($record)); + $ret = $this->getResultHelpers()->listRecord($request, $record, $this->getAclForUser()); return Result::create($request, $ret)->createResponse(); @@ -92,10 +95,12 @@ class V3MetadatasController extends Controller { $structByKey = []; $nameToStrucId = []; + $allStructFields = []; foreach ($struct as $f) { $nameToStrucId[$f->get_name()] = $f->get_id(); - $structByKey[$f->get_id()] = $f; - $structByKey[$f->get_name()] = &$structByKey[$f->get_id()]; + $allStructFields[$f->get_id()] = $f; + $structByKey[$f->get_id()] = &$allStructFields[$f->get_id()];; + $structByKey[$f->get_name()] = &$allStructFields[$f->get_id()]; } $metadatas_ops = []; @@ -107,7 +112,8 @@ class V3MetadatasController extends Controller // select fields that match meta_struct_id or field_name (can be arrays) $fields_list = null; // to filter caption_fields from record, default all $struct_fields = []; // struct fields that match meta_struct_id or field_name - if(($field_keys = $_m->meta_struct_id ? $_m->meta_struct_id : $_m->field_name) !== null) { // can be null if none defined (=match all) + $field_keys = $_m->meta_struct_id ? $_m->meta_struct_id : $_m->field_name; // can be null if none defined (=match all) + if($field_keys !== null) { if (!is_array($field_keys)) { $field_keys = [$field_keys]; } @@ -119,6 +125,10 @@ class V3MetadatasController extends Controller } } } + else { + // no meta_struct_id, no field_name --> match all struct fields ! + $struct_fields = $allStructFields; + } $caption_fields = $record->get_caption()->get_fields($fields_list, true); $meta_id = is_null($_m->meta_id) ? null : (int)($_m->meta_id); @@ -133,11 +143,15 @@ class V3MetadatasController extends Controller $values = []; if(is_array($_m->value)) { foreach ($_m->value as $v) { - $values[] = is_null($v) ? null : (string)$v; + if(($v = trim((string)$v)) !== '') { + $values[] = $v; + } } } else { - $values = is_null($_m->value) ? [] : [(string)($_m->value)]; + if(($v = trim((string)($_m->value))) !== '') { + $values[] = $v; + } } if(!($action = (string)($_m->action))) { @@ -167,7 +181,7 @@ class V3MetadatasController extends Controller $metadatas_ops = array_merge($metadatas_ops, $ops); } - // $record->set_metadatas($metadatas_ops, true); + $record->set_metadatas($metadatas_ops, true); return $metadatas_ops; } @@ -198,9 +212,6 @@ class V3MetadatasController extends Controller $record->setStatus(strrev($datas)); - // @todo Move event dispatch inside record_adapter class (keeps things encapsulated) - $this->dispatch(PhraseaEvents::RECORD_EDIT, new RecordEdit($record)); - return ["status" => $this->getResultHelpers()->listRecordStatus($record)]; } @@ -232,12 +243,12 @@ class V3MetadatasController extends Controller // if one field was multi-valued and no meta_id was set, we must delete all values foreach ($caption_fields as $cf) { - if ($cf->is_multi() && is_null($meta_id)) { - foreach ($cf->get_values() as $field_value) { + foreach ($cf->get_values() as $field_value) { + if (is_null($meta_id) || $field_value->getId() === (int)$meta_id) { $ops[] = [ 'meta_struct_id' => $cf->get_meta_struct_id(), 'meta_id' => $field_value->getId(), - 'value' => null + 'value' => '' ]; } } @@ -247,7 +258,7 @@ class V3MetadatasController extends Controller if($sf->is_multi()) { // add the non-null value(s) foreach ($values as $value) { - if (!is_null($value)) { + if ($value) { $ops[] = [ 'meta_struct_id' => $sf->get_id(), 'meta_id' => $meta_id, // can be null @@ -261,11 +272,13 @@ class V3MetadatasController extends Controller if(count($values) > 1) { throw new Exception(sprintf("setting mono-valued (%s) requires only one value.", $sf->get_name())); } - $ops[] = [ - 'meta_struct_id' => $sf->get_id(), - 'meta_id' => $meta_id, // probably null, - 'value' => $values[0] - ]; + if( ($value = $values[0]) ) { + $ops[] = [ + 'meta_struct_id' => $sf->get_id(), + 'meta_id' => $meta_id, // probably null, + 'value' => $value + ]; + } } } @@ -288,15 +301,12 @@ class V3MetadatasController extends Controller if(!$sf->is_multi()) { throw new Exception(sprintf("can't \"add\" to mono-valued (%s).", $sf->get_name())); } - // add the non-null value(s) foreach ($values as $value) { - if (!is_null($value)) { - $ops[] = [ - 'meta_struct_id' => $sf->get_id(), - 'meta_id' => null, - 'value' => $value - ]; - } + $ops[] = [ + 'meta_struct_id' => $sf->get_id(), + 'meta_id' => null, + 'value' => $value + ]; } } @@ -316,6 +326,8 @@ class V3MetadatasController extends Controller { $ops = []; + $replace_with = trim((string)$replace_with); + foreach ($caption_fields as $cf) { // match all ? if(is_null($meta_id) && count($values) == 0) { @@ -343,8 +355,8 @@ class V3MetadatasController extends Controller foreach ($values as $value) { foreach ($cf->get_values() as $field_value) { $rw = $replace_with; - if($match_method=='regexp' && !is_null($replace_with)) { - $rw = preg_replace($value, $replace_with, $field_value->getValue()); + if($match_method=='regexp' && $rw != '') { + $rw = preg_replace($value, $rw, $field_value->getValue()); } if ($this->match($value, $match_method, $field_value->getValue())) { $ops[] = [ @@ -366,17 +378,5 @@ class V3MetadatasController extends Controller private function getResultHelpers() { return $this->app['controller.api.v3.resulthelpers']; - /* - static $rh = null; - - if(is_null($rh)) { - $rh = new V3ResultHelpers( - $this->getConf(), - $this->app['media_accessor.subdef_url_generator'], - $this->getAuthenticator() - ); - } - return $rh; - */ } } diff --git a/lib/classes/record/adapter.php b/lib/classes/record/adapter.php index 9d94822566..e572b13a34 100644 --- a/lib/classes/record/adapter.php +++ b/lib/classes/record/adapter.php @@ -1054,10 +1054,13 @@ class record_adapter implements RecordInterface, cache_cacheableInterface } } - if (trim($params['meta_id']) !== '') { - $tmp_val = trim($params['value']); + $tmp_val = trim($params['value']); - $caption_field_value = $caption_field->get_value($params['meta_id']); + if (trim($params['meta_id']) !== '') { + + if(is_null($caption_field_value = $caption_field->get_value($params['meta_id']))) { + return $this; + } if ($tmp_val === '') { $caption_field_value->delete(); @@ -1068,8 +1071,11 @@ class record_adapter implements RecordInterface, cache_cacheableInterface $caption_field_value->setVocab($vocab, $vocab_id); } } - } else { - $caption_field_value = caption_Field_Value::create($this->app, $databox_field, $this, $params['value'], $vocab, $vocab_id); + } + else { + if($tmp_val !== '') { + caption_Field_Value::create($this->app, $databox_field, $this, $params['value'], $vocab, $vocab_id); + } } return $this; From e47312f02e7743215d68d1cabe93ccf235217db8 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Fri, 5 Jun 2020 13:32:53 +0400 Subject: [PATCH 018/165] PHRAS-3125 Fix on basket browser display --- package.json | 2 +- templates/web/prod/WorkZone/Browser/Basket.html.twig | 8 ++++---- templates/web/prod/WorkZone/Browser/Results.html.twig | 4 ++-- yarn.lock | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 062865c82a..76aa058cd1 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.214-d", + "phraseanet-production-client": "0.34.218-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/templates/web/prod/WorkZone/Browser/Basket.html.twig b/templates/web/prod/WorkZone/Browser/Basket.html.twig index 2618d70e22..4ac0e0f25e 100644 --- a/templates/web/prod/WorkZone/Browser/Basket.html.twig +++ b/templates/web/prod/WorkZone/Browser/Basket.html.twig @@ -1,6 +1,6 @@
- +
diff --git a/templates/web/prod/WorkZone/Browser/Results.html.twig b/templates/web/prod/WorkZone/Browser/Results.html.twig index 9ac3a5fa06..ee9f1f5d18 100644 --- a/templates/web/prod/WorkZone/Browser/Results.html.twig +++ b/templates/web/prod/WorkZone/Browser/Results.html.twig @@ -40,8 +40,8 @@   {% endif %} - - {{ Basket.getName() }} + + {{ Basket.getName()|length > 80 ? Basket.getName()|slice(0, 77) ~ '...' : Basket.getName() }}
{{ Basket.getElements().count() }} {{ ' records' }}
diff --git a/yarn.lock b/yarn.lock index f641a68101..7050a03240 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7578,10 +7578,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.214-d: - version "0.34.214-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.214-d.tgz#55675c3925c81626ddd8b9498e02c9d106a51d93" - integrity sha512-RXg7KMgpPtv4rR3c2tCNMr7RgneAZjvBbFyGVx+a42nPkkZMnulweDm1R2o5d/eOcW6uJWPWczSmCCS0GqNnVQ== +phraseanet-production-client@0.34.218-d: + version "0.34.218-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.218-d.tgz#6a5c1686a3c2bf5e334adb962fdd529c9bd59bae" + integrity sha512-rU5a/7fqhA8CIcWUicBAhRIO8Ga50V6PRiOnPMXnCxZfQWccG/sFbLSbvA2Sa+58eNSRhf7Z2QNu+S90KgoW1g== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 659cb69c70ca08e645be21fed06cdf7716c2d917 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Fri, 5 Jun 2020 15:19:01 +0400 Subject: [PATCH 019/165] PHRAS-3125 upgrade phraseanet-production-client --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 76aa058cd1..20d2c861a9 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.218-d", + "phraseanet-production-client": "0.34.219-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/yarn.lock b/yarn.lock index 7050a03240..2940fd971a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7578,10 +7578,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.218-d: - version "0.34.218-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.218-d.tgz#6a5c1686a3c2bf5e334adb962fdd529c9bd59bae" - integrity sha512-rU5a/7fqhA8CIcWUicBAhRIO8Ga50V6PRiOnPMXnCxZfQWccG/sFbLSbvA2Sa+58eNSRhf7Z2QNu+S90KgoW1g== +phraseanet-production-client@0.34.219-d: + version "0.34.219-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.219-d.tgz#9bd118d0588af0ca58b60ef6b8f2514b6a9ffe63" + integrity sha512-QHLsPBRjtE4wSH5jib6gN71U70lAtoloM5E+NfmFKHLBMv0B8xqcxJKVW7EbRX4DZTpsLCu5tuZ7vzd5PpbkOg== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 6cbcf8842d954b86c218310dd2319255b71cf8ab Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Fri, 5 Jun 2020 16:28:03 +0400 Subject: [PATCH 020/165] PHRAS-2773 Add notification on mail sending --- package.json | 2 +- templates/web/prod/index.html.twig | 1 + yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9182e782d4..758af630cc 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.216-d", + "phraseanet-production-client": "0.34.220-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/templates/web/prod/index.html.twig b/templates/web/prod/index.html.twig index b307dd2f20..b1c8059f56 100644 --- a/templates/web/prod/index.html.twig +++ b/templates/web/prod/index.html.twig @@ -1015,6 +1015,7 @@ + +{% endif %} From bbde0c4cceae1de60d47f6a984485a0b7136afa5 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Wed, 10 Jun 2020 13:45:41 +0200 Subject: [PATCH 040/165] test if PHRASEANET_SMTP_ENABLED var is set --- docker/phraseanet/entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/phraseanet/entrypoint.sh b/docker/phraseanet/entrypoint.sh index a0dabfc5fc..b975af2ca2 100755 --- a/docker/phraseanet/entrypoint.sh +++ b/docker/phraseanet/entrypoint.sh @@ -20,7 +20,7 @@ FILE=config/configuration.yml if [ -f "$FILE" ]; then echo "$FILE exists, skip setup." bin/setup system:config set registry.general.title $PHRASEANET_PROJECT_NAME - if [[ $PHRASEANET_SMTP_ENABLED=true ]]; then + if [[ $PHRASEANET_SMTP_ENABLED && $PHRASEANET_SMTP_ENABLED=true ]]; then bin/setup system:config set registry.email.smtp-enabled $PHRASEANET_SMTP_ENABLED bin/setup system:config set registry.email.smtp-auth-enabled $PHRASEANET_SMTP_AUTH_ENABLED bin/setup system:config set registry.email.smtp-auth-secure-mode $PHRASEANET_SMTP_SECURE_MODE From 4d5247aa704b190db3bb5e238b7ca3b7cf86d0be Mon Sep 17 00:00:00 2001 From: nmaillat Date: Wed, 10 Jun 2020 14:05:28 +0200 Subject: [PATCH 041/165] test if other env is set --- docker/phraseanet/entrypoint.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docker/phraseanet/entrypoint.sh b/docker/phraseanet/entrypoint.sh index b975af2ca2..1766b42251 100755 --- a/docker/phraseanet/entrypoint.sh +++ b/docker/phraseanet/entrypoint.sh @@ -19,7 +19,9 @@ FILE=config/configuration.yml if [ -f "$FILE" ]; then echo "$FILE exists, skip setup." - bin/setup system:config set registry.general.title $PHRASEANET_PROJECT_NAME + if [[ $PHRASEANET_PROJECT_NAME ]]; then + bin/setup system:config set registry.general.title $PHRASEANET_PROJECT_NAME + fi if [[ $PHRASEANET_SMTP_ENABLED && $PHRASEANET_SMTP_ENABLED=true ]]; then bin/setup system:config set registry.email.smtp-enabled $PHRASEANET_SMTP_ENABLED bin/setup system:config set registry.email.smtp-auth-enabled $PHRASEANET_SMTP_AUTH_ENABLED @@ -31,7 +33,10 @@ if [ -f "$FILE" ]; then bin/setup system:config set registry.email.emitter-email $PHRASEANET_EMITTER_EMAIL bin/setup system:config set registry.email.prefix $PHRASEANET_MAIL_OBJECT_PREFIX fi - bin/console user:password --user_id=1 --password $PHRASEANET_ADMIN_ACCOUNT_PASSWORD -y + if [[ $PHRASEANET_ADMIN_ACCOUNT_PASSWORD ]]; then + bin/console user:password --user_id=1 --password $PHRASEANET_ADMIN_ACCOUNT_PASSWORD -y + fi + else echo "$FILE doesn't exist, entering setup..." runuser app -c docker/phraseanet/auto-install.sh From 89c92fc91c88150aa72bf3c22fdb2ec653227058 Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 11 Jun 2020 10:03:05 +0300 Subject: [PATCH 042/165] change databox name on the first column --- resources/locales/messages.de.xlf | 8 ++++---- resources/locales/messages.en.xlf | 8 ++++---- resources/locales/messages.fr.xlf | 8 ++++---- resources/locales/messages.nl.xlf | 8 ++++---- resources/locales/validators.de.xlf | 2 +- resources/locales/validators.en.xlf | 2 +- resources/locales/validators.fr.xlf | 2 +- resources/locales/validators.nl.xlf | 2 +- templates/web/admin/worker-manager/worker_info.html.twig | 4 ++-- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/resources/locales/messages.de.xlf b/resources/locales/messages.de.xlf index c72b82500a..9018efa5e4 100644 --- a/resources/locales/messages.de.xlf +++ b/resources/locales/messages.de.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -9369,9 +9369,9 @@ Begonnen admin/worker-manager/worker_info.html.twig - - admin::workermanager:tab:workerinfo: databox_id - Databox ID + + admin::workermanager:tab:workerinfo: databox_name + admin::workermanager:tab:workerinfo: databox_name admin/worker-manager/worker_info.html.twig diff --git a/resources/locales/messages.en.xlf b/resources/locales/messages.en.xlf index bf66b5e4ea..df2b54f9f3 100644 --- a/resources/locales/messages.en.xlf +++ b/resources/locales/messages.en.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -9372,9 +9372,9 @@ Started admin/worker-manager/worker_info.html.twig - - admin::workermanager:tab:workerinfo: databox_id - Database Id + + admin::workermanager:tab:workerinfo: databox_name + admin::workermanager:tab:workerinfo: databox_name admin/worker-manager/worker_info.html.twig diff --git a/resources/locales/messages.fr.xlf b/resources/locales/messages.fr.xlf index 9f613494d4..ff0a18200b 100644 --- a/resources/locales/messages.fr.xlf +++ b/resources/locales/messages.fr.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -9372,9 +9372,9 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le Démarré admin/worker-manager/worker_info.html.twig - - admin::workermanager:tab:workerinfo: databox_id - Databox Id + + admin::workermanager:tab:workerinfo: databox_name + admin::workermanager:tab:workerinfo: databox_name admin/worker-manager/worker_info.html.twig diff --git a/resources/locales/messages.nl.xlf b/resources/locales/messages.nl.xlf index d2702e8d0a..8d14ffc5be 100644 --- a/resources/locales/messages.nl.xlf +++ b/resources/locales/messages.nl.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -9379,9 +9379,9 @@ admin::workermanager:tab:workerinfo: created admin/worker-manager/worker_info.html.twig - - admin::workermanager:tab:workerinfo: databox_id - admin::workermanager:tab:workerinfo: databox_id + + admin::workermanager:tab:workerinfo: databox_name + admin::workermanager:tab:workerinfo: databox_name admin/worker-manager/worker_info.html.twig diff --git a/resources/locales/validators.de.xlf b/resources/locales/validators.de.xlf index b5f7327d0c..df9ab69d0c 100644 --- a/resources/locales/validators.de.xlf +++ b/resources/locales/validators.de.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.en.xlf b/resources/locales/validators.en.xlf index e0e2fd06e9..801a0d3826 100644 --- a/resources/locales/validators.en.xlf +++ b/resources/locales/validators.en.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.fr.xlf b/resources/locales/validators.fr.xlf index 238e9fe21c..9d6b60b7cc 100644 --- a/resources/locales/validators.fr.xlf +++ b/resources/locales/validators.fr.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.nl.xlf b/resources/locales/validators.nl.xlf index f9db752335..aad0ae8884 100644 --- a/resources/locales/validators.nl.xlf +++ b/resources/locales/validators.nl.xlf @@ -1,6 +1,6 @@ - +
The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/templates/web/admin/worker-manager/worker_info.html.twig b/templates/web/admin/worker-manager/worker_info.html.twig index d5b089e449..d516f6bacb 100644 --- a/templates/web/admin/worker-manager/worker_info.html.twig +++ b/templates/web/admin/worker-manager/worker_info.html.twig @@ -42,7 +42,7 @@
@@ -23,9 +23,9 @@ {% endif %} - - {{ Basket.getName() }} - + + {{ Basket.getName()|length > 55 ? Basket.getName()|slice(0, 52) ~ '...' : Basket.getName() }} +
- + @@ -57,7 +57,7 @@ {% for workerRow in workerRunningJob | sort | reverse %} - + From 0f9a37f44c69f96d0c79c010bed24ec5e5211e5b Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 11 Jun 2020 15:28:49 +0300 Subject: [PATCH 043/165] help menu to doc 4.1 --- templates/web/common/menubar.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/web/common/menubar.html.twig b/templates/web/common/menubar.html.twig index 80443dd6b3..9d1b829c4c 100644 --- a/templates/web/common/menubar.html.twig +++ b/templates/web/common/menubar.html.twig @@ -232,7 +232,7 @@ {% endif %}
  • - + {{ 'phraseanet:: aide' | trans }} From 1264e093844e17a9c8e7aaafadb74e0dbda5d189 Mon Sep 17 00:00:00 2001 From: Nicolas Maillat Date: Thu, 11 Jun 2020 14:28:28 +0000 Subject: [PATCH 044/165] Translated using Weblate (English) Currently translated at 99.7% (2566 of 2573 strings) --- resources/locales/messages.en.xlf | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/resources/locales/messages.en.xlf b/resources/locales/messages.en.xlf index df2b54f9f3..069b159f86 100644 --- a/resources/locales/messages.en.xlf +++ b/resources/locales/messages.en.xlf @@ -1,4 +1,4 @@ - +
    @@ -7,8 +7,8 @@
    - - + + Form/Configuration/EmailFormType.php Form/Login/PhraseaAuthenticationForm.php @@ -9182,29 +9182,29 @@ Uploader admin/worker-manager/index.html.twig - + admin::workermanager:tab:queueMonitor: Consumer count - admin::workermanager:tab:queueMonitor: Consumer count + Worker Number admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: Message count - admin::workermanager:tab:queueMonitor: Message count + Message count admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: Refresh list - admin::workermanager:tab:queueMonitor: Refresh list + Refresh admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: description - admin::workermanager:tab:queueMonitor: description + State of message queue admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: title - admin::workermanager:tab:queueMonitor: title + Queue admin/worker-manager/index.html.twig @@ -9372,9 +9372,9 @@ Started admin/worker-manager/worker_info.html.twig - + admin::workermanager:tab:workerinfo: databox_name - admin::workermanager:tab:workerinfo: databox_name + Databox admin/worker-manager/worker_info.html.twig @@ -11879,9 +11879,9 @@ Warning: The current values will be overwritten by these new values Find prod/actions/edit_default.html.twig - + prod::export: send mail notification - Email sending request submitted + Email sending request submitted web/prod/index.html.twig From e88dc84fbbc40eb368f33c91cc2b5ee3ff7145a5 Mon Sep 17 00:00:00 2001 From: Jennifer Date: Thu, 11 Jun 2020 14:49:53 +0000 Subject: [PATCH 045/165] Translated using Weblate (German) Currently translated at 99.6% (2563 of 2573 strings) --- resources/locales/messages.de.xlf | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/resources/locales/messages.de.xlf b/resources/locales/messages.de.xlf index 9018efa5e4..5fd79ca2e4 100644 --- a/resources/locales/messages.de.xlf +++ b/resources/locales/messages.de.xlf @@ -1,4 +1,4 @@ - +
    @@ -7,8 +7,8 @@
    - - + + Form/Configuration/EmailFormType.php Form/Login/PhraseaAuthenticationForm.php @@ -9179,29 +9179,29 @@ Uploader admin/worker-manager/index.html.twig
    - + admin::workermanager:tab:queueMonitor: Consumer count - admin::workermanager:tab:queueMonitor: Consumer count + Worker Anzahl admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: Message count - admin::workermanager:tab:queueMonitor: Message count + Nachrichten Anzahl admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: Refresh list - admin::workermanager:tab:queueMonitor: Refresh list + Aktualisieren admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: description - admin::workermanager:tab:queueMonitor: description + Nachrichtenwarteschlange Zustand admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: title - admin::workermanager:tab:queueMonitor: title + Warteschlange admin/worker-manager/index.html.twig @@ -9369,9 +9369,9 @@ Begonnen admin/worker-manager/worker_info.html.twig - + admin::workermanager:tab:workerinfo: databox_name - admin::workermanager:tab:workerinfo: databox_name + Databox admin/worker-manager/worker_info.html.twig @@ -11804,9 +11804,9 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben Änderungen bestätigen oder abbrechen prod/actions/edit_default.html.twig - + prod::editing::annulation: abandonner les modification ? - Abbrechen und auf Änderungen verzichten? + Abbrechen der Bearbeitung wird alle Bearbeitungen verlieren - Abbrechen : Zur Bearbeitung zurückgehen - OK : schliessen und Bearbeitungen verlieren Controller/Prod/LanguageController.php From 9f612abd2a1d0383c4f38fc412157c91d71e30b4 Mon Sep 17 00:00:00 2001 From: Jennifer Date: Thu, 11 Jun 2020 14:44:06 +0000 Subject: [PATCH 046/165] Translated using Weblate (English) Currently translated at 99.7% (2566 of 2573 strings) --- resources/locales/messages.en.xlf | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/resources/locales/messages.en.xlf b/resources/locales/messages.en.xlf index 069b159f86..61189b3850 100644 --- a/resources/locales/messages.en.xlf +++ b/resources/locales/messages.en.xlf @@ -9184,7 +9184,7 @@ admin::workermanager:tab:queueMonitor: Consumer count - Worker Number + Worker number admin/worker-manager/worker_queue_monitor.html.twig @@ -11807,11 +11807,9 @@ Warning: The current values will be overwritten by these new values Valid changes or Cancel prod/actions/edit_default.html.twig - + prod::editing::annulation: abandonner les modification ? - Cancelling editing will lose all edits. -- Cancel : to go back to editing -- OK : to close and loose edits + Cancelling editing will lose all edits. - Cancel : to go back to editing - OK : to close and lose edits Controller/Prod/LanguageController.php From 420932b400021ac1ccfb69d56e50432bf80357c6 Mon Sep 17 00:00:00 2001 From: Nicolas Maillat Date: Thu, 11 Jun 2020 14:25:45 +0000 Subject: [PATCH 047/165] Translated using Weblate (French) Currently translated at 99.6% (2564 of 2573 strings) --- resources/locales/messages.fr.xlf | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/resources/locales/messages.fr.xlf b/resources/locales/messages.fr.xlf index ff0a18200b..764fb5891f 100644 --- a/resources/locales/messages.fr.xlf +++ b/resources/locales/messages.fr.xlf @@ -1,4 +1,4 @@ - +
    @@ -7,8 +7,8 @@
    - - + + Form/Configuration/EmailFormType.php Form/Login/PhraseaAuthenticationForm.php @@ -9152,9 +9152,9 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le Client secret WorkerManager/Form/WorkerPullAssetsType.php
    - + admin::workermanager:tab:pullassets: Endpoint get commit - Point de terminaison (url) pour la récupération des fichiers (adresse de l'uploader) + Point de terminaison pour la récupération des fichiers (adresse de l'uploader ex: https://uploader.phrasea.io) WorkerManager/Form/WorkerPullAssetsType.php @@ -9182,29 +9182,29 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le Uploader admin/worker-manager/index.html.twig - + admin::workermanager:tab:queueMonitor: Consumer count - admin::workermanager:tab:queueMonitor: Consumer count + Nombre de worker admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: Message count - admin::workermanager:tab:queueMonitor: Message count + Nombre de Message admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: Refresh list - admin::workermanager:tab:queueMonitor: Refresh list + Actualiser admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: description - admin::workermanager:tab:queueMonitor: description + Etat des files de message admin/worker-manager/worker_queue_monitor.html.twig - + admin::workermanager:tab:queueMonitor: title - admin::workermanager:tab:queueMonitor: title + Queue admin/worker-manager/index.html.twig @@ -9372,9 +9372,9 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le Démarré admin/worker-manager/worker_info.html.twig - + admin::workermanager:tab:workerinfo: databox_name - admin::workermanager:tab:workerinfo: databox_name + Databox admin/worker-manager/worker_info.html.twig From 5ad9a1a1837b88605d32d9ae3552ab28bb9791b6 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 11 Jun 2020 19:32:43 +0400 Subject: [PATCH 048/165] PHRAS-3116 --- package.json | 2 +- .../prod/actions/Tools/videoEditor.html.twig | 74 ++++++++++++++----- yarn.lock | 8 +- 3 files changed, 62 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 2225abb52f..124a33b9d7 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.222-d", + "phraseanet-production-client": "0.34.224-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index aec20b3f52..4838303661 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -31,7 +31,12 @@
  • - {{ "prod:videoeditor:subtitletab:: title" | trans }} + {{ "prod:videoeditor:subtitleTab:: title" | trans }} + +
  • +
  • + + {{ "prod:videoeditor:subtitleRequestTab:: title" | trans }}
  • @@ -164,27 +169,62 @@
    -
    -
    - -
    +
    +
    +
    +
    + +
    + +
    + + - - -
    -
    -
    -
    -

    {{ "prod:videoeditor:subtitletab:: left block title" | trans }}

    -
    + +
    + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    - + +
    +
    +
    +
    +
    + provider .... +
    @@ -194,7 +234,7 @@ {% endfor %} {{ 'No preview available' | trans }} -
    +
    diff --git a/yarn.lock b/yarn.lock index 0c682e6af7..6d37f8bc82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7578,10 +7578,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.222-d: - version "0.34.222-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.222-d.tgz#6c2b503e57bfe45cd002a04c7025ec9e0380ef97" - integrity sha512-umXponvYP3TfFhEleMTb1sRT/u+HRrBiEO4tL3tbmfTitc7eql5VGyTbZyjHEEZVgrbAs1jFbpe6gbstA5UcUg== +phraseanet-production-client@0.34.224-d: + version "0.34.224-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.224-d.tgz#9034d6b9a1a9a836332ebab84d6c03a1c4e49aa1" + integrity sha512-sxZmj4X3OqbDPRkaxcGGSMmajv8HMr/gePVUoA8SLYnQUBfwN2z8dRIIZ7lsZmESIweMdH8S0z59x4aBw2Di+g== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 4c19ee4e8f4fb9a8abdc2bcf3953115db4a015b3 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Mon, 15 Jun 2020 15:52:57 +0400 Subject: [PATCH 049/165] PHRAS-3116 --- package.json | 2 +- .../prod/actions/Tools/videoEditor.html.twig | 62 +++++++++++++++++-- yarn.lock | 8 +-- 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 124a33b9d7..a957eeaab1 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.224-d", + "phraseanet-production-client": "0.34.225-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index 4838303661..4d10f3d334 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -169,10 +169,12 @@
    + +

    0

    -
    +
    @@ -190,7 +192,7 @@
    - +
    @@ -200,8 +202,9 @@
    - - + +
    @@ -212,6 +215,7 @@ {% for subdef in previewHtml5 %} {% endfor %} + {{ 'No preview available' | trans }} @@ -222,8 +226,54 @@
    -
    - provider .... +
    + +

    + + +

    +

    + + +

    +

    + + +

    +

    + + +

    +

    + + +

    +
    + +
    + + +
    diff --git a/yarn.lock b/yarn.lock index 6d37f8bc82..fbd07fcf07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7578,10 +7578,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.224-d: - version "0.34.224-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.224-d.tgz#9034d6b9a1a9a836332ebab84d6c03a1c4e49aa1" - integrity sha512-sxZmj4X3OqbDPRkaxcGGSMmajv8HMr/gePVUoA8SLYnQUBfwN2z8dRIIZ7lsZmESIweMdH8S0z59x4aBw2Di+g== +phraseanet-production-client@0.34.225-d: + version "0.34.225-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.225-d.tgz#5695ed66e43a7e6f7d472d29bd2dbeac84153b4e" + integrity sha512-rQng1Fl2TlAHHHr+KXbCMpo0cFuIMTeGuPoUgoNG1279boxkLy6Zp2WnJNrn4W9xfuWsUh83dld91d0ANqlShQ== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 6a626886e07e6d796c6c60bedad80bcdc053482e Mon Sep 17 00:00:00 2001 From: aynsix Date: Mon, 15 Jun 2020 19:00:16 +0300 Subject: [PATCH 050/165] get videotexttrack field --- .../Controller/Prod/ToolsController.php | 28 +++++++++++++++++++ .../Phrasea/ControllerProvider/Prod/Tools.php | 1 + 2 files changed, 29 insertions(+) diff --git a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php index fa3fbac84a..86adee6158 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php @@ -456,6 +456,34 @@ class ToolsController extends Controller return $this->app->json(['success' => true, 'errorMessage' => '']); } + /** + * @param Request $request + * @return \Symfony\Component\HttpFoundation\JsonResponse + */ + public function getVideoTextTrackField(Request $request) + { + $records = RecordsRequest::fromRequest($this->app, $request, false); + $videoTextTrackField = []; + + if (count($records) == 1) { + /** @var \record_adapter $record */ + $record = $records->first(); + $databox = $record->getDatabox(); + + + foreach ($databox->get_meta_structure() as $meta) { + if (preg_match('/^VideoTextTrack(.*)$/iu', $meta->get_name(), $matches) && !empty($matches[1]) && strlen($matches[1]) == 2 ) { + $field['label'] = $matches[1]; + $field['meta_struct_id'] = $meta->get_id(); + $videoTextTrackField[] = $field; + unset($field); + } + } + } + + return $this->app->json($videoTextTrackField); + } + public function videoEditorAction(Request $request) { $records = RecordsRequest::fromRequest($this->app, $request, false); diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Tools.php b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Tools.php index 8d6932aecf..b3def8e65f 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Prod/Tools.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Prod/Tools.php @@ -73,6 +73,7 @@ class Tools implements ControllerProviderInterface, ServiceProviderInterface ->bind('prod_tools_metadata_save'); $controllers->get('/videoEditor', 'controller.prod.tools:videoEditorAction'); + $controllers->get('/videoTextTrack/field', 'controller.prod.tools:getVideoTextTrackField'); return $controllers; } From 18ba8b746dc3960b9c494b6157c2e44f8fc7d786 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Mon, 15 Jun 2020 22:19:43 +0400 Subject: [PATCH 051/165] PHRAS-3116 Add language list --- package.json | 2 +- .../prod/actions/Tools/videoEditor.html.twig | 20 +++---------------- yarn.lock | 8 ++++---- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index a957eeaab1..8bb7fe4937 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.225-d", + "phraseanet-production-client": "0.34.226-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index 4d10f3d334..bf7fd3855f 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -175,8 +175,8 @@

    0

    -
    -
    +
    +
    @@ -184,9 +184,6 @@
    @@ -230,20 +227,9 @@

    -

    -

    - - -

    +

    - - - + + +
    From 5c5078c36fc9f8ff807d2e7b4746b634b5d6961a Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Tue, 16 Jun 2020 12:09:38 +0400 Subject: [PATCH 053/165] PHRAs-3116 : save video caption field --- lib/Alchemy/Phrasea/Controller/Prod/LanguageController.php | 2 ++ templates/web/prod/actions/Tools/videoEditor.html.twig | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Prod/LanguageController.php b/lib/Alchemy/Phrasea/Controller/Prod/LanguageController.php index 254e3e9835..52e28e2db8 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/LanguageController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/LanguageController.php @@ -155,6 +155,8 @@ class LanguageController 'description notice' => $translator->trans('prod:mapboxgl: description notice'), 'title-map-dialog' => $translator->trans('prod:mapboxgl: title map dialog'), 'create new user' => $translator->trans('prod:push: create new user'), + 'prod:videoeditor:subtitletab:messsage:: error' => $translator->trans('prod:videoeditor:subtitletab:messsage:: error'), + 'prod:videoeditor:subtitletab:messsage:: success' => $translator->trans('prod:videoeditor:subtitletab:messsage:: success'), ]); } } diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index c745b255b2..fd9e86f6a8 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -183,7 +183,7 @@
    - {% for videoTextTrackField in videoTextTrackFields %} {% endfor %} @@ -192,7 +192,6 @@
    -
    From 1f6166dfab6b40530dc43fa357ab9ef9297af627 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Tue, 16 Jun 2020 18:34:50 +0400 Subject: [PATCH 054/165] PHRAS-3116 --- .../Phrasea/Controller/Prod/ToolsController.php | 6 ++++++ package.json | 2 +- .../web/prod/actions/Tools/videoEditor.html.twig | 13 +++++++++++-- yarn.lock | 8 ++++---- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php index 7672ff9190..3343a05438 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php @@ -485,6 +485,12 @@ class ToolsController extends Controller if (preg_match('/^VideoTextTrack(.*)$/iu', $meta->get_name(), $matches) && !empty($matches[1]) && strlen($matches[1]) == 2 ) { $field['label'] = $matches[1]; $field['meta_struct_id'] = $meta->get_id(); + $field['value'] = ''; + if ($record->get_caption()->has_field($meta->get_name())) { + $fieldValues = $record->get_caption()->get_field($meta->get_name())->get_values(); + $fieldValue = array_pop($fieldValues); + $field['value'] = $fieldValue->getValue(); + } $videoTextTrackFields[] = $field; unset($field); } diff --git a/package.json b/package.json index 8bb7fe4937..f75570979b 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.226-d", + "phraseanet-production-client": "0.34.228-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index fd9e86f6a8..97f1bfe6f3 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -176,7 +176,7 @@
    -
    +
    @@ -189,7 +189,11 @@ {% endfor %} + {% for videoTextTrackField in videoTextTrackFields %} + + {% endfor %}
    + @@ -291,7 +295,12 @@ >
    - + diff --git a/yarn.lock b/yarn.lock index 6093cdb250..1a926aab2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7578,10 +7578,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.229-d: - version "0.34.229-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.229-d.tgz#7e118da378b7240b5796370d2c08cb70ee10c7b2" - integrity sha512-+uvOQ9x+wICsEwb+uORFJhRcsOVnIWhU29vm5FQjLSFk2rJlsqExZ+X5Md7SJ27ZrpJsLumkgpaYuezKIN5a4A== +phraseanet-production-client@0.34.231-d: + version "0.34.231-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.231-d.tgz#7633568ce7bf0ac76306cca6c15e577ab4e0584c" + integrity sha512-AamwJNtpWL5nbxlqXhKCU4UpJIXAeBmY0gK0A5D5RrPqpc7ifH8osTrtMnvo54wXKX9nb6rrAR4vvZ7Z80bSrQ== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 0726e57187904b1a175e3dbf620d438e752f9cf2 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 18 Jun 2020 16:55:18 +0400 Subject: [PATCH 058/165] PHRAS-3116 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0b30fc33b2..1f0ab6ced2 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.231-d", + "phraseanet-production-client": "0.34.232-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/yarn.lock b/yarn.lock index 1a926aab2a..aa1c553564 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7578,10 +7578,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.231-d: - version "0.34.231-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.231-d.tgz#7633568ce7bf0ac76306cca6c15e577ab4e0584c" - integrity sha512-AamwJNtpWL5nbxlqXhKCU4UpJIXAeBmY0gK0A5D5RrPqpc7ifH8osTrtMnvo54wXKX9nb6rrAR4vvZ7Z80bSrQ== +phraseanet-production-client@0.34.232-d: + version "0.34.232-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.232-d.tgz#cb642ba78e85dbc1b32c9b2785b63ecf7c671fab" + integrity sha512-1z448ebd+Clql852Ai8wrsALxeAJ4OlQ0prG/T/sJNunNp1nxhVePZs6AuYTm5l/v6XkW27Em1o6FKn9XK3hfA== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 130912f6f9c337eefb553d87a47d1696b677dee8 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 18 Jun 2020 19:27:38 +0400 Subject: [PATCH 059/165] PHRAS-3116 Fix on duration display --- package.json | 2 +- templates/web/prod/actions/Tools/videoEditor.html.twig | 8 ++++++++ yarn.lock | 8 ++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 1f0ab6ced2..b55af2ae0a 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.232-d", + "phraseanet-production-client": "0.34.234-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index d96eb24bb0..2e086514a9 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -289,6 +289,14 @@ >
    + - +

    -
    - + + @@ -82,23 +86,23 @@
    - + {{ 'thesaurus:: exporter avec les synonymes sur la meme ligne' | trans }}
    - + {{ 'thesaurus:: exporter avec une ligne par synonyme' | trans }}
    - + {{ 'thesaurus:: export : numeroter les lignes' | trans }}
    - + {{ 'thesaurus:: export : inclure la langue' | trans }}
    - + {{ 'thesaurus:: export : inclure les hits' | trans }}
    diff --git a/templates/web/thesaurus/export-topics-dialog.html.twig b/templates/web/thesaurus/export-topics-dialog.html.twig index 968e5a50f8..d902e3ebbf 100644 --- a/templates/web/thesaurus/export-topics-dialog.html.twig +++ b/templates/web/thesaurus/export-topics-dialog.html.twig @@ -11,12 +11,12 @@ switch(button) { case "submit": - document.forms[0].target = (format == 'tofiles' ? "_self" : "EXPORT2"); - document.forms[0].submit(); + $('.export-topics-form').submit(); + $('.close-dialog').trigger('click'); break; case "cancel": self.returnValue = null; - self.close(); + $('.close-dialog').trigger('click'); break; } } @@ -45,21 +45,25 @@ } function chgFormat() { - var i, f; - for(i=0; i - +
    - + @@ -71,11 +75,11 @@
    {{ 'thesaurus:: exporter' | trans }}
    - + {{ 'thesaurus:: exporter vers topics pour toutes les langues' | trans }}
    - + {% trans with {'%piv%' : piv} %}thesaurus:: exporter a l'ecran pour la langue %piv%{% endtrans %}
    @@ -85,7 +89,7 @@
    {{ 'phraseanet:: tri' | trans }}
    - + {{ 'phraseanet:: tri par date' | trans }}
    @@ -95,15 +99,15 @@
    {{ 'thesaurus:: recherche' | trans }}
    - + {{ 'thesaurus:: recherche thesaurus *:"query"' | trans }}
    - + {{ 'thesaurus:: recherche fulltext' | trans }}
    - + {{ 'thesaurus:: question complete (avec operateurs)' | trans }}
    @@ -113,23 +117,23 @@
    {{ 'thesaurus:: presentation' | trans }}
    - + {{ 'thesaurus:: presentation : branches refermables' | trans }}
    - + {{ 'thesaurus:: presentation : branche ouvertes' | trans }}
    - + {{ 'thesaurus:: tout deployer - refermable' | trans }}
    - + {{ 'thesaurus:: tout deployer - statique' | trans }}
    - + {{ 'thesaurus:: tout fermer' | trans }}
    diff --git a/templates/web/thesaurus/link-field-step1.html.twig b/templates/web/thesaurus/link-field-step1.html.twig index ced3f72e0c..74e544eb61 100644 --- a/templates/web/thesaurus/link-field-step1.html.twig +++ b/templates/web/thesaurus/link-field-step1.html.twig @@ -25,24 +25,38 @@ switch(button) { case "submit": - // document.forms[0].target="LINKFIELD"; - document.forms[0].submit(); + $('.link-field-1').submit( + $.ajax({ + url : 'linkfield2.php', + type : 'POST', + data : $('.link-field-1').serialize(), + success : function( data ) { + $("#DLG_LINK_FIELD_1").html(''); + $("#DLG_LINK_FIELD_1").append(data); + }, + error : function( xhr, err ) { + alert('Error'); + } + }) + ); break; case "cancel": - self.close(); + $('.close-dialog').trigger('click'); break; } } function loaded() { - window.name="LINKFIELD"; ckField(); } + $( document ).ready(function() { + loaded(); + }); - +
    - + diff --git a/templates/web/thesaurus/link-field-step2.html.twig b/templates/web/thesaurus/link-field-step2.html.twig index 06cfceb0a9..070ddaff1a 100644 --- a/templates/web/thesaurus/link-field-step2.html.twig +++ b/templates/web/thesaurus/link-field-step2.html.twig @@ -12,10 +12,23 @@ switch(button) { case "submit": - document.forms[0].submit(); + $('.link-field-2').submit( + $.ajax({ + url : 'linkfield3.php', + type : 'POST', + data : $('.link-field-2').serialize(), + success : function( data ) { + $("#DLG_LINK_FIELD_1").html(''); + $("#DLG_LINK_FIELD_1").append(data); + }, + error : function( xhr, err ) { + alert('Error'); + } + }) + ); break; case "cancel": - self.close(); + $('.close-dialog').trigger('click'); break; } } @@ -23,11 +36,14 @@ { window.name="LINKFIELD"; } + $( document ).ready(function() { + loaded(); + }); - +
    - + diff --git a/templates/web/thesaurus/link-field-step3.html.twig b/templates/web/thesaurus/link-field-step3.html.twig index dd5607ae41..1605f551c7 100644 --- a/templates/web/thesaurus/link-field-step3.html.twig +++ b/templates/web/thesaurus/link-field-step3.html.twig @@ -42,7 +42,7 @@ {% endif %}
    - +
    diff --git a/templates/web/thesaurus/new-term.html.twig b/templates/web/thesaurus/new-term.html.twig index a8ef0a72da..37b18cc8a4 100644 --- a/templates/web/thesaurus/new-term.html.twig +++ b/templates/web/thesaurus/new-term.html.twig @@ -56,7 +56,7 @@
    {% else %} - {% if nb_candidates_bad > 0 %}t + {% if nb_candidates_bad > 0 %} {% set prop_label = 'thesaurus:: est candidat en provenance des champs mais ne peut etre accepte a cet emplacement du thesaurus' | trans %} {% else %} {% set prop_label = 'thesaurus:: n\'est pas present dans les candidats' | trans %} @@ -112,17 +112,19 @@ switch(refresh.item(i).getAttribute("type")) { case "CT": - {{ opener }}.reloadCtermsBranch(refresh.item(i).getAttribute("id")); + reloadCtermsBranch(refresh.item(i).getAttribute("id")); break; case "TH": - {{ opener }}.reloadThesaurusBranch(refresh.item(i).getAttribute("id")); + reloadThesaurusBranch(refresh.item(i).getAttribute("id")); break; } } - self.close(); + $("#NEWSY_DLG_CONFIRM").dialog('close'); + $("#NEWSY_DLG_CONFIRM").html(''); break; case "cancel": - self.close(); + $("#NEWSY_DLG_CONFIRM").dialog('close'); + $("#NEWSY_DLG_CONFIRM").html(''); break; } } @@ -168,6 +170,8 @@ break; case "cancel": $("#NEWSY_DLG_CONFIRM").dialog('close'); + $("#NEWSY_DLG_CONFIRM").html(''); + break; } } diff --git a/templates/web/thesaurus/properties.html.twig b/templates/web/thesaurus/properties.html.twig index e5c0280438..43e1c05b91 100644 --- a/templates/web/thesaurus/properties.html.twig +++ b/templates/web/thesaurus/properties.html.twig @@ -24,15 +24,15 @@ font-weight:900; } - - diff --git a/templates/web/thesaurus/thesaurus.html.twig b/templates/web/thesaurus/thesaurus.html.twig index 6a7180a151..492d69974f 100644 --- a/templates/web/thesaurus/thesaurus.html.twig +++ b/templates/web/thesaurus/thesaurus.html.twig @@ -84,7 +84,12 @@ $("#SEARCH_DLG").dialog({ modal: true, title: "{{ 'Chercher' | trans }}", - autoOpen:false + autoOpen:false, + open:function () { + $(this).closest(".ui-dialog") + .find(".ui-button:first") // the first button + .addClass("close-dialog").hide(); + } }); $("#NEWSY_DLG").dialog({ modal: true, @@ -302,11 +307,20 @@ -
    -
    - +
    +
    +
    +
    +
    +
    + + + @@ -324,23 +338,25 @@ + /**Populate btn action**/ + $('#populate_btn').click(function (e) { + e.preventDefault(); + $("#confirm_populate").dialog({ + modal: true, + title: "{{ 'thesaurus: Populate title' | trans }}", + autoOpen:false, + open:function () { + $(this).closest(".ui-dialog") + .find(".ui-button:first") // the first button + .addClass("close-dialog").hide(); + $('.cancel_button').click(function () { + $('.close-dialog').trigger('click'); + }); + + + } + }); + $("#confirm_populate").dialog('open'); + $('#confirm_populate_button').click(function () { + $.ajax({ + type: 'GET', + url: '/admin/worker-manager/populate-status', + data: { + sbasIds: [{{ bid }}] + }, + success: function (data) { + if (data == 0) { + $.ajax({ + url: '/thesaurus/populate', + type: 'POST', + data: { + databox_id: {{ bid }} + }, + success: function (data) { + //humane.info('{{ "thesaurus::populate: success message" |trans }}'); + $('.close-dialog').trigger('click'); + } + }); + } else { + alert('{{ "thesaurus::populate: Warning populate is in process to indexing databox" |trans }}'); + } + } + }); + }) + }); + + + From 1f0c54bfc3bfa1f9d777e194ca60f755c7c1948b Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Wed, 24 Jun 2020 15:17:50 +0400 Subject: [PATCH 081/165] PHRAS-3148 :Fix drag and drop terms --- templates/web/thesaurus/accept.html.twig | 33 ++++++++++--------- .../web/thesaurus/import-dialog.html.twig | 13 ++++---- templates/web/thesaurus/properties.html.twig | 1 + 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/templates/web/thesaurus/accept.html.twig b/templates/web/thesaurus/accept.html.twig index 3f25e80e35..962284af95 100644 --- a/templates/web/thesaurus/accept.html.twig +++ b/templates/web/thesaurus/accept.html.twig @@ -30,17 +30,18 @@ function ok() { as = ""; - if((n=document.forms[0].as.length) > 0) + if($(".as_1").length > 0) { - for(i=0; i @@ -144,9 +145,9 @@ {{ 'thesaurus:: Accepter le terme comme' | trans }}

    {{ fullpath_src | raw }}




    - {{ 'thesaurus:: comme terme specifique' | trans }} + {{ 'thesaurus:: comme terme specifique' | trans }}

    - + {% set fullpath_tgt_raw = fullpath_tgt | raw %} {% trans with {'%fullpath_tgt_raw%' : fullpath_tgt_raw} %}thesaurus:: comme synonyme de %fullpath_tgt_raw%{% endtrans %}
    @@ -155,7 +156,7 @@ {{ 'thesaurus:: Accepter la branche comme' | trans }}  {{ 'thesaurus:: comme terme specifique' | trans }}

    {{ fullpath_tgt | raw }}



    - + {% endif %}

    diff --git a/templates/web/thesaurus/import-dialog.html.twig b/templates/web/thesaurus/import-dialog.html.twig index 2696b04ede..563b4de8ef 100644 --- a/templates/web/thesaurus/import-dialog.html.twig +++ b/templates/web/thesaurus/import-dialog.html.twig @@ -15,13 +15,12 @@ { switch(button) { - case "submit": - document.forms[0].target='IFRIM'; - document.forms[0].submit(); + case "submit":= + $('.import-form').submit(); break; case "cancel": self.returnValue = null; - self.close(); + $('.close-dialog').trigger('click'); break; } } @@ -32,8 +31,8 @@ { if(!err) { - {{ opener }}.reload(); - self.close(); + reload(); + $('.close-dialog').trigger('click'); } else { @@ -44,7 +43,7 @@
    -
    + diff --git a/templates/web/thesaurus/properties.html.twig b/templates/web/thesaurus/properties.html.twig index 43e1c05b91..a772deaebb 100644 --- a/templates/web/thesaurus/properties.html.twig +++ b/templates/web/thesaurus/properties.html.twig @@ -139,6 +139,7 @@ parms += "&newlng=" + encodeURIComponent(lng); ret = loadXMLDoc(url, parms, true); + alert(ret); sy_list = ret.getElementsByTagName("sy_list").item(0); refresh_sy(sy_list); From 6a5b96be6aa78f891c72cb45b98500420c6d0090 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Wed, 24 Jun 2020 18:29:33 +0400 Subject: [PATCH 082/165] PHRAS-3148 --- resources/www/thesaurus/styles/main.scss | 24 +++++++++++--- templates/web/thesaurus/properties.html.twig | 34 +++++++++++--------- templates/web/thesaurus/thesaurus.html.twig | 11 ++++--- 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/resources/www/thesaurus/styles/main.scss b/resources/www/thesaurus/styles/main.scss index 68460e295c..8d859c8a13 100644 --- a/resources/www/thesaurus/styles/main.scss +++ b/resources/www/thesaurus/styles/main.scss @@ -252,11 +252,13 @@ DIV.menu { } DIV.menu IMG { - padding: 0px; - margin: 0px; + padding-right: 2px; + margin: 0; + position: relative; +} +DIV.menu p { + padding: 2px; position: relative; - left: -10px; - top: 2px; } DIV.menu A { @@ -316,3 +318,17 @@ DIV.menu .line { border-top: 1px solid #555555; border-bottom: 1px solid #ffffff; } + +#delete_sy { + background: #2196f3; + color: #fff; + font-weight: bold; + padding: 1px 10px; + margin-left: 12px; + &.disabled { + background: grey; + } +} +#DLG_PROPERTIES > #syMenu { + display: none; +} \ No newline at end of file diff --git a/templates/web/thesaurus/properties.html.twig b/templates/web/thesaurus/properties.html.twig index a772deaebb..106e51ab2d 100644 --- a/templates/web/thesaurus/properties.html.twig +++ b/templates/web/thesaurus/properties.html.twig @@ -3,11 +3,6 @@ {% else %} {% set opener = "opener" %} {% endif %} - - - - - {{ 'thesaurus:: Proprietes' | trans }} From b3f402a69f2de990f33eb9b006734138f36928cb Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 25 Jun 2020 17:32:18 +0400 Subject: [PATCH 089/165] PHRAS-3148 --- templates/web/thesaurus/thesaurus.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/web/thesaurus/thesaurus.html.twig b/templates/web/thesaurus/thesaurus.html.twig index 40ac5d281e..7574aadd64 100644 --- a/templates/web/thesaurus/thesaurus.html.twig +++ b/templates/web/thesaurus/thesaurus.html.twig @@ -1227,7 +1227,7 @@ url += "&typ=TH"; url += "&obr=" + list_opened_branches(o.parentNode); //w = window.open(url, "EXPORT", "directories=no, height=400, width=550, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, toolbar=no"); - w = loadDataAjax(url, 700, 400, "#DLG_EXPORT_TOPICS", '{{ 'thesaurus:: export en topics' | trans }}'); + w = loadDataAjax(url, 700, 450, "#DLG_EXPORT_TOPICS", '{{ 'thesaurus:: export en topics' | trans }}'); break; } break; From afc6f9e1939b99e7845d54a89a9a3007fb433643 Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 25 Jun 2020 16:58:56 +0300 Subject: [PATCH 090/165] create auto-subtitle event --- .../Controller/Prod/ToolsController.php | 119 +------------ .../Event/Record/RecordAutoSubtitleEvent.php | 29 +++ lib/Alchemy/Phrasea/Core/PhraseaEvents.php | 2 + .../Provider/QueueWorkerServiceProvider.php | 2 + .../Subscriber/SubtitlingSubscriber.php | 168 ++++++++++++++++++ 5 files changed, 208 insertions(+), 112 deletions(-) create mode 100644 lib/Alchemy/Phrasea/Core/Event/Record/RecordAutoSubtitleEvent.php create mode 100644 lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitlingSubscriber.php diff --git a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php index b549650286..4bdd562424 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php @@ -15,24 +15,21 @@ use Alchemy\Phrasea\Application\Helper\FilesystemAware; use Alchemy\Phrasea\Application\Helper\SubDefinitionSubstituerAware; use Alchemy\Phrasea\Controller\Controller; use Alchemy\Phrasea\Controller\RecordsRequest; +use Alchemy\Phrasea\Core\Event\Record\RecordAutoSubtitleEvent; use Alchemy\Phrasea\Core\Event\Record\RecordEvents; use Alchemy\Phrasea\Core\Event\Record\SubdefinitionCreateEvent; +use Alchemy\Phrasea\Core\PhraseaEvents; use Alchemy\Phrasea\Exception\RuntimeException; use Alchemy\Phrasea\Metadata\PhraseanetMetadataReader; use Alchemy\Phrasea\Metadata\PhraseanetMetadataSetter; use Alchemy\Phrasea\Record\RecordWasRotated; use DataURI\Parser; -use GuzzleHttp\Client; use MediaAlchemyst\Alchemyst; use MediaVorus\MediaVorus; use Symfony\Component\HttpFoundation\Request; class ToolsController extends Controller { - const GINGER_BASE_URL = "https://test.api.ginger.studio/recognition/speech"; - const GINGER_TOKEN = "39c6011d-3bbe-4f39-95d0-a327d320ded4"; - const GINGER_TRANSCRIPT_FORMAT = "text/vtt"; - use DataboxLoggerAware; use DispatcherAware; use FilesystemAware; @@ -454,119 +451,17 @@ class ToolsController extends Controller public function autoSubtitleAction(Request $request) { - $return = ['success' => false, 'errorMessage' => '']; $record = new \record_adapter($this->app, (int)$request->request->get("databox_id"), (int)$request->request->get("record_id") ); - if ($record->has_preview() && ($previewLink = $record->get_preview()->get_permalink()) !== null && $request->request->get("meta_struct_id")) { - switch ($request->request->get("subtitle_language_source")) { - case 'En': - $language = 'en-GB'; - break; - case 'De': - $language = 'de-DE'; - break; - case 'Fr': - default: - $language = 'fr-FR'; - break; - } + $this->dispatch( + PhraseaEvents::RECORD_AUTO_SUBTITLE, + new RecordAutoSubtitleEvent($record, $request->request->get("subtitle_language_source"), $request->request->get("meta_struct_id")) + ); - $permalinkUrl = $previewLink->get_url()->__toString(); - - $gingerClient = new Client(); - - try { - $response = $gingerClient->post(self::GINGER_BASE_URL.'/media/', [ - 'headers' => [ - 'Authorization' => 'token '.self::GINGER_TOKEN - ], - 'json' => [ - 'url' => $permalinkUrl, - 'language' => $language - ] - ]); - } catch(\Exception $e) { - $return['errorMessage'] = $e->getMessage(); - - return $this->app->json($return); - } - - if ($response->getStatusCode() !== 201) { - return $this->app->json($return); - } - - $responseMediaBody = $response->getBody()->getContents(); - $responseMediaBody = json_decode($responseMediaBody,true); - - $checkStatus = null; - do { - // first wait 5 second before check subtitling status - sleep(5); - - try { - $response = $gingerClient->get(self::GINGER_BASE_URL.'/task/'.$responseMediaBody['task_id'].'/', [ - 'headers' => [ - 'Authorization' => 'token '.self::GINGER_TOKEN - ] - ]); - } catch (\Exception $e) { - $checkStatus = false; - } - - if ($response->getStatusCode() !== 200) { - $checkStatus = false; - break; - } - - $responseTaskBody = $response->getBody()->getContents(); - $responseTaskBody = json_decode($responseTaskBody,true); - - } while($responseTaskBody['status'] != 'SUCCESS'); - - if (!$checkStatus) { - return $this->app->json($return); - } - - try { - $response = $gingerClient->get(self::GINGER_BASE_URL.'/media/'.$responseMediaBody['media']['uuid'].'/', [ - 'headers' => [ - 'Authorization' => 'token '.self::GINGER_TOKEN, - 'ACCEPT' => self::GINGER_TRANSCRIPT_FORMAT - ], - 'query' => [ - 'language' => $language - ] - ]); - } catch (\Exception $e) { - return $this->app->json($return); - } - if ($response->getStatusCode() !== 201) { - return $this->app->json($return); - } - - $transcriptContent = $response->getBody()->getContents(); - - $metadatas[0] = [ - 'meta_struct_id' => (int)$request->request->get("meta_struct_id"), - 'meta_id' => '', - 'value' => $transcriptContent - ]; - - try { - $record->set_metadatas($metadatas); - } catch (\Exception $e) { - $return['errorMessage'] = $e->getMessage(); - - return $this->app->json($return); - } - - $return['success'] = true; - } - - return $this->app->json($return); + return $this->app->json(["status" => "dispatch"]); } public function videoEditorAction(Request $request) diff --git a/lib/Alchemy/Phrasea/Core/Event/Record/RecordAutoSubtitleEvent.php b/lib/Alchemy/Phrasea/Core/Event/Record/RecordAutoSubtitleEvent.php new file mode 100644 index 0000000000..5f502930e5 --- /dev/null +++ b/lib/Alchemy/Phrasea/Core/Event/Record/RecordAutoSubtitleEvent.php @@ -0,0 +1,29 @@ +languageSource = $languageSource; + $this->metaStructId = $metaStructId; + } + + public function getLanguageSource() + { + return $this->languageSource; + } + + public function getMetaStructId() + { + return $this->metaStructId; + } +} diff --git a/lib/Alchemy/Phrasea/Core/PhraseaEvents.php b/lib/Alchemy/Phrasea/Core/PhraseaEvents.php index 90adac69dd..1e1daf714b 100644 --- a/lib/Alchemy/Phrasea/Core/PhraseaEvents.php +++ b/lib/Alchemy/Phrasea/Core/PhraseaEvents.php @@ -54,6 +54,8 @@ final class PhraseaEvents const RECORD_EDIT = 'record.edit'; const RECORD_UPLOAD = 'record.upload'; + const RECORD_AUTO_SUBTITLE = 'record.auto-subtitle'; + const THESAURUS_IMPORTED = 'thesaurus.imported'; const THESAURUS_FIELD_LINKED = 'thesaurus.field-linked'; const THESAURUS_CANDIDATE_ACCEPTED_AS_CONCEPT = 'thesaurus.candidate-accepted-as-concept'; diff --git a/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php b/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php index 7de8ef2604..85e141ee5a 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php @@ -23,6 +23,7 @@ use Alchemy\Phrasea\WorkerManager\Subscriber\AssetsIngestSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\ExportSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\RecordSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\SearchengineSubscriber; +use Alchemy\Phrasea\WorkerManager\Subscriber\SubtitlingSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\WebhookSubscriber; use Silex\Application; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -68,6 +69,7 @@ class QueueWorkerServiceProvider implements PluginProviderInterface $dispatcher->addSubscriber(new AssetsIngestSubscriber($app['alchemy_worker.message.publisher'])); $dispatcher->addSubscriber(new SearchengineSubscriber($app['alchemy_worker.message.publisher'])); $dispatcher->addSubscriber(new WebhookSubscriber($app['alchemy_worker.message.publisher'])); + $dispatcher->addSubscriber(new SubtitlingSubscriber(new LazyLocator($app, 'phraseanet.appbox'), $app['monolog'])); return $dispatcher; }) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitlingSubscriber.php b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitlingSubscriber.php new file mode 100644 index 0000000000..ceefdbc02a --- /dev/null +++ b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitlingSubscriber.php @@ -0,0 +1,168 @@ +appboxLocator = $appboxLocator; + $this->logger = $logger; + } + + public function onRecordAutoSubtitle(RecordAutoSubtitleEvent $event) + { + $record = $this->getApplicationBox()->get_databox($event->getRecord()->getDataboxId())->get_record($event->getRecord()->getRecordId()); + + if ($record->has_preview() && ($previewLink = $record->get_preview()->get_permalink()) !== null && $event->getMetaStructId()) { + switch ($event->getLanguageSource()) { + case 'En': + $language = 'en-GB'; + break; + case 'De': + $language = 'de-DE'; + break; + case 'Fr': + default: + $language = 'fr-FR'; + break; + } + + $permalinkUrl = $previewLink->get_url()->__toString(); + + $gingerClient = new Client(); + + try { + $response = $gingerClient->post(self::GINGER_BASE_URL.'/media/', [ + 'headers' => [ + 'Authorization' => 'token '.self::GINGER_TOKEN + ], + 'json' => [ + 'url' => $permalinkUrl, + 'language' => $language + ] + ]); + } catch(\Exception $e) { + $this->logger->error($e->getMessage()); + + return 0; + } + + if ($response->getStatusCode() !== 201) { + $this->logger->error("response status : ". $response->getStatusCode()); + + return 0; + } + + $responseMediaBody = $response->getBody()->getContents(); + $responseMediaBody = json_decode($responseMediaBody,true); + + $checkStatus = true; + do { + // first wait 5 second before check subtitling status + sleep(5); + + try { + $response = $gingerClient->get(self::GINGER_BASE_URL.'/task/'.$responseMediaBody['task_id'].'/', [ + 'headers' => [ + 'Authorization' => 'token '.self::GINGER_TOKEN + ] + ]); + } catch (\Exception $e) { + $checkStatus = false; + } + + if ($response->getStatusCode() !== 200) { + $checkStatus = false; + break; + } + + $responseTaskBody = $response->getBody()->getContents(); + $responseTaskBody = json_decode($responseTaskBody,true); + + } while($responseTaskBody['status'] != 'SUCCESS'); + + if (!$checkStatus) { + $this->logger->error("can't check status"); + + return 0; + } + + try { + $response = $gingerClient->get(self::GINGER_BASE_URL.'/media/'.$responseMediaBody['media']['uuid'].'/', [ + 'headers' => [ + 'Authorization' => 'token '.self::GINGER_TOKEN, + 'ACCEPT' => self::GINGER_TRANSCRIPT_FORMAT + ], + 'query' => [ + 'language' => $language + ] + ]); + } catch (\Exception $e) { + $this->logger->error($e->getMessage()); + + return 0; + } + + if ($response->getStatusCode() !== 201) { + $this->logger->error("response status : ". $response->getStatusCode()); + + return 0; + } + + $transcriptContent = $response->getBody()->getContents(); + + $metadatas[0] = [ + 'meta_struct_id' => (int)$event->getMetaStructId(), + 'meta_id' => '', + 'value' => $transcriptContent + ]; + + try { + $record->set_metadatas($metadatas); + } catch (\Exception $e) { + $this->logger->error($e->getMessage()); + + return 0; + } + + $this->logger->error("Auto subtitle SUCCESS"); + } + + return 0; + } + + public static function getSubscribedEvents() + { + return [ + PhraseaEvents::RECORD_AUTO_SUBTITLE => 'onRecordAutoSubtitle', + ]; + } + + /** + * @return \appbox + */ + private function getApplicationBox() + { + $callable = $this->appboxLocator; + + return $callable(); + } +} From a0d3d8db51a6b2c35ed7269980c3a60e9e4f5f21 Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 25 Jun 2020 17:41:38 +0300 Subject: [PATCH 091/165] rename class --- .../WorkerManager/Provider/QueueWorkerServiceProvider.php | 4 ++-- .../{SubtitlingSubscriber.php => SubtitleSubscriber.php} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename lib/Alchemy/Phrasea/WorkerManager/Subscriber/{SubtitlingSubscriber.php => SubtitleSubscriber.php} (98%) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php b/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php index 85e141ee5a..f4ee18eaf5 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php @@ -23,7 +23,7 @@ use Alchemy\Phrasea\WorkerManager\Subscriber\AssetsIngestSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\ExportSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\RecordSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\SearchengineSubscriber; -use Alchemy\Phrasea\WorkerManager\Subscriber\SubtitlingSubscriber; +use Alchemy\Phrasea\WorkerManager\Subscriber\SubtitleSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\WebhookSubscriber; use Silex\Application; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -69,7 +69,7 @@ class QueueWorkerServiceProvider implements PluginProviderInterface $dispatcher->addSubscriber(new AssetsIngestSubscriber($app['alchemy_worker.message.publisher'])); $dispatcher->addSubscriber(new SearchengineSubscriber($app['alchemy_worker.message.publisher'])); $dispatcher->addSubscriber(new WebhookSubscriber($app['alchemy_worker.message.publisher'])); - $dispatcher->addSubscriber(new SubtitlingSubscriber(new LazyLocator($app, 'phraseanet.appbox'), $app['monolog'])); + $dispatcher->addSubscriber(new SubtitleSubscriber(new LazyLocator($app, 'phraseanet.appbox'), $app['monolog'])); return $dispatcher; }) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitlingSubscriber.php b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitleSubscriber.php similarity index 98% rename from lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitlingSubscriber.php rename to lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitleSubscriber.php index ceefdbc02a..51c3617e55 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitlingSubscriber.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitleSubscriber.php @@ -8,7 +8,7 @@ use GuzzleHttp\Client; use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -class SubtitlingSubscriber implements EventSubscriberInterface +class SubtitleSubscriber implements EventSubscriberInterface { const GINGER_BASE_URL = "https://test.api.ginger.studio/recognition/speech"; const GINGER_TOKEN = "39c6011d-3bbe-4f39-95d0-a327d320ded4"; From 47f8d2e6df33db64c0ee57480d97a044c4c9591c Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 25 Jun 2020 18:40:10 +0300 Subject: [PATCH 092/165] test --- lib/Alchemy/Phrasea/Application.php | 3 +++ .../WorkerManager/Provider/QueueWorkerServiceProvider.php | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index 4d0d2ab2d5..1132aef6c9 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -27,6 +27,7 @@ use Alchemy\Phrasea\Core\Event\Subscriber\PhraseaInstallSubscriber; use Alchemy\Phrasea\Core\Event\Subscriber\RegistrationSubscriber; use Alchemy\Phrasea\Core\Event\Subscriber\ValidationSubscriber; use Alchemy\Phrasea\Core\Event\Subscriber\WebhookUserEventSubscriber; +use Alchemy\Phrasea\Core\LazyLocator; use Alchemy\Phrasea\Core\MetaProvider\DatabaseMetaProvider; use Alchemy\Phrasea\Core\MetaProvider\HttpStackMetaProvider; use Alchemy\Phrasea\Core\MetaProvider\MediaUtilitiesMetaServiceProvider; @@ -89,6 +90,7 @@ use Alchemy\Phrasea\Media\TechnicalDataServiceProvider; use Alchemy\Phrasea\Model\Entities\User; use Alchemy\Phrasea\WorkerManager\Provider\AlchemyWorkerServiceProvider; use Alchemy\Phrasea\WorkerManager\Provider\QueueWorkerServiceProvider; +use Alchemy\Phrasea\WorkerManager\Subscriber\SubtitleSubscriber; use Alchemy\QueueProvider\QueueServiceProvider; use Alchemy\WorkerProvider\WorkerServiceProvider; use Doctrine\DBAL\Event\ConnectionEventArgs; @@ -749,6 +751,7 @@ class Application extends SilexApplication $dispatcher->addSubscriber(new LazaretSubscriber($app)); $dispatcher->addSubscriber(new ValidationSubscriber($app)); $dispatcher->addSubscriber(new WebhookUserEventSubscriber($app)); + $dispatcher->addSubscriber(new SubtitleSubscriber(new LazyLocator($app, 'phraseanet.appbox'), $app['monolog'])); return $dispatcher; }) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php b/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php index f4ee18eaf5..7de8ef2604 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Provider/QueueWorkerServiceProvider.php @@ -23,7 +23,6 @@ use Alchemy\Phrasea\WorkerManager\Subscriber\AssetsIngestSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\ExportSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\RecordSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\SearchengineSubscriber; -use Alchemy\Phrasea\WorkerManager\Subscriber\SubtitleSubscriber; use Alchemy\Phrasea\WorkerManager\Subscriber\WebhookSubscriber; use Silex\Application; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -69,7 +68,6 @@ class QueueWorkerServiceProvider implements PluginProviderInterface $dispatcher->addSubscriber(new AssetsIngestSubscriber($app['alchemy_worker.message.publisher'])); $dispatcher->addSubscriber(new SearchengineSubscriber($app['alchemy_worker.message.publisher'])); $dispatcher->addSubscriber(new WebhookSubscriber($app['alchemy_worker.message.publisher'])); - $dispatcher->addSubscriber(new SubtitleSubscriber(new LazyLocator($app, 'phraseanet.appbox'), $app['monolog'])); return $dispatcher; }) From 18d925b532930e5ff8da306d3902da47deefd72a Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Mon, 29 Jun 2020 11:48:21 +0400 Subject: [PATCH 093/165] PHRAS-3148 fix n drag and drop from stock --- templates/web/thesaurus/accept.html.twig | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/templates/web/thesaurus/accept.html.twig b/templates/web/thesaurus/accept.html.twig index 17d0c0bec7..48d54bb79b 100644 --- a/templates/web/thesaurus/accept.html.twig +++ b/templates/web/thesaurus/accept.html.twig @@ -22,6 +22,7 @@ {##}
    {% else %} @@ -70,9 +70,9 @@ {{ prop_label }}
    - +     - + {% endif %} diff --git a/templates/web/thesaurus/properties.html.twig b/templates/web/thesaurus/properties.html.twig index 224679cec6..78510851a1 100644 --- a/templates/web/thesaurus/properties.html.twig +++ b/templates/web/thesaurus/properties.html.twig @@ -30,7 +30,7 @@ });
    - #} -
    + +

    {{ fullpath | raw }}

    +
    id: {{ id }}
    -

    {{ fullpath | raw }}


    {% if typ == "CT" %}
    - {% elseif typ == "TH" %} + {#{% elseif typ == "TH" %} {% trans with {'%hits%' : hits} %}thesaurus:: %hits% reponses retournees{% endtrans %}
    -
    +
    #} {% endif %}
    @@ -136,6 +137,14 @@ sy_list = ret.getElementsByTagName("sy_list").item(0); refresh_sy(sy_list); + /* $.ajax({ + type: "GET", + url: `${url}?${parms}`, + success: function(data){ + $('#DLG_PROPERTIES').html(''); + $('#DLG_PROPERTIES').append(data); + } + });*/ refresh = ret.getElementsByTagName("refresh"); @@ -295,8 +304,8 @@ // td.setAttribute("colSpan", "3"); // attention au 'S' majuscule !!! td.innerHTML = n.getAttribute("t"); - td = tr.appendChild(document.createElement("td")); - td.innerHTML = n.getAttribute("hits"); + /*td = tr.appendChild(document.createElement("td")); + td.innerHTML = n.getAttribute("hits");*/ td = tr.appendChild(document.createElement("td")); td.innerHTML = n.getAttribute("id"); @@ -322,17 +331,6 @@ ; if(tr) myGUI.select(tr); - /* switch(o.id.substr(0, 4)) - { - case "FLG_": // le drapeau - document.getElementById("flagsMenu").runAsMenu( evt, tr ); - break; - case "SYN_": // le synonyme - document.getElementById("syMenu").runAsMenu( evt, tr ); - $('.delete_term').html(''); - $('.delete_term', tr).append($('#syMenu').html()); - break; - }*/ } break; case "MOUSEDOWN": diff --git a/templates/web/thesaurus/thesaurus.html.twig b/templates/web/thesaurus/thesaurus.html.twig index dfcc12fdd1..d8149b0544 100644 --- a/templates/web/thesaurus/thesaurus.html.twig +++ b/templates/web/thesaurus/thesaurus.html.twig @@ -169,10 +169,6 @@

    {{ language }}

    {% endfor %} - {# {% for code, language in flags %} - - {{ language }} - {% endfor %}#}
    @@ -1521,55 +1521,58 @@ */ - /**Populate btn action**/ - $('#populate_btn').click(function (e) { - e.preventDefault(); - $("#confirm_populate").dialog({ - modal: true, - title: "{{ 'thesaurus: Populate title' | trans }}", - autoOpen:false, - width: 400, - open:function () { - $(this).closest(".ui-dialog") - .find(".ui-button:first") // the first button - .addClass("close-dialog").hide(); - $('.cancel_button').click(function () { - $('.close-dialog').trigger('click'); - }); - $('#CTERMS').find('.OB').addClass('ob').removeClass('OB'); - $('#THP_C').html('+'); + $(document).ready(function () { + /**Populate btn action**/ + $('#populate_btn').bind('click', function (e) { + e.preventDefault(); + $("#confirm_populate").dialog({ + modal: true, + title: "{{ 'thesaurus: Populate title' | trans }}", + autoOpen:false, + width: 400, + open:function () { + $(this).closest(".ui-dialog") + .find(".ui-button:first") // the first button + .addClass("close-dialog").hide(); + $('.cancel_button').click(function () { + $('.close-dialog').trigger('click'); + }); + $('#CTERMS').find('.OB').addClass('ob').removeClass('OB'); + $('#THP_C').html('+'); - } - }); - $("#confirm_populate").dialog('open'); - $('#confirm_populate_button').click(function () { - $.ajax({ - type: 'GET', - url: '/admin/worker-manager/populate-status', - data: { - sbasIds: [{{ bid }}] - }, - success: function (data) { - if (data == 0) { - $.ajax({ - url: '/thesaurus/populate', - type: 'POST', - data: { - databox_id: {{ bid }} - }, - success: function (data) { - //humane.info('{{ "thesaurus::populate: success message" |trans }}'); - $('.close-dialog').trigger('click'); - } - }); - } else { - alert('{{ "thesaurus::populate: Warning populate is in process to indexing databox" |trans }}'); - } - } - }); - }) - }); + } + }); + $("#confirm_populate").dialog('open'); + $('#confirm_populate_button').unbind('click').bind('click', function (e) { + e.preventDefault(); + $.ajax({ + type: 'GET', + url: '/admin/worker-manager/populate-status', + data: { + sbasIds: [{{ bid }}] + }, + success: function (data) { + if (data == 0) { + $.ajax({ + url: '/thesaurus/populate', + type: 'POST', + data: { + databox_id: {{ bid }} + }, + success: function (data) { + //humane.info('{{ "thesaurus::populate: success message" |trans }}'); + $('.close-dialog').trigger('click'); + } + }); + } else { + alert('{{ "thesaurus::populate: Warning populate is in process to indexing databox" |trans }}'); + } + } + }); + }) + }); + }) From e444e67215343ed3015b4cf5df6268e80fbdb36f Mon Sep 17 00:00:00 2001 From: gjacobjn <52928254+gjacobjn@users.noreply.github.com> Date: Thu, 2 Jul 2020 12:31:45 +0200 Subject: [PATCH 114/165] Update .env --- .env | 1 + 1 file changed, 1 insertion(+) diff --git a/.env b/.env index 191754107f..b18d09366e 100644 --- a/.env +++ b/.env @@ -34,6 +34,7 @@ PHP_LOG_LEVEL=warning # These variables are used in the configuration.yml . # set here the first user / email couple +PHRASEANET_ADMIN_ACCOUNT_ID=1 PHRASEANET_ADMIN_ACCOUNT_EMAIL=admin@alchemy.fr PHRASEANET_ADMIN_ACCOUNT_PASSWORD=iJRqXU0MwbyJewQLBbra6IWHsWly # Database parameters From e7e1e08c331db77147d5907313c2414c3f120204 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 2 Jul 2020 14:32:42 +0400 Subject: [PATCH 115/165] PHRAS-3148 --- templates/web/thesaurus/properties.html.twig | 15 --------------- templates/web/thesaurus/thesaurus.html.twig | 2 +- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/templates/web/thesaurus/properties.html.twig b/templates/web/thesaurus/properties.html.twig index bcb7e82ad0..7f8674b6e0 100644 --- a/templates/web/thesaurus/properties.html.twig +++ b/templates/web/thesaurus/properties.html.twig @@ -33,13 +33,6 @@ {{ 'thesaurus:properties:: Mettre dans le stock' | trans }}
    - {##} -

    {{ fullpath | raw }}

    @@ -137,14 +130,6 @@ sy_list = ret.getElementsByTagName("sy_list").item(0); refresh_sy(sy_list); - /* $.ajax({ - type: "GET", - url: `${url}?${parms}`, - success: function(data){ - $('#DLG_PROPERTIES').html(''); - $('#DLG_PROPERTIES').append(data); - } - });*/ refresh = ret.getElementsByTagName("refresh"); diff --git a/templates/web/thesaurus/thesaurus.html.twig b/templates/web/thesaurus/thesaurus.html.twig index 62fce8f343..ed93f6a7c2 100644 --- a/templates/web/thesaurus/thesaurus.html.twig +++ b/templates/web/thesaurus/thesaurus.html.twig @@ -226,7 +226,7 @@

    {{ 'thesaurus:: confirm populate' | trans }}

    - +
    From 2b61f1963fbaf801e2f85d04d95e5a05c9220c82 Mon Sep 17 00:00:00 2001 From: gjacobjn <52928254+gjacobjn@users.noreply.github.com> Date: Thu, 2 Jul 2020 12:33:45 +0200 Subject: [PATCH 116/165] Update docker-compose.yml --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 34ec5133dd..1f906e4cb1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,6 +43,7 @@ services: - OPCACHE_ENABLED - SESSION_CACHE_LIMITER - PHP_LOG_LEVEL + - PHRASEANET_ADMIN_ACCOUNT_ID - PHRASEANET_ADMIN_ACCOUNT_EMAIL - PHRASEANET_ADMIN_ACCOUNT_PASSWORD - PHRASEANET_DB_HOST From b647f172286837bea97dfeed1401c7fb92142069 Mon Sep 17 00:00:00 2001 From: gjacobjn <52928254+gjacobjn@users.noreply.github.com> Date: Thu, 2 Jul 2020 12:37:36 +0200 Subject: [PATCH 117/165] Update entrypoint.sh --- docker/phraseanet/entrypoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/phraseanet/entrypoint.sh b/docker/phraseanet/entrypoint.sh index 74757c3a26..ed23d9d253 100755 --- a/docker/phraseanet/entrypoint.sh +++ b/docker/phraseanet/entrypoint.sh @@ -32,8 +32,8 @@ if [ -f "$FILE" ]; then bin/setup system:config set registry.email.emitter-email $PHRASEANET_EMITTER_EMAIL bin/setup system:config set registry.email.prefix $PHRASEANET_MAIL_OBJECT_PREFIX fi - if [[ $PHRASEANET_ADMIN_ACCOUNT_PASSWORD ]]; then - bin/console user:password --user_id=1 --password $PHRASEANET_ADMIN_ACCOUNT_PASSWORD -y + if [[ $PHRASEANET_ADMIN_ACCOUNT_ID && $PHRASEANET_ADMIN_ACCOUNT_ID =~ ^[0-9]+$ ]]; then + bin/console user:password --user_id=$PHRASEANET_ADMIN_ACCOUNT_ID --password $PHRASEANET_ADMIN_ACCOUNT_PASSWORD -y fi else From d54b2a1e2437a59bcc9d11d2b823beae5be525c0 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 2 Jul 2020 19:21:55 +0400 Subject: [PATCH 118/165] PHRAS-3157 Video tools --- package.json | 2 +- resources/www/common/images/loader.gif | Bin 0 -> 20450 bytes .../prod/actions/Tools/videoEditor.html.twig | 4 +++- yarn.lock | 8 ++++---- 4 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 resources/www/common/images/loader.gif diff --git a/package.json b/package.json index 684672f1bd..02a712431b 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.240-d", + "phraseanet-production-client": "0.34.243-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/resources/www/common/images/loader.gif b/resources/www/common/images/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8ebc054789746aefe7f9c6c653d8b11e2c3723a GIT binary patch literal 20450 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 ku6NDrUiECp!=TJ189_ssI20 literal 0 HcmV?d00001 diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index 7e0c3d3109..57091334de 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -92,7 +92,9 @@
    - +
    diff --git a/yarn.lock b/yarn.lock index 20c3152ff2..6c932a3feb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7678,10 +7678,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.240-d: - version "0.34.240-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.240-d.tgz#81a3902a5258d048544ee763a139361be2728d58" - integrity sha512-P5qGQtvSNIGQgoOJMqxKzch4qb4QXFy10JL1wBiFjGOqRHgAQrzreLOF6z/sJE3TkY+B35MtijDnXWDLRZypwg== +phraseanet-production-client@0.34.243-d: + version "0.34.243-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.243-d.tgz#757a870334d382d60e19e49893740f55ee086d1c" + integrity sha512-3dplkbR4LOjbBLVkuxicdPcJlawrqQqAx+JZlAc9AIDvhlaCQQENmHz8/Ygb3mWtAFInexPyp/ns9qtpc3H43A== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From e6bdcad4ba3a1e073a9ee6030fb83368e2b7a201 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Fri, 3 Jul 2020 10:51:38 +0400 Subject: [PATCH 119/165] PHRAS-3157 : video tools : change loader gif --- resources/www/common/images/loader.gif | Bin 20450 -> 0 bytes .../prod/actions/Tools/videoEditor.html.twig | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 resources/www/common/images/loader.gif diff --git a/resources/www/common/images/loader.gif b/resources/www/common/images/loader.gif deleted file mode 100644 index f8ebc054789746aefe7f9c6c653d8b11e2c3723a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20450 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 ku6NDrUiECp!=TJ189_ssI20 diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index 57091334de..dc2d1bb0cd 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -92,8 +92,8 @@
    -
    {{ 'admin::workermanager:tab:workerinfo: databox_id' | trans }}{{ 'admin::workermanager:tab:workerinfo: databox_name' | trans }} {{ 'admin::workermanager:tab:workerinfo: record_id' | trans }} {{ 'admin::workermanager:tab:workerinfo: work' | trans }} {{ 'admin::workermanager:tab:workerinfo: work_on' | trans }}
    {{ workerRow.databoxId }}{{ workerRow.databoxId | sbas_labels(app) }} {{ workerRow.recordId }} {{ workerRow.getWorkName }} {{ workerRow.workOn }}
    diff --git a/templates/web/lightbox/index_layout.html.twig b/templates/web/lightbox/index_layout.html.twig index e04cfe9b77..92d42a9207 100644 --- a/templates/web/lightbox/index_layout.html.twig +++ b/templates/web/lightbox/index_layout.html.twig @@ -1,5 +1,8 @@ {% extends "common/index_bootstrap.html.twig" %} +{% block icon %} + +{% endblock %} {% block extra_content %}
    {% endblock %} diff --git a/yarn.lock b/yarn.lock index 3e726f9310..865b962908 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7678,10 +7678,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.250-d: - version "0.34.250-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.250-d.tgz#6d885ed986b22733bdd8e76a1abb0ab85fe35635" - integrity sha512-ae9URsI+LfoRcEP8OD73KpOjJnLYRiqXtgzAzLF97oATY9fidd70lZQPRHgSGKCMLgvE4F68noEAjWoIWE7cpQ== +phraseanet-production-client@0.34.252-d: + version "0.34.252-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.252-d.tgz#e3a628d08d825c2554220cfcbbda3f8e3c3c6127" + integrity sha512-jSfa47v3TcwIbv6ItpzzXER/1U7ydrLyiUFRpJn+H0FapPUJCoKZ9Iy1PqNmUIzlTjqewQlatXSCLzMfzBcMlg== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 47c6ad80e0676d7b87b029f29f388bad2a008b07 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Tue, 7 Jul 2020 15:46:30 +0400 Subject: [PATCH 147/165] PHRAS-3164 export add term of use design --- resources/www/common/styles/main.scss | 17 +++++++++++++++++ templates/web/common/dialog_export.html.twig | 3 +-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/resources/www/common/styles/main.scss b/resources/www/common/styles/main.scss index e232bde41c..ab639af0ce 100644 --- a/resources/www/common/styles/main.scss +++ b/resources/www/common/styles/main.scss @@ -164,3 +164,20 @@ $mainMenuLinkBackgroundHoverColor: transparent; } +.acceptDl-info { + background-color: #d9edf7; + border: 1px solid #bce8f1; + border-radius: 3px; + color: #3a87ad; + display: inline-block; + padding: 9px 24px 5px 9px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255,255,255,.5); + a, label { + color: #3a87ad!important; + } + a { + text-decoration: underline; + } +} + diff --git a/templates/web/common/dialog_export.html.twig b/templates/web/common/dialog_export.html.twig index a7b1abc21b..386deda247 100644 --- a/templates/web/common/dialog_export.html.twig +++ b/templates/web/common/dialog_export.html.twig @@ -152,9 +152,8 @@ {% endif %} {{ _self.choose_title('download', choose_export_title, default_export_title) }} - {% if app['conf'].get(['registry', 'actions', 'tou-validation-required-for-export']) == true %} -
    +

    {{ 'export::mail: contenu du mail' | trans }}

    @@ -234,7 +236,7 @@ {{ _self.choose_title('sendmail', choose_export_title, default_export_title) }} {% if app['conf'].get(['registry', 'actions', 'tou-validation-required-for-export']) == true %} -
    + {% if app['conf'].get(['registry', 'actions', 'tou-validation-required-for-export']) == true %} -
    +
    ' %} @@ -468,7 +470,7 @@ {% endif %} {% if app['conf'].get(['registry', 'actions', 'tou-validation-required-for-export']) == true %} -
    +
    ' %} From a6f01624e8decf3f85f96c1f1c37096f906ebb7a Mon Sep 17 00:00:00 2001 From: aynsix Date: Tue, 7 Jul 2020 20:19:51 +0300 Subject: [PATCH 150/165] fix lazaret storage path --- lib/Alchemy/Phrasea/Application.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index 4d0d2ab2d5..60d8f2bf3e 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -618,7 +618,7 @@ class Application extends SilexApplication ); $this['tmp.lazaret.path'] = $factory->createDefinition( - ['main', 'storage', 'quarantine'], + ['main', 'storage', 'lazaret'], function (Application $app) { return $app['tmp.path'].'/lazaret'; } From 4b9ee4f6a5a9742ebb467cf054de1b3340e0fc1c Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Wed, 8 Jul 2020 15:17:22 +0400 Subject: [PATCH 151/165] PHRAS-3164 Fix on lightbox --- package.json | 2 +- resources/www/lightbox/styles/main.scss | 4 ++++ yarn.lock | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c306bb3e9e..c255568100 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.252-d", + "phraseanet-production-client": "0.34.254-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/resources/www/lightbox/styles/main.scss b/resources/www/lightbox/styles/main.scss index 35a94621ec..2ebb0a831f 100644 --- a/resources/www/lightbox/styles/main.scss +++ b/resources/www/lightbox/styles/main.scss @@ -730,4 +730,8 @@ a.btn-info { transition: all 0.3s ease-out 0s; padding: 10px; border-radius: 5px; +} + +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { + padding: 0!important; } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 865b962908..e716aea776 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7678,10 +7678,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.252-d: - version "0.34.252-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.252-d.tgz#e3a628d08d825c2554220cfcbbda3f8e3c3c6127" - integrity sha512-jSfa47v3TcwIbv6ItpzzXER/1U7ydrLyiUFRpJn+H0FapPUJCoKZ9Iy1PqNmUIzlTjqewQlatXSCLzMfzBcMlg== +phraseanet-production-client@0.34.254-d: + version "0.34.254-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.254-d.tgz#52a798b8c1f9994cf677db6ad6aeb9909c811f80" + integrity sha512-EvTbTbDbdoWGfqZtqJGEl6xeE6vyk43IF5eVMCy7c6qkaYjTuyiTqvI8eMXSJ2gKvsEidaa6AsHigUL9lKuVcA== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From c7870dbc4feff78cb3a768a031562f442c8f2685 Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Wed, 8 Jul 2020 17:11:49 +0400 Subject: [PATCH 152/165] PHRAS-3164 : add some string on export > email --- resources/locales/messages.de.xlf | 355 ++++++++++--------- resources/locales/messages.en.xlf | 355 ++++++++++--------- resources/locales/messages.fr.xlf | 355 ++++++++++--------- resources/locales/messages.nl.xlf | 355 ++++++++++--------- resources/locales/validators.de.xlf | 2 +- resources/locales/validators.en.xlf | 2 +- resources/locales/validators.fr.xlf | 2 +- resources/locales/validators.nl.xlf | 2 +- templates/web/common/dialog_export.html.twig | 8 +- 9 files changed, 722 insertions(+), 714 deletions(-) diff --git a/resources/locales/messages.de.xlf b/resources/locales/messages.de.xlf index 21e1de7a8b..fd041523ed 100644 --- a/resources/locales/messages.de.xlf +++ b/resources/locales/messages.de.xlf @@ -1,6 +1,6 @@ - +
    The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -112,8 +112,8 @@ %basket_length% documents %basket_length% Dokument(e) mobile/lightbox/validate.html.twig - web/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig + web/lightbox/index.html.twig %countable% documents can not be modified. @@ -138,12 +138,12 @@ %docs_not_orderable% documents ne peuvent pas etre commandes %docs_not_orderable% Dokumente können nicht bestellt werden - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig %docs_orderable% documents commandes %docs_orderable% bestellte Dokumente - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig %entry_length% documents @@ -378,17 +378,17 @@ (validation) a envoyer zu senden - web/lightbox/index.html.twig + web/lightbox/index.html.twig (validation) envoyee gesendet - web/lightbox/index.html.twig + web/lightbox/index.html.twig (validation) session terminee Sitzung beendet - web/lightbox/index.html.twig + web/lightbox/index.html.twig *Phraseanet Navigator* is a smartphone application that allow user to connect on this instance @@ -618,7 +618,7 @@ Accuse de reception indisponible, vous n'avez pas declare d'adresse email Es ist nicht möglich, eine Empfangsbestätigung zu erhalten. Grund: eine fehlende E-Mail Adresse - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Action Forbidden : You are not the publisher @@ -1543,10 +1543,10 @@ By checking this box, you accept %beginning_link% Terms of Use %end_link% Wenn Sie dieses Kästchen anwählen, akzeptieren Sie die %beginning_link% Nutzeungsbedingungen %end_link% - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig By default it is available for admins @@ -1705,7 +1705,7 @@ Certains champs sont obligatoires, veuillez les remplir Bitte füllen Sie die erforderlichen Felder aus - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Ces informations sont directement fournies par la norme de metadonnees de ce champ : %norm_name% @@ -1770,7 +1770,7 @@ Civility Anrede - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Clear @@ -1813,7 +1813,7 @@ Codec Audio Audio Codec web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig Codec Video @@ -2608,9 +2608,9 @@ Documents indisponibles Dokument(e) nicht verfügbar web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Don't worry, You can modify your configuration later @@ -2986,7 +2986,7 @@ Entrez plusieurs adresses email en les separant par des points-virgules Trennen Sie die E-Mail Adressen mit Strichpunkten wenn sie an mehrere Empfänger gleichzeitig Dokumente senden wollen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Entry removed from list @@ -3713,7 +3713,7 @@ Images par secondes Bilder pro Sekunde web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig Imagette indisponible @@ -3734,8 +3734,8 @@ Include Business-fields in caption Geschäftsfelder in Beschriftung enthalten web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Incorrect please try again @@ -3916,9 +3916,9 @@ La sous resolution n'est pas disponible pour les documents suivants Unterauflösung für die folgende Dokumente ist nicht verfügbar - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig La taille maximale d'une video est de %duration% minutes. @@ -4915,9 +4915,9 @@ mobile/lightbox/index.html.twig mobile/lightbox/index.html.twig web/account/account.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox/IE6/validate.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Par %author% @@ -5536,7 +5536,7 @@ Recevoir un accuse de reception a %my_email% Empfangsbestätigung zu %my_email% bekommen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Rechercher dans un champ date @@ -6216,7 +6216,7 @@ Size Grösse web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Download/prepare.html.twig @@ -6428,7 +6428,7 @@ Success Erfolg api/auth/native_app_access_token.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Successful install @@ -6461,7 +6461,7 @@ Controller/Admin/CollectionController.php Controller/Admin/CollectionController.php Controller/Admin/CollectionController.php - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig admin/collection/suggested_value.html.twig admin/collection/collection.html.twig web/admin/databases.html.twig @@ -6589,7 +6589,7 @@ Terms of Use Nutzungsbedingungen Form/Login/PhraseaRegisterForm.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Terms of service @@ -6995,12 +6995,12 @@ Un document commande Ein bestelltes Dokument - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Un document ne peut etre commande Ein Dokument kann nicht bestellt werden - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Unable to add file to Phraseanet @@ -7320,7 +7320,7 @@ VALIDATION Bestätigung - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/agreement_box.html.twig @@ -7353,9 +7353,9 @@ Bestätigung mobile/lightbox/index.html.twig mobile/lightbox/index.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox/IE6/validate.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Validations received @@ -7427,13 +7427,13 @@ Voici vos paniers Ihre Sammelkörbe mobile/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Voici vos validations en cours Hier sind Ihre aktuellen Bewertungen mobile/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Votre adresse email @@ -7498,7 +7498,7 @@ Vous devez selectionner un type de sous definitions Sie müssen einen Typ von Unterauflösungen auswählen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Vous devez specifier une adresse email et un mot de passe valides @@ -7592,7 +7592,7 @@ Warning ! Warnung ! - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Warning, this database is not empty @@ -7671,7 +7671,7 @@ Would you like to receive an e-mail when your download is ready ? Möchten Sie eine Email erhalten wenn Ihr Download abgeschlossen ist ? - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Would you like to reset rights before applying the template? @@ -7768,7 +7768,7 @@ You can alternatively receive an email when the download is ready. Sie können zur Bestätigung eine Email erhalten wenn Ihr Download abgeschlossen ist. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You can choose only one record @@ -7783,7 +7783,7 @@ You can not directly download more than %max_download% Mo ; time to package all documents is too long You can not download more than %max_download% Mo ; time to package all documents is too long - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You can not edit this story @@ -7879,7 +7879,7 @@ You must agree to the Terms of Use to continue. Sie müssen die Nutzungsbedingungen akzeptieren, um fortzufahren - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You must give a destination collection @@ -8035,7 +8035,7 @@ action : exporter Exportieren - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -8509,7 +8509,7 @@ Adresse Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8524,7 +8524,7 @@ PLZ Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8548,7 +8548,7 @@ E-Mail Event/Subscriber/RegistrationSubscriber.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/users.html.twig web/admin/connected-users.html.twig @@ -8560,7 +8560,7 @@ Fax Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8597,7 +8597,7 @@ Event/Subscriber/RegistrationSubscriber.php Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/connected-users.html.twig admin/user/registrations.html.twig @@ -8619,7 +8619,7 @@ Beruf Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8630,7 +8630,7 @@ Event/Subscriber/RegistrationSubscriber.php Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8647,7 +8647,7 @@ Unternehmen Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/users.html.twig web/admin/connected-users.html.twig @@ -8663,7 +8663,7 @@ admin::compte-utilisateur telephone Telefon Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/connected-users.html.twig admin/user/registrations.html.twig @@ -8679,7 +8679,7 @@ Ort Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8775,7 +8775,7 @@ admin::compte-utilisateur:sexe: madame Frau Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8783,7 +8783,7 @@ admin::compte-utilisateur:sexe: mademoiselle Fräulein Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8791,7 +8791,7 @@ admin::compte-utilisateur:sexe: monsieur Herr Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -9422,7 +9422,7 @@ alert Vorsicht - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -9534,15 +9534,15 @@ web/thesaurus/export-topics-dialog.html.twig web/thesaurus/new-term.html.twig web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/link-field-step2.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/reset-email.html.twig Bridge/Dailymotion/video_modify.html.twig Bridge/Dailymotion/video_modify.html.twig @@ -9565,8 +9565,8 @@ boutton::chercher suchen - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/prod/index.html.twig web/admin/users.html.twig @@ -9579,7 +9579,7 @@ boutton::commander bestellen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::creer @@ -9607,13 +9607,13 @@ boutton::envoyer senden - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::essayer probieren - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::exporter @@ -9627,7 +9627,7 @@ web/thesaurus/export-topics.html.twig web/thesaurus/accept.html.twig web/thesaurus/accept.html.twig - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig web/thesaurus/link-field-step3.html.twig web/common/dialog_export.html.twig web/lightbox/sc_note.html.twig @@ -9775,14 +9775,14 @@ boutton::telecharger Download - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/lightbox/feed_options_box.html.twig web/lightbox/sc_options_box.html.twig boutton::telecharger tous les documents Alle Dokumente herunterladen - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -9805,8 +9805,8 @@ web/thesaurus/export-topics-dialog.html.twig web/thesaurus/new-term.html.twig web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/index.html.twig web/thesaurus/link-field-step2.html.twig web/account/access.html.twig @@ -9963,12 +9963,12 @@ commande::deadline Termin - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig commande::utilisation prevue Verwendungszweck - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig prod/orders/order_item.html.twig @@ -10151,7 +10151,7 @@ export:: FTP FTP web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export:: commande @@ -10162,7 +10162,7 @@ export:: envoi par mail E-Mail web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export:: erreur : aucun document selectionne @@ -10178,7 +10178,7 @@ export::export-email: email-invalid Das Format der Email Adresse scheint falsch zu sein - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::ftp: reglages manuels @@ -10188,7 +10188,7 @@ export::mail: contenu du mail Textinhalt - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::mail: destinataire @@ -10198,8 +10198,8 @@ export::mail: fichiers joint E-Mail Anhänge - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::titre: nom original du document @@ -10211,6 +10211,11 @@ Titel web/common/dialog_export.html.twig + + export:email:: acknowledgement info + export:email:: acknowledgement info + web/common/dialog_export.html.twig + failed to send mail Email Senden ist fehlgeschlagen @@ -10459,12 +10464,12 @@ lightbox::See_less_feedback Weniger Feedback sehen - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::See_more_feedback Mehr Feedback sehen - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::list @@ -10475,61 +10480,61 @@ lightbox::recaptitulatif Übersicht mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/agreement_box.html.twig web/lightbox/feed.html.twig lightbox::see_less_basket Weniger Sammelkörbe sehen - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::see_more_basket Weitere Sammelkörbe sehen - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox:feedback:sendreport:warnwindows:cancel Sendung abbrechen und Feedback fortsetzen mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:message Zusammenfassung der Feedback Auswahlmöglichkeiten mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_approved genehmigt mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_rejected abgelehnt mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_unexpressed unausgesprochen mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:title Feedback Übersicht mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:validate Bericht Sendung bestätigen mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig login:: Changer mon adresse email @@ -10686,7 +10691,7 @@ no image selected Kein Bild wurde ausgewählt - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -10698,7 +10703,7 @@ notice Beschreibung - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -11176,7 +11181,7 @@ phraseanet:: language Sprache - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig phraseanet:: password @@ -11199,7 +11204,7 @@ phraseanet:: prereglages Voreinstellungen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig phraseanet:: presse-papier @@ -11236,7 +11241,7 @@ web/thesaurus/load-thesaurus.html.twig web/thesaurus/load-thesaurus.html.twig web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/index.html.twig web/prod/tab_headers.html.twig prod/actions/edit_default.html.twig @@ -11707,7 +11712,7 @@ processing verarbeitend - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -11880,6 +11885,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben prod::export: send mail notification E-Mail-Anfrage gesendet + web/lightbox/validate.html.twig web/prod/index.html.twig @@ -12152,7 +12158,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben prod:videoeditor:subtitleRequestTab:: submit Anfrage einreichen - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:: title @@ -12162,22 +12168,22 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben prod:videoeditor:subtitleRequestTab:label:: Kind Typ - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Language destination Zielsprache - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Provider Provider - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Source Audio language Audioquelle Sprache - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleTab:: title @@ -12187,47 +12193,47 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben prod:videoeditor:subtitletab:: Caption placeholder Geben Sie einen Untertitel ein - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: End time Ende - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: No caption message Keine Untertitel für diese Sprache - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: Show for Dauer - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: Start time Start - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: add caption Untertitel hinzufügen - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: copy to clipboard In die Zwischenablage kopieren - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: save Speichern - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: work on Untertitel Sprache auswählen - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:message:: error @@ -13012,7 +13018,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben screenshot video Video Screenshot - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig select at least one user @@ -13388,12 +13394,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus: Populate title thesaurus: Populate title - web/thesaurus/thesaurus.html.twig - - - thesaurus:: %hits% reponses retournees - %hits% Ergebnisse geliefert - web/thesaurus/properties.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: A cet emplacement du thesaurus , un candidat du champ %cfield% ne peut etre accepte @@ -13418,7 +13419,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: Confirmer la suppression du terme %s Das Löschen des Begriffes "%s" bestätigen - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thesaurus:: Editer le thesaurus @@ -13429,7 +13430,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: Importer Importieren web/thesaurus/import-dialog.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Lier la branche de thesaurus @@ -13441,7 +13442,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: Lier la branche de thesaurus au champ Die Verzweigung mit dem Feld %s verbinden web/thesaurus/link-field-step1.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Lier la branche de thesaurus au champ %branch% @@ -13452,31 +13453,31 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: Nouveau synonyme Neuer Synonym web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Nouveau terme Neuer Begriff - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Nouveau terme specifique Neuer bestimmte Begriff web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Proprietes Eigenschaften - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Vous n'avez acces a aucune base @@ -13487,12 +13488,12 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: accepter... Annehmen web/thesaurus/accept.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: afficher les termes refuses Abgelehnte Begriffe anzeigen - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: ce champ doit etre lie au thesaurus. La reindexation de la base est necessaire @@ -13518,22 +13519,22 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: commence par beginnt mit - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: confirm populate thesaurus:: confirm populate - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: contexte Kontext - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: contient beinhaltet - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: corbeille @@ -13545,7 +13546,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: deplacer le terme dans la corbeille ? Begriffe zum Stock verschieben - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: enregistrement de la liste modifiee des mots candidats. @@ -13575,7 +13576,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: est egal a gleicht - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: example @@ -13603,14 +13604,14 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben web/thesaurus/export-text-dialog.html.twig web/thesaurus/export-text-dialog.html.twig web/thesaurus/export-text.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: export en topics Themen web/thesaurus/export-topics.html.twig web/thesaurus/export-topics-dialog.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: exporter @@ -13665,7 +13666,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: le terme Begriff - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: le terme %term% avec contexte %context% @@ -13690,12 +13691,12 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: onglet stock Mögliche Begriffe - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: onglet thesaurus Thesaurus - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: options d'export : @@ -13710,7 +13711,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: populate button thesaurus:: populate button - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: presentation @@ -13807,17 +13808,17 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:: synonyme Synonym - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: synonymes Synonyme - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thesaurus:: terme Begriff - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: tout deployer - refermable @@ -13837,85 +13838,85 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus::menu: Mettre dans le stock thesaurus::menu: Mettre dans le stock - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: Nouveau synonyme Neuer Synonym - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: Nouveau terme Neuer Begriff - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: accepter Annehmen - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: chercher Suchen - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: export topics Exportieren als Themen - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: exporter Exportieren - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: importer Importieren - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: lier au champ Mit dem Feld verbinden - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: proprietes Eigenschaften - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: refuser Ablehnen - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: supprimer Löschen - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::populate: Warning populate is in process to indexing databox thesaurus::populate: Warning populate is in process to indexing databox - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::populate: success message thesaurus::populate: success message - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:dialog:: export thesaurus:dialog:: export - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:dialog:: properties thesaurus:dialog:: properties - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:properties:: Mettre dans le stock @@ -13925,12 +13926,12 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben thesaurus:termePorperties:termeId thesaurus:termePorperties:termeId - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thumbnail validation Miniaturansicht Bestätigung - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -13989,7 +13990,7 @@ Vorsicht: die aktuelle Werte werden durch die neue Werte überschrieben validate Bestätigen - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig actions/Tools/index.html.twig actions/Tools/index.html.twig diff --git a/resources/locales/messages.en.xlf b/resources/locales/messages.en.xlf index 3a9abe6bb5..786f3028fa 100644 --- a/resources/locales/messages.en.xlf +++ b/resources/locales/messages.en.xlf @@ -1,6 +1,6 @@ - +
    The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -112,8 +112,8 @@ %basket_length% documents %basket_length% document(s) mobile/lightbox/validate.html.twig - web/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig + web/lightbox/index.html.twig %countable% documents can not be modified. @@ -138,12 +138,12 @@ %docs_not_orderable% documents ne peuvent pas etre commandes %docs_not_orderable% document(s) can't be ordered - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig %docs_orderable% documents commandes %docs_orderable% ordered document(s) - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig %entry_length% documents @@ -378,17 +378,17 @@ (validation) a envoyer Feedback request to send - web/lightbox/index.html.twig + web/lightbox/index.html.twig (validation) envoyee Feedback request sent. - web/lightbox/index.html.twig + web/lightbox/index.html.twig (validation) session terminee Feedback session ended. - web/lightbox/index.html.twig + web/lightbox/index.html.twig *Phraseanet Navigator* is a smartphone application that allow user to connect on this instance @@ -618,7 +618,7 @@ Accuse de reception indisponible, vous n'avez pas declare d'adresse email Unable to send an acknowledgement: Missing e-mail address. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Action Forbidden : You are not the publisher @@ -1544,10 +1544,10 @@ By checking this box, you accept %beginning_link% Terms of Use %end_link% By checking this box, you have read and agree to the %beginning_link% Terms of Use %end_link% - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig By default it is available for admins @@ -1706,7 +1706,7 @@ Certains champs sont obligatoires, veuillez les remplir Some fields must be completed - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Ces informations sont directement fournies par la norme de metadonnees de ce champ : %norm_name% @@ -1772,7 +1772,7 @@ Civility Title - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Clear @@ -1815,7 +1815,7 @@ Codec Audio Audio codec web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig Codec Video @@ -2611,9 +2611,9 @@ Documents indisponibles Document(s) unavailable web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Don't worry, You can modify your configuration later @@ -2989,7 +2989,7 @@ Entrez plusieurs adresses email en les separant par des points-virgules Use a semicolon between e-mail addresses. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Entry removed from list @@ -3716,7 +3716,7 @@ Images par secondes Image per second web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig Imagette indisponible @@ -3737,8 +3737,8 @@ Include Business-fields in caption Include Business fields in captions web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Incorrect please try again @@ -3919,9 +3919,9 @@ La sous resolution n'est pas disponible pour les documents suivants Subviews unavailable for the following document(s) - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig La taille maximale d'une video est de %duration% minutes. @@ -4918,9 +4918,9 @@ mobile/lightbox/index.html.twig mobile/lightbox/index.html.twig web/account/account.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox/IE6/validate.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Par %author% @@ -5539,7 +5539,7 @@ Recevoir un accuse de reception a %my_email% Receive an acknowledgement at %my_email% - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Rechercher dans un champ date @@ -6219,7 +6219,7 @@ Size Size web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Download/prepare.html.twig @@ -6431,7 +6431,7 @@ Success Success api/auth/native_app_access_token.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Successful install @@ -6464,7 +6464,7 @@ Controller/Admin/CollectionController.php Controller/Admin/CollectionController.php Controller/Admin/CollectionController.php - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig admin/collection/suggested_value.html.twig admin/collection/collection.html.twig web/admin/databases.html.twig @@ -6592,7 +6592,7 @@ Terms of Use Terms of use Form/Login/PhraseaRegisterForm.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Terms of service @@ -6998,12 +6998,12 @@ Un document commande One document ordered. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Un document ne peut etre commande One document can not be ordered. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Unable to add file to Phraseanet @@ -7323,7 +7323,7 @@ VALIDATION Feedback - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/agreement_box.html.twig @@ -7356,9 +7356,9 @@ Feedbacks mobile/lightbox/index.html.twig mobile/lightbox/index.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox/IE6/validate.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Validations received @@ -7430,13 +7430,13 @@ Voici vos paniers Your Basket(s) mobile/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Voici vos validations en cours Your feedbacks in progress mobile/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Votre adresse email @@ -7501,7 +7501,7 @@ Vous devez selectionner un type de sous definitions Select type of subviews - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Vous devez specifier une adresse email et un mot de passe valides @@ -7595,7 +7595,7 @@ Warning ! Warning! - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Warning, this database is not empty @@ -7674,7 +7674,7 @@ Would you like to receive an e-mail when your download is ready ? Would you like to receive an e-mail when download is ready ? - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Would you like to reset rights before applying the template? @@ -7771,7 +7771,7 @@ You can alternatively receive an email when the download is ready. Alternatively, you can receive an e-mail when the download is ready. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You can choose only one record @@ -7786,7 +7786,7 @@ You can not directly download more than %max_download% Mo ; time to package all documents is too long You can't directly download more than %max_download% Mo ; time to package all documents would be too long. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You can not edit this story @@ -7882,7 +7882,7 @@ You must agree to the Terms of Use to continue. You must accept the Terms of Use to continue. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You must give a destination collection @@ -8038,7 +8038,7 @@ action : exporter Export - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -8512,7 +8512,7 @@ Address Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8527,7 +8527,7 @@ Zip code Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8551,7 +8551,7 @@ E-mail Event/Subscriber/RegistrationSubscriber.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/users.html.twig web/admin/connected-users.html.twig @@ -8563,7 +8563,7 @@ Fax Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8600,7 +8600,7 @@ Event/Subscriber/RegistrationSubscriber.php Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/connected-users.html.twig admin/user/registrations.html.twig @@ -8622,7 +8622,7 @@ Job Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8633,7 +8633,7 @@ Event/Subscriber/RegistrationSubscriber.php Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8650,7 +8650,7 @@ Company Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/users.html.twig web/admin/connected-users.html.twig @@ -8666,7 +8666,7 @@ admin::compte-utilisateur telephone Phone Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/connected-users.html.twig admin/user/registrations.html.twig @@ -8682,7 +8682,7 @@ City Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8778,7 +8778,7 @@ admin::compte-utilisateur:sexe: madame Mrs. Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8786,7 +8786,7 @@ admin::compte-utilisateur:sexe: mademoiselle Miss Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8794,7 +8794,7 @@ admin::compte-utilisateur:sexe: monsieur Mr. Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -9425,7 +9425,7 @@ alert Warning - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -9537,15 +9537,15 @@ web/thesaurus/export-topics-dialog.html.twig web/thesaurus/new-term.html.twig web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/link-field-step2.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/reset-email.html.twig Bridge/Dailymotion/video_modify.html.twig Bridge/Dailymotion/video_modify.html.twig @@ -9568,8 +9568,8 @@ boutton::chercher Search - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/prod/index.html.twig web/admin/users.html.twig @@ -9582,7 +9582,7 @@ boutton::commander Order - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::creer @@ -9610,13 +9610,13 @@ boutton::envoyer Send - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::essayer Try - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::exporter @@ -9630,7 +9630,7 @@ web/thesaurus/export-topics.html.twig web/thesaurus/accept.html.twig web/thesaurus/accept.html.twig - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig web/thesaurus/link-field-step3.html.twig web/common/dialog_export.html.twig web/lightbox/sc_note.html.twig @@ -9778,14 +9778,14 @@ boutton::telecharger Download - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/lightbox/feed_options_box.html.twig web/lightbox/sc_options_box.html.twig boutton::telecharger tous les documents Download all - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -9808,8 +9808,8 @@ web/thesaurus/export-topics-dialog.html.twig web/thesaurus/new-term.html.twig web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/index.html.twig web/thesaurus/link-field-step2.html.twig web/account/access.html.twig @@ -9966,12 +9966,12 @@ commande::deadline Deadline - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig commande::utilisation prevue Intended use - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig prod/orders/order_item.html.twig @@ -10154,7 +10154,7 @@ export:: FTP FTP web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export:: commande @@ -10165,7 +10165,7 @@ export:: envoi par mail E-Mail web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export:: erreur : aucun document selectionne @@ -10181,7 +10181,7 @@ export::export-email: email-invalid The email address format seems incorrect - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::ftp: reglages manuels @@ -10191,7 +10191,7 @@ export::mail: contenu du mail Content - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::mail: destinataire @@ -10201,8 +10201,8 @@ export::mail: fichiers joint Attachment(s) - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::titre: nom original du document @@ -10214,6 +10214,11 @@ Title web/common/dialog_export.html.twig + + export:email:: acknowledgement info + export:email:: acknowledgement info + web/common/dialog_export.html.twig + failed to send mail failed to send mail @@ -10462,12 +10467,12 @@ lightbox::See_less_feedback See less feedback - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::See_more_feedback See more feedback - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::list @@ -10478,61 +10483,61 @@ lightbox::recaptitulatif Summary mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/agreement_box.html.twig web/lightbox/feed.html.twig lightbox::see_less_basket See less baskets - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::see_more_basket See more baskets - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox:feedback:sendreport:warnwindows:cancel Cancel report sending and continue mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:message Your feedback contains mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_approved Approved mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_rejected Rejected mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_unexpressed Unexpressed mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:title Feedback summary mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:validate Send my report mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig login:: Changer mon adresse email @@ -10689,7 +10694,7 @@ no image selected No Document selected - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -10701,7 +10706,7 @@ notice Caption - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -11179,7 +11184,7 @@ phraseanet:: language Language - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig phraseanet:: password @@ -11202,7 +11207,7 @@ phraseanet:: prereglages Presets - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig phraseanet:: presse-papier @@ -11239,7 +11244,7 @@ web/thesaurus/load-thesaurus.html.twig web/thesaurus/load-thesaurus.html.twig web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/index.html.twig web/prod/tab_headers.html.twig prod/actions/edit_default.html.twig @@ -11710,7 +11715,7 @@ processing Processing... - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -11885,6 +11890,7 @@ Warning: The current values will be overwritten by these new values prod::export: send mail notification Email sending request submitted + web/lightbox/validate.html.twig web/prod/index.html.twig @@ -12160,7 +12166,7 @@ It is possible to place several search areas prod:videoeditor:subtitleRequestTab:: submit Submit Subtitling Request - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:: title @@ -12170,22 +12176,22 @@ It is possible to place several search areas prod:videoeditor:subtitleRequestTab:label:: Kind Kind - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Language destination Subtitles language destination - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Provider Provider - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Source Audio language Audio language Source - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleTab:: title @@ -12195,47 +12201,47 @@ It is possible to place several search areas prod:videoeditor:subtitletab:: Caption placeholder Type a subtitle - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: End time End - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: No caption message No Subtitle set for this language - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: Show for Duration - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: Start time Start - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: add caption Add a Subtitle - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: copy to clipboard Copy to clipboard - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: save Save - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: work on Select subtitling language - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:message:: error @@ -13020,7 +13026,7 @@ It is possible to place several search areas screenshot video Video screenshot - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig select at least one user @@ -13396,12 +13402,7 @@ It is possible to place several search areas thesaurus: Populate title Indexing - web/thesaurus/thesaurus.html.twig - - - thesaurus:: %hits% reponses retournees - %hits% hits - web/thesaurus/properties.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: A cet emplacement du thesaurus , un candidat du champ %cfield% ne peut etre accepte @@ -13426,7 +13427,7 @@ It is possible to place several search areas thesaurus:: Confirmer la suppression du terme %s Confirm term "%s" delete - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thesaurus:: Editer le thesaurus @@ -13437,7 +13438,7 @@ It is possible to place several search areas thesaurus:: Importer Import web/thesaurus/import-dialog.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Lier la branche de thesaurus @@ -13449,7 +13450,7 @@ It is possible to place several search areas thesaurus:: Lier la branche de thesaurus au champ Link thesaurus branch to field web/thesaurus/link-field-step1.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Lier la branche de thesaurus au champ %branch% @@ -13460,31 +13461,31 @@ It is possible to place several search areas thesaurus:: Nouveau synonyme New Synonym web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Nouveau terme New term - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Nouveau terme specifique New specific term web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Proprietes Properties - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Vous n'avez acces a aucune base @@ -13495,12 +13496,12 @@ It is possible to place several search areas thesaurus:: accepter... Accept web/thesaurus/accept.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: afficher les termes refuses Display rejected terms - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: ce champ doit etre lie au thesaurus. La reindexation de la base est necessaire @@ -13526,22 +13527,22 @@ It is possible to place several search areas thesaurus:: commence par starts with - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: confirm populate Launch databases indexing - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: contexte Context - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: contient contains - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: corbeille @@ -13553,7 +13554,7 @@ It is possible to place several search areas thesaurus:: deplacer le terme dans la corbeille ? Move Terms to stock - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: enregistrement de la liste modifiee des mots candidats. @@ -13583,7 +13584,7 @@ It is possible to place several search areas thesaurus:: est egal a is equal to - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: example @@ -13611,14 +13612,14 @@ It is possible to place several search areas web/thesaurus/export-text-dialog.html.twig web/thesaurus/export-text-dialog.html.twig web/thesaurus/export-text.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: export en topics Topics web/thesaurus/export-topics.html.twig web/thesaurus/export-topics-dialog.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: exporter @@ -13673,7 +13674,7 @@ It is possible to place several search areas thesaurus:: le terme term - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: le terme %term% avec contexte %context% @@ -13698,12 +13699,12 @@ It is possible to place several search areas thesaurus:: onglet stock Candidates - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: onglet thesaurus Thesaurus - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: options d'export : @@ -13718,7 +13719,7 @@ It is possible to place several search areas thesaurus:: populate button Indexing - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: presentation @@ -13815,17 +13816,17 @@ It is possible to place several search areas thesaurus:: synonyme Synonym - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: synonymes Synonyms - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thesaurus:: terme Term - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: tout deployer - refermable @@ -13845,85 +13846,85 @@ It is possible to place several search areas thesaurus::menu: Mettre dans le stock Move to the stock - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: Nouveau synonyme New synonym - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: Nouveau terme New term - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: accepter Allow - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: chercher Search - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: export topics Export as topics - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: exporter Export - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: importer Import - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: lier au champ Link to fields - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: proprietes Properties - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: refuser Reject - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: supprimer Delete - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::populate: Warning populate is in process to indexing databox Warning populate is in process to indexing databox. Wait the end of this indexing, before launch a new one. - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::populate: success message thesaurus::populate: success message - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:dialog:: export Export Candidats - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:dialog:: properties Properties - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:properties:: Mettre dans le stock @@ -13933,12 +13934,12 @@ It is possible to place several search areas thesaurus:termePorperties:termeId Id - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thumbnail validation Confirm thumbnail - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -13997,7 +13998,7 @@ It is possible to place several search areas validate Validate - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig actions/Tools/index.html.twig actions/Tools/index.html.twig diff --git a/resources/locales/messages.fr.xlf b/resources/locales/messages.fr.xlf index 6558965f96..2f2358e7a5 100644 --- a/resources/locales/messages.fr.xlf +++ b/resources/locales/messages.fr.xlf @@ -1,6 +1,6 @@ - +
    The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -112,8 +112,8 @@ %basket_length% documents %basket_length% documents mobile/lightbox/validate.html.twig - web/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig + web/lightbox/index.html.twig %countable% documents can not be modified. @@ -138,12 +138,12 @@ %docs_not_orderable% documents ne peuvent pas etre commandes %docs_not_orderable% documents ne peuvent être commandés - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig %docs_orderable% documents commandes %docs_orderable% documents commandés - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig %entry_length% documents @@ -378,17 +378,17 @@ (validation) a envoyer Rapport de validation à envoyer - web/lightbox/index.html.twig + web/lightbox/index.html.twig (validation) envoyee Rapport de validation envoyé - web/lightbox/index.html.twig + web/lightbox/index.html.twig (validation) session terminee Session terminée - web/lightbox/index.html.twig + web/lightbox/index.html.twig *Phraseanet Navigator* is a smartphone application that allow user to connect on this instance @@ -618,7 +618,7 @@ Accuse de reception indisponible, vous n'avez pas declare d'adresse email Accusé de réception indisponible; vous n'avez pas déclaré d'adresse e-mail - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Action Forbidden : You are not the publisher @@ -1543,10 +1543,10 @@ By checking this box, you accept %beginning_link% Terms of Use %end_link% En cochant cette case, vous acceptez les %beginning_link% conditions générales d'utilisation %end_link% - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig By default it is available for admins @@ -1705,7 +1705,7 @@ Certains champs sont obligatoires, veuillez les remplir Certains champs sont obligatoires, veuillez les compléter - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Ces informations sont directement fournies par la norme de metadonnees de ce champ : %norm_name% @@ -1770,7 +1770,7 @@ Civility Civilité - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Clear @@ -1813,7 +1813,7 @@ Codec Audio Codec audio web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig Codec Video @@ -2608,9 +2608,9 @@ Documents indisponibles Documents indisponibles web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Don't worry, You can modify your configuration later @@ -2986,7 +2986,7 @@ Entrez plusieurs adresses email en les separant par des points-virgules Entrez plusieurs adresses e-mail en les séparant par des points-virgules - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Entry removed from list @@ -3713,7 +3713,7 @@ Images par secondes Images par seconde web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig Imagette indisponible @@ -3734,8 +3734,8 @@ Include Business-fields in caption Inclure les champs métier dans la notice web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Incorrect please try again @@ -3916,9 +3916,9 @@ La sous resolution n'est pas disponible pour les documents suivants La sous-résolution n'est pas disponible pour les documents suivants - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig La taille maximale d'une video est de %duration% minutes. @@ -4915,9 +4915,9 @@ mobile/lightbox/index.html.twig mobile/lightbox/index.html.twig web/account/account.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox/IE6/validate.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Par %author% @@ -5538,7 +5538,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Recevoir un accuse de reception a %my_email% Demander un accusé de réception à transmettre à l'adresse %my_email% - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Rechercher dans un champ date @@ -6218,7 +6218,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Size Taille web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Download/prepare.html.twig @@ -6430,7 +6430,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Success Succès api/auth/native_app_access_token.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Successful install @@ -6463,7 +6463,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Controller/Admin/CollectionController.php Controller/Admin/CollectionController.php Controller/Admin/CollectionController.php - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig admin/collection/suggested_value.html.twig admin/collection/collection.html.twig web/admin/databases.html.twig @@ -6591,7 +6591,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Terms of Use Conditions générales d'utilisation Form/Login/PhraseaRegisterForm.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Terms of service @@ -6997,12 +6997,12 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Un document commande Un document commandé. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Un document ne peut etre commande Un document ne peut être commandé. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Unable to add file to Phraseanet @@ -7322,7 +7322,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis VALIDATION Validation - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/agreement_box.html.twig @@ -7355,9 +7355,9 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Validations mobile/lightbox/index.html.twig mobile/lightbox/index.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox/IE6/validate.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Validations received @@ -7429,13 +7429,13 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Voici vos paniers Paniers disponibles mobile/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Voici vos validations en cours Demandes de validations en cours mobile/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Votre adresse email @@ -7500,7 +7500,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Vous devez selectionner un type de sous definitions Vous devez sélectionner un type de sous-définitions - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Vous devez specifier une adresse email et un mot de passe valides @@ -7594,7 +7594,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Warning ! Attention ! - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Warning, this database is not empty @@ -7673,7 +7673,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Would you like to receive an e-mail when your download is ready ? Souhaitez-vous recevoir un e-mail quand votre téléchargement est prêt ? - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Would you like to reset rights before applying the template? @@ -7770,7 +7770,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis You can alternatively receive an email when the download is ready. Vous pouvez être informé par e-mail quand votre téléchargement est prêt. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You can choose only one record @@ -7785,7 +7785,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis You can not directly download more than %max_download% Mo ; time to package all documents is too long Vous ne pouvez pas télécharger directement plus de %max_download% Mo de données. Le temps nécessaire pour zipper tous les documents serait trop long. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You can not edit this story @@ -7881,7 +7881,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis You must agree to the Terms of Use to continue. Vous devez accepter les conditions générales d'utilisation pour poursuivre. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You must give a destination collection @@ -8037,7 +8037,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis action : exporter Exporter - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -8511,7 +8511,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Adresse Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8526,7 +8526,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Code postal Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8550,7 +8550,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis E-mail Event/Subscriber/RegistrationSubscriber.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/users.html.twig web/admin/connected-users.html.twig @@ -8562,7 +8562,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Fax Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8599,7 +8599,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Event/Subscriber/RegistrationSubscriber.php Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/connected-users.html.twig admin/user/registrations.html.twig @@ -8621,7 +8621,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Poste Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8632,7 +8632,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Event/Subscriber/RegistrationSubscriber.php Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8649,7 +8649,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Société Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/users.html.twig web/admin/connected-users.html.twig @@ -8665,7 +8665,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis admin::compte-utilisateur telephone Téléphone Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/connected-users.html.twig admin/user/registrations.html.twig @@ -8681,7 +8681,7 @@ Pour les utilisateurs authentifiés, la demande de validation est également dis Ville Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8778,7 +8778,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le admin::compte-utilisateur:sexe: madame Mme Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8786,7 +8786,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le admin::compte-utilisateur:sexe: mademoiselle Mlle Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8794,7 +8794,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le admin::compte-utilisateur:sexe: monsieur M. Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -9425,7 +9425,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le alert Alerte - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -9537,15 +9537,15 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le web/thesaurus/export-topics-dialog.html.twig web/thesaurus/new-term.html.twig web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/link-field-step2.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/reset-email.html.twig Bridge/Dailymotion/video_modify.html.twig Bridge/Dailymotion/video_modify.html.twig @@ -9568,8 +9568,8 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le boutton::chercher Chercher - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/prod/index.html.twig web/admin/users.html.twig @@ -9582,7 +9582,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le boutton::commander Commander - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::creer @@ -9610,13 +9610,13 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le boutton::envoyer Envoyer - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::essayer Essayer - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::exporter @@ -9630,7 +9630,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le web/thesaurus/export-topics.html.twig web/thesaurus/accept.html.twig web/thesaurus/accept.html.twig - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig web/thesaurus/link-field-step3.html.twig web/common/dialog_export.html.twig web/lightbox/sc_note.html.twig @@ -9778,14 +9778,14 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le boutton::telecharger Télécharger - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/lightbox/feed_options_box.html.twig web/lightbox/sc_options_box.html.twig boutton::telecharger tous les documents Tout télécharger - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -9808,8 +9808,8 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le web/thesaurus/export-topics-dialog.html.twig web/thesaurus/new-term.html.twig web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/index.html.twig web/thesaurus/link-field-step2.html.twig web/account/access.html.twig @@ -9966,12 +9966,12 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le commande::deadline Date limite - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig commande::utilisation prevue Utilisation prévue - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig prod/orders/order_item.html.twig @@ -10154,7 +10154,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le export:: FTP FTP web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export:: commande @@ -10165,7 +10165,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le export:: envoi par mail E-Mail web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export:: erreur : aucun document selectionne @@ -10181,7 +10181,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le export::export-email: email-invalid Email invalide - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::ftp: reglages manuels @@ -10191,7 +10191,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le export::mail: contenu du mail Texte - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::mail: destinataire @@ -10201,8 +10201,8 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le export::mail: fichiers joint Fichier(s) joint(s) - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::titre: nom original du document @@ -10214,6 +10214,11 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le Titre web/common/dialog_export.html.twig + + export:email:: acknowledgement info + export:email:: acknowledgement info + web/common/dialog_export.html.twig + failed to send mail Echec de l'envoi d'e-mail @@ -10462,12 +10467,12 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le lightbox::See_less_feedback Voir moins de validations - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::See_more_feedback Voir plus de Validations - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::list @@ -10478,61 +10483,61 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le lightbox::recaptitulatif Récapitulatif mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/agreement_box.html.twig web/lightbox/feed.html.twig lightbox::see_less_basket Voir moins de Paniers - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::see_more_basket Voir plus de paniers - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox:feedback:sendreport:warnwindows:cancel Annuler l'envoi et continuer la validation mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:message Récapitulatif des choix de la validation mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_approved Approuvés mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_rejected Refusés mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_unexpressed Non exprimés mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:title Résumé de la validation mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:validate Confirmer l'envoi du rapport mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig login:: Changer mon adresse email @@ -10689,7 +10694,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le no image selected Aucune image sélectionnée - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -10701,7 +10706,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le notice Notice - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -11179,7 +11184,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le phraseanet:: language Langue - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig phraseanet:: password @@ -11202,7 +11207,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le phraseanet:: prereglages Préréglages - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig phraseanet:: presse-papier @@ -11239,7 +11244,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le web/thesaurus/load-thesaurus.html.twig web/thesaurus/load-thesaurus.html.twig web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/index.html.twig web/prod/tab_headers.html.twig prod/actions/edit_default.html.twig @@ -11710,7 +11715,7 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le processing En cours... - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -11885,6 +11890,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles prod::export: send mail notification Demande d'envois d'email soumise + web/lightbox/validate.html.twig web/prod/index.html.twig @@ -12163,7 +12169,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles prod:videoeditor:subtitleRequestTab:: submit Soumettre la demande - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:: title @@ -12173,22 +12179,22 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles prod:videoeditor:subtitleRequestTab:label:: Kind Type - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Language destination Langue de destination des sous-titres - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Provider Fournisseur - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Source Audio language Langue de la source audio - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleTab:: title @@ -12198,47 +12204,47 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles prod:videoeditor:subtitletab:: Caption placeholder Sous-titre - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: End time Fin - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: No caption message Pas de sous-titres définis pour cette langue - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: Show for Durée - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: Start time Début - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: add caption Ajouter un sous-titre - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: copy to clipboard Copier dans le presse papier - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: save Sauvegarder - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: work on Choisir une langue a éditer - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:message:: error @@ -13023,7 +13029,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles screenshot video Capture d'écran vidéo - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig select at least one user @@ -13399,12 +13405,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus: Populate title Indéxation - web/thesaurus/thesaurus.html.twig - - - thesaurus:: %hits% reponses retournees - %hits% enregistrements retournés - web/thesaurus/properties.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: A cet emplacement du thesaurus , un candidat du champ %cfield% ne peut etre accepte @@ -13429,7 +13430,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: Confirmer la suppression du terme %s Confirmer la suppression du terme "%s" - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thesaurus:: Editer le thesaurus @@ -13440,7 +13441,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: Importer Importer web/thesaurus/import-dialog.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Lier la branche de thesaurus @@ -13452,7 +13453,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: Lier la branche de thesaurus au champ Lier la branche de thesaurus au champ web/thesaurus/link-field-step1.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Lier la branche de thesaurus au champ %branch% @@ -13463,31 +13464,31 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: Nouveau synonyme Nouveau synonyme web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Nouveau terme Nouveau terme - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Nouveau terme specifique Nouveau terme spécifique web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Proprietes Propriétés - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Vous n'avez acces a aucune base @@ -13498,12 +13499,12 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: accepter... Accepter web/thesaurus/accept.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: afficher les termes refuses Afficher les termes refusés - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: ce champ doit etre lie au thesaurus. La reindexation de la base est necessaire @@ -13529,22 +13530,22 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: commence par commence par - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: confirm populate Lancer une indexation de l'intégralité de la base - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: contexte Contexte - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: contient contient - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: corbeille @@ -13556,7 +13557,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: deplacer le terme dans la corbeille ? Déplacer le terme dans le stock ? - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: enregistrement de la liste modifiee des mots candidats. @@ -13586,7 +13587,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: est egal a est égal à - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: example @@ -13614,14 +13615,14 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles web/thesaurus/export-text-dialog.html.twig web/thesaurus/export-text-dialog.html.twig web/thesaurus/export-text.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: export en topics Thèmes web/thesaurus/export-topics.html.twig web/thesaurus/export-topics-dialog.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: exporter @@ -13676,7 +13677,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: le terme Le terme - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: le terme %term% avec contexte %context% @@ -13701,12 +13702,12 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: onglet stock Candidats - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: onglet thesaurus Thésaurus - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: options d'export : @@ -13721,7 +13722,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: populate button Indexation - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: presentation @@ -13818,17 +13819,17 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:: synonyme Synonyme - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: synonymes Synonymes - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thesaurus:: terme Terme - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: tout deployer - refermable @@ -13848,85 +13849,85 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus::menu: Mettre dans le stock Déplacer dans le stock - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: Nouveau synonyme Nouveau synonyme - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: Nouveau terme Nouveau terme - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: accepter Accepter - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: chercher Chercher - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: export topics Exporter comme thèmes - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: exporter Exporter - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: importer Importer - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: lier au champ Lier au champ - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: proprietes Propriétés - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: refuser Refuser - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: supprimer Supprimer - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::populate: Warning populate is in process to indexing databox Attention une indexation de la base est deja en cours. Il est nécéssaire d'attendre la fin de cette indexation pour en relancer une nouvelle. - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::populate: success message thesaurus::populate: success message - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:dialog:: export Export des termes candidats - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:dialog:: properties Propriétés - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:properties:: Mettre dans le stock @@ -13936,12 +13937,12 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles thesaurus:termePorperties:termeId ID - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thumbnail validation Validation de la vignette - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -14000,7 +14001,7 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles validate Valider - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig actions/Tools/index.html.twig actions/Tools/index.html.twig diff --git a/resources/locales/messages.nl.xlf b/resources/locales/messages.nl.xlf index eb96bf8f21..072c04a47a 100644 --- a/resources/locales/messages.nl.xlf +++ b/resources/locales/messages.nl.xlf @@ -1,6 +1,6 @@ - +
    The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. @@ -116,8 +116,8 @@ %basket_length% documents %basket_length% documenten mobile/lightbox/validate.html.twig - web/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig + web/lightbox/index.html.twig %countable% documents can not be modified. @@ -142,12 +142,12 @@ %docs_not_orderable% documents ne peuvent pas etre commandes %docs_not_orderable% documenten kunnen niet worden besteld - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig %docs_orderable% documents commandes %docs_orderable% documenten besteld - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig %entry_length% documents @@ -382,17 +382,17 @@ (validation) a envoyer te versturen - web/lightbox/index.html.twig + web/lightbox/index.html.twig (validation) envoyee verstuurd - web/lightbox/index.html.twig + web/lightbox/index.html.twig (validation) session terminee sessie beïndigd - web/lightbox/index.html.twig + web/lightbox/index.html.twig *Phraseanet Navigator* is a smartphone application that allow user to connect on this instance @@ -622,7 +622,7 @@ Accuse de reception indisponible, vous n'avez pas declare d'adresse email Ontvangstbevestiging niet beschikbaar is, u hebt geen emailadres opgegeven - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Action Forbidden : You are not the publisher @@ -1548,10 +1548,10 @@ By checking this box, you accept %beginning_link% Terms of Use %end_link% Door deze optie aan te klikken aanvaardt u %beginning_link% Gebruiksvoorwaarden %end_link% - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig By default it is available for admins @@ -1710,7 +1710,7 @@ Certains champs sont obligatoires, veuillez les remplir Sommige velden zijn verplicht, wilt u ze invullen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Ces informations sont directement fournies par la norme de metadonnees de ce champ : %norm_name% @@ -1776,7 +1776,7 @@ Civility Beleefdheid - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Clear @@ -1819,7 +1819,7 @@ Codec Audio Audio Codec web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig Codec Video @@ -2615,9 +2615,9 @@ Documents indisponibles Documenten niet beschikbaar web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Don't worry, You can modify your configuration later @@ -2996,7 +2996,7 @@ Entrez plusieurs adresses email en les separant par des points-virgules Geef meerdere email adressen op door ze te scheiden met een punt coma - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Entry removed from list @@ -3723,7 +3723,7 @@ Images par secondes Beelden per seconde web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig Imagette indisponible @@ -3744,8 +3744,8 @@ Include Business-fields in caption Business-fields opnemen in caption web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Incorrect please try again @@ -3926,9 +3926,9 @@ La sous resolution n'est pas disponible pour les documents suivants De onder resolutie is niet beschikbaar voor de volgende documenten - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig La taille maximale d'une video est de %duration% minutes. @@ -4925,9 +4925,9 @@ mobile/lightbox/index.html.twig mobile/lightbox/index.html.twig web/account/account.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox/IE6/validate.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Par %author% @@ -5546,7 +5546,7 @@ Recevoir un accuse de reception a %my_email% Ontvangen van een bevestigingsmail van ontvangst van %my_email% - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Rechercher dans un champ date @@ -6226,7 +6226,7 @@ Size Grootte web/common/technical_datas.html.twig - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Download/prepare.html.twig @@ -6438,7 +6438,7 @@ Success Gelukt api/auth/native_app_access_token.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Successful install @@ -6471,7 +6471,7 @@ Controller/Admin/CollectionController.php Controller/Admin/CollectionController.php Controller/Admin/CollectionController.php - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig admin/collection/suggested_value.html.twig admin/collection/collection.html.twig web/admin/databases.html.twig @@ -6599,7 +6599,7 @@ Terms of Use Gebruiksvoorwaarden Form/Login/PhraseaRegisterForm.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Terms of service @@ -7005,12 +7005,12 @@ Un document commande Een document bestelling - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Un document ne peut etre commande Eén document kan niet worden besteld - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Unable to add file to Phraseanet @@ -7330,7 +7330,7 @@ VALIDATION VALIDATIE - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/agreement_box.html.twig @@ -7363,9 +7363,9 @@ Controles mobile/lightbox/index.html.twig mobile/lightbox/index.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox/IE6/validate.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Validations received @@ -7437,13 +7437,13 @@ Voici vos paniers Uw mandjes mobile/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Voici vos validations en cours Een controle in proces mobile/lightbox/index.html.twig - web/lightbox/index.html.twig + web/lightbox/index.html.twig Votre adresse email @@ -7508,7 +7508,7 @@ Vous devez selectionner un type de sous definitions U moet een type thumbnail selecteren - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Vous devez specifier une adresse email et un mot de passe valides @@ -7602,7 +7602,7 @@ Warning ! Waarschuwing ! - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Warning, this database is not empty @@ -7681,7 +7681,7 @@ Would you like to receive an e-mail when your download is ready ? Wilt u een email ontvangen wanneer de download klaar is ? - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig Would you like to reset rights before applying the template? @@ -7778,7 +7778,7 @@ You can alternatively receive an email when the download is ready. Als alternatief kunt u een email ontvangen wanneer de download klaar is. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You can choose only one record @@ -7793,7 +7793,7 @@ You can not directly download more than %max_download% Mo ; time to package all documents is too long U kan niet meer dan %max_download% Mb downloaded ; tijd om alle documenten compresseren is te lang - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You can not edit this story @@ -7889,7 +7889,7 @@ You must agree to the Terms of Use to continue. U moet de gebruiksvoorwaarden aanvaarden. - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig You must give a destination collection @@ -8045,7 +8045,7 @@ action : exporter Exporteer - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -8519,7 +8519,7 @@ Adres Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8534,7 +8534,7 @@ Postcode Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8558,7 +8558,7 @@ Email Event/Subscriber/RegistrationSubscriber.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/users.html.twig web/admin/connected-users.html.twig @@ -8570,7 +8570,7 @@ Fax Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8607,7 +8607,7 @@ Event/Subscriber/RegistrationSubscriber.php Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/connected-users.html.twig admin/user/registrations.html.twig @@ -8629,7 +8629,7 @@ Postcode Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8640,7 +8640,7 @@ Event/Subscriber/RegistrationSubscriber.php Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig admin/user/registrations.html.twig web/admin/editusers.html.twig @@ -8657,7 +8657,7 @@ Bedrijf Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/users.html.twig web/admin/connected-users.html.twig @@ -8673,7 +8673,7 @@ admin::compte-utilisateur telephone Telefoon Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/connected-users.html.twig admin/user/registrations.html.twig @@ -8689,7 +8689,7 @@ Star Core/Provider/RegistrationServiceProvider.php Controller/Admin/UserController.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8785,7 +8785,7 @@ admin::compte-utilisateur:sexe: madame Mevrouw Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8793,7 +8793,7 @@ admin::compte-utilisateur:sexe: mademoiselle Jufrouw Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -8801,7 +8801,7 @@ admin::compte-utilisateur:sexe: monsieur De heer Core/Provider/RegistrationServiceProvider.php - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/account.html.twig web/admin/editusers.html.twig @@ -9432,7 +9432,7 @@ alert alert - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -9544,15 +9544,15 @@ web/thesaurus/export-topics-dialog.html.twig web/thesaurus/new-term.html.twig web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/link-field-step2.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/account/reset-email.html.twig Bridge/Dailymotion/video_modify.html.twig Bridge/Dailymotion/video_modify.html.twig @@ -9575,8 +9575,8 @@ boutton::chercher zoeken - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/prod/index.html.twig web/admin/users.html.twig @@ -9589,7 +9589,7 @@ boutton::commander Bestellen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::creer @@ -9617,13 +9617,13 @@ boutton::envoyer Verzenden - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::essayer Proberen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig boutton::exporter @@ -9637,7 +9637,7 @@ web/thesaurus/export-topics.html.twig web/thesaurus/accept.html.twig web/thesaurus/accept.html.twig - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig web/thesaurus/link-field-step3.html.twig web/common/dialog_export.html.twig web/lightbox/sc_note.html.twig @@ -9785,14 +9785,14 @@ boutton::telecharger Downloaden - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig web/lightbox/feed_options_box.html.twig web/lightbox/sc_options_box.html.twig boutton::telecharger tous les documents Alle documenten downloaden - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -9815,8 +9815,8 @@ web/thesaurus/export-topics-dialog.html.twig web/thesaurus/new-term.html.twig web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/index.html.twig web/thesaurus/link-field-step2.html.twig web/account/access.html.twig @@ -9973,12 +9973,12 @@ commande::deadline Deadline - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig commande::utilisation prevue Utilisation gepland - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig prod/orders/order_item.html.twig @@ -10161,7 +10161,7 @@ export:: FTP FTP web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export:: commande @@ -10172,7 +10172,7 @@ export:: envoi par mail Verstuur per mail web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export:: erreur : aucun document selectionne @@ -10188,7 +10188,7 @@ export::export-email: email-invalid export::export-email: email-invalid - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::ftp: reglages manuels @@ -10198,7 +10198,7 @@ export::mail: contenu du mail Inhoud van de mail - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::mail: destinataire @@ -10208,8 +10208,8 @@ export::mail: fichiers joint Toegevoegde bestanden - web/common/dialog_export.html.twig - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig + web/common/dialog_export.html.twig export::titre: nom original du document @@ -10221,6 +10221,11 @@ Titel van het document web/common/dialog_export.html.twig + + export:email:: acknowledgement info + export:email:: acknowledgement info + web/common/dialog_export.html.twig + failed to send mail email versturen niet gelukt @@ -10469,12 +10474,12 @@ lightbox::See_less_feedback lightbox::See_less_feedback - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::See_more_feedback lightbox::See_more_feedback - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::list @@ -10485,61 +10490,61 @@ lightbox::recaptitulatif Beknopt mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/agreement_box.html.twig web/lightbox/feed.html.twig lightbox::see_less_basket lightbox::see_less_basket - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox::see_more_basket lightbox::see_more_basket - web/lightbox/index.html.twig + web/lightbox/index.html.twig lightbox:feedback:sendreport:warnwindows:cancel lightbox:feedback:sendreport:warnwindows:cancel mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:message lightbox:feedback:sendreport:warnwindows:message mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_approved lightbox:feedback:sendreport:warnwindows:record_approved mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_rejected lightbox:feedback:sendreport:warnwindows:record_rejected mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:record_unexpressed lightbox:feedback:sendreport:warnwindows:record_unexpressed mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:title lightbox:feedback:sendreport:warnwindows:title mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig lightbox:feedback:sendreport:warnwindows:validate lightbox:feedback:sendreport:warnwindows:validate mobile/lightbox/validate.html.twig - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig login:: Changer mon adresse email @@ -10696,7 +10701,7 @@ no image selected geen beeld geselecteerd - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -10708,7 +10713,7 @@ notice mededeling - web/lightbox/validate.html.twig + web/lightbox/validate.html.twig web/lightbox/feed.html.twig lightbox/IE6/validate.html.twig lightbox/IE6/feed.html.twig @@ -11186,7 +11191,7 @@ phraseanet:: language Taal - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig phraseanet:: password @@ -11209,7 +11214,7 @@ phraseanet:: prereglages Voorinstellingen - web/common/dialog_export.html.twig + web/common/dialog_export.html.twig phraseanet:: presse-papier @@ -11246,7 +11251,7 @@ web/thesaurus/load-thesaurus.html.twig web/thesaurus/load-thesaurus.html.twig web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig web/thesaurus/index.html.twig web/prod/tab_headers.html.twig prod/actions/edit_default.html.twig @@ -11717,7 +11722,7 @@ processing verwerken - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -11889,6 +11894,7 @@ prod::export: send mail notification prod::export: send mail notification + web/lightbox/validate.html.twig web/prod/index.html.twig @@ -12161,7 +12167,7 @@ prod:videoeditor:subtitleRequestTab:: submit prod:videoeditor:subtitleRequestTab:: submit - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:: title @@ -12171,22 +12177,22 @@ prod:videoeditor:subtitleRequestTab:label:: Kind prod:videoeditor:subtitleRequestTab:label:: Kind - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Language destination prod:videoeditor:subtitleRequestTab:label:: Language destination - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Provider prod:videoeditor:subtitleRequestTab:label:: Provider - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleRequestTab:label:: Source Audio language prod:videoeditor:subtitleRequestTab:label:: Source Audio language - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitleTab:: title @@ -12196,47 +12202,47 @@ prod:videoeditor:subtitletab:: Caption placeholder prod:videoeditor:subtitletab:: Caption placeholder - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: End time prod:videoeditor:subtitletab:: End time - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: No caption message prod:videoeditor:subtitletab:: No caption message - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: Show for prod:videoeditor:subtitletab:: Show for - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: Start time prod:videoeditor:subtitletab:: Start time - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: add caption prod:videoeditor:subtitletab:: add caption - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: copy to clipboard prod:videoeditor:subtitletab:: copy to clipboard - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: save prod:videoeditor:subtitletab:: save - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:: work on prod:videoeditor:subtitletab:: work on - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig prod:videoeditor:subtitletab:message:: error @@ -13021,7 +13027,7 @@ screenshot video schermafbeelding video - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig select at least one user @@ -13397,12 +13403,7 @@ thesaurus: Populate title thesaurus: Populate title - web/thesaurus/thesaurus.html.twig - - - thesaurus:: %hits% reponses retournees - thesaurus:: %hits% gekregen antwoorden - web/thesaurus/properties.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: A cet emplacement du thesaurus , un candidat du champ %cfield% ne peut etre accepte @@ -13427,7 +13428,7 @@ thesaurus:: Confirmer la suppression du terme %s Bevestig verwijderinng van de term %s - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thesaurus:: Editer le thesaurus @@ -13438,7 +13439,7 @@ thesaurus:: Importer Importeren web/thesaurus/import-dialog.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Lier la branche de thesaurus @@ -13450,7 +13451,7 @@ thesaurus:: Lier la branche de thesaurus au champ Link de tak van de thesaurus aan veld web/thesaurus/link-field-step1.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Lier la branche de thesaurus au champ %branch% @@ -13461,31 +13462,31 @@ thesaurus:: Nouveau synonyme Nieuw synoniem web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Nouveau terme Nieuwe term - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Nouveau terme specifique Nieuwe specifieke term web/thesaurus/new-term.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Proprietes Eigenschappen - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: Vous n'avez acces a aucune base @@ -13496,12 +13497,12 @@ thesaurus:: accepter... Aanvaarden... web/thesaurus/accept.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: afficher les termes refuses toon de geweigerde termen - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: ce champ doit etre lie au thesaurus. La reindexation de la base est necessaire @@ -13527,22 +13528,22 @@ thesaurus:: commence par beginnen met - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: confirm populate thesaurus:: confirm populate - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: contexte Inhoud - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: contient bevat - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: corbeille @@ -13554,7 +13555,7 @@ thesaurus:: deplacer le terme dans la corbeille ? De term in de prullemand plaatsen ? - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: enregistrement de la liste modifiee des mots candidats. @@ -13584,7 +13585,7 @@ thesaurus:: est egal a thesaurus:: est egal a - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: example @@ -13612,14 +13613,14 @@ web/thesaurus/export-text-dialog.html.twig web/thesaurus/export-text-dialog.html.twig web/thesaurus/export-text.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: export en topics Exporteer in topics web/thesaurus/export-topics.html.twig web/thesaurus/export-topics-dialog.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: exporter @@ -13674,7 +13675,7 @@ thesaurus:: le terme De term - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: le terme %term% avec contexte %context% @@ -13699,12 +13700,12 @@ thesaurus:: onglet stock stock tabblad - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: onglet thesaurus thesaurus tabblad - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: options d'export : @@ -13719,7 +13720,7 @@ thesaurus:: populate button thesaurus:: populate button - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: presentation @@ -13816,17 +13817,17 @@ thesaurus:: synonyme Synoniem - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: synonymes Synoniemen - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thesaurus:: terme Term - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:: tout deployer - refermable @@ -13846,85 +13847,85 @@ thesaurus::menu: Mettre dans le stock thesaurus::menu: Mettre dans le stock - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: Nouveau synonyme Niew synoniem - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: Nouveau terme Nieuwe term - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: accepter aanvaarden - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: chercher zoeken - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: export topics exporteer topics - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: exporter exporteren - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: importer importeren - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: lier au champ linken aan veld - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: proprietes eigenschappen - web/thesaurus/thesaurus.html.twig - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: refuser weigeren - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::menu: supprimer verwijderen - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::populate: Warning populate is in process to indexing databox thesaurus::populate: Warning populate is in process to indexing databox - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus::populate: success message thesaurus::populate: success message - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:dialog:: export thesaurus:dialog:: export - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:dialog:: properties thesaurus:dialog:: properties - web/thesaurus/thesaurus.html.twig + web/thesaurus/thesaurus.html.twig thesaurus:properties:: Mettre dans le stock @@ -13934,12 +13935,12 @@ thesaurus:termePorperties:termeId thesaurus:termePorperties:termeId - web/thesaurus/properties.html.twig + web/thesaurus/properties.html.twig thumbnail validation thumbnail goedkeuring - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig @@ -13998,7 +13999,7 @@ validate OK - actions/Tools/videoEditor.html.twig + actions/Tools/videoEditor.html.twig actions/Tools/index.html.twig actions/Tools/index.html.twig actions/Tools/index.html.twig diff --git a/resources/locales/validators.de.xlf b/resources/locales/validators.de.xlf index a90ceda081..b45769f4ae 100644 --- a/resources/locales/validators.de.xlf +++ b/resources/locales/validators.de.xlf @@ -1,6 +1,6 @@ - +
    The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.en.xlf b/resources/locales/validators.en.xlf index f5103bffa8..d32c82b34e 100644 --- a/resources/locales/validators.en.xlf +++ b/resources/locales/validators.en.xlf @@ -1,6 +1,6 @@ - +
    The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.fr.xlf b/resources/locales/validators.fr.xlf index 5cef6366ca..c098c5a095 100644 --- a/resources/locales/validators.fr.xlf +++ b/resources/locales/validators.fr.xlf @@ -1,6 +1,6 @@ - +
    The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/resources/locales/validators.nl.xlf b/resources/locales/validators.nl.xlf index 87c4bb130d..827cd96c29 100644 --- a/resources/locales/validators.nl.xlf +++ b/resources/locales/validators.nl.xlf @@ -1,6 +1,6 @@ - +
    The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message. diff --git a/templates/web/common/dialog_export.html.twig b/templates/web/common/dialog_export.html.twig index d7862af917..4200c98bdf 100644 --- a/templates/web/common/dialog_export.html.twig +++ b/templates/web/common/dialog_export.html.twig @@ -176,8 +176,12 @@
    - {{ 'export::mail: destinataire' | trans }} + + {{ 'export::mail: destinataire' | trans }} +
    + {{ 'Entrez plusieurs adresses email en les separant par des points-virgules' | trans }} +
    {% set my_email = app.getAuthenticatedUser().getEmail() %}
    {% if my_email != '' %} @@ -191,7 +195,7 @@ {% endif %} - {{ 'Entrez plusieurs adresses email en les separant par des points-virgules' | trans }} + {{ 'export:email:: acknowledgement info' | trans }}
    From 9b0c5634d453e48e0cf76ad25f6fb30eddfe8cab Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Wed, 8 Jul 2020 18:32:01 +0400 Subject: [PATCH 153/165] PHRAS-3169 video subtitle : add number on saving --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c255568100..4d4e4caab2 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.254-d", + "phraseanet-production-client": "0.34.255-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/yarn.lock b/yarn.lock index e716aea776..30158d604e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7678,10 +7678,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.254-d: - version "0.34.254-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.254-d.tgz#52a798b8c1f9994cf677db6ad6aeb9909c811f80" - integrity sha512-EvTbTbDbdoWGfqZtqJGEl6xeE6vyk43IF5eVMCy7c6qkaYjTuyiTqvI8eMXSJ2gKvsEidaa6AsHigUL9lKuVcA== +phraseanet-production-client@0.34.255-d: + version "0.34.255-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.255-d.tgz#40e9c97ebb5fd77dd117f2d766126a94437b63ff" + integrity sha512-UQpkjhkKLPF63107y1nG+cd1wxUq2jAmbO58yrp3tJLsfQt1nGAkUfvZb9VEJ3/zbvKcjRmjnHHFDa08RcViww== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From 53397bb3453e9958740c77f9da12dcbff16719f2 Mon Sep 17 00:00:00 2001 From: aynsix Date: Wed, 8 Jul 2020 18:36:39 +0300 Subject: [PATCH 154/165] add an webvtt header description --- lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php b/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php index 361ab5b5ad..666c8e3c31 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php @@ -163,6 +163,8 @@ class SubtitleWorker implements WorkerInterface $transcriptContent = $response->getBody()->getContents(); + $transcriptContent = preg_replace('WEBVTT', 'WEBVTT - with cue identifier', $transcriptContent, 1); + $metadatas[0] = [ 'meta_struct_id' => (int)$payload['metaStructureId'], 'meta_id' => '', From 2654037910d8b96bbd8fd89a769bb1a1aeb60a2b Mon Sep 17 00:00:00 2001 From: aynsix Date: Wed, 8 Jul 2020 19:00:23 +0300 Subject: [PATCH 155/165] fix delimiter --- lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php b/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php index 666c8e3c31..e9d66a2c66 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php @@ -163,7 +163,7 @@ class SubtitleWorker implements WorkerInterface $transcriptContent = $response->getBody()->getContents(); - $transcriptContent = preg_replace('WEBVTT', 'WEBVTT - with cue identifier', $transcriptContent, 1); + $transcriptContent = preg_replace('/WEBVTT/', 'WEBVTT - with cue identifier', $transcriptContent, 1); $metadatas[0] = [ 'meta_struct_id' => (int)$payload['metaStructureId'], From 936e3b704c5c257a5bb659b24993f7e22510761e Mon Sep 17 00:00:00 2001 From: aynsix Date: Wed, 8 Jul 2020 19:15:45 +0300 Subject: [PATCH 156/165] add ginger conf in conf.d --- lib/conf.d/configuration.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/conf.d/configuration.yml b/lib/conf.d/configuration.yml index 4013f8a44e..fd59be26f8 100644 --- a/lib/conf.d/configuration.yml +++ b/lib/conf.d/configuration.yml @@ -319,5 +319,15 @@ workers: user: '' password: '' vhost: / + +externalservice: + ginger: + AutoSubtitling: + service_base_url: https://base.uri + token: 39c6011d + transcript_format: text/vtt + subdef_source: preview + + Console_logger_enabled_environments: [test] From 8ca946be9373bf15b1d636a604e6ce0fed6ec990 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Wed, 8 Jul 2020 22:42:01 +0200 Subject: [PATCH 157/165] PHRAS-3173 change xpdf in favor of poppler-utils --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a730e9dd2b..738031c4ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,7 +37,7 @@ RUN echo "deb http://deb.debian.org/debian stretch main non-free" > /etc/apt/sou swftools \ unoconv \ unzip \ - xpdf \ + poppler-utils \ libreoffice-base-core \ libreoffice-impress \ libreoffice-calc \ From 08f63994bd9aad8e27f7438b2b92a39d001a34cd Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 9 Jul 2020 14:30:50 +0400 Subject: [PATCH 158/165] PHRAS-3169 resize video on automatic subtitle tab --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4d4e4caab2..dae70c0368 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "normalize-css": "^2.1.0", "npm": "^6.0.0", "npm-modernizr": "^2.8.3", - "phraseanet-production-client": "0.34.255-d", + "phraseanet-production-client": "0.34.256-d", "requirejs": "^2.3.5", "tinymce": "^4.0.28", "underscore": "^1.8.3", diff --git a/yarn.lock b/yarn.lock index 30158d604e..2a99f187cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7678,10 +7678,10 @@ phraseanet-common@^0.4.5-d: js-cookie "^2.1.0" pym.js "^1.3.1" -phraseanet-production-client@0.34.255-d: - version "0.34.255-d" - resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.255-d.tgz#40e9c97ebb5fd77dd117f2d766126a94437b63ff" - integrity sha512-UQpkjhkKLPF63107y1nG+cd1wxUq2jAmbO58yrp3tJLsfQt1nGAkUfvZb9VEJ3/zbvKcjRmjnHHFDa08RcViww== +phraseanet-production-client@0.34.256-d: + version "0.34.256-d" + resolved "https://registry.yarnpkg.com/phraseanet-production-client/-/phraseanet-production-client-0.34.256-d.tgz#93a6b103ba38fc78d2b7687fec47928e2c46f363" + integrity sha512-cPHofONltBWs6IUOPEsQ02gSN+7HZv1hy9DZ98UPGpqkJG0D7gZLuNxiEVq/OFQFyYDCBTemNm/+BCRm6Abr7A== dependencies: "@mapbox/mapbox-gl-language" "^0.9.2" "@turf/turf" "^5.1.6" From a040a3af5a560693c2229b57d3ccdd7d8fae751b Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 9 Jul 2020 16:13:56 +0300 Subject: [PATCH 159/165] fix databoxID --- templates/web/prod/actions/Tools/videoEditor.html.twig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index 13283d5812..4d1b3b0ca6 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -363,8 +363,8 @@ url: '/prod/tools/auto-subtitle/', dataType: 'json', data: { - databox_id: {{ record.get_base_id }}, - record_id: {{ record.get_record_id }}, + databox_id: {{ record.getDataboxId }}, + record_id: {{ record.getRecordId }}, meta_struct_id: $('#subtitle_language_source').val(), subtitle_language_source: $('#subtitle_language_source option:selected').text() }, From b2c4472a40e4bfcca7ad4fe3f4c1a80debb9f5fc Mon Sep 17 00:00:00 2001 From: Harrys Ravalomanana Date: Thu, 9 Jul 2020 18:46:34 +0400 Subject: [PATCH 160/165] PHRAS-3177 Add request status --- .../web/prod/actions/Tools/videoEditor.html.twig | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index 4d1b3b0ca6..b9920c7fb2 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -236,9 +236,7 @@

    @@ -252,9 +250,9 @@

    @@ -262,6 +260,9 @@
    +

    + {{ "prod:videoeditor:subtitleRequestTab:: Request in process" | trans }} +

    @@ -370,6 +371,7 @@ }, success: function success(data) { console.log(data); + $('#request-status').removeClass('hide'); } }); }); From 838a6e1499000abcee1d43aa85e648b04c4640e7 Mon Sep 17 00:00:00 2001 From: Alexandre BRACH Date: Thu, 9 Jul 2020 17:43:36 +0200 Subject: [PATCH 161/165] use PHRASEANET_TRUSTED_PROXY env var --- docker/phraseanet/entrypoint.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docker/phraseanet/entrypoint.sh b/docker/phraseanet/entrypoint.sh index 820023455e..24fcf17661 100755 --- a/docker/phraseanet/entrypoint.sh +++ b/docker/phraseanet/entrypoint.sh @@ -31,11 +31,14 @@ if [ -f "$FILE" ]; then bin/setup system:config set registry.email.smtp-password $PHRASEANET_SMTP_PASSWORD bin/setup system:config set registry.email.emitter-email $PHRASEANET_EMITTER_EMAIL bin/setup system:config set registry.email.prefix $PHRASEANET_MAIL_OBJECT_PREFIX + if [[ -n $PHRASEANET_TRUSTED_PROXY ]]; then + bin/setup system:config add trusted-proxies $PHRASEANET_TRUSTED_PROXY + fi fi if [[ -n ${PHRASEANET_ADMIN_ACCOUNT_ID} && $PHRASEANET_ADMIN_ACCOUNT_ID =~ ^[0-9]+$ ]]; then bin/console user:password --user_id=$PHRASEANET_ADMIN_ACCOUNT_ID --password $PHRASEANET_ADMIN_ACCOUNT_PASSWORD -y fi - + else echo "$FILE doesn't exist, entering setup..." runuser app -c docker/phraseanet/auto-install.sh @@ -55,7 +58,7 @@ chown -R app:app \ datas \ tmp \ logs \ - www + www if [ -d "plugins/" ];then chown -R app:app plugins; From 02227fd019919a955544c536aecc482c698d5a35 Mon Sep 17 00:00:00 2001 From: Nicolas Maillat Date: Thu, 9 Jul 2020 23:49:58 +0000 Subject: [PATCH 162/165] Translated using Weblate (English) Currently translated at 99.2% (2579 of 2599 strings) --- resources/locales/messages.en.xlf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/locales/messages.en.xlf b/resources/locales/messages.en.xlf index 786f3028fa..f09a7f3da3 100644 --- a/resources/locales/messages.en.xlf +++ b/resources/locales/messages.en.xlf @@ -1,4 +1,4 @@ - +
    @@ -7,8 +7,8 @@
    - - + + Form/Login/PhraseaAuthenticationForm.php Form/Configuration/EmailFormType.php @@ -10214,9 +10214,9 @@ Title web/common/dialog_export.html.twig - + export:email:: acknowledgement info - export:email:: acknowledgement info + Acknowledgment works only if the recipient's server has activated this function. web/common/dialog_export.html.twig @@ -13926,9 +13926,9 @@ It is possible to place several search areas Properties web/thesaurus/thesaurus.html.twig - + thesaurus:properties:: Mettre dans le stock - thesaurus:properties:: Mettre dans le stock + -> Stock web/thesaurus/properties.html.twig From 2b8581d2269e280413d7ecc2f6dd9d6a5c9fb5b7 Mon Sep 17 00:00:00 2001 From: Nicolas Maillat Date: Thu, 9 Jul 2020 23:46:37 +0000 Subject: [PATCH 163/165] Translated using Weblate (French) Currently translated at 99.1% (2577 of 2599 strings) --- resources/locales/messages.fr.xlf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/locales/messages.fr.xlf b/resources/locales/messages.fr.xlf index 2f2358e7a5..af3c467592 100644 --- a/resources/locales/messages.fr.xlf +++ b/resources/locales/messages.fr.xlf @@ -1,4 +1,4 @@ - +
    @@ -7,8 +7,8 @@
    - - + + Form/Login/PhraseaAuthenticationForm.php Form/Configuration/EmailFormType.php @@ -10214,9 +10214,9 @@ Si vous recevez cet e-mail sans l'avoir sollicité, merci de l'ignorer ou de le Titre web/common/dialog_export.html.twig
    - + export:email:: acknowledgement info - export:email:: acknowledgement info + Les accusé reception fonctionne que si le serveur du destinataire a activé cette fonction. web/common/dialog_export.html.twig @@ -13929,9 +13929,9 @@ Attention: les valeurs actuellement en place seront écrasées par ces nouvelles Propriétés web/thesaurus/thesaurus.html.twig - + thesaurus:properties:: Mettre dans le stock - thesaurus:properties:: Mettre dans le stock + -> Stock web/thesaurus/properties.html.twig From 34b614d30d0bd23d1790efa13dedd0217b7fee0a Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 16 Jul 2020 21:31:59 +0300 Subject: [PATCH 164/165] add translate for ginga --- .../Controller/Prod/ToolsController.php | 9 +- .../Event/Record/RecordAutoSubtitleEvent.php | 35 ++++- .../Provider/AlchemyWorkerServiceProvider.php | 4 +- .../Subscriber/SubtitleSubscriber.php | 12 +- .../WorkerManager/Worker/SubtitleWorker.php | 138 +++++++++++++++--- .../prod/actions/Tools/videoEditor.html.twig | 6 +- 6 files changed, 168 insertions(+), 36 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php index 55c067b17b..af30331807 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/ToolsController.php @@ -468,7 +468,14 @@ class ToolsController extends Controller $this->dispatch( PhraseaEvents::RECORD_AUTO_SUBTITLE, - new RecordAutoSubtitleEvent($record, $permalinkUrl, $request->request->get("subtitle_language_source"), $request->request->get("meta_struct_id")) + new RecordAutoSubtitleEvent( + $record, + $permalinkUrl, + $request->request->get("subtitle_language_source"), + $request->request->get("meta_struct_id_source"), + $request->request->get("subtitle_language_destination"), + $request->request->get("meta_struct_id_destination") + ) ); return $this->app->json(["status" => "dispatch"]); diff --git a/lib/Alchemy/Phrasea/Core/Event/Record/RecordAutoSubtitleEvent.php b/lib/Alchemy/Phrasea/Core/Event/Record/RecordAutoSubtitleEvent.php index 044303161a..307a54e474 100644 --- a/lib/Alchemy/Phrasea/Core/Event/Record/RecordAutoSubtitleEvent.php +++ b/lib/Alchemy/Phrasea/Core/Event/Record/RecordAutoSubtitleEvent.php @@ -7,16 +7,27 @@ use Alchemy\Phrasea\Model\RecordInterface; class RecordAutoSubtitleEvent extends RecordEvent { private $languageSource; - private $metaStructId; + private $metaStructureIdSource; + private $languageDestination; + private $metaStructureIdDestination; private $permalinkUrl; - public function __construct(RecordInterface $record, $permalinkUrl, $languageSource, $metaStructId) + public function __construct( + RecordInterface $record, + $permalinkUrl, + $languageSource, + $metaStructureIdSource, + $languageDestination, + $metaStructureIdDestination + ) { parent::__construct($record); - $this->languageSource = $languageSource; - $this->metaStructId = $metaStructId; - $this->permalinkUrl = $permalinkUrl; + $this->languageSource = $languageSource; + $this->metaStructureIdSource = $metaStructureIdSource; + $this->languageDestination = $languageDestination; + $this->metaStructureIdDestination = $metaStructureIdDestination; + $this->permalinkUrl = $permalinkUrl; } public function getLanguageSource() @@ -24,9 +35,19 @@ class RecordAutoSubtitleEvent extends RecordEvent return $this->languageSource; } - public function getMetaStructId() + public function getMetaStructureIdSource() { - return $this->metaStructId; + return $this->metaStructureIdSource; + } + + public function getLanguageDestination() + { + return $this->languageDestination; + } + + public function getMetaStructureIdDestination() + { + return $this->metaStructureIdDestination; } public function getPermalinkUrl() diff --git a/lib/Alchemy/Phrasea/WorkerManager/Provider/AlchemyWorkerServiceProvider.php b/lib/Alchemy/Phrasea/WorkerManager/Provider/AlchemyWorkerServiceProvider.php index 2011ef9921..b1690777e4 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Provider/AlchemyWorkerServiceProvider.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Provider/AlchemyWorkerServiceProvider.php @@ -132,7 +132,9 @@ class AlchemyWorkerServiceProvider implements PluginProviderInterface })); $app['alchemy_worker.type_based_worker_resolver']->addFactory(MessagePublisher::SUBTITLE_TYPE, new CallableWorkerFactory(function () use ($app) { - return new SubtitleWorker($app['repo.worker-job'], $app['conf'], new LazyLocator($app, 'phraseanet.appbox'), $app['alchemy_worker.logger']); + return (new SubtitleWorker($app['repo.worker-job'], $app['conf'], new LazyLocator($app, 'phraseanet.appbox'), $app['alchemy_worker.logger'])) + ->setFileSystemLocator(new LazyLocator($app, 'filesystem')) + ->setTemporaryFileSystemLocator(new LazyLocator($app, 'temporary-filesystem')); })); $app['alchemy_worker.type_based_worker_resolver']->addFactory(MessagePublisher::MAIN_QUEUE_TYPE, new CallableWorkerFactory(function () use ($app) { diff --git a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitleSubscriber.php b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitleSubscriber.php index bed3a8eb4c..e67958165c 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitleSubscriber.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Subscriber/SubtitleSubscriber.php @@ -32,11 +32,13 @@ class SubtitleSubscriber implements EventSubscriberInterface $em = $this->repoWorkerJob->getEntityManager(); $data = [ - "databoxId" => $event->getRecord()->getDataboxId(), - "recordId" => $event->getRecord()->getRecordId(), - "permalinkUrl" => $event->getPermalinkUrl(), - "langageSource" => $event->getLanguageSource(), - "metaStructureId" => $event->getMetaStructId() + "databoxId" => $event->getRecord()->getDataboxId(), + "recordId" => $event->getRecord()->getRecordId(), + "permalinkUrl" => $event->getPermalinkUrl(), + "languageSource" => $event->getLanguageSource(), + "metaStructureIdSource" => $event->getMetaStructureIdSource(), + "languageDestination" => $event->getLanguageDestination(), + "metaStructureIdDestination" => $event->getMetaStructureIdDestination() ]; $this->repoWorkerJob->reconnect(); diff --git a/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php b/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php index e9d66a2c66..c0c9d56f61 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php @@ -2,6 +2,7 @@ namespace Alchemy\Phrasea\WorkerManager\Worker; +use Alchemy\Phrasea\Application\Helper\FilesystemAware; use Alchemy\Phrasea\Core\Configuration\PropertyAccess; use Alchemy\Phrasea\Model\Entities\WorkerJob; use Alchemy\Phrasea\Model\Repositories\WorkerJobRepository; @@ -10,6 +11,8 @@ use Psr\Log\LoggerInterface; class SubtitleWorker implements WorkerInterface { + use FilesystemAware; + /** * @var callable */ @@ -50,31 +53,40 @@ class SubtitleWorker implements WorkerInterface } $workerJob->setStatus(WorkerJob::RUNNING) - ->setStarted(new \DateTime('now')); + ->setStarted(new \DateTime('now')); $em = $this->repoWorkerJob->getEntityManager(); $this->repoWorkerJob->reconnect(); $em->persist($workerJob); $em->flush(); + switch ($gingaTranscriptFormat) { + case 'text/srt,': + $extension = 'srt'; + break; + case 'text/plain': + $extension = 'txt'; + break; + case 'application/json': + $extension = 'json'; + break; + case 'text/vtt': + default: + $extension = 'vtt'; + break; + } + + $languageSource = $this->getLanguageFormat($payload['languageSource']); + $languageDestination = $this->getLanguageFormat($payload['languageDestination']); + $record = $this->getApplicationBox()->get_databox($payload['databoxId'])->get_record($payload['recordId']); + $languageSourceFieldName = $record->getDatabox()->get_meta_structure()->get_element($payload['meta_struct_id_source'])->get_name(); - if ($payload['permalinkUrl'] != '' && $payload['metaStructureId']) { - switch ($payload['langageSource']) { - case 'En': - $language = 'en-GB'; - break; - case 'De': - $language = 'de-DE'; - break; - case 'Fr': - default: - $language = 'fr-FR'; - break; - } - - $gingerClient = new Client(); + $subtitleSourceTemporaryFile = $this->getTemporaryFilesystem()->createTemporaryFile("subtitle", null, $extension); + $gingerClient = new Client(); + // if the languageSourceFieldName do not yet exist, first generate subtitle for it + if ($payload['permalinkUrl'] != '' && !$record->get_caption()->has_field($languageSourceFieldName)) { try { $response = $gingerClient->post($gingaBaseurl.'/media/', [ 'headers' => [ @@ -82,7 +94,7 @@ class SubtitleWorker implements WorkerInterface ], 'json' => [ 'url' => $payload['permalinkUrl'], - 'language' => $language + 'language' => $languageSource ] ]); } catch(\Exception $e) { @@ -144,7 +156,7 @@ class SubtitleWorker implements WorkerInterface 'ACCEPT' => $gingaTranscriptFormat ], 'query' => [ - 'language' => $language + 'language' => $languageSource ] ]); } catch (\Exception $e) { @@ -165,8 +177,11 @@ class SubtitleWorker implements WorkerInterface $transcriptContent = preg_replace('/WEBVTT/', 'WEBVTT - with cue identifier', $transcriptContent, 1); + // save subtitle on temporary file to use to translate if needed + file_put_contents($subtitleSourceTemporaryFile, $transcriptContent); + $metadatas[0] = [ - 'meta_struct_id' => (int)$payload['metaStructureId'], + 'meta_struct_id' => (int)$payload['metaStructureIdSource'], 'meta_id' => '', 'value' => $transcriptContent ]; @@ -180,7 +195,77 @@ class SubtitleWorker implements WorkerInterface return 0; } - $this->logger->info("Auto subtitle SUCCESS"); + $this->logger->info("Generate subtitle on language source SUCCESS"); + } elseif ($record->get_caption()->has_field($languageSourceFieldName)) { + // get the source subtitle and save it to a temporary file + $fieldValues = $record->get_caption()->get_field($languageSourceFieldName)->get_values(); + $fieldValue = array_pop($fieldValues); + + file_put_contents($subtitleSourceTemporaryFile, $fieldValue->getValue()); + } + + if ($payload['metaStructureIdSource'] !== $payload['metaStructureIdDestination']) { + try { + $response = $gingerClient->post($gingaBaseurl.'/translate/', [ + 'headers' => [ + 'Authorization' => 'token '.$gingaToken, + 'ACCEPT' => $gingaTranscriptFormat + ], + 'multipart' => [ + [ + 'name' => 'transcript', + 'contents' => fopen($subtitleSourceTemporaryFile, 'r') + ], + [ + 'name' => 'transcript_format', + 'contents' => $gingaTranscriptFormat, + + ], + [ + 'name' => 'language_in', + 'contents' => $languageSource, + + ], + [ + 'name' => 'language_out', + 'contents' => $languageDestination, + + ] + ] + ]); + } catch(\Exception $e) { + $this->logger->error($e->getMessage()); + $this->jobFinished($workerJob); + + return 0; + } + + if ($response->getStatusCode() !== 200) { + $this->logger->error("response status /translate/ : ". $response->getStatusCode()); + $this->jobFinished($workerJob); + + return 0; + } + + $transcriptContent = $response->getBody()->getContents(); + $transcriptContent = preg_replace('/WEBVTT/', 'WEBVTT - with cue identifier', $transcriptContent, 1); + + $metadatas[0] = [ + 'meta_struct_id' => (int)$payload['metaStructureIdDestination'], + 'meta_id' => '', + 'value' => $transcriptContent + ]; + + try { + $record->set_metadatas($metadatas); + } catch (\Exception $e) { + $this->logger->error($e->getMessage()); + $this->jobFinished($workerJob); + + return 0; + } + + $this->logger->info("Translate subtitle on language destination SUCCESS"); } $this->jobFinished($workerJob); @@ -209,4 +294,17 @@ class SubtitleWorker implements WorkerInterface $em->persist($workerJob); $em->flush(); } + + private function getLanguageFormat($language) + { + switch ($language) { + case 'En': + return 'en-GB'; + case 'De': + return 'de-DE'; + case 'Fr': + default: + return 'fr-FR'; + } + } } diff --git a/templates/web/prod/actions/Tools/videoEditor.html.twig b/templates/web/prod/actions/Tools/videoEditor.html.twig index b9920c7fb2..93da3b2018 100644 --- a/templates/web/prod/actions/Tools/videoEditor.html.twig +++ b/templates/web/prod/actions/Tools/videoEditor.html.twig @@ -366,8 +366,10 @@ data: { databox_id: {{ record.getDataboxId }}, record_id: {{ record.getRecordId }}, - meta_struct_id: $('#subtitle_language_source').val(), - subtitle_language_source: $('#subtitle_language_source option:selected').text() + subtitle_language_source: $('#subtitle_language_source option:selected').text(), + meta_struct_id_source: $('#subtitle_language_source').val(), + subtitle_language_destination: $('#subtitle_language_destination option:selected').text(), + meta_struct_id_destination: $('#subtitle_language_destination').val() }, success: function success(data) { console.log(data); From d53db66fd55d23f357ff723f3f88bc389800c92e Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 16 Jul 2020 21:56:23 +0300 Subject: [PATCH 165/165] fix source --- lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php b/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php index c0c9d56f61..638af48b3a 100644 --- a/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php +++ b/lib/Alchemy/Phrasea/WorkerManager/Worker/SubtitleWorker.php @@ -80,7 +80,7 @@ class SubtitleWorker implements WorkerInterface $languageDestination = $this->getLanguageFormat($payload['languageDestination']); $record = $this->getApplicationBox()->get_databox($payload['databoxId'])->get_record($payload['recordId']); - $languageSourceFieldName = $record->getDatabox()->get_meta_structure()->get_element($payload['meta_struct_id_source'])->get_name(); + $languageSourceFieldName = $record->getDatabox()->get_meta_structure()->get_element($payload['metaStructureIdSource'])->get_name(); $subtitleSourceTemporaryFile = $this->getTemporaryFilesystem()->createTemporaryFile("subtitle", null, $extension); $gingerClient = new Client();