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')) %}