From ae264bdc96384758c7d63dc823cbb265cfebb5c6 Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Tue, 17 Sep 2019 16:32:40 +0200 Subject: [PATCH 1/5] - Fix Elasticsearch - Traitement des XML - Gestion du flux Arcadia - Changement interface --- app/Console/Commands/ImportMedia.php | 377 ++++++++++--------- app/Http/Controllers/MediaController.php | 67 +++- app/Http/Controllers/UploadController.php | 7 + app/Http/Traits/ArcadiaLink.php | 164 ++++++++ app/Http/Traits/ElasticTrait.php | 1 - app/Http/Traits/MediaTools.php | 6 +- config/filesystems.php | 9 + resources/js/media.js | 49 ++- resources/views/layouts/media_edit.blade.php | 10 +- storage/arcadia_link/.gitkeep | 1 + storage/arcadia_link/receive/.gitkeep | 1 + storage/arcadia_link/send/.gitkeep | 1 + 12 files changed, 475 insertions(+), 218 deletions(-) create mode 100644 app/Http/Traits/ArcadiaLink.php create mode 100644 storage/arcadia_link/.gitkeep create mode 100644 storage/arcadia_link/receive/.gitkeep create mode 100644 storage/arcadia_link/send/.gitkeep diff --git a/app/Console/Commands/ImportMedia.php b/app/Console/Commands/ImportMedia.php index 43e60b0..e52ab31 100644 --- a/app/Console/Commands/ImportMedia.php +++ b/app/Console/Commands/ImportMedia.php @@ -13,7 +13,7 @@ use App\Models\Dossier; class ImportMedia extends Command { - use MediaTools; + use MediaTools; /** * The name and signature of the console command. @@ -44,203 +44,224 @@ class ImportMedia extends Command * * @return mixed */ - public function handle() - { - $this->info('Démarrage du traitement'); - $files = Storage::disk('arcadia')->files(); + public function handle() + { + $this->info('Démarrage du traitement'); + + $files = File::glob(storage_path('export_arcadia') . "/DAM_MEDIA_VISUEL_*.*"); + + $this->line("-> Import du fichier DAM_MEDIA_VISUEL"); + // ---- Traitement de l'import des XML Visuel + foreach ($files as $filename) { + $path = explode("/", $filename); + $filename = $path[count($path) - 1]; + + // ---- Récupération du contenu + $oneFile = Storage::disk('arcadia')->get($filename); + $fileContent = simplexml_load_string($oneFile); + + // ---- traitement du fichier + $bar = $this->output->createProgressBar(count($fileContent->MEDIA_VISUEL)-1); + $bar->start(); + foreach ($fileContent->MEDIA_VISUEL as $row) { + $record = Media::where('arcadia_id', $row->code)->first(); + if (!$record) { // Insert new record + $record = new Media(); + $record->arcadia_id = $row->code; + if ($row->extension != "") { + $record->extension = $row->extension->typeFichier->libExtension; + } + + $record->libelle = $row->libelle; + $record->largeur = $row->nbPxLargeur; + $record->largeur_mm = $row->largeurMm; + $record->hauteur = $row->nbPxHauteur; + $record->hauteur_mm = $row->hauteurMm; + $record->resolution = $row->pppLargeur; + if ($row->version != "") { + $record->version = $row->version; + } else { + $record->version = 1; + } + + if ($row->codeTypeMedia != "") { + $record->typemedia_id = $row->codeTypeMedia; + } else { + $record->typemedia_id = 1; + } + if ($row->codeTypeVue != "") { + $record->typevue_id = $row->codeTypeVue; + } + $record->commentaire = $row->commentaire; + $record->sujet_id = $row->codeSujet; + if ($row->langue != "") { + $record->langue_id = $row->langue; + } + if ($row->copyright != "") { + $record->copyright_id = $row->copyright; + } + if ($row->codeVariante != "") { + $record->variante_id = $row->codeVariante; + } + if ($row->dateCreation != "") { + $row->dateCreation = substr($row->dateCreation, 0, 10); + $date = explode("/", $row->dateCreation); + $record->created_at = $date[2] . '-' . $date[1] . '-' . $date[0]; + } + if ($row->dateModification != "") { + $row->dateModification = substr($row->dateModification, 0, 10); + $date = explode("/", $row->dateModification); + $record->updated_at = $date[2] . '-' . $date[1] . '-' . $date[0]; + } + if ($row->datePublication != "") { + $row->datePublication = substr($row->datePublication, 0, 10); + $date = explode("/", $row->datePublication); + $record->published_at = $date[2] . '-' . $date[1] . '-' . $date[0]; + } + $record->statut = config('services.statut.public_etendu'); + + // Affectation d'un dossier et d'un uid + $destinationPath = $this->get_mediaFolder() . "/"; + $record->folder = $destinationPath; + $record->uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)); + $mediaFile = "/images/" . $record->arcadia_id . "." . $record->extension; + $fileExists = Storage::disk('arcadia')->exists($mediaFile); + if ($fileExists) { + // déplacement du média et renommage du fichier + $file = Storage::disk('arcadia')->get($mediaFile); + $full_path_source = Storage::disk('arcadia')->getDriver()->getAdapter()->applyPathPrefix($mediaFile); + $full_path_dest = Storage::disk('local')->getDriver()->getAdapter()->applyPathPrefix($destinationPath . $record->uid . '.' . $record->extension); + File::move($full_path_source, $full_path_dest); - $this->line("-> Import du fichier DAM_MEDIA_VISUEL"); - // ---- Traitement de l'import des XML Visuel - foreach ($files as $filename) { + // calcul de la taille du média + $record->taille = $this->formatBytes($this->get_file_size($full_path_dest)); - if($filename == ".gitignore") continue; + } else { + // on applique une image par défaut + $record->extension = "jpg"; + Storage::disk('local')->copy("images/default.jpg", $destinationPath . $record->uid . '.' . $record->extension); - // ---- Récupération du contenu - $oneFile = Storage::disk('arcadia')->get($filename); - $fileContent = simplexml_load_string($oneFile); - - // ---- traitement du fichier - if (substr($filename, 0, 16) == "DAM_MEDIA_VISUEL") { - foreach ($fileContent->MEDIA_VISUEL as $row) { - $record = Media::where('arcadia_id', $row->code)->first(); - if(!$record){ // Insert new record - $record = new Media(); - $record->arcadia_id = $row->code; - if($row->extension != ""){ - $record->extension = $row->extension->typeFichier->libExtension; - } - - $record->libelle = $row->libelle; - $record->largeur = $row->nbPxLargeur; - $record->largeur_mm = $row->largeurMm; - $record->hauteur = $row->nbPxHauteur; - $record->hauteur_mm = $row->hauteurMm; - $record->resolution = $row->pppLargeur; - if($row->version != ""){ - $record->version = $row->version; - }else{ - $record->version = 1; - } - - if($row->codeTypeMedia != ""){ - $record->typemedia_id = $row->codeTypeMedia; - }else{ - $record->typemedia_id = 1; - } - if($row->codeTypeVue != ""){ - $record->typevue_id = $row->codeTypeVue; - } - $record->commentaire = $row->commentaire; - $record->sujet_id = $row->codeSujet; - if($row->langue != ""){ - $record->langue_id = $row->langue; - } - if($row->copyright != ""){ - $record->copyright_id = $row->copyright; - } - if($row->codeVariante != ""){ - $record->variante_id = $row->codeVariante; - } - if($row->dateCreation != ""){ - $row->dateCreation = substr($row->dateCreation, 0, 10); - $date = explode("/", $row->dateCreation); - $record->created_at = $date[2].'-'.$date[1].'-'.$date[0]; - } - if($row->dateModification != ""){ - $row->dateModification = substr($row->dateModification, 0, 10); - $date = explode("/", $row->dateModification); - $record->updated_at = $date[2].'-'.$date[1].'-'.$date[0]; - } - if($row->datePublication != ""){ - $row->datePublication = substr($row->datePublication, 0, 10); - $date = explode("/", $row->datePublication); - $record->published_at = $date[2].'-'.$date[1].'-'.$date[0]; - } - $record->statut = config('services.statut.public_etendu'); - - // Affectation d'un dossier et d'un uid - $destinationPath = $this->get_mediaFolder()."/"; - $record->folder = $destinationPath; - $record->uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)); + // calcul de la taille du média + $record->taille = $this->formatBytes($this->get_file_size("public/" . $destinationPath . $record->uid . '.' . $record->extension)); + } - $mediaFile = "/images/".$record->arcadia_id.".".$record->extension; - $fileExists = Storage::disk('arcadia')->exists($mediaFile); - if($fileExists){ - // déplacement du média et renommage du fichier - $file = Storage::disk('arcadia')->get($mediaFile); - $full_path_source = Storage::disk('arcadia')->getDriver()->getAdapter()->applyPathPrefix($mediaFile); - $full_path_dest = Storage::disk('local')->getDriver()->getAdapter()->applyPathPrefix($destinationPath.$record->uid. '.' .$record->extension); - File::move($full_path_source, $full_path_dest); + $record->save(); - // calcul de la taille du média - $record->taille = $this->formatBytes($this->get_file_size($full_path_dest)); + // ---- Creation des vignettes de base + $this->create_sys_thumb($record); + // ---- Creation des vignettes en lien avec le sujet du média + $this->create_thumb($record); + } else { + $this->line("DAM_MEDIA_VISUEL : le media n°" . $row->code . " existe déjà en base"); + } + $bar->advance(); + } + $bar->finish(); - }else{ - // on applique une image par défaut - $record->extension = "jpg"; - Storage::disk('local')->copy("images/default.jpg", $destinationPath.$record->uid. '.' .$record->extension); + // ---- Suppression du fichier + //Storage::disk('arcadia')->delete($filename); - // calcul de la taille du média - $record->taille = $this->formatBytes($this->get_file_size("public/".$destinationPath.$record->uid. '.' .$record->extension)); - } + } - $record->save(); + // ---- Traitement de l'association media <-> article + $files = File::glob(storage_path('export_arcadia') . "/DAM_ASSO_ARTICLE_*.*"); + $this->line("-> Import du fichier DAM_ASSO_ARTICLE"); + foreach ($files as $filename) { + $path = explode("/", $filename); + $filename = $path[count($path) - 1]; - // ---- Creation des vignettes de base - $this->create_sys_thumb($record); - // ---- Creation des vignettes en lien avec le sujet du média - $this->create_thumb($record); - }else{ - $this->line("DAM_MEDIA_VISUEL : le media n°".$row->code. " existe déjà en base"); - } - } + // ---- Récupération du contenu + $oneFile = Storage::disk('arcadia')->get($filename); + $fileContent = simplexml_load_string($oneFile); - // ---- Suppression du fichier - //Storage::disk('arcadia')->delete($filename); + // ---- traitement du fichier + $bar = $this->output->createProgressBar(count($fileContent->mediaassoarticle)-1); + $bar->start(); + foreach ($fileContent->mediaassoarticle as $row) { + $record = Media::where('arcadia_id', $row->codeVisuel)->first(); + if ($record) { + $article = Article::where('noArt', $row->noArt)->first(); + if ($article) { + // attache l'article au média + $record->articles()->syncWithoutDetaching($article->id); + // recherche un dossier lié à la marque de l'article + $marque_id = $article->codMarq; + $dossier = Dossier::whereHas("marques", function ($query) use ($marque_id) { + $query->where("codMarq", $marque_id); + })->first(); - } - } + if ($dossier) { + // attache le dossier marque au Média + $record->dossier_id = $dossier->id; + $record->save(); + $this->line("Liason media n°" . $row->codeVisuel . " à la marque n°" . $article->libMarq); + } else { + $marque = Marque::where('codMarq', '=', $marque_id)->first(); + // On cree le dossier + $dossier = new Dossier(); + $dossier->libelle = $marque->libMarq; + $dossier->sujet_id = 1; + $dossier->system = 0; + $dossier->marques()->syncWithoutDetaching($marque_id); + $dossier->save(); + + $record->dossier_id = $dossier->id; + $record->save(); + $this->line("Liason media n°" . $row->codeVisuel . " à la marque n°" . $article->libMarq); + //$this->line("pas de liaison de marque : le media n°".$row->codeVisuel. " ne peut être lié à l'article n°".$row->noArt); + } + } else { + $this->line("DAM_ASSO_ARTICLE : le media n°" . $row->codeVisuel . " ne peut être lié à l'article n°" . $row->noArt); + } + } else { + $this->line("DAM_ASSO_ARTICLE : le media n°" . $row->codeVisuel . " n'existe pas"); + } + $bar->advance(); + } + $bar->finish(); + + // ---- Suppression du fichier + //Storage::disk('arcadia')->delete($filename); + } - // ---- Traitement de l'association media <-> article - $this->line("-> Import du fichier DAM_ASSO_ARTICLE"); - foreach ($files as $filename) { - if($filename == ".gitignore") continue; + // ---- Traitement de l'association media <-> marque + $files = File::glob(storage_path('export_arcadia') . "/DAM_ASSO_MARQUE_*.*"); + $this->line("-> Import du fichier DAM_ASSO_MARQUE"); + foreach ($files as $filename) { + $path = explode("/", $filename); + $filename = $path[count($path) - 1]; - // ---- Récupération du contenu - $oneFile = Storage::disk('arcadia')->get($filename); - $fileContent = simplexml_load_string($oneFile); + // ---- Récupération du contenu + $oneFile = Storage::disk('arcadia')->get($filename); + $fileContent = simplexml_load_string($oneFile); - // ---- traitement du fichier - if (substr($filename, 0, 16) == "DAM_ASSO_ARTICLE") { - foreach ($fileContent->mediaassoarticle as $row) { - $record = Media::where('arcadia_id', $row->codeVisuel)->first(); - if($record){ - $article = Article::where('noArt', $row->noArt)->first(); - if($article){ - // attache l'article au média - $record->articles()->syncWithoutDetaching ($article->id); - // recherche un dossier lié à la marque de l'article - $marque_id = $article->codMarq; - $dossier = Dossier::whereHas("marques", function($query) use ($marque_id){ - $query->where("codMarq", $marque_id); - })->first(); + // ---- traitement du fichier + $bar = $this->output->createProgressBar(count($fileContent->mediaassomarque)-1); + $bar->start(); + foreach ($fileContent->mediaassomarque as $row) { + $record = Media::where('arcadia_id', $row->codeVisuel)->first(); + if ($record) { + // attache la marque au média + $record->marques()->attach($row->codMarq); + } else { + $this->line("DAM_ASSO_MARQUE : le media n°" . $row->codeVisuel . " n'existe pas"); + } + $bar->advance(); + } + $bar->finish(); - if($dossier){ - // attache le dossier marque au Média - $record->dossier_id = $dossier->id; - $record->save(); - $this->line("Liason media n°".$row->codeVisuel. " à la marque n°".$article->libMarq); - }else{ - $this->line("pas de liaison de marque : le media n°".$row->codeVisuel. " ne peut être lié à l'article n°".$row->noArt); - } - }else{ - $this->line("DAM_ASSO_ARTICLE : le media n°".$row->codeVisuel. " ne peut être lié à l'article n°".$row->noArt); - } - }else{ - $this->line("DAM_ASSO_ARTICLE : le media n°".$row->codeVisuel. " n'existe pas"); - } - } + // ---- Suppression du fichier + //Storage::disk('arcadia')->delete($filename); + } - // ---- Suppression du fichier - //Storage::disk('arcadia')->delete($filename); - } - } + // TODO : Import de l'association des sociétés - - // ---- Traitement de l'association media <-> marque - $this->line("-> Import du fichier DAM_ASSO_MARQUE"); - foreach ($files as $filename) { - if($filename == ".gitignore") continue; - - // ---- Récupération du contenu - $oneFile = Storage::disk('arcadia')->get($filename); - $fileContent = simplexml_load_string($oneFile); - - // ---- traitement du fichier - if (substr($filename, 0, 15) == "DAM_ASSO_MARQUE") { - foreach ($fileContent->mediaassomarque as $row) { - $record = Media::where('arcadia_id', $row->codeVisuel)->first(); - if($record){ - // attache la marque au média - $record->marques()->attach($row->codMarq); - }else{ - $this->line("DAM_ASSO_MARQUE : le media n°".$row->codeVisuel. " n'existe pas"); - } - } - - // ---- Suppression du fichier - //Storage::disk('arcadia')->delete($filename); - } - } - - // TODO : Import de l'association des sociétés - - $this->line(""); - $this->info('Fin du traitement'); - } + $this->line(""); + $this->info('Fin du traitement'); + } } diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index d3322e2..ca8fd42 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Http\Traits\ArcadiaLink; use Elasticquent\ElasticquentTrait; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; @@ -481,6 +482,16 @@ class MediaController extends Controller $historique->description = "Média déplacé à la racine"; } $media->save(); + + // Elasticsearch + $id = $media->id; + $media = Media::find($id); + $media->removeFromIndex(); + $media->addToIndex(); + + // Lien Arcadia + ArcadiaLink::update($media); + $historique->save(); } } @@ -511,7 +522,13 @@ class MediaController extends Controller $historique->description = "Le média a été supprimé"; $historique->save(); + // Elasticsearch + $media->removeFromIndex(); + $media->delete(); + + // Lien Arcadia + ArcadiaLink::delete($media); } return json_encode($deletedMediasList); @@ -574,7 +591,6 @@ class MediaController extends Controller { Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR'), config('roles.const.CONTRIBUTEUR')]); $user_id = Auth::user()->id; - $response = array(); $mediaUpdate = (object)$request->input('media'); $media = Media::where('id', $mediaUpdate->id)->first(); @@ -651,9 +667,14 @@ class MediaController extends Controller } // ---- Index dans Elasticsearch + $id = $media->id; + $media = Media::find($id); $media->removeFromIndex(); $media->addToIndex(); + // Lien Arcadia + ArcadiaLink::update($media); + // ---- Historique des actions $historique = new historique(); $historique->user_id = $user_id; @@ -664,7 +685,7 @@ class MediaController extends Controller } - $response = true; + $response = array('status' => true, 'sujet_id' => $media->sujet_id); return json_encode($response); } @@ -698,6 +719,15 @@ class MediaController extends Controller // ---- Sauvegarde de la nouvelle étiquette $media->etiquette_id = $etiquette_id; $media->save(); + + // ---- Index dans Elasticsearch + $id = $media->id; + $media = Media::find($id); + $media->removeFromIndex(); + $media->addToIndex(); + + // Lien Arcadia + ArcadiaLink::update($media); } } } @@ -752,6 +782,12 @@ class MediaController extends Controller $media->taille = $this->formatBytes($this->get_file_size($mediaPath)); $media->save(); + // ---- Index dans Elasticsearch + $id = $media->id; + $media = Media::find($id); + $media->removeFromIndex(); + $media->addToIndex(); + $historique = new historique(); $historique->user_id = Auth::user()->id;; $historique->media_id = $media->id; @@ -764,6 +800,9 @@ class MediaController extends Controller // ---- Creation des vignettes en lien avec le sujet du média $this->create_thumb($media); $response = $media; + + // Lien Arcadia + ArcadiaLink::update($media); } return json_encode($response); @@ -778,28 +817,24 @@ class MediaController extends Controller Auth::user()->authorizeRoles([config('roles.const.ADMIN')]); $response = false; $media_id = $request->input('media_id'); - $arcadia_id = $request->input('arcadia_id'); $historique = new historique(); $historique->user_id = Auth::user()->id; $historique->media_id = $media_id; $historique->type = "Modification"; - - if ($arcadia_id == "" || $arcadia_id == 0) { - $arcadia_id = NULL; - $historique->description = "Suppression de la référence Arcadia"; - } else { - $historique->description = "Ajout de la référence Arcadia " . $arcadia_id; - $media = Media::where('arcadia_id', $arcadia_id)->first(); - if ($media) return json_encode($response); - } + $historique->description = "Ajout de la liaison Arcadia"; $media = Media::where('id', $media_id)->first(); if ($media) { - $media->arcadia_id = $arcadia_id; + $media->isLocked = 1; $media->save(); + // Lien Arcadia + ArcadiaLink::create($media); + // ---- Index dans Elasticsearch + $id = $media->id; + $media = Media::find($id); $media->removeFromIndex(); $media->addToIndex(); @@ -935,8 +970,13 @@ class MediaController extends Controller $media->largeur_mm = ""; $media->hauteur_mm = ""; } + + $media->isDefault = 1; $media->save(); + $id = $media->id; + $media = Media::find($id); + // ---- Index dans Elasticsearch $media->addToIndex(); @@ -960,7 +1000,6 @@ class MediaController extends Controller $historique->description = "Média ajouté"; $historique->save(); - return json_encode($response); } } diff --git a/app/Http/Controllers/UploadController.php b/app/Http/Controllers/UploadController.php index dae7b71..99d340a 100644 --- a/app/Http/Controllers/UploadController.php +++ b/app/Http/Controllers/UploadController.php @@ -1,6 +1,7 @@ folder.$media->uid, '/'); $matchingFiles = preg_grep('/^'.$filepath.'/', $filesfF); Storage::delete($matchingFiles); + + $media->isDefault = 0; + $media->save(); + }else{ // On déplace le fichier dans le répertoire des médias Storage::move("uploads/".$filename, $destinationPath.$filename); @@ -200,6 +205,8 @@ class UploadController extends Controller { break; } + $id = $media->id; + $media = Media::find($id); // ---- Index dans Elasticsearch $media->addToIndex(); diff --git a/app/Http/Traits/ArcadiaLink.php b/app/Http/Traits/ArcadiaLink.php new file mode 100644 index 0000000..a9a53e0 --- /dev/null +++ b/app/Http/Traits/ArcadiaLink.php @@ -0,0 +1,164 @@ +arcadia_id === NULL) + return; + self::convert(self::getXML($media, "M"), $media); + } + + public static function delete($media) + { + if ($media->arcadia_id === NULL) + return; + $dom = new DOMDocument('1.0','UTF-8'); + $dom->formatOutput = true; + $root = $dom->createElement('MEDIA_VISUEL'); + $dom->appendChild($root); + $root->appendChild($dom->createElement('codeArcadia'))->appendChild($dom->createCDATASection( "$media->arcadia_id")); + $root->appendChild($dom->createElement('code_DAM'))->appendChild($dom->createCDATASection( "$media->id")); + $root->appendChild( $dom->createElement('TypeMouvement'))->appendChild($dom->createCDATASection( "S")); + $xml = $dom->saveXML(); + + self::convert($xml, $media); + } + + public static function reactivate($media) + { + if ($media->arcadia_id === NULL) + return; + $dom = new DOMDocument('1.0','UTF-8'); + $dom->formatOutput = true; + $root = $dom->createElement('MEDIA_VISUEL'); + $dom->appendChild($root); + $root->appendChild($dom->createElement('codeArcadia'))->appendChild($dom->createCDATASection( "$media->arcadia_id")); + $root->appendChild($dom->createElement('code_DAM'))->appendChild($dom->createCDATASection( "$media->id")); + $root->appendChild( $dom->createElement('TypeMouvement'))->appendChild($dom->createCDATASection( "R")); + $xml = $dom->saveXML(); + + self::convert($xml, $media); + } + + private static function convert($xml, $media) + { + $uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)); + Storage::disk('arcadia_link_s')->put("$uid.xml", $xml); + self::compress($media->folder, $media->uid, $media->extension, $uid); + } + + private static function compress($folder, $name, $extension, $uid) + { + try { + $a = new \PharData( storage_path('arcadia_link/send') ."/$uid.tmp"); + + // ADD FILES TO archive.tar FILE + $a->addFile(storage_path('arcadia_link/send') . "/$uid.xml", 'media.xml'); + $a->addFile(public_path() . "/$folder$name.$extension", "$name.$extension"); + + // COMPRESS archive.tar FILE. COMPRESSED FILE WILL BE archive.tar.gz + $a->compress(\Phar::NONE); + + // NOTE THAT BOTH FILES WILL EXISTS. SO IF YOU WANT YOU CAN UNLINK archive.tar + unset($a); + unlink(storage_path('arcadia_link/send') . "/$uid.tmp"); + unlink(storage_path('arcadia_link/send') . "/$uid.xml"); + } catch (Exception $e) { + //echo "Exception : " . $e; + // TODO : Envoi mail Log + Log::emergency("Erreur création .tar : $e (Traits/ArcadiaLink)"); + } + } + + private static function getXML($media, $mouvement) + { + $refKey = self::getRefKey($media); + $formats = self::getFormats(); + + $dom = new DOMDocument('1.0','UTF-8'); + $dom->formatOutput = true; + + $root = $dom->createElement('MEDIA_VISUEL'); + $dom->appendChild($root); + + $root->appendChild($dom->createElement('codeArcadia'))->appendChild($dom->createCDATASection( "$media->arcadia_id")); + $root->appendChild($dom->createElement('code_DAM'))->appendChild($dom->createCDATASection( "$media->id")); + $root->appendChild( $dom->createElement('TypeMouvement'))->appendChild($dom->createCDATASection( "$mouvement")); + + $cleRef = $root->appendChild( $dom->createElement('cle_Referentiel')); + + foreach ($refKey as $k) { + $cleRef->appendChild( $dom->createElement('id'))->appendChild($dom->createCDATASection( "$k->id")); + } + + $root->appendChild( $dom->createElement('libExtension'))->appendChild($dom->createCDATASection( "$media->extension")); + $root->appendChild( $dom->createElement('nbPxLargeur'))->appendChild($dom->createCDATASection( "$media->largeur")); + $root->appendChild( $dom->createElement('largeurMm'))->appendChild($dom->createCDATASection( "$media->largeur_mm")); + $root->appendChild( $dom->createElement('nbPxHauteur'))->appendChild($dom->createCDATASection( "$media->hauteur")); + $root->appendChild( $dom->createElement('hauteurMm'))->appendChild($dom->createCDATASection( "$media->hauteur_mm")); + $root->appendChild( $dom->createElement('pppLargeur'))->appendChild($dom->createCDATASection( "$media->resolution")); + $root->appendChild( $dom->createElement('version'))->appendChild($dom->createCDATASection( "$media->version")); + $root->appendChild( $dom->createElement('codeTypeMedia'))->appendChild($dom->createCDATASection( "$media->typemedia_id")); + $root->appendChild( $dom->createElement('codeTypeVue'))->appendChild($dom->createCDATASection( "$media->typevue_id")); + $root->appendChild( $dom->createElement('commentaire'))->appendChild($dom->createCDATASection( "$media->commentaire")); + $root->appendChild( $dom->createElement('codeSujet'))->appendChild($dom->createCDATASection( "$media->sujet_id")); + $root->appendChild( $dom->createElement('langue'))->appendChild($dom->createCDATASection( "$media->langue_id")); + $root->appendChild( $dom->createElement('copyright'))->appendChild($dom->createCDATASection( "$media->copyright_id")); + $root->appendChild( $dom->createElement('codeVariante'))->appendChild($dom->createCDATASection( "$media->variante_id")); + $root->appendChild( $dom->createElement('dateCreation'))->appendChild($dom->createCDATASection( "$media->created_at")); + $root->appendChild( $dom->createElement('dateModification'))->appendChild($dom->createCDATASection( "$media->updated_at")); + $root->appendChild( $dom->createElement('datePublication'))->appendChild($dom->createCDATASection( "$media->published_at")); + $root->appendChild( $dom->createElement('libelle'))->appendChild($dom->createCDATASection( "$media->libelle")); + $root->appendChild( $dom->createElement('NomFichier'))->appendChild($dom->createCDATASection( "$media->uid.$media->extension")); + + $mediaFormat = $root->appendChild( $dom->createElement('formats')); + + foreach ($formats as $k) { + $format = $mediaFormat->appendChild( $dom->createElement('format')); + $format->appendChild( $dom->createElement('id'))->appendChild($dom->createCDATASection( $k['id'])); + $format->appendChild( $dom->createElement('libelle'))->appendChild($dom->createCDATASection( $k['libelle'])); + $format->appendChild( $dom->createElement('extension'))->appendChild($dom->createCDATASection("$media->extension")); + $format->appendChild( $dom->createElement('largeur'))->appendChild($dom->createCDATASection( $k['largeur'])); + $format->appendChild( $dom->createElement('hauteur'))->appendChild($dom->createCDATASection( $k['hauteur'])); + $format->appendChild( $dom->createElement('lien'))->appendChild($dom->createCDATASection(env('APP_URL') . "/$media->folder$media->uid" . "_" . $k['libelle'] . ".$media->extension")); + } + + return $dom->saveXML(); + } + + private static function getRefKey($media) + { + switch ($media->sujet_id){ + case 1: + return $media->articles()->get(); + break; + case 2: + return $media->marques()->get(); + break; + case 4: + return $media->societes()->get(); + break; + default: + return []; + } + } + + private static function getFormats() + { + return Format::withoutGlobalScope(SystemScope::class)->where('system', '=', '1')->get(); + } +} diff --git a/app/Http/Traits/ElasticTrait.php b/app/Http/Traits/ElasticTrait.php index f2891a5..ae5ccea 100644 --- a/app/Http/Traits/ElasticTrait.php +++ b/app/Http/Traits/ElasticTrait.php @@ -1,7 +1,6 @@ sujet->formats; $mediaPath = public_path()."/".$media->folder.$media->uid.".".$media->extension; - $im = new \imagick($mediaPath); + $im = new \Imagick($mediaPath); $im->setImageBackgroundColor('#ffffff'); $im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE); $im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN); @@ -38,12 +38,13 @@ trait MediaTools { $im->writeImage($fp); } $im->destroy(); + unset($im); } public function create_sys_thumb($media) { $mediaPath = public_path()."/".$media->folder.$media->uid.".".$media->extension; - $im = new \imagick(); + $im = new \Imagick(); $im->readImage($mediaPath); if(in_array($media->extension, array("pdf", "ai", "psd")) ){ @@ -82,6 +83,7 @@ trait MediaTools { $im->thumbnailImage(200, 200 , true); $im->writeImage($fp); $im->destroy(); + unset($im); } public function get_mediaFolder() { diff --git a/config/filesystems.php b/config/filesystems.php index 607760d..292a1ea 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -60,6 +60,15 @@ return [ 'root' => storage_path('export_arcadia'), ], + 'arcadia_link_s' => [ + 'driver' => 'local', + 'root' => storage_path('arcadia_link/send'), + ], + 'arcadia_link_r' => [ + 'driver' => 'local', + 'root' => storage_path('arcadia_link/receive'), + ], + 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), diff --git a/resources/js/media.js b/resources/js/media.js index caf8044..145d093 100644 --- a/resources/js/media.js +++ b/resources/js/media.js @@ -713,7 +713,7 @@ $(document).ready(function() { }, success: function(result){ // chargement des données - $(".tab_edit #arcadia_id").val(result.data.arcadia_id); + $(".tab_edit #arcadia_id").val(result.data.arcadia_id); $(".tab_edit #libelle").val(result.data.libelle); $(".tab_edit #sujetLibelle").val(result.data.sujet.libelle); $(".tab_edit #typevues").val(result.data.typevue_id); @@ -786,11 +786,33 @@ $(document).ready(function() { $(".tab_edit #hauteur_mm").val(result.data.hauteur_mm); // Config de la fiche d'édition - if(result.data.sujet.sujet_arcadia == 0){ + // Si le media n'est pas un sujet Arcadia ou si le media n'est pas une image on masque l'option Arcadia + // 1 = Photos et 5 = jpg + if(result.data.sujet.sujet_arcadia == 0 || result.data.isDefault == 1 || (result.data.typemedia_id != 1 && result.data.typemedia_id != 5)){ $(".tab_edit .arcadia_fields").hide(); }else{ $(".tab_edit .arcadia_fields").show(); } + + // Si le media est lie a Arcadia ou si le media est en attente d'Arcadia + if (result.data.arcadia_id != null || result.data.isLocked == 1){ + $(".btn-arcadia-link").hide(); + $(".btn-arcadia-remove-link").show(); + }else{ + $(".btn-arcadia-link").show(); + $(".btn-arcadia-remove-link").hide(); + } + // Si le media est en attente d'Arcadia + if(result.data.isLocked == 1){ + $(".btn-arcadia-remove-link").attr('disabled', true); + $(".btn_tab_edit_save").attr('disabled', true); + $(".is-locked").show(); + }else{ + $(".btn-arcadia-remove-link").attr('disabled', false); + $(".btn_tab_edit_save").attr('disabled', false); + $(".is-locked").hide(); + } + $(".tab_edit .article_form, .tab_edit .marque_form, .tab_edit .societe_form").hide(); switch (result.data.sujet_id) { case 1: // Visuel Article @@ -865,38 +887,24 @@ $(document).ready(function() { // ---- Bouton Arcadia $('.tab_edit .btn-arcadia-link').on('click', function(event){ event.preventDefault(); - var arcadia_id = $("#arcadia_id").val(); - arcadia_id = prompt("Indiquez le code Arcadia de ce média", arcadia_id); - - // Si la saisie est vide on affiche le message d'erreur et on n'execute pas l'ajax - if (arcadia_id === "") { - $.fancybox.close(); - $.fancyMessage({ - title: "Lier un média à Arcadia", - message: "Le code Arcadia est vide.", - type: "error" - }); + var result = confirm("Etes-vous sur de vouloir lancer le traitement ?"); + if (result != true) return; - }else if (arcadia_id === null) { - return; - } $.ajax({ url: '/ajax/set-id-arcadia', method: 'POST', dataType : 'json', data: { - arcadia_id: arcadia_id, media_id : $(window).data('current_edit_media'), }, success: function(result){ if(result == true){ $.fancybox.close(); - $.fancyMessage({title : "Lier un média à Arcadia", message : "Le code Arcadia a bien été ajouté au média", type : "info"}); - $("#arcadia_id").val(arcadia_id); + $.fancyMessage({title : "Lier un média à Arcadia", message : "La demande à été effectuée, votre média est temporairement bloqué.", type : "info"}); }else{ $.fancybox.close(); - $.fancyMessage({title : "Lier un média à Arcadia", message : "Ce code a déjà été attribué à un autre média. Ajout impossible.", type : "error"}); + $.fancyMessage({title : "Lier un média à Arcadia", message : "Une erreur est survenue. Traitement impossible.", type : "error"}); } }, error: function(jqXHR, textStatus, errorThrown) { @@ -1164,6 +1172,7 @@ $(document).ready(function() { }, success: function(result){ $.fancyMessage({title : "Sauvegarde d'un média", message : "Les données ont bien été enregistrées", type : "info"}); + loadMedia(result.sujet_id); }, error: function(jqXHR, textStatus, errorThrown) { $.fancyMessage({title : "Sauvegarde d'un média", message : "Erreur lors de l'enregistrement. Merci d'actualiser la page.", type : "error"}); diff --git a/resources/views/layouts/media_edit.blade.php b/resources/views/layouts/media_edit.blade.php index bc3fb09..ef94f1c 100644 --- a/resources/views/layouts/media_edit.blade.php +++ b/resources/views/layouts/media_edit.blade.php @@ -21,11 +21,12 @@

Informations générales

- + +
- @if (Auth::user()->hasRole(config('roles.const.ADMIN'))) - + + @endif
@@ -221,6 +222,9 @@
Fermer + @if (Auth::user()->hasRole(config('roles.const.ADMIN'))) + + @endif @if (Auth::user()->hasRole([config('roles.const.CONTRIBUTEUR'), config('roles.const.ADMIN'), config('roles.const.REDACTEUR')])) @endif diff --git a/storage/arcadia_link/.gitkeep b/storage/arcadia_link/.gitkeep new file mode 100644 index 0000000..77f2af2 --- /dev/null +++ b/storage/arcadia_link/.gitkeep @@ -0,0 +1 @@ +gitkeep diff --git a/storage/arcadia_link/receive/.gitkeep b/storage/arcadia_link/receive/.gitkeep new file mode 100644 index 0000000..77f2af2 --- /dev/null +++ b/storage/arcadia_link/receive/.gitkeep @@ -0,0 +1 @@ +gitkeep diff --git a/storage/arcadia_link/send/.gitkeep b/storage/arcadia_link/send/.gitkeep new file mode 100644 index 0000000..77f2af2 --- /dev/null +++ b/storage/arcadia_link/send/.gitkeep @@ -0,0 +1 @@ +gitkeep From 1c22e7a04d86e8c7c5e247ee5f48436abb847401 Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Tue, 17 Sep 2019 16:45:02 +0200 Subject: [PATCH 2/5] Ajout Commands/ArcadiaLink --- app/Console/Commands/ArcadiaLink.php | 74 ++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 app/Console/Commands/ArcadiaLink.php diff --git a/app/Console/Commands/ArcadiaLink.php b/app/Console/Commands/ArcadiaLink.php new file mode 100644 index 0000000..0abe013 --- /dev/null +++ b/app/Console/Commands/ArcadiaLink.php @@ -0,0 +1,74 @@ +info('Démarrage du traitement'); + $files = Storage::disk('arcadia_link_r')->files(); + $bar = $this->output->createProgressBar(count($files)-1); + $bar->start(); + + foreach ($files as $filename) { + if($filename == ".gitignore" || $filename == ".gitkeep") continue; + + // ---- Récupération du contenu + $files = Storage::disk('arcadia_link_r')->get($filename); + $fileContent = simplexml_load_string($files, null, LIBXML_NOCDATA); + + $media = Media::find($fileContent->code_DAM); + $media->arcadia_id = $fileContent->codeArcadia; + $media->version = $fileContent->version; + $media->isLocked = 0; + $media->save(); + + // ---- Index dans Elasticsearch + $id = $media->id; + $media = Media::find($id); + $media->removeFromIndex(); + $media->addToIndex(); + + //Storage::disk('arcadia_link_r')->delete($filename); + $bar->advance(); + } + + $bar->finish(); + $this->line(""); + $this->info('Fin du traitement'); + } +} From 215ae6921457884376dda39be0e90b0646da25dc Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Wed, 18 Sep 2019 16:41:45 +0200 Subject: [PATCH 3/5] =?UTF-8?q?-=20Ajout=20condition=20existence=20dans=20?= =?UTF-8?q?Elasticsearch=20sur=20la=20commande=20ArcadiaLink=20-=20Ajout?= =?UTF-8?q?=20des=20fonctions=20de=20r=C3=A9cup=C3=A9ration=20de=20M=C3=A9?= =?UTF-8?q?dia=20+=20XML=20vers=20Arcadia=20-=20Ajout=20r=C3=A8gles=20de?= =?UTF-8?q?=20gestion=20sur=20le=20bouton=20de=20liaison=20Arcadia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/ArcadiaLink.php | 7 +- app/Http/Controllers/DossierController.php | 3 + app/Http/Controllers/MediaController.php | 31 ++- public/js/app.js | 237 +++++++++++++++++-- resources/js/admin.js | 64 +++++ resources/js/media.js | 99 +++++++- resources/views/dossiers/create.blade.php | 1 + resources/views/dossiers/edit.blade.php | 1 + resources/views/dossiers/index.blade.php | 1 + resources/views/layouts/media_edit.blade.php | 4 +- resources/views/recovery/index.blade.php | 54 +++++ resources/views/users/create.blade.php | 1 + resources/views/users/edit.blade.php | 1 + resources/views/users/index.blade.php | 1 + routes/web.php | 3 + 15 files changed, 472 insertions(+), 36 deletions(-) create mode 100644 resources/views/recovery/index.blade.php diff --git a/app/Console/Commands/ArcadiaLink.php b/app/Console/Commands/ArcadiaLink.php index 0abe013..96e02ae 100644 --- a/app/Console/Commands/ArcadiaLink.php +++ b/app/Console/Commands/ArcadiaLink.php @@ -58,9 +58,10 @@ class ArcadiaLink extends Command $media->save(); // ---- Index dans Elasticsearch - $id = $media->id; - $media = Media::find($id); - $media->removeFromIndex(); + $media = Media::find($media->id); + $esExist = Media::searchByQuery(array('match' => array('arcadia_id' => "$media->arcadia_id"))); + if ($esExist) + $media->removeFromIndex(); $media->addToIndex(); //Storage::disk('arcadia_link_r')->delete($filename); diff --git a/app/Http/Controllers/DossierController.php b/app/Http/Controllers/DossierController.php index b2b873b..5b07ce8 100644 --- a/app/Http/Controllers/DossierController.php +++ b/app/Http/Controllers/DossierController.php @@ -239,6 +239,9 @@ class DossierController extends Controller $response['draggable'] = false; } + // Envoi du role + $response['role'] = Auth::user()->role; + return json_encode($response); } diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index ca8fd42..1a2a0ef 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -437,7 +437,6 @@ class MediaController extends Controller } else { $response['draggable'] = false; } - $response['role'] = Auth::user()->role; $response['isDepot'] = $isDepot; return json_encode($response); @@ -510,7 +509,12 @@ class MediaController extends Controller $user_id = Auth::user()->id; $deleteMedias = $request->input('medias'); - $medias = Media::whereIn('id', $deleteMedias)->whereNull('arcadia_id')->get(); + if (Auth::user()->hasRole(config('roles.const.ADMIN'))){ + $medias = Media::whereIn('id', $deleteMedias)->get(); + }else{ + $medias = Media::whereIn('id', $deleteMedias)->whereNull('arcadia_id')->get(); + } + foreach ($medias as $media) { $deletedMediasList[] = $media->id; @@ -534,6 +538,29 @@ class MediaController extends Controller return json_encode($deletedMediasList); } + /** + * Récupération d'un média + */ + + public function recoverMedia(Request $request) + { + $arcadia_id = $request->arcadia_id; + $media = Media::onlyTrashed()->where('arcadia_id', '=', $arcadia_id)->first(); + $media->restore(); + $media->isLocked = 1; + $media->save(); + + // Elasticsearch + $id = $media->id; + $media = Media::find($id); + $media->addToIndex(); + + // Lien Arcadia + ArcadiaLink::reactivate($media); + + return json_encode(true); + } + /** * Obtenir toutes les informations d'un média * diff --git a/public/js/app.js b/public/js/app.js index 500ee55..0092a7b 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -10805,6 +10805,62 @@ $(document).ready(function () { $(".loader").hide(); } }); + }); // Rechercher ID Arcadia pour réactivation + + $("#recovery-form").submit(function (e) { + e.preventDefault(); + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') + } + }); + var id = $("input[name='arcadia_id']").val(); + $.ajax({ + url: '/check-arcadia-id', + method: 'POST', + dataType: 'json', + data: { + id: id + }, + success: function success(result) { + if (result === false) { + $.fancyMessage({ + title: "Attention", + message: "Aucun média supprimé avec cet ID Arcadia.", + type: "error" + }); + } else { + $.fancyConfirm({ + title: "Attention", + message: "Êtes-vous sûr de vouloir lancer le traitement ?", + okButton: 'Oui', + noButton: 'Non', + callback: function callback(value) { + if (value) { + $.ajax({ + url: '/ajax/recover-media', + method: 'POST', + dataType: 'json', + data: { + arcadia_id: id + }, + success: function success(result) { + $.fancyMessage({ + title: "Information", + message: "La demande de récupération a été faite.", + type: "info" + }); + }, + error: function error(jqXHR, textStatus, errorThrown) {} + }); + } + } + }); + } + }, + error: function error(jqXHR, textStatus, errorThrown) {} + }); + $("input[name='arcadia_id']").val(''); }); initSelector(".selector_marques"); initSelector(".selector_sujets"); @@ -12126,13 +12182,35 @@ $(document).ready(function () { $(".tab_edit #resolution").val(result.data.resolution); $(".tab_edit #largeur_mm").val(result.data.largeur_mm); $(".tab_edit #hauteur_mm").val(result.data.hauteur_mm); // Config de la fiche d'édition + // Si le media n'est pas un sujet Arcadia ou si le media n'est pas une image on masque l'option Arcadia + // 1 = Photos et 5 = jpg - if (result.data.sujet.sujet_arcadia == 0) { + if (result.data.sujet.sujet_arcadia == 0 || result.data.typemedia_id != 1 && result.data.typemedia_id != 5) { $(".tab_edit .arcadia_fields").hide(); } else { $(".tab_edit .arcadia_fields").show(); - } + } // Si le media est lie a Arcadia ou si le media est en attente d'Arcadia + + if (result.data.arcadia_id != null || result.data.isLocked == 1) { + $(".btn-arcadia-link").hide(); + } else { + $(".btn-arcadia-link").show(); + } // Si le media est en attente d'Arcadia + + + if (result.data.isLocked == 1) { + $(".btn_tab_edit_save").attr('disabled', true); + $(".btn_tab_edit_delete").attr('disabled', true); + $(".is-locked").show(); + } else { + $(".btn_tab_edit_save").attr('disabled', false); + $(".btn_tab_edit_delete").attr('disabled', false); + $(".is-locked").hide(); + } // On creer la variable pour faire le check sur le bouton Arcadia + + + $(window).data('CurrentIsDefault', result.data.isDefault); $(".tab_edit .article_form, .tab_edit .marque_form, .tab_edit .societe_form").hide(); switch (result.data.sujet_id) { @@ -12226,14 +12304,23 @@ $(document).ready(function () { $('.tab_edit .btn-arcadia-link').on('click', function (event) { event.preventDefault(); - var arcadia_id = $("#arcadia_id").val(); - arcadia_id = prompt("Indiquez le code Arcadia de ce média", arcadia_id); + + if ($(window).data('CurrentIsDefault') === 1) { + $.fancyMessage({ + title: "Lier un média à Arcadia", + message: "Ce média ne peut pas être lié car il possède un visuel par défaut.", + type: "error" + }); + return; + } + + var result = confirm("Etes-vous sur de vouloir lancer le traitement ?"); + if (result != true) return; $.ajax({ url: '/ajax/set-id-arcadia', method: 'POST', dataType: 'json', data: { - arcadia_id: arcadia_id, media_id: $(window).data('current_edit_media') }, success: function success(result) { @@ -12241,15 +12328,18 @@ $(document).ready(function () { $.fancybox.close(); $.fancyMessage({ title: "Lier un média à Arcadia", - message: "Le code Arcadia a bien été ajouté au média", + message: "La demande à été effectuée, votre média est temporairement bloqué.", type: "info" }); - $("#arcadia_id").val(arcadia_id); + $(".btn_tab_edit_save").attr('disabled', true); + $(".btn_tab_edit_delete").attr('disabled', true); + $(".is-locked").show(); + $(".btn-arcadia-link").hide(); } else { $.fancybox.close(); $.fancyMessage({ title: "Lier un média à Arcadia", - message: "Ce code a déjà été attribué à un autre média. Ajout impossible.", + message: "Une erreur est survenue. Traitement impossible.", type: "error" }); } @@ -12279,8 +12369,20 @@ $(document).ready(function () { $('.tab_edit .add_article').on('click', function (event) { event.preventDefault(); - var arcadia_id = prompt("Indiquez le code Arcadia de l'article.", arcadia_id); - if (arcadia_id === null) return false; + var arcadia_id = prompt("Indiquez le code Arcadia de l'article.", arcadia_id); // Si la saisie est vide on affiche le message d'erreur et on n'execute pas l'ajax + + if (arcadia_id === "") { + $.fancybox.close(); + $.fancyMessage({ + title: "Lier un média à un article Arcadia", + message: "Le code Arcadia est vide.", + type: "error" + }); + return; + } else if (arcadia_id === null) { + return; + } + $.ajax({ url: '/ajax/get-article', method: 'POST', @@ -12346,6 +12448,76 @@ $(document).ready(function () { } }); removeMedias(medias); + }); // Suppression d'un média + + $(".btn_tab_edit_delete").on("click", function (event) { + event.preventDefault(); + + if ($(".tab_edit #arcadia_id").val().length) { + var r = confirm("Etes-vous sûr de vouloir supprimer ce média ? (Lié à Arcadia)"); + } else { + var r = confirm("Etes-vous sûr de vouloir supprimer ce média ?"); + } + + if (r == true) { + var medias = [$(window).data('current_edit_media')]; + $.ajax({ + url: '/ajax/remove-media', + method: 'POST', + dataType: 'json', + data: { + medias: medias + }, + success: function success(result) { + $.each(result, function (index, value) { + $(".media_container .imageItem[data-id='" + value + "']").remove(); + }); // ---- MAJ du nb de média dans le dossier + + var currentFolder = $(window).data('currentFolder'); + + if (currentFolder == 0 || currentFolder == "") { + var count = $(".folder_container .root_folder .count"); + } else { + var count = $(".folder_container .dd3-item[data-id='" + currentFolder + "'] > .dd3-content .count"); + } + + count.html(parseInt(count.html()) - result.length); + + if (result.length != medias.length) { + $.fancybox.close(); + + if (medias.length == 1) { + $.fancyMessage({ + title: "Attention", + message: "Ce média est lié à Arcadia. Suppression refusée. ", + type: "error" + }); + } else { + $.fancyMessage({ + title: "Attention", + message: "Votre sélection contient des médias liés à Arcadia. Ces médias ne seront pas supprimés.", + type: "info" + }); + } + } else { + $(".form_media_close").trigger('click'); + $.fancyMessage({ + title: "Suppression de média", + message: "Le média a été supprimé.", + type: "info" + }); + } + }, + error: function error(jqXHR, textStatus, errorThrown) { + $.fancybox.close(); + $.fancyMessage({ + title: "Attention", + message: "Erreur lors de la suppression du média, merci d'actualiser la page.", + type: "error" + }); + } + }); + } }); // ---- Popup pour Appliquer une étiquette à un média en masse $('.action_tag_media').on('click', function (event) { @@ -12491,6 +12663,7 @@ $(document).ready(function () { message: "Le formulaire a mal été renseigné. merci de corriger.", type: "error" }); + return; } var media = { @@ -12522,7 +12695,10 @@ $(document).ready(function () { title: "Sauvegarde d'un média", message: "Les données ont bien été enregistrées", type: "info" - }); + }); // On replace l'offset pour recharger + + $(window).data('offset', $(window).data('offset') - $(window).data('limit')); + loadMedia(result.sujet_id); }, error: function error(jqXHR, textStatus, errorThrown) { $.fancyMessage({ @@ -12801,7 +12977,16 @@ function initFolderManager(sujetId) { }, success: function success(result) { var output = ''; - var draggable = result.draggable; // initialisation de la liste type vues + var draggable = result.draggable; // init du role du user + + $(window).data('CurrentUserRole', result.role); // Si l'utilisateur est lecteur alors on enleve la possibilite d'upload + + if (result.role === 2) { + $(".form_media_replace").hide(); + } else { + $(".form_media_replace").show(); + } // initialisation de la liste type vues + var typevues = result.typevues; $("#typevues").find('option').remove(); @@ -13041,7 +13226,7 @@ window.loadMedia = function (sujet_id) { output += ''; output += ''; - if (result.role != 2) { + if ($(window).data('CurrentUserRole') != 2) { output += ''; output += ''; } @@ -13069,6 +13254,13 @@ window.loadMedia = function (sujet_id) { function removeMedias(medias) { + // Si Admin + if ($(window).data('CurrentUserRole') === 1) { + var msg = "Êtes-vous sûr de vouloir supprimer " + medias.length + " média(s) ?
ATTENTION DES MEDIAS PEUVENT ETRE LIES AVEC ARCADIA !"; + } else { + var msg = "Êtes-vous sûr de vouloir supprimer " + medias.length + " média(s) ?"; + } + if (medias.length == 0) { $.fancyMessage({ title: "Supprimer un média", @@ -13078,7 +13270,7 @@ function removeMedias(medias) { } else { $.fancyConfirm({ title: "Suppression de média", - message: "Êtes-vous sûr de vouloir supprimer " + medias.length + " média(s) ?", + message: msg, okButton: 'Supprimer', noButton: 'Annuler', callback: function callback(value) { @@ -13843,8 +14035,9 @@ $(document).ready(function () { }); // ---- Réinitialisation de la recherche $(".reinit_search_btn").on('click', function (event) { - event.preventDefault(); // Vide la bar recherche + event.preventDefault(); // Vide la barre recherche + $(".search_filters .search_value").val(''); $.each(Object.keys($(window).data('filter')), function (index, value) { if (value != "currentFolder") $(".search_filters_list #" + value).remove(); }); // supprime tous les éléments de recherche @@ -13952,13 +14145,13 @@ window.updateFilter = function (filter) { /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\app.js */"./resources/js/app.js"); -__webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\admin.js */"./resources/js/admin.js"); -__webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\media.js */"./resources/js/media.js"); -__webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\depot.js */"./resources/js/depot.js"); -__webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\panier.js */"./resources/js/panier.js"); -__webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\searchengine.js */"./resources/js/searchengine.js"); -module.exports = __webpack_require__(/*! D:\sources\www\ldc-dam\resources\sass\app.scss */"./resources/sass/app.scss"); +__webpack_require__(/*! D:\laragon\www\dam\resources\js\app.js */"./resources/js/app.js"); +__webpack_require__(/*! D:\laragon\www\dam\resources\js\admin.js */"./resources/js/admin.js"); +__webpack_require__(/*! D:\laragon\www\dam\resources\js\media.js */"./resources/js/media.js"); +__webpack_require__(/*! D:\laragon\www\dam\resources\js\depot.js */"./resources/js/depot.js"); +__webpack_require__(/*! D:\laragon\www\dam\resources\js\panier.js */"./resources/js/panier.js"); +__webpack_require__(/*! D:\laragon\www\dam\resources\js\searchengine.js */"./resources/js/searchengine.js"); +module.exports = __webpack_require__(/*! D:\laragon\www\dam\resources\sass\app.scss */"./resources/sass/app.scss"); /***/ }) diff --git a/resources/js/admin.js b/resources/js/admin.js index 879e4a1..b4c83c8 100644 --- a/resources/js/admin.js +++ b/resources/js/admin.js @@ -110,6 +110,70 @@ $(document).ready(function() { }); }); + // Rechercher ID Arcadia pour réactivation + $("#recovery-form").submit(function (e) { + e.preventDefault(); + + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') + } + }); + + const id = $("input[name='arcadia_id']").val(); + + $.ajax({ + url: '/check-arcadia-id', + method: 'POST', + dataType : 'json', + data: { + id: id, + }, + success: function(result){ + if (result === false){ + $.fancyMessage({ + title : "Attention", + message : "Aucun média supprimé avec cet ID Arcadia.", + type : "error", + }); + }else{ + $.fancyConfirm({ + title : "Attention", + message : "Êtes-vous sûr de vouloir lancer le traitement ?", + okButton : 'Oui', + noButton : 'Non', + callback : function (value) { + if (value) { + $.ajax({ + url: '/ajax/recover-media', + method: 'POST', + dataType : 'json', + data: { + arcadia_id: id, + }, + success: function(result){ + $.fancyMessage({ + title : "Information", + message : "La demande de récupération a été faite.", + type : "info", + }); + }, + error: function(jqXHR, textStatus, errorThrown) { + + } + }); + } + } + }); + } + }, + error: function(jqXHR, textStatus, errorThrown) { + + } + }); + $("input[name='arcadia_id']").val(''); + }); + initSelector(".selector_marques"); initSelector(".selector_sujets"); }); diff --git a/resources/js/media.js b/resources/js/media.js index 145d093..ab51062 100644 --- a/resources/js/media.js +++ b/resources/js/media.js @@ -788,7 +788,7 @@ $(document).ready(function() { // Config de la fiche d'édition // Si le media n'est pas un sujet Arcadia ou si le media n'est pas une image on masque l'option Arcadia // 1 = Photos et 5 = jpg - if(result.data.sujet.sujet_arcadia == 0 || result.data.isDefault == 1 || (result.data.typemedia_id != 1 && result.data.typemedia_id != 5)){ + if(result.data.sujet.sujet_arcadia == 0 || (result.data.typemedia_id != 1 && result.data.typemedia_id != 5)){ $(".tab_edit .arcadia_fields").hide(); }else{ $(".tab_edit .arcadia_fields").show(); @@ -797,22 +797,23 @@ $(document).ready(function() { // Si le media est lie a Arcadia ou si le media est en attente d'Arcadia if (result.data.arcadia_id != null || result.data.isLocked == 1){ $(".btn-arcadia-link").hide(); - $(".btn-arcadia-remove-link").show(); }else{ $(".btn-arcadia-link").show(); - $(".btn-arcadia-remove-link").hide(); } // Si le media est en attente d'Arcadia if(result.data.isLocked == 1){ - $(".btn-arcadia-remove-link").attr('disabled', true); $(".btn_tab_edit_save").attr('disabled', true); + $(".btn_tab_edit_delete").attr('disabled', true); $(".is-locked").show(); }else{ - $(".btn-arcadia-remove-link").attr('disabled', false); $(".btn_tab_edit_save").attr('disabled', false); + $(".btn_tab_edit_delete").attr('disabled', false); $(".is-locked").hide(); } + // On creer la variable pour faire le check sur le bouton Arcadia + $(window).data('CurrentIsDefault', result.data.isDefault); + $(".tab_edit .article_form, .tab_edit .marque_form, .tab_edit .societe_form").hide(); switch (result.data.sujet_id) { case 1: // Visuel Article @@ -887,6 +888,12 @@ $(document).ready(function() { // ---- Bouton Arcadia $('.tab_edit .btn-arcadia-link').on('click', function(event){ event.preventDefault(); + + if ($(window).data('CurrentIsDefault') === 1){ + $.fancyMessage({title : "Lier un média à Arcadia", message : "Ce média ne peut pas être lié car il possède un visuel par défaut.", type : "error"}); + return; + } + var result = confirm("Etes-vous sur de vouloir lancer le traitement ?"); if (result != true) return; @@ -902,6 +909,12 @@ $(document).ready(function() { if(result == true){ $.fancybox.close(); $.fancyMessage({title : "Lier un média à Arcadia", message : "La demande à été effectuée, votre média est temporairement bloqué.", type : "info"}); + + $(".btn_tab_edit_save").attr('disabled', true); + $(".btn_tab_edit_delete").attr('disabled', true); + $(".is-locked").show(); + $(".btn-arcadia-link").hide(); + }else{ $.fancybox.close(); $.fancyMessage({title : "Lier un média à Arcadia", message : "Une erreur est survenue. Traitement impossible.", type : "error"}); @@ -1001,6 +1014,59 @@ $(document).ready(function() { removeMedias(medias); }); + // Suppression d'un média + $(".btn_tab_edit_delete").on("click", function (event) { + event.preventDefault(); + + if ($(".tab_edit #arcadia_id").val().length) { + var r = confirm("Etes-vous sûr de vouloir supprimer ce média ? (Lié à Arcadia)"); + } else { + var r = confirm("Etes-vous sûr de vouloir supprimer ce média ?"); + } + + if (r == true) { + var medias = [$(window).data('current_edit_media')]; + $.ajax({ + url: '/ajax/remove-media', + method: 'POST', + dataType : 'json', + data: { + medias: medias + }, + success: function(result){ + $.each(result, function (index, value) { + $(".media_container .imageItem[data-id='"+value+"']").remove(); + }); + + // ---- MAJ du nb de média dans le dossier + var currentFolder = $(window).data('currentFolder'); + if(currentFolder == 0 || currentFolder == ""){ + var count = $(".folder_container .root_folder .count"); + }else{ + var count = $(".folder_container .dd3-item[data-id='"+currentFolder+"'] > .dd3-content .count"); + } + count.html(parseInt(count.html())-result.length); + + if(result.length != medias.length){ + $.fancybox.close(); + if(medias.length == 1){ + $.fancyMessage({title : "Attention", message : "Ce média est lié à Arcadia. Suppression refusée. ", type : "error"}); + }else{ + $.fancyMessage({title : "Attention", message : "Votre sélection contient des médias liés à Arcadia. Ces médias ne seront pas supprimés.", type : "info"}); + } + }else{ + $(".form_media_close").trigger('click'); + $.fancyMessage({title : "Suppression de média", message : "Le média a été supprimé.", type : "info"}); + } + }, + error: function(jqXHR, textStatus, errorThrown) { + $.fancybox.close(); + $.fancyMessage({title : "Attention", message : "Erreur lors de la suppression du média, merci d'actualiser la page.", type : "error"}); + } + }); + } + }); + // ---- Popup pour Appliquer une étiquette à un média en masse $('.action_tag_media').on('click',function(event){ event.preventDefault(); @@ -1172,6 +1238,8 @@ $(document).ready(function() { }, success: function(result){ $.fancyMessage({title : "Sauvegarde d'un média", message : "Les données ont bien été enregistrées", type : "info"}); + // On replace l'offset pour recharger + $(window).data('offset', $(window).data('offset')-$(window).data('limit')); loadMedia(result.sujet_id); }, error: function(jqXHR, textStatus, errorThrown) { @@ -1437,6 +1505,16 @@ function initFolderManager(sujetId){ var output = ''; var draggable = result.draggable; + // init du role du user + $(window).data('CurrentUserRole', result.role); + + // Si l'utilisateur est lecteur alors on enleve la possibilite d'upload + if (result.role === 2){ + $(".form_media_replace").hide(); + }else{ + $(".form_media_replace").show(); + } + // initialisation de la liste type vues var typevues = result.typevues; $("#typevues").find('option').remove(); @@ -1658,7 +1736,7 @@ window.loadMedia = function(sujet_id, saveSearch = 0){ output += ''; output += ''; output += ''; - if(result.role != 2 ){ + if($(window).data('CurrentUserRole') != 2 ){ output += ''; output += ''; } @@ -1685,12 +1763,19 @@ window.loadMedia = function(sujet_id, saveSearch = 0){ // ---- Supression de médias function removeMedias(medias){ + // Si Admin + if ($(window).data('CurrentUserRole') === 1){ + var msg = "Êtes-vous sûr de vouloir supprimer "+medias.length+" média(s) ?
ATTENTION DES MEDIAS PEUVENT ETRE LIES AVEC ARCADIA !"; + }else{ + var msg = "Êtes-vous sûr de vouloir supprimer "+medias.length+" média(s) ?"; + } + if(medias.length == 0){ $.fancyMessage({title : "Supprimer un média", message : "Veuillez sélectionner les médias à supprimer.", type : "info"}); }else{ $.fancyConfirm({ title : "Suppression de média", - message : "Êtes-vous sûr de vouloir supprimer "+medias.length+" média(s) ?", + message : msg, okButton : 'Supprimer', noButton : 'Annuler', callback : function (value) { diff --git a/resources/views/dossiers/create.blade.php b/resources/views/dossiers/create.blade.php index de55312..b269947 100644 --- a/resources/views/dossiers/create.blade.php +++ b/resources/views/dossiers/create.blade.php @@ -5,6 +5,7 @@
@if ($errors->any()) diff --git a/resources/views/dossiers/edit.blade.php b/resources/views/dossiers/edit.blade.php index 6ac7b5c..0d381f6 100644 --- a/resources/views/dossiers/edit.blade.php +++ b/resources/views/dossiers/edit.blade.php @@ -5,6 +5,7 @@
@if ($errors->any()) diff --git a/resources/views/dossiers/index.blade.php b/resources/views/dossiers/index.blade.php index c9564c1..b241d86 100644 --- a/resources/views/dossiers/index.blade.php +++ b/resources/views/dossiers/index.blade.php @@ -5,6 +5,7 @@
diff --git a/resources/views/layouts/media_edit.blade.php b/resources/views/layouts/media_edit.blade.php index ef94f1c..6f9dadf 100644 --- a/resources/views/layouts/media_edit.blade.php +++ b/resources/views/layouts/media_edit.blade.php @@ -22,7 +22,7 @@
- +
@if (Auth::user()->hasRole(config('roles.const.ADMIN'))) @@ -222,7 +222,7 @@
Fermer - @if (Auth::user()->hasRole(config('roles.const.ADMIN'))) + @if (Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')])) @endif @if (Auth::user()->hasRole([config('roles.const.CONTRIBUTEUR'), config('roles.const.ADMIN'), config('roles.const.REDACTEUR')])) diff --git a/resources/views/recovery/index.blade.php b/resources/views/recovery/index.blade.php new file mode 100644 index 0000000..f85edcb --- /dev/null +++ b/resources/views/recovery/index.blade.php @@ -0,0 +1,54 @@ +@extends('layouts.app') +@include('layouts.header') +@section('content') +
+ +
+ @if ($errors->any()) +
+ +
    + @foreach ($errors->all() as $error) +
  • {{ __($error) }}
  • + @endforeach +
+
+ @endif + @if (session()->has('error')) +
+ +
    +
  • {{ Session::get('error') }}
  • +
+
+ @endif + @if (session()->has('message')) +
+ +
    +
  • {{ Session::get('message') }}
  • +
+
+ @endif +
+

Récupération des médias

+
+ + @csrf +
+ {!! Form::label('arcadia_id', 'ID Arcadia *') !!} + {!! Form::text('arcadia_id') !!} +
+
+ {!! Form::submit('Rechercher', [ 'class' => 'btn']) !!} +
+ +
+
+@endsection diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php index b85a29b..0e55aa1 100644 --- a/resources/views/users/create.blade.php +++ b/resources/views/users/create.blade.php @@ -5,6 +5,7 @@
@if ($errors->any()) diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php index 887a56c..b9838c8 100644 --- a/resources/views/users/edit.blade.php +++ b/resources/views/users/edit.blade.php @@ -5,6 +5,7 @@
@if ($errors->any()) diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index 6e2ae1c..5f7ec4b 100644 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -5,6 +5,7 @@
diff --git a/routes/web.php b/routes/web.php index 4e69497..09a2507 100644 --- a/routes/web.php +++ b/routes/web.php @@ -34,6 +34,7 @@ Route::group(['middleware' => ['auth']], function(){ Route::post('/ajax/load-media', 'MediaController@loadMedia'); Route::post('/ajax/move-media', 'MediaController@moveMedia'); Route::post('/ajax/remove-media', 'MediaController@removeMedia'); + Route::post('/ajax/recover-media', 'MediaController@recoverMedia'); Route::post('/ajax/get-media', 'MediaController@getOneMedia'); Route::post('/ajax/save-media', 'MediaController@saveMedia'); Route::post('/ajax/apply-sticker', 'MediaController@applySticker'); @@ -58,6 +59,8 @@ Route::group(['middleware' => ['auth']], function(){ Route::resource('user', 'UserController'); Route::post('/check-matricule', 'UserController@checkMatricule'); Route::resource('dossier', 'DossierController'); + Route::get('/recovery', 'RecoveryController@index')->name('recovery.index'); + Route::post('/check-arcadia-id', 'RecoveryController@checkArcadiaId'); }); Auth::routes([ From dc5b7d624a64d4ff443d78783cd6f362ab511430 Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Wed, 2 Oct 2019 08:42:28 +0200 Subject: [PATCH 4/5] - Add RecoveryController --- app/Http/Controllers/RecoveryController.php | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 app/Http/Controllers/RecoveryController.php diff --git a/app/Http/Controllers/RecoveryController.php b/app/Http/Controllers/RecoveryController.php new file mode 100644 index 0000000..d5b7900 --- /dev/null +++ b/app/Http/Controllers/RecoveryController.php @@ -0,0 +1,27 @@ +authorizeRoles(config('roles.const.ADMIN')); + + return view('recovery.index'); + } + + public function checkArcadiaId(Request $request) + { + $response = false; + $arcadia_id = $request->id; + $media = Media::onlyTrashed()->where('arcadia_id', '=', $arcadia_id)->first(); + if ($media) + $response = true; + return json_encode($response); + } +} From 553fd01576ad94b59ba1ed052a37339d8c6acd7b Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Wed, 16 Oct 2019 08:54:38 +0200 Subject: [PATCH 5/5] =?UTF-8?q?-=20Changement=20du=20type=20de=20fichier?= =?UTF-8?q?=20d'export=20Arcadia=20de=20.tar=20=C3=A0=20.zip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Traits/ArcadiaLink.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/Http/Traits/ArcadiaLink.php b/app/Http/Traits/ArcadiaLink.php index a9a53e0..bfcff91 100644 --- a/app/Http/Traits/ArcadiaLink.php +++ b/app/Http/Traits/ArcadiaLink.php @@ -64,6 +64,16 @@ trait ArcadiaLink { private static function compress($folder, $name, $extension, $uid) { try { + $zip_file = storage_path('arcadia_link/send') ."/$uid.zip"; + $zip = new \ZipArchive(); + $zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE); + $zip->addFile(storage_path('arcadia_link/send') . "/$uid.xml", 'media.xml'); + $zip->addFile(public_path() . "/$folder$name.$extension", "$name.$extension"); + $zip->close(); + unset($zip); + unlink(storage_path('arcadia_link/send') . "/$uid.xml"); + + /* Pour faire la meme chose en .tar (CDC Initial) $a = new \PharData( storage_path('arcadia_link/send') ."/$uid.tmp"); // ADD FILES TO archive.tar FILE @@ -77,10 +87,11 @@ trait ArcadiaLink { unset($a); unlink(storage_path('arcadia_link/send') . "/$uid.tmp"); unlink(storage_path('arcadia_link/send') . "/$uid.xml"); + */ } catch (Exception $e) { //echo "Exception : " . $e; // TODO : Envoi mail Log - Log::emergency("Erreur création .tar : $e (Traits/ArcadiaLink)"); + Log::emergency("Erreur création .zip : $e (Traits/ArcadiaLink)"); } }