From b30180717a2b4ef64cef7a94403c0e2cf3d9b04b Mon Sep 17 00:00:00 2001 From: Yann Gonidec Date: Mon, 22 Jul 2019 14:54:42 +0200 Subject: [PATCH] Ajout de l'historique + fix divers --- app/Console/Commands/ImportArcadiaFiles.php | 2 +- app/Dossier.php | 13 +- app/Historique.php | 26 ++++ app/Http/Controllers/DossierController.php | 9 +- app/Http/Controllers/MediaController.php | 139 ++++++++++++++++--- app/Http/Controllers/UploadController.php | 11 ++ app/Http/Middleware/TrustProxies.php | 2 +- app/Media.php | 8 ++ app/User.php | 8 ++ config/ldap.php | 7 +- public/.htaccess | 5 +- public/css/app.css | 1 + public/js/app.js | 41 +++++- resources/js/app.js | 8 ++ resources/js/media.js | 34 +++-- resources/sass/partials/media.scss | 1 + resources/views/layouts/media_edit.blade.php | 5 +- resources/views/media_manager.blade.php | 8 +- routes/web.php | 1 + 19 files changed, 276 insertions(+), 53 deletions(-) create mode 100644 app/Historique.php diff --git a/app/Console/Commands/ImportArcadiaFiles.php b/app/Console/Commands/ImportArcadiaFiles.php index 0313b51..0a8559f 100644 --- a/app/Console/Commands/ImportArcadiaFiles.php +++ b/app/Console/Commands/ImportArcadiaFiles.php @@ -280,7 +280,7 @@ class ImportArcadiaFiles extends Command } // ---- Suppression du fichier - //Storage::disk('arcadia')->delete($filename); + Storage::disk('arcadia')->delete($filename); $bar->advance(); } diff --git a/app/Dossier.php b/app/Dossier.php index 3845518..fd67af9 100644 --- a/app/Dossier.php +++ b/app/Dossier.php @@ -28,7 +28,18 @@ class Dossier extends Model */ public function getMediacountAttribute() { - return $this->medias()->count(); + $userId = Auth::user()->id; + + if($this->parent_id != 1 && $this->id != 1){ // dossier classic + return $this->medias() + ->where(function ($query) use ( $userId ) { + $query->where('statut', '<>', config('services.statut.brouillon')) + ->orWhere('created_by', $userId); + }) + ->count(); + }else{ // dossier dépôt + return $this->medias()->count(); + } } /** diff --git a/app/Historique.php b/app/Historique.php new file mode 100644 index 0000000..86f710e --- /dev/null +++ b/app/Historique.php @@ -0,0 +1,26 @@ +belongsTo('App\User', 'user_id'); + } + + /** + * Get the media that owns the historique. + */ + public function media() + { + return $this->belongsTo('App\Media', 'media_id'); + } +} diff --git a/app/Http/Controllers/DossierController.php b/app/Http/Controllers/DossierController.php index 593d106..5e6bd6b 100644 --- a/app/Http/Controllers/DossierController.php +++ b/app/Http/Controllers/DossierController.php @@ -210,10 +210,11 @@ class DossierController extends Controller $response['count'] = Media::where('sujet_id', $sujetId) ->whereNull('dossier_id') ->where(function ($query) use ( $userId ) { - $query->where('statut', '<>', 0) + $query->where('statut', config('services.statut.public_etendue')) + ->orWhere('statut', config('services.statut.public')) ->orWhere('created_by', $userId); }) - ->count(); + ->count(); $response['typevues'] = Typevue::where('sujet_id', $sujetId)->get(); $response['variantes'] = Variante::where('sujet_id', $sujetId)->get(); @@ -247,7 +248,7 @@ class DossierController extends Controller // ---- Le dossier $dossier = new Dossier(); - $dossier->libelle = $libelle; + $dossier->libelle = htmlspecialchars($libelle); $dossier->description = $description; $dossier->parent_id = $parent_id; if($parent_id == 1){ // dossier de dépôt @@ -272,7 +273,7 @@ class DossierController extends Controller // ---- Le dossier $dossier = new Dossier(); - $dossier->libelle = $libelle; + $dossier->libelle = htmlspecialchars($libelle); $dossier->description = $description; $dossier->parent_id = 1; $dossier->system = 1; diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index a270693..308665d 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -17,6 +17,7 @@ use App\Marque; use App\Dossier; use App\Tag; use App\Article; +use App\Historique; use App\Http\Traits\MediaTools; class MediaController extends Controller @@ -68,11 +69,16 @@ class MediaController extends Controller if($dossier_id == "0"){ // dossier racine $query= Media::where('sujet_id', $sujet_id) - ->whereNull('dossier_id'); - }elseif($dossier_id == "-1"){ + ->whereNull('dossier_id') + ->where(function ($query) use ( $userId ) { + $query->where('statut', config('services.statut.public_etendue')) + ->orWhere('statut', config('services.statut.public')) + ->orWhere('created_by', $userId); + }); + }elseif($dossier_id == "-1"){ // recherche global $query = Media::where('sujet_id', $sujet_id) ->where(function ($query) use ( $userId ) { - $query->where('statut', '<>', 0) + $query->where('statut', config('services.statut.public_etendue')) ->orWhere('created_by', $userId); }); }else{ @@ -81,7 +87,7 @@ class MediaController extends Controller $query = Media::where('sujet_id', $sujet_id) ->where('dossier_id', $dossier_id) ->where(function ($query) use ( $userId ) { - $query->where('statut', '<>', 0) + $query->where('statut', '<>', config('services.statut.brouillon')) ->orWhere('created_by', $userId); }); }else{ // dossier dépôt @@ -152,25 +158,43 @@ class MediaController extends Controller public function moveMedia(Request $request) { Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]); - $response = array(); + $response = false; $dossier_id = $request->input('dossier_id'); $data = $request->input('data'); $sujet_id = $request->input('sujet_id'); $data = explode(",", $data); - foreach ($data as $key => $media_id) { - $media = Media::where('id', $media_id)->first(); - if($media){ - $media->sujet_id = $sujet_id; - if($dossier_id > 0){ - $media->dossier_id = $dossier_id; - }else{ - $media->dossier_id = null; - } - $media->save(); + $user_id = Auth::user()->id; + $libelle = ""; + + if($dossier_id > 0){ + $dossier = Dossier::where('id', $dossier_id)->first(); + if($dossier){ + $libelle = $dossier->libelle; } } - return json_encode(true); + foreach ($data as $key => $media_id) { + $media = Media::where('id', $media_id)->first(); + if($media){ + $historique = new historique(); + $historique->user_id = $user_id; + $historique->media_id = $media->id; + $historique->type = "Déplacement"; + + $media->sujet_id = $sujet_id; + if($dossier_id > 0){ + $media->dossier_id = $dossier_id; + $historique->description = "Déplacement dans le dossier ".$libelle; + }else{ + $media->dossier_id = null; + $historique->description = "Média déplacé à la racine"; + } + $media->save(); + $historique->save(); + } + } + + return json_encode($response); } /** @@ -181,12 +205,21 @@ class MediaController extends Controller { $deletedMediasList = array(); Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]); - + $user_id = Auth::user()->id; $deleteMedias = $request->input('medias'); $medias = Media::whereIn('id', $deleteMedias)->whereNull('arcadia_id')->get(); foreach ($medias as $media) { $deletedMediasList[] = $media->id; + + // Historique des actions + $historique = new historique(); + $historique->user_id =$user_id; + $historique->media_id = $media->id; + $historique->type = "Suppression"; + $historique->description = "Le média a été supprimé"; + $historique->save(); + $media->delete(); } @@ -249,6 +282,7 @@ class MediaController extends Controller public function saveMedia(Request $request) { 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'); @@ -265,7 +299,21 @@ class MediaController extends Controller } $media->statut = $mediaUpdate->statut; $media->copyright_id = $mediaUpdate->copyright_id; - $media->etiquette_id = $mediaUpdate->etiquette_id; + + + // ---- Historique des actions (etiquette seulement) + if($media->etiquette_id != $mediaUpdate->etiquette_id){ + $curEtiquette = Etiquette::where('etiquette_id', $media->etiquette_id)->first(); + $newEtiquette = Etiquette::where('etiquette_id', $mediaUpdate->etiquette_id)->first(); + $historique = new historique(); + $historique->user_id = $user_id; + $historique->media_id = $media->id; + $historique->type = "Etiquette"; + $historique->description = $curEtiquette->libelle." -> ".$newEtiquette->libelle; + $historique->save(); + $media->etiquette_id = $mediaUpdate->etiquette_id; + } + $media->save(); // MAJ des tags @@ -312,6 +360,15 @@ class MediaController extends Controller $media->articles()->attach($articleId); } } + + // ---- Historique des actions + $historique = new historique(); + $historique->user_id = $user_id; + $historique->media_id = $media->id; + $historique->type = "Modification"; + $historique->description = "Les informations du média on été modificées"; + $historique->save(); + } $response = true; @@ -328,6 +385,7 @@ class MediaController extends Controller $response = array(); $medias = $request->input('medias'); $etiquette_id = $request->input('etiquette_id'); + $user_id = Auth::user()->id; $etiquette = Etiquette::where('etiquette_id', $etiquette_id)->first(); $response = $etiquette; @@ -335,6 +393,16 @@ class MediaController extends Controller foreach ($medias as $media_id) { $media = Media::where('id', $media_id)->first(); if($media){ + // ---- Historique des actions + $curEtiquette = Etiquette::where('etiquette_id', $media->etiquette_id)->first(); + $historique = new historique(); + $historique->user_id = $user_id; + $historique->media_id = $media->id; + $historique->type = "Etiquette"; + $historique->description = $curEtiquette->libelle." -> ".$etiquette->libelle; + $historique->save(); + + // ---- Sauvegarde de la nouvelle étiquette $media->etiquette_id = $etiquette_id; $media->save(); } @@ -379,6 +447,13 @@ class MediaController extends Controller $media->taille = $this->formatBytes($this->get_file_size($mediaPath)); $media->save(); + $historique = new historique(); + $historique->user_id = Auth::user()->id;; + $historique->media_id = $media->id; + $historique->type = "Retouche"; + $historique->description = "Retouche de l'image"; + $historique->save(); + // Regénération des miniatures de base $this->create_sys_thumb($media); // ---- Creation des vignettes en lien avec le sujet du média @@ -399,9 +474,17 @@ class MediaController extends Controller $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); } @@ -411,6 +494,7 @@ class MediaController extends Controller $media->arcadia_id = $arcadia_id; $media->save(); $response = true; + $historique->save(); } return json_encode($response); @@ -422,6 +506,7 @@ class MediaController extends Controller */ public function getArticle(Request $request) { + if(!$user = Auth::user()) abort(401, 'Cette action n\'est pas autorisée.'); $response = array(); $arcadia_id = $request->input('arcadia_id'); @@ -435,7 +520,7 @@ class MediaController extends Controller } /** - * Renvoie un article par ID Arcadia + * Téléchargement des médias * */ public function downloadMedia(Request $request) @@ -479,4 +564,20 @@ class MediaController extends Controller return response()->download($fp)->deleteFileAfterSend($deleteFileAfterSend); } + + /** + * Renvoie l'historique des actions d'un média + * + */ + public function getMediaHistory(Request $request) + { + $response = array(); + if(!$user = Auth::user()) abort(401, 'Cette action n\'est pas autorisée.'); + $media_id = $request->input('media_id'); + + $media = Historique::where('media_id', $media_id)->with('user')->orderBy("created_date", "DESC")->get(); + $response = $media; + return json_encode($response); + } + } diff --git a/app/Http/Controllers/UploadController.php b/app/Http/Controllers/UploadController.php index bc30e00..eb90e85 100644 --- a/app/Http/Controllers/UploadController.php +++ b/app/Http/Controllers/UploadController.php @@ -6,6 +6,7 @@ use Illuminate\Support\Facades\Storage; use Illuminate\Http\Request; use App\Media; use App\Site; +use App\Historique; use App\Http\Traits\MediaTools; @@ -180,6 +181,16 @@ class UploadController extends Controller { $media->save(); break; } + + // ---- Historique des actions + $historique = new historique(); + if($user = Auth::user()){ + $historique->user_id = $user->id; + } + $historique->media_id = $media->id; + $historique->type = "Création"; + $historique->description = "Média ajouté"; + $historique->save(); } $filest = array(); diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index 7daf51f..26bb8f2 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -12,7 +12,7 @@ class TrustProxies extends Middleware * * @var array */ - protected $proxies; + protected $proxies = '*'; /** * The headers that should be used to detect proxies. diff --git a/app/Media.php b/app/Media.php index 4da7058..7aff524 100644 --- a/app/Media.php +++ b/app/Media.php @@ -106,4 +106,12 @@ class Media extends Model { return $this->belongsTo('App\User', 'created_by'); } + + /** + * Get the historiques for the media. + */ + public function historiques() + { + return $this->hasMany('App\Historique'); + } } diff --git a/app/User.php b/app/User.php index 09eb1b2..44bc545 100644 --- a/app/User.php +++ b/app/User.php @@ -99,4 +99,12 @@ class User extends Authenticatable { return $this->hasMany('App\Media'); } + + /** + * Get the historiques for the user. + */ + public function historiques() + { + return $this->hasMany('App\Historique'); + } } diff --git a/config/ldap.php b/config/ldap.php index c62c91b..7ee9dd7 100644 --- a/config/ldap.php +++ b/config/ldap.php @@ -143,7 +143,7 @@ return [ | */ - 'hosts' => explode(' ', env('LDAP_HOSTS', '10.1.3.89')), + 'hosts' => explode(' ', env('LDAP_HOSTS', 'dtys05403.svlidc.com')), /* |-------------------------------------------------------------------------- @@ -154,8 +154,7 @@ return [ | */ - 'port' => env('LDAP_PORT', 389), - // 'port' => env('LDAP_PORT', 636), + 'port' => env('LDAP_PORT', 636), /* |-------------------------------------------------------------------------- @@ -232,7 +231,7 @@ return [ | */ - 'use_ssl' => env('LDAP_USE_SSL', false), + 'use_ssl' => env('LDAP_USE_SSL', true), 'use_tls' => env('LDAP_USE_TLS', false), ], diff --git a/public/.htaccess b/public/.htaccess index d32af37..9301401 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -49,7 +49,7 @@ ServerSignature Off #Header set Content-Security-Policy "script-src 'self' https://www.google.com" # Protection contre le clickjacking. Interdit que le site soit intégré en iframe - #Header always set X-FRAME-OPTIONS "DENY" + Header always set X-FRAME-OPTIONS "SAMEORIGIN" # Bloque la totalité du contenu lorsqu'une attaque XSS est suspectée Header always set X-XSS-Protection "1; mode=block" @@ -57,9 +57,8 @@ ServerSignature Off #Désactive la détection automatique du type des ressources Header always set X-Content-Type-Options "nosniff" - # protege les cookies d'être modifiés par le client - #Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure + Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure # BEGIN DEFLATE COMPRESSION diff --git a/public/css/app.css b/public/css/app.css index 0e7607f..cb6b48b 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -14386,6 +14386,7 @@ table tfoot tr:hover { left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); + width: 80%; } #form_media .main_content .tab.tab_preview .svgElt { diff --git a/public/js/app.js b/public/js/app.js index e2d0241..3711f16 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -11001,6 +11001,12 @@ $(document).mouseup(function (e) { if (!filter_list.is(e.target) && filter_list.has(e.target).length === 0) { $(".filter_selector .list").hide(); + } // ---- déselectionne les éléments si on clique en dehors + + + if ($(e.target).hasClass('media_container') || $(e.target).hasClass('wrapper')) { + $(".imageItem").attr("aria-grabbed", "false"); + $(".imageItem").removeClass('flip'); } }); // ---- Header : Ouverture formulaire de contact @@ -11712,12 +11718,6 @@ $(document).ready(function () { if (!$(event.target).hasClass('imageItem')) { return false; } - }); // ---- déselectionne les éléments si on clique en dehors - - $(".main_content .media_container").on("click", function (event) { - if (event.target !== this) return; - $(".imageItem").attr("aria-grabbed", "false"); - $(".imageItem").removeClass('flip'); }); // ---- clique droit sur un média $(".main_content .wrapper").on("contextmenu", '.imageItem', function (event) { @@ -12419,6 +12419,33 @@ $(document).ready(function () { if ($(".tab_preview audio").length) { $(".tab_preview audio").get(0).pause(); + } // ---- Chargement de l'historique des actions + + + if ($(this).hasClass('form_media_history')) { + $(".tab_history table tbody").html(' Chargements de l\'historique'); + $.ajax({ + url: '/ajax/get-media-history', + method: 'POST', + dataType: 'json', + data: { + media_id: $(window).data('current_edit_media') + }, + success: function success(result) { + if (result) { + $(".tab_history table tbody").html(''); + $.each(result, function (index, history) { + var username = ""; + + if (null !== history.user) { + username = history.user.firstname + ' ' + history.user.lastname; + } + + $(".tab_history table tbody").append('' + history.created_date + '' + username + '' + history.type + '' + history.description + ''); + }); + } + } + }); } }); // ---- sauvegarde de la popup d'édition @@ -12692,7 +12719,7 @@ function initFolderManager(sujetId) { $("#variantes").find('option').remove(); $.each(variantes, function (index, variante) { $("#variantes").append(''); - }); // initialisation des formats de vignette disponibles autéléchargement + }); // initialisation des formats de vignette disponibles au téléchargement $(window).data('formats', result.formats); $('#form_download .download_format').html(''); diff --git a/resources/js/app.js b/resources/js/app.js index 471762e..426e433 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -126,6 +126,14 @@ $(document).mouseup(function(e) { if (!filter_list.is(e.target) && filter_list.has(e.target).length === 0) { $(".filter_selector .list").hide(); } + + + // ---- déselectionne les éléments si on clique en dehors + if ($(e.target).hasClass('media_container') || $(e.target).hasClass('wrapper')) { + $(".imageItem").attr("aria-grabbed", "false"); + $(".imageItem").removeClass('flip'); + } + }); // ---- Header : Ouverture formulaire de contact diff --git a/resources/js/media.js b/resources/js/media.js index 640a197..ccc52fa 100644 --- a/resources/js/media.js +++ b/resources/js/media.js @@ -421,13 +421,6 @@ $(document).ready(function() { } }); - // ---- déselectionne les éléments si on clique en dehors - $(".main_content .media_container").on("click", function(event) { - if (event.target !== this) return; - $(".imageItem").attr("aria-grabbed", "false"); - $(".imageItem").removeClass('flip'); - }); - // ---- clique droit sur un média $(".main_content .wrapper").on("contextmenu", '.imageItem' , function(event) { event.preventDefault(); @@ -1075,6 +1068,31 @@ $(document).ready(function() { if($(".tab_preview audio").length){ $(".tab_preview audio").get(0).pause() } + + // ---- Chargement de l'historique des actions + if($(this).hasClass('form_media_history')){ + $(".tab_history table tbody").html(' Chargements de l\'historique'); + $.ajax({ + url: '/ajax/get-media-history', + method: 'POST', + dataType : 'json', + data: { + media_id : $(window).data('current_edit_media'), + }, + success: function(result){ + if(result){ + $(".tab_history table tbody").html(''); + $.each(result, function (index, history) { + var username = ""; + if(null !== history.user){ + username = history.user.firstname+' '+history.user.lastname; + } + $(".tab_history table tbody").append(''+history.created_date+''+username+''+history.type+''+history.description+''); + }); + } + } + }); + } }); // ---- sauvegarde de la popup d'édition @@ -1338,7 +1356,7 @@ function initFolderManager(sujetId){ $("#variantes").append(''); }); - // initialisation des formats de vignette disponibles autéléchargement + // initialisation des formats de vignette disponibles au téléchargement $(window).data('formats', result.formats); $('#form_download .download_format').html(''); $('#form_download .download_format').append(''); diff --git a/resources/sass/partials/media.scss b/resources/sass/partials/media.scss index 56b4665..54a6c69 100644 --- a/resources/sass/partials/media.scss +++ b/resources/sass/partials/media.scss @@ -666,6 +666,7 @@ top: 50%; left: 50%; transform: translate(-50%,-50%); + width: 80%; } .svgElt{ width: auto; diff --git a/resources/views/layouts/media_edit.blade.php b/resources/views/layouts/media_edit.blade.php index 263795d..e901d29 100644 --- a/resources/views/layouts/media_edit.blade.php +++ b/resources/views/layouts/media_edit.blade.php @@ -260,13 +260,16 @@

Historique des actions

+ - + + +
DATE UTILISATEUR TYPE COMMENTAIRE
diff --git a/resources/views/media_manager.blade.php b/resources/views/media_manager.blade.php index febb8eb..91f90e9 100644 --- a/resources/views/media_manager.blade.php +++ b/resources/views/media_manager.blade.php @@ -102,14 +102,14 @@
Trier par :
diff --git a/routes/web.php b/routes/web.php index 42757fe..0f87474 100644 --- a/routes/web.php +++ b/routes/web.php @@ -40,6 +40,7 @@ Route::group(['middleware' => ['auth']], function(){ Route::post('/ajax/set-id-arcadia', 'MediaController@setIdArcdadia'); Route::post('/ajax/get-article', 'MediaController@getArticle'); Route::post('/ajax/download-media', 'MediaController@downloadMedia')->name('downloadMedia'); + Route::post('/ajax/get-media-history', 'MediaController@getMediaHistory')->name('downloadMedia'); // Back office Route::resource('user', 'UserController');