From: Vincent Vanwaelscappel Date: Wed, 4 Sep 2024 17:02:44 +0000 (+0200) Subject: wip #7063 @3 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=fe8222bb73cb5ab56bd298ae7c1a419ff725cb96;p=fluidbook-toolbox.git wip #7063 @3 --- diff --git a/app/Fluidbook/Packager/Download.php b/app/Fluidbook/Packager/Download.php index 53fca26a0..914ea6549 100644 --- a/app/Fluidbook/Packager/Download.php +++ b/app/Fluidbook/Packager/Download.php @@ -91,7 +91,7 @@ class Download extends DownloadBase { App::setLocale($this->user->preferredLocale()); $res = []; - try { + // try { $url = $this->_compileandpackage(); $translateVariables = ['title' => $this->_title(), 'nb' => $this->_id()]; @@ -151,13 +151,13 @@ class Download extends DownloadBase $subject = __($this->_loadbalancerSubject, $translateVariables); $text = __($this->_loadbalancerText, $translateVariables); } - } catch (\Exception $e) { - $subject = __('Erreur lors de la compilation du :type :nb', ['nb' => $this->_id(), 'type' => $this->type]); - $text = __('Détails de l\'erreur :message', ['message' => $e->getMessage() . ' at line ' . $e->getLine() . ' of ' . $e->getFile()]); - $actions = []; - $showTextIfNotEmail = true; - Log::error($e); - } +// } catch (\Exception $e) { +// $subject = __('Erreur lors de la compilation du :type :nb', ['nb' => $this->_id(), 'type' => $this->type]); +// $text = __('Détails de l\'erreur :message', ['message' => $e->getMessage() . ' at line ' . $e->getLine() . ' of ' . $e->getFile()]); +// $actions = []; +// $showTextIfNotEmail = true; +// Log::error($e); +// } if ($notify) { $this->sendNotification($subject, $text, $actions, $showTextIfNotEmail); diff --git a/app/Http/Controllers/Admin/Operations/FluidbookPublication/CompositionOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookPublication/CompositionOperation.php index 6f3de05e2..a47bcb52b 100644 --- a/app/Http/Controllers/Admin/Operations/FluidbookPublication/CompositionOperation.php +++ b/app/Http/Controllers/Admin/Operations/FluidbookPublication/CompositionOperation.php @@ -97,26 +97,13 @@ trait CompositionOperation protected function upload() { - $uploadID = Str::random(); - $file = request()->file('file'); if (null === $file) { abort(500); } - $fluidbook_id = request('fluidbook_id'); - $fluidbook = FluidbookPublication::withoutGlobalScopes()->find($fluidbook_id); - - $document = new FluidbookDocument(); - $document->region = $fluidbook->region; - $document->file = $file->getClientOriginalName(); - $document->file_data = ["fileName" => $file->getClientOriginalName(), "fileSize" => $file->getSize(), "modificationDate" => $file->getMTime(), "creationDate" => $file->getCTime()]; - $document->owner = backpack_user()->id; - $document->save(); - move_uploaded_file($file->getPathname(), Files::mkdir($document->path()) . 'original.pdf'); - FluidbookDocumentUpload::updateProgression($uploadID, $document->id, __('Mise en file d\'attente du traitement du document'), 1.2); - FluidbookDocumentUpload::dispatch($uploadID, $document, backpack_user(), $fluidbook->id); - return response()->json(['uploadID' => $uploadID, 'document' => $document->id]); + $res = FluidbookDocument::uploadToFluidbook($file, request('fluidbook_id'), backpack_user()); + return response()->json($res); } protected function docInfos($doc_id) diff --git a/app/Http/Controllers/Admin/Operations/Tools/FluidbookEasyCreation.php b/app/Http/Controllers/Admin/Operations/Tools/FluidbookEasyCreation.php new file mode 100644 index 000000000..a725cc84a --- /dev/null +++ b/app/Http/Controllers/Admin/Operations/Tools/FluidbookEasyCreation.php @@ -0,0 +1,39 @@ +setEnctype('multipart/form-data'); + $form->setTitle(__('Créer une publication')); + $form->setSubmitLabel(__('Créer la publication')); + $form->setSubmitIcon('las la-magic'); + $form->addField('file', StandardFile::class, __('Charger le fichier PDF'), ['accept' => '.pdf']); + $form->addField('base', FluidbookID::class, __('Configuration basée sur le fluidbook')); + $form->addField('title', Text::class, __('Titre')); + $form->addField('export', ExternalPath::class, __('Installation'), ['default' => '__FIRST__', 'servers_model' => FluidbookExternalInstallServer::class]); + + return view('tools.form', ['form' => $form]); + } + + public function dofluidbookeasycreation() + { + \App\Jobs\FluidbookEasyCreation::dispatch(request('base'), Files::move_uploaded_file(request()->file('file')), request('title'), request('export'), backpack_user(), true); + Alert::add('success', __('La production du fluidbook a été placée en file d\'attente. Vous recevrez une notification lorsqu\'elle sera terminée.'))->flash(); + return back(); + } +} diff --git a/app/Http/Controllers/Admin/ToolsController.php b/app/Http/Controllers/Admin/ToolsController.php index 51909465b..c29646755 100644 --- a/app/Http/Controllers/Admin/ToolsController.php +++ b/app/Http/Controllers/Admin/ToolsController.php @@ -11,6 +11,7 @@ use App\Http\Controllers\Admin\Operations\Tools\FluidbookAssetsDownloader; use App\Http\Controllers\Admin\Operations\Tools\FluidbookBranchCreate; use App\Http\Controllers\Admin\Operations\Tools\FluidbookBranchRemove; use App\Http\Controllers\Admin\Operations\Tools\FluidbookCopyLinks; +use App\Http\Controllers\Admin\Operations\Tools\FluidbookEasyCreation; use App\Http\Controllers\Admin\Operations\Tools\FluidbookReferencesURL; use App\Http\Controllers\Admin\Operations\Tools\FluidbookReplicate; use App\Http\Controllers\Admin\Operations\Tools\GitReposCreate; @@ -50,6 +51,7 @@ class ToolsController extends Controller use StaticSiteUploader; use PDFLayers; use Webfonts; + use FluidbookEasyCreation; protected function index($tool, $args = '') { diff --git a/app/Jobs/FluidbookEasyCreation.php b/app/Jobs/FluidbookEasyCreation.php new file mode 100644 index 000000000..a78cdcf8f --- /dev/null +++ b/app/Jobs/FluidbookEasyCreation.php @@ -0,0 +1,79 @@ +file = $file; + $this->base = $base; + $this->title = $title; + $this->export = $export; + $this->user = $user ?? backpack_user(); + $this->notify = $notify; + } + + public function handle() + { + /** @var FluidbookPublication $base */ + $base = FluidbookPublication::withoutGlobalScopes()->find($this->base); + $fluidbook = $base->replicateSettings(); + $fluidbook->setOwner($base->owner); + $fluidbook->title = $this->title; + $install = false; + if ($this->export['server']) { + $install = true; + $fluidbook->install_online = $this->export; + } + $fluidbook->saveQuietly(); + $res = FluidbookDocument::uploadToFluidbook(new \SplFileInfo($this->file), $fluidbook->id, $this->user, false); + + /** @var FluidbookDocument $document */ + $document = FluidbookDocument::withoutGlobalScopes()->find($res['document']); + $composition = []; + for ($i = 1; $i <= $document->pages; $i++) { + $composition[$i] = [$document->id, $i]; + } + + $fluidbook->setAttribute('composition', $composition); + $fluidbook->setStatus($install ? 2 : 1); + $fluidbook->save(); + + $download = new Download($fluidbook, 'online', $install ? 'install' : 'download', $this->user); + $download->package($this->notify); + } +} diff --git a/app/Jobs/Tools/Base.php b/app/Jobs/Tools/Base.php index b43e5f521..75e68787b 100644 --- a/app/Jobs/Tools/Base.php +++ b/app/Jobs/Tools/Base.php @@ -103,7 +103,7 @@ class Base extends \App\Jobs\Base /** * @param User $user */ - public function setUser(User $user): void + public function setUser(User|null $user): void { parent::setUser($user); $this->mail->setUser($user); @@ -153,7 +153,7 @@ class Base extends \App\Jobs\Base * @param \Exception $exception * @return void */ - public function failed(\Exception $exception) + public function failed(\Exception|\Throwable $exception) { $this->logger->critical($exception); $this->endJob(); diff --git a/app/Jobs/Tools/FluidbookAssetsDownloader.php b/app/Jobs/Tools/FluidbookAssetsDownloader.php index f6b47d97b..bd4e78dcc 100644 --- a/app/Jobs/Tools/FluidbookAssetsDownloader.php +++ b/app/Jobs/Tools/FluidbookAssetsDownloader.php @@ -15,7 +15,7 @@ class FluidbookAssetsDownloader extends Base protected $type; protected $dest; - protected $timeout = 7200; + public $timeout = 7200; public function __construct($url, $type, $fluidbook, $folder, $user) { diff --git a/app/Models/Base/ToolboxModel.php b/app/Models/Base/ToolboxModel.php index 819077ac0..b93add7b9 100644 --- a/app/Models/Base/ToolboxModel.php +++ b/app/Models/Base/ToolboxModel.php @@ -2,88 +2,18 @@ namespace App\Models\Base; -use App\Fields\Owner; -use App\Models\FluidbookPublication; +use App\Models\Traits\Owner; +use App\Models\Traits\Permissions; use Cubist\Backpack\Magic\Fields\HiddenDatetime; use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletes; -use Illuminate\Support\Facades\Auth; class ToolboxModel extends CubistMagicAbstractModel { use SoftDeletes; - - protected static $_ownerAttribute = 'owner'; - - public static function addOwnerClause(Builder $builder) - { - if (null === backpack_user() || null === Auth::id()) { - return; - } - if (Auth::user()->hasPermissionTo(static::$_permissionBase . ':admin')) { - return; - } - if (null === static::$_ownerAttribute) { - return; - } - $builder->whereIn(static::$_ownerAttribute, backpack_user()->getManagedUsers()); - } - - /** - * @param $id - * @param $permission - * @param $user - * @return bool - */ - public static function hasPermission($id, $permission = 'write', $user = null) - { - if (null === $user) { - $user = Auth::user(); - } - if (null === $user) { - return false; - } - - if ($user->hasPermissionTo(static::$_permissionBase . ':admin')) { - return true; - } - if (!$user->hasPermissionTo(static::$_permissionBase . ':' . $permission)) { - return false; - } - if ($id instanceof FluidbookPublication) { - return true; - } - $entry = static::find($id); - if (null === $entry) { - return false; - } - return true; - } - - public function addOwnerField($options = []) - { - if (can(static::$_permissionBase . ':admin')) { - $columnAttribute = 'allTreeInfos'; - } else { - $columnAttribute = 'basicTreeInfos'; - } - - $fieldSettings = [ - 'name' => static::$_ownerAttribute, - 'label' => __('Propriétaire'), - 'type' => Owner::class, - 'column' => true, - 'can' => static::$_permissionBase . ':set-owner', - 'column_attribute' => $columnAttribute, - 'column_escape' => false, - 'attribute' => 'companyWithName', - 'default' => Auth::id(), - 'non_default_tracking' => true, - ]; - - $this->addField(array_merge($fieldSettings, $options)); - } + protected static $_ownerAttribute='owner'; + use Owner; + use Permissions; public function addColumnDateFields($tab = null, $type = HiddenDatetime::class) { @@ -115,49 +45,6 @@ class ToolboxModel extends CubistMagicAbstractModel ); } - public function allowsDelete() - { - if (!can('fluidbook-publication:admin')) { - return false; - } - return true; - } - - public function allowsUpdate() - { - if (!can(static::$_permissionBase . ':write')) { - return false; - } - return true; - } - - public function allowsEdit() - { - return $this->allowsUpdate(); - } - - public function allowsClone() - { - return $this->allowsCreate(); - } - - public function allowsPreview() - { - if (can(static::$_permissionBase . ':write')) { - return true; - } - if (!can(static::$_permissionBase . ':read')) { - return false; - } - return true; - } - - public function setOwner($owner) - { - $this->{static::$_ownerAttribute} = $owner; - } - - public function getPreviewURL($attrs = []) { $routeName = $this->getOption('name') . '_preview'; diff --git a/app/Models/FluidbookDocument.php b/app/Models/FluidbookDocument.php index a45a6d66b..a5e1e795c 100644 --- a/app/Models/FluidbookDocument.php +++ b/app/Models/FluidbookDocument.php @@ -17,6 +17,8 @@ use Cubist\Util\CommandLine\Rsync; use Cubist\Util\Files\Files; use Cubist\Util\Gzip; use Cubist\Util\Math; +use Cubist\Util\Str; +use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Log; @@ -607,4 +609,24 @@ class FluidbookDocument extends ToolboxModel $this->echoStatus($uploadID); } + public static function uploadToFluidbook(\SplFileInfo $file, $fluidbookID, $owner, $async = true) + { + $uploadID = Str::random(); + + $fluidbook = FluidbookPublication::withoutGlobalScopes()->find($fluidbookID); + + $document = new FluidbookDocument(); + $document->region = $fluidbook->region; + $document->file = $file->getFilename(); + $document->file_data = ["fileName" => $file->getFilename(), "fileSize" => $file->getSize(), "modificationDate" => $file->getMTime(), "creationDate" => $file->getCTime()]; + $document->owner = $owner->id; + $document->save(); + + rename($file->getPathname(), Files::mkdir($document->path()) . 'original.pdf'); + FluidbookDocumentUpload::updateProgression($uploadID, $document->id, __('Mise en file d\'attente du traitement du document'), 1.2); + $dispatch = $async ? 'dispatch' : 'dispatchSync'; + FluidbookDocumentUpload::$dispatch($uploadID, $document, backpack_user(), $fluidbook->id); + return ['uploadID' => $uploadID, 'document' => $document->id]; + } + } diff --git a/app/Models/FluidbookExternalInstallServer.php b/app/Models/FluidbookExternalInstallServer.php index 87d3704dd..66b1cd6ac 100644 --- a/app/Models/FluidbookExternalInstallServer.php +++ b/app/Models/FluidbookExternalInstallServer.php @@ -2,8 +2,11 @@ namespace App\Models; +use App\Http\Controllers\Admin\Operations\ChangeownerOperation; use App\Http\Controllers\Admin\Operations\ServerOperation; use App\Jobs\HostingUpdate; +use App\Models\Traits\Owner; +use App\Models\Traits\Permissions; use Cubist\Backpack\Magic\Fields\Checkbox; use Cubist\Backpack\Magic\Fields\Table; use Cubist\Backpack\Magic\Fields\Textarea; @@ -28,7 +31,7 @@ class FluidbookExternalInstallServer extends ExternalServer protected static $_permissionBase = 'fluidbook-external-install-server'; - protected $_operations = [ServerOperation::class]; + protected $_operations = [ServerOperation::class, ChangeownerOperation::class]; protected static $hostingBasePaths = [ 'hosting' => '/mnt/hosting/', @@ -44,6 +47,11 @@ class FluidbookExternalInstallServer extends ExternalServer private static $id; + protected static $_ownerAttribute = 'owner'; + + use Owner; + use Permissions; + protected static function _getOneServer($server) { return array_merge(parent::_getOneServer($server), ['allows_root' => $server->allows_root]); @@ -55,6 +63,7 @@ class FluidbookExternalInstallServer extends ExternalServer $nothostingProtocols = array_diff(array_keys($this->getProtocols()), $hostingProtocols); parent::setFields(); + $this->addOwnerField(['column' => true]); $this->getField('base_url')->setAttribute('when', ['protocol' => $nothostingProtocols]); $this->addField('subdomains', Textarea::class, __('Sous-domaines'), ['when' => ['protocol' => $hostingProtocols]]); $this->addField('php', Checkbox::class, __('Activer le support de PHP'), ['default' => false, 'when' => ['protocol' => $hostingProtocols]]); diff --git a/app/Models/FluidbookPublication.php b/app/Models/FluidbookPublication.php index e4595cf70..a918e2d22 100644 --- a/app/Models/FluidbookPublication.php +++ b/app/Models/FluidbookPublication.php @@ -806,7 +806,9 @@ class FluidbookPublication extends ToolboxStatusModel $new->visits_counter = 0; $new->hash = ''; $new->cid = ''; - $new->owner = backpack_user()->id; + if (backpack_user() !== null) { + $new->owner = backpack_user()->id; + } $new->extranet_task = null; $new->version = 3; return $new; diff --git a/app/Models/Traits/Owner.php b/app/Models/Traits/Owner.php new file mode 100644 index 000000000..5ec18be55 --- /dev/null +++ b/app/Models/Traits/Owner.php @@ -0,0 +1,54 @@ +hasPermissionTo(static::$_permissionBase . ':admin')) { + return; + } + if (null === static::$_ownerAttribute) { + return; + } + $builder->whereIn(static::$_ownerAttribute, backpack_user()->getManagedUsers()); + } + + + public function setOwner($owner) + { + $this->{static::$_ownerAttribute} = $owner; + } + + public function addOwnerField($options = []) + { + if (can(static::$_permissionBase . ':admin')) { + $columnAttribute = 'allTreeInfos'; + } else { + $columnAttribute = 'basicTreeInfos'; + } + + $fieldSettings = [ + 'name' => static::$_ownerAttribute, + 'label' => __('Propriétaire'), + 'type' => \App\Fields\Owner::class, + 'column' => true, + 'can' => static::$_permissionBase . ':set-owner', + 'column_attribute' => $columnAttribute, + 'column_escape' => false, + 'attribute' => 'companyWithName', + 'default' => Auth::id(), + 'non_default_tracking' => true, + ]; + + $this->addField(array_merge($fieldSettings, $options)); + } + +} diff --git a/app/Models/Traits/Permissions.php b/app/Models/Traits/Permissions.php new file mode 100644 index 000000000..2c5ac3631 --- /dev/null +++ b/app/Models/Traits/Permissions.php @@ -0,0 +1,80 @@ +allowsUpdate(); + } + + public function allowsClone() + { + return $this->allowsCreate(); + } + + public function allowsPreview() + { + if (can(static::$_permissionBase . ':write')) { + return true; + } + if (!can(static::$_permissionBase . ':read')) { + return false; + } + return true; + } + + + /** + * @param $id + * @param $permission + * @param $user + * @return bool + */ + public static function hasPermission($id, $permission = 'write', $user = null) + { + if (null === $user) { + $user = Auth::user(); + } + if (null === $user) { + return false; + } + + if ($user->hasPermissionTo(static::$_permissionBase . ':admin')) { + return true; + } + if (!$user->hasPermissionTo(static::$_permissionBase . ':' . $permission)) { + return false; + } + if ($id instanceof FluidbookPublication) { + return true; + } + $entry = static::find($id); + if (null === $entry) { + return false; + } + return true; + } + +} diff --git a/composer.json b/composer.json index 8c5e85f31..2043f36d3 100644 --- a/composer.json +++ b/composer.json @@ -59,7 +59,9 @@ "nyholm/psr7": "^1.8", "php-ffmpeg/php-ffmpeg": "^v1.2.0", "php-http/curl-client": "^2.3", + "php-http/discovery": "^1.19", "php-http/message": "^1.16", + "php-http/message-factory": "^1.1", "pnz/mattermost-client": "dev-master", "rickselby/laravel-gate-cache": "^3.8", "rodneyrehm/plist": "^2.0", diff --git a/composer.lock b/composer.lock index abf137f92..a6ed52257 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cc2b0b718123cc1c7b0000fd115eaad7", + "content-hash": "0c1e26ecb97c25849f9c57b4177b0344", "packages": [ { "name": "archtechx/enums", @@ -8190,6 +8190,61 @@ }, "time": "2024-03-07T13:22:09+00:00" }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" + }, { "name": "php-http/multipart-stream-builder", "version": "1.4.0", @@ -17978,5 +18033,5 @@ "ext-zlib": "*" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.6.0" } diff --git a/resources/views/tools/sidebar.blade.php b/resources/views/tools/sidebar.blade.php index fc14d9b22..199961628 100644 --- a/resources/views/tools/sidebar.blade.php +++ b/resources/views/tools/sidebar.blade.php @@ -30,9 +30,14 @@ - + @can('fluidbook-publication:write') + + + @endcan