PHRAS-3838 support expose v2 (#4307)

* add phrasea compose project name for traefik,
fix exception on client_credentials grant type from expose

* WIP

* remove expose_version

---------
authored-by: Arthur de Moulins <arthurdemoulins@gmail.com>
This commit is contained in:
Nicolas Maillat
2023-05-04 13:37:43 +02:00
committed by GitHub
parent 85da4dfda1
commit c10c91bcf0
17 changed files with 130 additions and 78 deletions

2
.env
View File

@@ -148,6 +148,7 @@ PHRASEA_NETWORK_NAME=ps_internal
PHRASEA_DOMAIN=phrasea.local
PHRASEA_GATEWAY_IP=172.30.0.1
PHRASEA_COMPOSE_PROJECT_NAME=ps
# --- Phraseanet container entrypoint settings -------------------------------------------------------------------------
@@ -341,6 +342,7 @@ DB_BACKUP_INIT_RESTORE_LATEST=0
# Every day at 03:00
# @run
#DB_BACKUP_CRON_TIME=0 3 * *
DB_BACKUP_CRON_TIME=
# Make it small
# @run

View File

@@ -23,11 +23,11 @@ Node `^5.0.0`.
- Go to Phraseanet-production-client folder ```cd Phraseanet-production-client```
- Generate dist ```npm run dist```
- Go back to Phraseanet folder : ```cd ..```
- Copy assets in www/assets folder ```make install_asset```
- Copy assets in www/assets folder ```make install_assets```
- ... or simply one cmd : ```cd Phraseanet-production-client && npm run dist && cd .. && make install_assets && rm -rf cache/*```
### Push
- If features is finished ```dist``` folder is to be commited with sources.
- If features is finished ```dist``` folder is to be committed with sources.
## Available commands

View File

@@ -13,5 +13,5 @@ module.exports = {
setupDir: _root + 'tests/setup/node.js',
karmaConf: _root + 'config/karma.conf.js',
// change this version when you change JS file for lazy loading
assetFileVersion: 85
assetFileVersion: 86
};

View File

@@ -96,7 +96,7 @@ return /******/ (function(modules) { // webpackBootstrap
/******/ if (__webpack_require__.nc) {
/******/ script.setAttribute("nonce", __webpack_require__.nc);
/******/ }
/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=85";
/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=86";
/******/ var timeout = setTimeout(onScriptComplete, 120000);
/******/ script.onerror = script.onload = onScriptComplete;
/******/ function onScriptComplete() {

View File

@@ -96,7 +96,7 @@ return /******/ (function(modules) { // webpackBootstrap
/******/ if (__webpack_require__.nc) {
/******/ script.setAttribute("nonce", __webpack_require__.nc);
/******/ }
/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=85";
/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=86";
/******/ var timeout = setTimeout(onScriptComplete, 120000);
/******/ script.onerror = script.onload = onScriptComplete;
/******/ function onScriptComplete() {

View File

@@ -91,7 +91,7 @@
/******/ if (__webpack_require__.nc) {
/******/ script.setAttribute("nonce", __webpack_require__.nc);
/******/ }
/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=85";
/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".js?v=86";
/******/ var timeout = setTimeout(onScriptComplete, 120000);
/******/ script.onerror = script.onload = onScriptComplete;
/******/ function onScriptComplete() {

View File

@@ -91,7 +91,7 @@
/******/ if (__webpack_require__.nc) {
/******/ script.setAttribute("nonce", __webpack_require__.nc);
/******/ }
/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=85";
/******/ script.src = __webpack_require__.p + "lazy-" + ({}[chunkId]||chunkId) + ".min.js?v=86";
/******/ var timeout = setTimeout(onScriptComplete, 120000);
/******/ script.onerror = script.onload = onScriptComplete;
/******/ function onScriptComplete() {

View File

@@ -9901,8 +9901,6 @@ Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _jquery = __webpack_require__(0);
var _jquery2 = _interopRequireDefault(_jquery);
@@ -10936,17 +10934,18 @@ var workzone = function workzone(services) {
var publicationId = (0, _jquery2.default)(this).attr('data-publication-id');
var exposeName = (0, _jquery2.default)('#expose_list').val();
var assetsContainer = (0, _jquery2.default)(this).parents('.expose_item_deployed');
var positions = [];
var order = [];
(0, _jquery2.default)('.assets_list .chim-wrapper').each(function (i, el) {
positions[(0, _jquery2.default)(this).attr('data-pub-asset-id')] = i + 1;
order.push((0, _jquery2.default)(this).attr('data-pub-asset-id'));
});
_jquery2.default.ajax({
type: 'POST',
url: '/prod/expose/publication/update-assets-order/?exposeName=' + exposeName,
data: {
listPositions: JSON.stringify(_extends({}, positions))
order: order,
publicationId: publicationId
},
dataType: 'json',
success: function success(data) {

View File

@@ -9901,8 +9901,6 @@ Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _jquery = __webpack_require__(0);
var _jquery2 = _interopRequireDefault(_jquery);
@@ -10936,17 +10934,18 @@ var workzone = function workzone(services) {
var publicationId = (0, _jquery2.default)(this).attr('data-publication-id');
var exposeName = (0, _jquery2.default)('#expose_list').val();
var assetsContainer = (0, _jquery2.default)(this).parents('.expose_item_deployed');
var positions = [];
var order = [];
(0, _jquery2.default)('.assets_list .chim-wrapper').each(function (i, el) {
positions[(0, _jquery2.default)(this).attr('data-pub-asset-id')] = i + 1;
order.push((0, _jquery2.default)(this).attr('data-pub-asset-id'));
});
_jquery2.default.ajax({
type: 'POST',
url: '/prod/expose/publication/update-assets-order/?exposeName=' + exposeName,
data: {
listPositions: JSON.stringify(_extends({}, positions))
order: order,
publicationId: publicationId
},
dataType: 'json',
success: function success(data) {

View File

@@ -1014,17 +1014,18 @@ const workzone = (services) => {
let publicationId = $(this).attr('data-publication-id');
let exposeName = $('#expose_list').val();
let assetsContainer = $(this).parents('.expose_item_deployed');
let positions = [];
const order = [];
$('.assets_list .chim-wrapper').each(function(i, el){
positions[$(this).attr('data-pub-asset-id')] = i + 1;
order.push($(this).attr('data-pub-asset-id'));
});
$.ajax({
type: 'POST',
url: `/prod/expose/publication/update-assets-order/?exposeName=${exposeName}`,
data: {
listPositions: JSON.stringify({ ...positions })
order,
publicationId,
},
dataType: 'json',
success: function (data) {

View File

@@ -5,8 +5,11 @@ services:
- ../:/var/alchemy
- .:/var/alchemy/Phraseanet
- ./docker/nginx/root/entrypoint.sh:/entrypoint.sh
networks:
- internal
gateway-traefik:
volumes:
- ../:/var/alchemy
- .:/var/alchemy/Phraseanet
- ./docker/nginx/root/entrypoint.sh:/entrypoint.sh
builder:
build:
context: .

View File

@@ -2,8 +2,8 @@ version: "3.9"
networks:
phrasea:
external:
name: ${PHRASEA_NETWORK_NAME}
name: ${PHRASEA_NETWORK_NAME}
external: true
services:
gateway-traefik:
@@ -15,6 +15,7 @@ services:
- "traefik.docker.network=${PHRASEA_NETWORK_NAME}"
- "traefik.http.routers.phraseanet.rule=Host(`${PHRASEANET_HOSTNAME}`)"
- "traefik.http.routers.phraseanet.tls=true"
- "traefik.project_name=${PHRASEA_COMPOSE_PROJECT_NAME}"
phraseanet:
extra_hosts:

View File

@@ -173,7 +173,8 @@ class PSExposeController extends Controller
*/
public function listPublicationAction(PhraseaApplication $app, Request $request)
{
if ($request->get('exposeName') == null) {
$exposeName = $request->get('exposeName');
if ($exposeName == null) {
return $app->json([
'twig' => $this->render("prod/WorkZone/ExposeList.html.twig", [
'publications' => [],
@@ -182,10 +183,10 @@ class PSExposeController extends Controller
}
$exposeConfiguration = $app['conf']->get(['phraseanet-service', 'expose-service', 'exposes'], []);
$exposeConfiguration = $exposeConfiguration[$request->get('exposeName')];
$exposeConfiguration = $exposeConfiguration[$exposeName];
$session = $this->getSession();
$passSessionName = $this->getPassSessionName($request->get('exposeName'));
$passSessionName = $this->getPassSessionName($exposeName);
$providerId = $session->get('auth_provider.id');
if (!$session->has($passSessionName) && $providerId != null) {
@@ -193,7 +194,7 @@ class PSExposeController extends Controller
$provider = $this->getAuthenticationProviders()->get($providerId);
if ($provider->getType() == 'PsAuth') {
$session->set($passSessionName, $provider->getAccessToken());
$session->set($this->getLoginSessionName($request->get('exposeName')), $provider->getUserName());
$session->set($this->getLoginSessionName($exposeName), $provider->getUserName());
}
} catch(\Exception $e) {
}
@@ -202,12 +203,12 @@ class PSExposeController extends Controller
if (!$session->has($passSessionName) && $exposeConfiguration['connection_kind'] == 'password' && $request->get('format') != 'json') {
return $app->json([
'twig' => $this->render("prod/WorkZone/ExposeOauthLogin.html.twig", [
'exposeName' => $request->get('exposeName')
'exposeName' => $exposeName
])
]);
}
$accessToken = $this->getAndSaveToken($request->get('exposeName'));
$accessToken = $this->getAndSaveToken($exposeName);
if ($exposeConfiguration == null ) {
return $app->json([
@@ -228,7 +229,7 @@ class PSExposeController extends Controller
try {
$uri = '/publications?flatten=true&order[createdAt]=desc';
if ($request->get('mine')) {
if ($request->get('mine') && $exposeConfiguration['connection_kind'] === 'password') {
$uri .= '&mine=true';
}
@@ -285,8 +286,8 @@ class PSExposeController extends Controller
return $app->json([
'twig' => $exposeListTwig,
'exposeName' => $request->get('exposeName'),
'exposeLogin' => $session->get($this->getLoginSessionName($request->get('exposeName'))),
'exposeName' => $exposeName,
'exposeLogin' => $session->get($this->getLoginSessionName($exposeName)),
'basePath' => $basePath
]);
}
@@ -449,9 +450,11 @@ class PSExposeController extends Controller
*/
public function getPublicationAssetsAction(PhraseaApplication $app, Request $request)
{
$exposeName = $request->get('exposeName');
$config = $this->getExposeConfiguration($exposeName);
$page = $request->get('page')?:1;
$exposeClient = $this->getExposeClient($request->get('exposeName'));
$exposeClient = $this->getExposeClient($exposeName);
if ($exposeClient == null) {
return $app->json([
@@ -460,7 +463,7 @@ class PSExposeController extends Controller
]);
}
$accessToken = $this->getAndSaveToken($request->get('exposeName'));
$accessToken = $this->getAndSaveToken($exposeName);
try {
$resPublication = $exposeClient->get('/publications/' . $request->get('publicationId') . '/assets?page=' . $page , [
@@ -483,16 +486,24 @@ class PSExposeController extends Controller
]);
}
$pubAssets = [];
$assets = [];
$totalItems = 0;
if ($resPublication->getStatusCode() == 200) {
$body = json_decode($resPublication->getBody()->getContents(),true);
$pubAssets = $body['hydra:member'];
$assets = $body['hydra:member'];
if (!empty($assets) && isset($assets[0]['asset'])) {
// expose v1 BC: flatten assets
$assets = array_map(function (array $pubAsset): array {
return $pubAsset['asset'];
}, $assets);
}
$totalItems = $body['hydra:totalItems'];
}
return $this->render("prod/WorkZone/ExposePublicationAssets.html.twig", [
'pubAssets' => $pubAssets,
return $this->render('prod/WorkZone/ExposePublicationAssets.html.twig', [
'assets' => $assets,
'publicationId' => $request->get('publicationId'),
'capabilitiesDelete' => $request->get('capabilitiesDelete'),
'capabilitiesEdit' => $request->get('capabilitiesEdit'),
@@ -684,7 +695,7 @@ class PSExposeController extends Controller
/**
* Update assets positions
* Require params "exposeName" and "listPositions" of the assets
* Require params "exposeName", "publicationId" and "order" of the assets
*
* @param PhraseaApplication $app
* @param Request $request
@@ -705,10 +716,15 @@ class PSExposeController extends Controller
try {
$accessToken = $this->getAndSaveToken($exposeName);
$listPositions = json_decode($request->get('listPositions'), true);
foreach ($listPositions as $pubAssetId => $pos) {
$this->putPublicationAsset($exposeClient, $pubAssetId, $accessToken, ['position' => $pos]);
}
$exposeClient->post(sprintf('/publications/%s/sort-assets', $request->get('publicationId', [])), [
'headers' => [
'Authorization' => 'Bearer '. $accessToken,
'Content-Type' => 'application/json'
],
'json' => [
'order' => $request->get('order', []),
],
]);
} catch (\Exception $e) {
return $app->json([
'success' => false,
@@ -1253,20 +1269,18 @@ class PSExposeController extends Controller
} else {
$proxyConfig = new NetworkProxiesConfiguration($this->app['conf']);
$oauthClient = $proxyConfig->getClientWithOptions([]);
$oauthClient = $proxyConfig->getClientWithOptions([
'verify' => $config['verify_ssl'],
]);
try {
$response = $oauthClient->post($config['expose_base_uri'] . '/oauth/v2/token', [
'json' => [
'client_id' => $config['expose_client_id'],
'client_secret' => $config['expose_client_secret'],
'grant_type' => 'client_credentials',
'scope' => 'publish'
]
]);
} catch(\Exception $e) {
return null;
}
$response = $oauthClient->post($config['expose_base_uri'] . '/oauth/v2/token', [
'json' => [
'client_id' => $config['expose_client_id'],
'client_secret' => $config['expose_client_secret'],
'grant_type' => 'client_credentials',
'scope' => 'publish'
]
]);
if ($response->getStatusCode() !== 200) {
return null;
@@ -1307,17 +1321,6 @@ class PSExposeController extends Controller
]);
}
private function putPublicationAsset(Client $exposeClient, $publicationAssetId, $token, $publicationAssetData)
{
return $exposeClient->put('/publication-assets/' . $publicationAssetId, [
'headers' => [
'Authorization' => 'Bearer '. $token,
'Content-Type' => 'application/json'
],
'json' => $publicationAssetData
]);
}
private function removePublication(Client $exposeClient, $publicationId, $token)
{
return $exposeClient->delete('/publications/' . $publicationId, [

View File

@@ -67,7 +67,7 @@ class PSExposeConfigurationType extends AbstractType implements DataMapperInterf
* exposes:
* expose_test:
* activate_expose: true
* connection_kind: account
* connection_kind: password
* expose_front_uri: 'localhost:8080'
* expose_base_uri: 'localhost:8082'
* client_secret: secret

View File

@@ -60,7 +60,7 @@ class PhraseanetExtension extends \Twig_Extension
{
return [
// change this version when you change JS file to force the navigation to reload js file
'assetFileVersion' => 85
'assetFileVersion' => 86
];
}

View File

@@ -64,10 +64,10 @@ class User extends \Alchemy\Phrasea\Model\Entities\User implements \Doctrine\ORM
public function __sleep()
{
if ($this->__isInitialized__) {
return ['__isInitialized__', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'id', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'login', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'email', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'password', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'nonce', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'saltedPassword', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'firstName', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastName', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'gender', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'address', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'city', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'country', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'zipCode', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'geonameId', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'locale', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'timezone', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'job', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'activity', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'company', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'phone', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'fax', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'admin', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'guest', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'mailNotificationsActivated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'requestNotificationsActivated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'ldapCreated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastAppliedTemplate', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'pushList', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'canChangeProfil', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'canChangeFtpProfil', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastConnection', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'mailLocked', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'deleted', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'created', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'updated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'templateOwner', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'ftpCredential', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'queries', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'settings', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'notificationSettings', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'grantedApi'];
return ['__isInitialized__', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'id', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'login', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'email', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'password', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'nonce', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'saltedPassword', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'firstName', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastName', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'gender', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'address', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'city', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'country', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'zipCode', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'geonameId', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'locale', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'timezone', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'job', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'activity', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'company', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'phone', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'fax', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'admin', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'guest', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'mailNotificationsActivated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'requestNotificationsActivated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'ldapCreated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastAppliedTemplate', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'pushList', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'canChangeProfil', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'canChangeFtpProfil', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastConnection', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'mailLocked', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'deleted', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'created', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'updated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'templateOwner', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'ftpCredential', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'queries', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'settings', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'notificationSettings', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'grantedApi', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'nbInactivityEmail', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastInactivityEmail'];
}
return ['__isInitialized__', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'id', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'login', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'email', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'password', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'nonce', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'saltedPassword', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'firstName', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastName', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'gender', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'address', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'city', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'country', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'zipCode', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'geonameId', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'locale', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'timezone', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'job', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'activity', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'company', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'phone', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'fax', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'admin', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'guest', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'mailNotificationsActivated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'requestNotificationsActivated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'ldapCreated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastAppliedTemplate', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'pushList', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'canChangeProfil', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'canChangeFtpProfil', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastConnection', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'mailLocked', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'deleted', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'created', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'updated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'templateOwner', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'ftpCredential', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'queries', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'settings', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'notificationSettings', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'grantedApi'];
return ['__isInitialized__', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'id', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'login', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'email', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'password', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'nonce', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'saltedPassword', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'firstName', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastName', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'gender', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'address', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'city', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'country', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'zipCode', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'geonameId', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'locale', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'timezone', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'job', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'activity', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'company', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'phone', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'fax', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'admin', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'guest', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'mailNotificationsActivated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'requestNotificationsActivated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'ldapCreated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastAppliedTemplate', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'pushList', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'canChangeProfil', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'canChangeFtpProfil', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastConnection', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'mailLocked', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'deleted', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'created', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'updated', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'templateOwner', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'ftpCredential', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'queries', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'settings', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'notificationSettings', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'grantedApi', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'nbInactivityEmail', '' . "\0" . 'Alchemy\\Phrasea\\Model\\Entities\\User' . "\0" . 'lastInactivityEmail'];
}
/**
@@ -1068,6 +1068,50 @@ class User extends \Alchemy\Phrasea\Model\Entities\User implements \Doctrine\ORM
return parent::setGrantedApi($grantedApi);
}
/**
* {@inheritDoc}
*/
public function setNbInactivityEmail($nbEnactivityEmail)
{
$this->__initializer__ && $this->__initializer__->__invoke($this, 'setNbInactivityEmail', [$nbEnactivityEmail]);
return parent::setNbInactivityEmail($nbEnactivityEmail);
}
/**
* {@inheritDoc}
*/
public function getNbInactivityEmail()
{
$this->__initializer__ && $this->__initializer__->__invoke($this, 'getNbInactivityEmail', []);
return parent::getNbInactivityEmail();
}
/**
* {@inheritDoc}
*/
public function setLastInactivityEmail($lastInactivityEmail)
{
$this->__initializer__ && $this->__initializer__->__invoke($this, 'setLastInactivityEmail', [$lastInactivityEmail]);
return parent::setLastInactivityEmail($lastInactivityEmail);
}
/**
* {@inheritDoc}
*/
public function getLastInactivityEmail()
{
$this->__initializer__ && $this->__initializer__->__invoke($this, 'getLastInactivityEmail', []);
return parent::getLastInactivityEmail();
}
/**
* {@inheritDoc}
*/

View File

@@ -55,19 +55,19 @@
{% endif %}
{% for pubAsset in pubAssets %}
<div class="chim-wrapper" data-pub-asset-id="{{ pubAsset.id }}">
{% for asset in assets %}
<div class="chim-wrapper" data-pub-asset-id="{{ asset.id }}">
<div class="chim-content">
<div class="CHIM diapo">
<div class="thumb_wrapper">
<img
data-kind="image" oncontextMenu="return(false);"
src="{{ pubAsset.asset.thumbUrl|trim }}" data-original="{{ pubAsset.asset.thumbUrl|trim }}" ondragstart="return false;">
src="{{ asset.thumbUrl|trim }}" data-original="{{ asset.thumbUrl|trim }}" ondragstart="return false;">
</div>
{% if capabilitiesEdit %}
<div class="set-cover" style="position: absolute;bottom: 0;cursor: pointer;" title="Set as Cover"
data-publication-id="{{ pubAsset.publication.id }}" data-asset-id="{{ pubAsset.asset.id }}">
data-publication-id="{{ publicationId }}" data-asset-id="{{ asset.id }}">
<img src="/assets/common/images/icons/icon_story.gif" title="Set as Cover">
</div>
@@ -75,7 +75,7 @@
{% if capabilitiesDelete %}
<div class="bottom">
<a class="WorkZoneElementRemover removeAsset" data-asset-id="{{ pubAsset.asset.id }}" data-publication-id="{{ pubAsset.publication.id }}">
<a class="WorkZoneElementRemover removeAsset" data-asset-id="{{ asset.id }}" data-publication-id="{{ publicationId }}">
<i class="icomoon icon-circle fa-stack-2x" aria-hidden="true"></i>
<i class="icomoon icon-round-close-24px fa-stack-1x " aria-hidden="true"></i>
</a>