diff --git a/.env b/.env index 1fa61ee344..dde3312624 100644 --- a/.env +++ b/.env @@ -1,4 +1,5 @@ PHRASEANET_PROJECT_NAME=Phraseanet +PHRASEANET_SERVER_NAME=localhost # Registry from where you pull Docker images PHRASEANET_DOCKER_REGISTRY=local # Tag of the Docker images @@ -59,8 +60,6 @@ PHRASEANET_DB_PASSWORD=root INSTALL_DB_TEMPLATE=DublinCore INSTALL_APPBOX=ab_master INSTALL_DATABOX=db_databox1 -PHRASEANET_SERVER_NAME=localhost - # binaries execution timeouts PHRASEANET_FFMPEG_TIMEOUT=7200 PHRASEANET_FFPROBE_TIMEOUT=120 @@ -81,15 +80,32 @@ PHRASEANET_API_AUTH_TOKEN_HEADER_ONLY=false # Phraseanet mail configuration PHRASEANET_EMITTER_EMAIL=phraseanet@example.com -PHRASEANET_MAIL_OBJECT_PREFIX= -PHRASEANET_SMTP_ENABLED=false -PHRASEANET_SMTP_HOST= -PHRASEANET_SMTP_PORT= +PHRASEANET_MAIL_OBJECT_PREFIX="phraseanet" +PHRASEANET_SMTP_ENABLED=true +PHRASEANET_SMTP_HOST=mailhog +PHRASEANET_SMTP_PORT=1025 PHRASEANET_SMTP_AUTH_ENABLED=false -PHRASEANET_SMTP_SECURE_MODE=tls +PHRASEANET_SMTP_SECURE_MODE=null PHRASEANET_SMTP_USER= PHRASEANET_SMTP_PASSWORD= +# Phraseanet Workers setting +PHRASEANET_EXPLODE_WORKER=1 +PHRASEANET_WORKER_assetsIngest=1 +PHRASEANET_WORKER_createRecord=2 +PHRASEANET_WORKER_deleteRecord=2 +PHRASEANET_WORKER_exportMail=2 +PHRASEANET_WORKER_exposeUpload=2 +PHRASEANET_WORKER_ftp=1 +PHRASEANET_WORKER_mainQueue=3 +PHRASEANET_WORKER_populateIndex=1 +PHRASEANET_WORKER_pullAssets=1 +PHRASEANET_WORKER_recordEdit=2 +PHRASEANET_WORKER_subdefCreation=1 +PHRASEANET_WORKER_subtitle=1 +PHRASEANET_WORKER_validationReminder=1 +PHRASEANET_WORKER_webhook=1 +PHRASEANET_WORKER_writeMetadatas=1 # Locale setting diff --git a/Dockerfile b/Dockerfile index adf98b9b06..df7a049884 100644 --- a/Dockerfile +++ b/Dockerfile @@ -215,7 +215,7 @@ CMD ["php-fpm", "-F"] FROM phraseanet-fpm as phraseanet-worker ENTRYPOINT ["docker/phraseanet/worker/entrypoint.sh"] -CMD ["bin/console", "worker:execute"] +CMD ["/bin/bash", "bin/run-worker.sh"] ######################################################################### # phraseanet-nginx diff --git a/Phraseanet-production-client/dist/production.js b/Phraseanet-production-client/dist/production.js index 6d467bf66e..d18157d6ca 100644 --- a/Phraseanet-production-client/dist/production.js +++ b/Phraseanet-production-client/dist/production.js @@ -65249,13 +65249,12 @@ var previewRecordService = function previewRecordService(services) { event.preventDefault(); closePreview(); }).on('dblclick', '.open-preview-action', function (event) { - var $el = (0, _jquery2.default)(event.currentTarget); - // env, pos, contId, reload - var reload = $el.data('reload') === true ? true : false; - _openPreview(event.currentTarget, $el.data('kind'), $el.data('position'), $el.data('id'), $el.data('kind')); + var $element = (0, _jquery2.default)(event.currentTarget); + openPreview($element); }).on('click', '.to-open-preview-action', function (event) { event.preventDefault(); - (0, _jquery2.default)('.open-preview-action').trigger("dblclick"); + var $element = (0, _jquery2.default)(event.currentTarget); + openPreview($element); }); $previewContainer.on('click', '.preview-navigate-action', function (event) { event.preventDefault(); @@ -65499,7 +65498,18 @@ var previewRecordService = function previewRecordService(services) { (0, _jquery2.default)('#PREVIEWBOX img.record.zoomable').draggable(); } - (0, _jquery2.default)('#SPANTITLE').empty().append(data.title); + var basketIcon = ''; + if (data.containerType !== null) { + if (data.containerType === 'feedback') { + basketIcon = ""; + } else if (data.containerType === 'push') { + basketIcon = ""; + } else { + basketIcon = ""; + } + } + + (0, _jquery2.default)('#SPANTITLE').empty().append(basketIcon + data.title); (0, _jquery2.default)('#PREVIEWTITLE_COLLLOGO').empty().append(data.collection_logo); (0, _jquery2.default)('#PREVIEWTITLE_COLLNAME').empty().append(data.databox_name + ' / ' + data.collection_name); @@ -65562,6 +65572,12 @@ var previewRecordService = function previewRecordService(services) { (0, _jquery2.default)("iframe", $sel).css('width', NW).css('height', NH); } + function openPreview($element) { + var reload = $element.data('reload') === true ? true : false; + // env, pos, contId, reload + _openPreview(event.currentTarget, $element.data('kind'), $element.data('position'), $element.data('id'), reload); + } + function closePreview() { options.open = false; if (activeThumbnailFrame !== false) { diff --git a/Phraseanet-production-client/dist/production.min.js b/Phraseanet-production-client/dist/production.min.js index 6d467bf66e..d18157d6ca 100644 --- a/Phraseanet-production-client/dist/production.min.js +++ b/Phraseanet-production-client/dist/production.min.js @@ -65249,13 +65249,12 @@ var previewRecordService = function previewRecordService(services) { event.preventDefault(); closePreview(); }).on('dblclick', '.open-preview-action', function (event) { - var $el = (0, _jquery2.default)(event.currentTarget); - // env, pos, contId, reload - var reload = $el.data('reload') === true ? true : false; - _openPreview(event.currentTarget, $el.data('kind'), $el.data('position'), $el.data('id'), $el.data('kind')); + var $element = (0, _jquery2.default)(event.currentTarget); + openPreview($element); }).on('click', '.to-open-preview-action', function (event) { event.preventDefault(); - (0, _jquery2.default)('.open-preview-action').trigger("dblclick"); + var $element = (0, _jquery2.default)(event.currentTarget); + openPreview($element); }); $previewContainer.on('click', '.preview-navigate-action', function (event) { event.preventDefault(); @@ -65499,7 +65498,18 @@ var previewRecordService = function previewRecordService(services) { (0, _jquery2.default)('#PREVIEWBOX img.record.zoomable').draggable(); } - (0, _jquery2.default)('#SPANTITLE').empty().append(data.title); + var basketIcon = ''; + if (data.containerType !== null) { + if (data.containerType === 'feedback') { + basketIcon = ""; + } else if (data.containerType === 'push') { + basketIcon = ""; + } else { + basketIcon = ""; + } + } + + (0, _jquery2.default)('#SPANTITLE').empty().append(basketIcon + data.title); (0, _jquery2.default)('#PREVIEWTITLE_COLLLOGO').empty().append(data.collection_logo); (0, _jquery2.default)('#PREVIEWTITLE_COLLNAME').empty().append(data.databox_name + ' / ' + data.collection_name); @@ -65562,6 +65572,12 @@ var previewRecordService = function previewRecordService(services) { (0, _jquery2.default)("iframe", $sel).css('width', NW).css('height', NH); } + function openPreview($element) { + var reload = $element.data('reload') === true ? true : false; + // env, pos, contId, reload + _openPreview(event.currentTarget, $element.data('kind'), $element.data('position'), $element.data('id'), reload); + } + function closePreview() { options.open = false; if (activeThumbnailFrame !== false) { diff --git a/Phraseanet-production-client/src/components/record/recordPreview/index.js b/Phraseanet-production-client/src/components/record/recordPreview/index.js index ba2066e304..38b0089fb8 100644 --- a/Phraseanet-production-client/src/components/record/recordPreview/index.js +++ b/Phraseanet-production-client/src/components/record/recordPreview/index.js @@ -81,20 +81,14 @@ const previewRecordService = services => { closePreview(); }) .on('dblclick', '.open-preview-action', event => { - let $el = $(event.currentTarget); - // env, pos, contId, reload - let reload = $el.data('reload') === true ? true : false; - _openPreview( - event.currentTarget, - $el.data('kind'), - $el.data('position'), - $el.data('id'), - $el.data('kind') - ); + let $element = $(event.currentTarget); + openPreview($element); + }) .on('click', '.to-open-preview-action', event => { event.preventDefault(); - $( '.open-preview-action' ).trigger( "dblclick" ); + let $element = $(event.currentTarget); + openPreview($element); }) ; $previewContainer @@ -387,7 +381,18 @@ const previewRecordService = services => { $('#PREVIEWBOX img.record.zoomable').draggable(); } - $('#SPANTITLE').empty().append(data.title); + let basketIcon = ''; + if (data.containerType !== null ) { + if (data.containerType === 'feedback') { + basketIcon = ""; + } else if (data.containerType === 'push') { + basketIcon = ""; + } else { + basketIcon = ""; + } + } + + $('#SPANTITLE').empty().append(basketIcon + data.title); $('#PREVIEWTITLE_COLLLOGO') .empty() .append(data.collection_logo); @@ -466,6 +471,18 @@ const previewRecordService = services => { } + function openPreview($element) { + let reload = $element.data('reload') === true ? true : false; + // env, pos, contId, reload + _openPreview( + event.currentTarget, + $element.data('kind'), + $element.data('position'), + $element.data('id'), + reload + ); + } + function closePreview() { options.open = false; if (activeThumbnailFrame !== false) { diff --git a/docker-compose.yml b/docker-compose.yml index 1f9c13b271..03bd619603 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -119,6 +119,7 @@ services: - redis - rabbitmq - elasticsearch + - phraseanet environment: - PHRASEANET_PROJECT_NAME - PHRASEANET_TRUSTED_PROXIES @@ -135,6 +136,22 @@ services: - LC_CTYPE=C.UTF-8 - LC_TIME=C.UTF-8 - LC_NAME=C.UTF-8 + - PHRASEANET_EXPLODE_WORKER + - PHRASEANET_WORKER_assetsIngest + - PHRASEANET_WORKER_createRecord + - PHRASEANET_WORKER_deleteRecord + - PHRASEANET_WORKER_exportMail + - PHRASEANET_WORKER_exposeUpload + - PHRASEANET_WORKER_ftp + - PHRASEANET_WORKER_mainQueue + - PHRASEANET_WORKER_populateIndex + - PHRASEANET_WORKER_pullAssets + - PHRASEANET_WORKER_recordEdit + - PHRASEANET_WORKER_subdefCreation + - PHRASEANET_WORKER_subtitle + - PHRASEANET_WORKER_validationReminder + - PHRASEANET_WORKER_webhook + - PHRASEANET_WORKER_writeMetadatas - IMAGEMAGICK_POLICY_VERSION - IMAGEMAGICK_POLICY_WIDTH - IMAGEMAGICK_POLICY_HEIGHT diff --git a/docker/phraseanet/entrypoint.sh b/docker/phraseanet/entrypoint.sh index 4fd1e76c79..929d89eabe 100755 --- a/docker/phraseanet/entrypoint.sh +++ b/docker/phraseanet/entrypoint.sh @@ -38,7 +38,7 @@ if [ -f "$FILE" ]; 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 + bin/setup system:config set registry.email.smtp-secure-mode $PHRASEANET_SMTP_SECURE_MODE 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 @@ -49,7 +49,7 @@ if [ -f "$FILE" ]; then 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 - + echo `date +"%Y-%m-%d %H:%M:%S"` " - config/configuration.yml update by Phraseanet entrypoint.sh Finished !" else echo "$FILE doesn't exist, entering setup..." @@ -62,6 +62,7 @@ else datas runuser app -c docker/phraseanet/auto-install.sh + echo `date +"%Y-%m-%d %H:%M:%S"` " - End of Phraseanet Installation" fi if [ ${XDEBUG_ENABLED} == "1" ]; then @@ -70,7 +71,8 @@ if [ ${XDEBUG_ENABLED} == "1" ]; then fi ./docker/phraseanet/plugins/console init -#rm -Rf cache/ +rm -Rf cache/* +chmod 600 config/configuration.yml chown -R app:app \ cache \ @@ -84,6 +86,7 @@ if [ -d "plugins/" ];then chown -R app:app plugins; fi -chown -R app:app datas & +chown -R app:app datas && echo `date +"%Y-%m-%d %H:%M:%S"` " - Finished chown on datas by entreypoint" & +echo `date +"%Y-%m-%d %H:%M:%S"` " - Finished runnning Phraseanet entrypoint.sh" bash -e docker-php-entrypoint $@ diff --git a/docker/phraseanet/worker/entrypoint.sh b/docker/phraseanet/worker/entrypoint.sh index 9526bb01f7..2fa3c03a4f 100755 --- a/docker/phraseanet/worker/entrypoint.sh +++ b/docker/phraseanet/worker/entrypoint.sh @@ -29,4 +29,33 @@ if [ -f /etc/ImageMagick-$IMAGEMAGICK_POLICY_VERSION/policy.xml ]; then sed -i "s/.*domain=\"resource\" name=\"temporary-path\" value=\".*//g" /etc/ImageMagick-$IMAGEMAGICK_POLICY_VERSION/policy.xml fi +rm -rf bin/run-worker.sh +if [ ${PHRASEANET_EXPLODE_WORKER} == "1" ]; then + for i in `env | grep PHRASEANET_WORKER_ | cut -d'=' -f1` + do + queue_name="$(echo $i | cut -d'_' -f3)" + m=$i + command="bin/console worker:execute --queue-name=$queue_name -m ${!m} &" + echo $command >> bin/run-worker.sh + done + + echo 'WORKER_NB_QUEUES=`env | grep PHRASEANET_WORKER_ | wc -l` + WORKER_LOOP_VALUE=20s + while true; + do + sleep $WORKER_LOOP_VALUE + nb_process=`ps faux | grep "worker:execute" | grep php | wc -l` + date_time_process=`date +"%Y-%m-%d %H:%M:%S"` + echo $date_time_process "-" $nb_process "running workers" + if [ $nb_process -lt $WORKER_NB_QUEUES ] + then + exit 1 + break + fi + done ' >> bin/run-worker.sh +else + command="bin/console worker:execute" + echo $command >> bin/run-worker.sh +fi + runuser -u app -- $@ diff --git a/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php b/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php index 1c1e6ee250..55f18cc959 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/RecordController.php @@ -103,6 +103,18 @@ class RecordController extends Controller $recordTitle = htmlspecialchars($record->get_title()); } + $containerType = null; + + if ($env === 'BASK') { + if ($record->get_container()->getValidation()) { + $containerType = 'feedback'; + } elseif ($record->get_container()->getPusher()) { + $containerType = 'push'; + } else { + $containerType = 'basket'; + } + } + return $this->app->json([ "desc" => $this->render('prod/preview/caption.html.twig', [ 'record' => $record, @@ -131,6 +143,7 @@ class RecordController extends Controller ]), "pos" => $record->getNumber(), "title" => $recordTitle, + "containerType" => $containerType, "databox_name" => $record->getDatabox()->get_dbname(), "collection_name" => $record->getCollection()->get_name(), "collection_logo" => $record->getCollection()->getLogo($record->getBaseId(), $this->app), diff --git a/lib/classes/record/preview.php b/lib/classes/record/preview.php index dd0ae0fe43..63666f5d7b 100644 --- a/lib/classes/record/preview.php +++ b/lib/classes/record/preview.php @@ -270,8 +270,7 @@ class record_preview extends record_adapter $this->title .= parent::get_title($options); break; case "BASK": - $this->title .= $this->name . ' - ' . parent::get_title($options) - . ' (' . $this->getNumber() . '/' . $this->total . ') '; + $this->title .= $this->name . ' (' . $this->getNumber() . '/' . $this->total . ') - ' . parent::get_title($options); break; case "REG": $title = parent::get_title($options); diff --git a/templates/web/prod/preview/tools.html.twig b/templates/web/prod/preview/tools.html.twig index 51612aa60e..ad6d6cd2a6 100644 --- a/templates/web/prod/preview/tools.html.twig +++ b/templates/web/prod/preview/tools.html.twig @@ -9,7 +9,7 @@ {% if record.is_from_basket() %} @@ -17,7 +17,7 @@ {% endif %}
- +
{% if app.getAclForUser(app.getAuthenticatedUser()).has_right_on_base(record.get_base_id(), constant('\\ACL::CANDWNLDHD')) or app.getAclForUser(app.getAuthenticatedUser()).has_right_on_base(record.get_base_id(), constant('\\ACL::CANDWNLDPREVIEW')) %}