File systeme V3

This commit is contained in:
Mathieu Lagacé
2020-10-19 18:45:05 -04:00
parent 1664bb06aa
commit 4f83774200
27 changed files with 2030 additions and 1223 deletions

View File

@@ -78,9 +78,4 @@ class AdminController extends Controller
return view('admin.status.index',['alerts' => $alerts]);
}
public function instruction()
{
}
}

View File

@@ -140,43 +140,9 @@ class ConfigController extends Controller
public function editfilesConfig()
{
$configList = [
'cadet_list',
];
$configListEncrypt = [
'GOOGLE_DRIVE_CLIENT_ID',
'GOOGLE_DRIVE_CLIENT_SECRET',
'GOOGLE_DRIVE_REFRESH_TOKEN',
'GOOGLE_DRIVE_FOLDER_ID'
];
if (\request('is_active') == 'on')
if (\request()->file('nominativeList') != null)
{
$config = \App\Config::find('is_Google_Drive_enabled');
$config->data = ['true'];
$config->save();
}
else
{
$config = \App\Config::find('is_Google_Drive_enabled');
$config->data = ['false'];
$config->save();
}
foreach ($configList as $configName)
{
$config = \App\Config::find($configName);
$config->data = [\request($configName)];
$config->save();
}
foreach ($configListEncrypt as $configName)
{
$config = \App\Config::find($configName);
$config->data = [\Crypt::encryptString(\request($configName))];
$config->save();
\Storage::putFileAs('Systeme/Fichier',\request()->file('nominativeList'),'ListeNominative.pdf');
}
clog('edit','success','a modifié la configuration des fichiers');

View File

@@ -71,7 +71,7 @@ class CourseController extends Controller
{
$name = $user->fullname();
}
return view('admin.course.show',['course' => $course,'username' => $name,'lessonPlanDir' => \App\GoogleDriveFile::findByPath('.Systeme/.Fichier/.PlanDeCours')->id]);
return view('admin.course.show',['course' => $course,'username' => $name]);
}
/**
@@ -136,31 +136,21 @@ class CourseController extends Controller
public function updateLessonPlan(Request $request, $id)
{
$course = Course::findOrFail($id);
$name = $course->ocom.'_'.$course->instructor().'_'.$course->event->date_begin.'_'.'v'.date('c').'.'.\request()->file('file')->getClientOriginalExtension();
$name = urlencode($name);
$dirID = \App\GoogleDriveFile::findByPath('.Systeme/.Fichier/.PlanDeCours')->id;
$name = $course->ocom.'_'.$course->instructor().'_'.date('c',strtotime($course->event->date_begin)).'.'.\request()->file('file')->getClientOriginalExtension();
$dirID = 'Systeme/Fichier/PlanDeCours';
if ($course->lessonPlan != null)
{
$lessonPlan = $course->lessonPlan;
$contents = collect(\Storage::cloud()->listContents($dirID, false));
$file = $contents
->where('type', '=', 'file')
->where('filename', '=', pathinfo($course->lessonPlan->file, PATHINFO_FILENAME))
->where('extension', '=', pathinfo($course->lessonPlan->file, PATHINFO_EXTENSION))
->first(); // there can be duplicate file names!
\Storage::cloud()->delete($file['path']);
}
else
{
$lessonPlan = new \App\LessonPlan();
}
\Storage::cloud()->putFileAs($dirID,\request()->file('file'),$name);
$metadata = \Storage::cloud()->getMetadata($dirID.'/'.$name);
\Storage::putFileAs($dirID,\request()->file('file'),$name);
$lessonPlan->user_id = \Auth::user()->id;
$lessonPlan->file = $metadata['name'];
$lessonPlan->file = $name;
$lessonPlan->course_id = $course->id;
$lessonPlan->desc = "";
$lessonPlan->comment = "";
@@ -169,6 +159,18 @@ class CourseController extends Controller
return redirect()->back();
}
public function downloadLessonPlan($name)
{
if (\Storage::exists('Systeme/Fichier/PlanDeCours/'.$name))
{
return \Storage::download('Systeme/Fichier/PlanDeCours/'.$name);
}
else
{
abort(404);
}
}
/**
* Remove the specified resource from storage.
*

View File

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\GoogleDriveFile;
use Illuminate\Http\Request;
use function Symfony\Component\VarDumper\Dumper\esc;
class FilesController extends Controller
{
@@ -41,21 +42,83 @@ class FilesController extends Controller
/**
* Display the specified resource.
*
* @param string $id
* @return void
* @param $path
* @return \Symfony\Component\HttpFoundation\StreamedResponse
*/
public function show($path)
public function show(String $path)
{
$file_rules = \DB::table('acl_rules')->where('path','=',$path)->get()->all();
if ($file_rules != []) {
dd($file_rules);
}
dd(dirname($path));
$path_rules = \DB::table('acl_rules')->where('path','=',dirname($path))->get()->all();
if ($path_rules != []) {
$all_rules = collect(\DB::table('acl_rules')->get()->all());
foreach ($all_rules as $rule)
{
if ($rule->path == "*")
{
if (\Auth::check())
{
if (\Auth::user()->checkACLRules($rule) > 0)
{
if (\Storage::exists($path))
{
return \Storage::download($path);
}
return abort(404);
else
{
abort(404);
}
}
}
}
}
$path_array = explode('/',$path);
$checkedPath = $path_array[0];
unset($path_array[0]);
$path_array = array_values($path_array);
while ($checkedPath != $path)
{
$rules = $all_rules->where('path','=',$checkedPath.'/*');
if ($rules->isNotEmpty())
{
$access_level = 0;
foreach ($rules as $r)
{
if (\Auth::check())
{
$temp_access_level = \Auth::user()->checkACLRules($r);
if ($temp_access_level > $access_level)
{
$access_level = $temp_access_level;
}
}
else
{
if ($r->user_id == '*')
{
if ($r->access > $access_level)
{
$access_level = $r->access;
}
}
}
if ($access_level > 0)
{
if (\Storage::exists($path))
{
return \Storage::download($path);
}
else
{
abort(404);
}
}
}
}
$checkedPath = $checkedPath.'/'.$path_array[0];
unset($path_array[0]);
$path_array = array_values($path_array);
}
abort(403);
}
/**
@@ -94,67 +157,63 @@ class FilesController extends Controller
public function guide()
{
if (\App\GoogleDriveFile::checkConfig())
{
$dirID = \App\GoogleDriveFile::findByPath('.Privé/.Staff/.Guide');
$dir = collect(\Storage::cloud()->listContents($dirID->id,false))->sortBy('name');
return view('admin.files.guide',['dir' => $dir]);
}
return redirect('/admin')->with('error','Google Drive n\'est pas configuré');
return redirect('/admin/files?leftPath=Prive/Staff/Guide');
}
public function instruction()
{
if (\App\GoogleDriveFile::checkConfig())
{
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.Staff/.Instruction')->first()->id, 'mode' => 'folder']);
}
return redirect('/admin')->with('error','Google Drive n\'est pas configuré');
return redirect('/admin/files?leftPath=Prive/Staff/Instruction');
}
public function cadet()
{
if (!\App\GoogleDriveFile::checkConfig())
{
return redirect('/admin')->with('error','Google Drive n\'est pas configuré');
}
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.Cadet')->first()->id, 'mode' => 'folder']);
return redirect('/admin/files?leftPath=Prive/Cadet');
}
public function staff()
{
if (!\App\GoogleDriveFile::checkConfig())
{
return redirect('/admin')->with('error','Google Drive n\'est pas configuré');
}
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.Staff')->first()->id, 'mode' => 'folder']);
return redirect('/admin/files?leftPath=Prive/Staff');
}
public function etamas()
{
if (!\App\GoogleDriveFile::checkConfig())
{
return redirect('/admin')->with('error','Google Drive n\'est pas configuré');
}
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.ETAMAS')->first()->id, 'mode' => 'folder']);
return redirect('/admin/files?leftPath=Prive/ETAMAS');
}
public function officier()
{
if (!\App\GoogleDriveFile::checkConfig())
{
return redirect('/admin')->with('error','Google Drive n\'est pas configuré');
}
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.Officier')->first()->id, 'mode' => 'folder']);
return redirect('/admin/files?leftPath=Prive/Officier');
}
public function publique()
{
if (!\App\GoogleDriveFile::checkConfig())
{
return redirect('/admin')->with('error','Google Drive n\'est pas configuré');
return redirect('/admin/files?leftPath=Publique');
}
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Publique')->first()->id, 'mode' => 'folder']);
public function show_nominativeList()
{
return view('admin.files.list.index');
}
public function download_nominativeList()
{
if (\Storage::exists('/Systeme/Fichier/ListeNominative.pdf'))
{
return \Storage::download('/Systeme/Fichier/ListeNominative.pdf');
}
return view('admin.files.list.index');
}
public function edit_nominativeList()
{
return view('admin.files.list.edit');
}
public function update_nominativeList()
{
\Storage::putFileAs('Systeme/Fichier',\request()->file('nominativeList'),'ListeNominative.pdf');
clog('edit','success','a modifié la liste nominative');
return redirect('/admin/nominativelist')->with('success','Modification sauvegarder avec succès !');
}
}

View File

@@ -57,6 +57,8 @@ class JobController extends Controller
$job->permissions = json_encode($tpermission);
$job->save();
$job->updateACLRules();
clog('add','success','Poste ajouté avec succès');
return redirect('/admin/config/jobs')->with('success','Poste ajouté avec succès');
}
@@ -112,6 +114,8 @@ class JobController extends Controller
$job->permissions = json_encode($tpermission);
$job->save();
$job->updateACLRules();
clog('add','success','Poste modifié avec succès');
return redirect('/admin/config/jobs')->with('success','Poste modifié avec succès');
}

View File

@@ -52,6 +52,8 @@ class RankController extends Controller
$r->permissions = json_encode($tpermission);
$r->save();
$r->updateACLRules();
clog('add','success','Grade ajouté avec succès');
return redirect('/admin/config/ranks')->with('success','Grade ajouté avec succès');
}
@@ -99,10 +101,11 @@ class RankController extends Controller
$tkey = $perm->ckey;
$tpermission[$tkey] = $request->$tkey;
}
$r->permissions = json_encode($tpermission);
$r->save();
$r->updateACLRules();
clog('edit','success','Grade modifié avec succès');
return redirect('/admin/config/ranks')->with('success','Grade modifié avec succès');
}

View File

@@ -48,4 +48,9 @@ class Job extends Model
{
return $this->permission($perm);
}
public function updateACLRules()
{
\App\Permission::updateACLRules($this);
}
}

View File

@@ -116,4 +116,11 @@ class OCOM extends Model
{
return $this->nbPeriode * 30;
}
public function niveau()
{
$niveau = -1;
preg_match('/[^0\D]/',$this->oren,$niveau);
return $niveau[0];
}
}

View File

@@ -4,6 +4,7 @@ namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
/**
* App\Permission
@@ -15,6 +16,150 @@ use Illuminate\Support\Arr;
*/
class Permission extends Model
{
const ACLRULES = [
'files_cadets' => [
'_see' => [
[
'path' => 'Prive/Cadet',
'access' => '1'
],
[
'path' => 'Prive/Cadet/*',
'access' => '1'
]
],
'_edit' => [
[
'path' => 'Prive/Cadet',
'access' => '2'
],
[
'path' => 'Prive/Cadet/*',
'access' => '2'
]
]
],
'files_staff' => [
'_see' => [
[
'path' => 'Prive/Staff',
'access' => '1'
],
[
'path' => 'Prive/Staff/*',
'access' => '1'
]
],
'_edit' => [
[
'path' => 'Prive/Staff',
'access' => '2'
],
[
'path' => 'Prive/Staff/*',
'access' => '2'
]
]
],
'files_etamas' => [
'_see' => [
[
'path' => 'Prive/ETAMAS',
'access' => '1'
],
[
'path' => 'Prive/ETAMAS/*',
'access' => '1'
]
],
'_edit' => [
[
'path' => 'Prive/ETAMAS',
'access' => '2'
],
[
'path' => 'Prive/ETAMAS/*',
'access' => '2'
]
]
],
'files_officier' => [
'_see' => [
[
'path' => 'Prive',
'access' => '1'
],
[
'path' => 'Prive/Officier',
'access' => '1'
],
[
'path' => 'Prive/Officier/*',
'access' => '1'
]
],
'_edit' => [
[
'path' => 'Prive',
'access' => '1'
],
[
'path' => 'Prive/Officier',
'access' => '2'
],
[
'path' => 'Prive/Officier/*',
'access' => '2'
]
]
],
'files_systeme' => [
'_see' => [
[
'path' => 'Systeme',
'access' => '1'
],
[
'path' => 'Systeme/*',
'access' => '1'
]
],
'_edit' => [
// Vide
]
],
'files_instruction' => [
'_see' => [
[
'path' => 'Prive/Staff/Instruction',
'access' => '1'
],
[
'path' => 'Prive/Staff/Instruction/*',
'access' => '1'
]
],
'_edit' => [
// Vide
]
],
'instruction_guide' => [
'_see' => [
[
'path' => 'Prive/Staff/Guide',
'access' => '1'
],
[
'path' => 'Prive/Staff/Guide/*',
'access' => '1'
]
],
'_edit' => [
// Vide
]
],
];
const PERMISSIONS = [
'Nouvelle' => [
'news_see' => [
@@ -149,6 +294,13 @@ class Permission extends Model
'icon' => 'fa-eye',
'valeur' => 0
],
'config_edit_files' => [
'ckey' => 'config_edit_files',
'communName' => 'Modifier les configurations de fichier',
'desc' => 'L\'utilisateur peut-il modifier les configurations de fichier',
'icon' => 'fa-eye',
'valeur' => 0
],
'config_edit_customization' => [
'ckey' => 'config_edit_customization',
'communName' => 'Modifier les configurations de l\'apparence du site',
@@ -253,6 +405,13 @@ class Permission extends Model
'icon' => 'fa-eye',
'valeur' => 0
],
'cadet_list_edit' => [
'ckey' => 'cadet_list_edit',
'communName' => 'Modifier la liste nominative',
'desc' => 'L\'utilisateur peut-il modifier la liste nominative',
'icon' => 'fa-eye',
'valeur' => 0
],
],
'Horaire' => [
'schedule_see' => [
@@ -345,23 +504,150 @@ class Permission extends Model
],
],
'Fichiers' => [
'file_see' => [
'ckey' => 'file_see',
'communName' => 'Voir les fichiers publiques',
'desc' => 'L\'utilisateur peut-il consulter les fichiers publiques',
'files_cadets_see' => [
'ckey' => 'files_cadets_see',
'communName' => 'Consulter les fichiers des cadets',
'desc' => 'L\'utilisateur peut-il consulter les fichiers des cadets',
'icon' => 'fa-eye',
'valeur' => 0
],
'drive_see' => [
'ckey' => 'drive_see',
'communName' => 'Voir l\'explorateur de fichier',
'desc' => 'L\'utilisateur peut-il consulter l\'explorateur de fichier',
'files_cadets_edit' => [
'ckey' => 'files_cadets_edit',
'communName' => 'Modifier les fichiers des cadets',
'desc' => 'L\'utilisateur peut-il modifier les fichiers des cadets',
'icon' => 'fa-eye',
'valeur' => 0
],
'files_staff_see' => [
'ckey' => 'files_staff_see',
'communName' => 'Consulter les fichiers des staffs',
'desc' => 'L\'utilisateur peut-il consulter les fichiers des staffs',
'icon' => 'fa-eye',
'valeur' => 0
],
'files_staff_edit' => [
'ckey' => 'files_staff_edit',
'communName' => 'Modifier les fichiers des staffs',
'desc' => 'L\'utilisateur peut-il modifier les fichiers des staffs',
'icon' => 'fa-eye',
'valeur' => 0
],
'files_etamas_see' => [
'ckey' => 'files_etamas_see',
'communName' => 'Consulter les fichiers de l\'ETAMAS',
'desc' => 'L\'utilisateur peut-il consulter les fichiers de l\'ETAMAS',
'icon' => 'fa-eye',
'valeur' => 0
],
'files_etamas_edit' => [
'ckey' => 'files_etamas_edit',
'communName' => 'Mo
difier les fichiers de l\'ETAMAS',
'desc' => 'L\'utilisateur peut-il modifier les fichiers de l\'ETAMAS',
'icon' => 'fa-eye',
'valeur' => 0
],
'files_officier_see' => [
'ckey' => 'files_officier_see',
'communName' => 'Consulter les fichiers des officiers',
'desc' => 'L\'utilisateur peut-il consulter les fichiers des officiers',
'icon' => 'fa-eye',
'valeur' => 0
],
'files_officier_edit' => [
'ckey' => 'files_officier_edit',
'communName' => 'Modifier les fichiers des officiers',
'desc' => 'L\'utilisateur peut-il modifier les fichiers des officiers',
'icon' => 'fa-eye',
'valeur' => 0
],
'files_systeme_see' => [
'ckey' => 'files_systeme_see',
'communName' => 'Voir les fichiers systemes',
'desc' => 'L\'utilisateur peut-il consulter les fichiers systemes',
'icon' => 'fa-eye',
'valeur' => 0
],
'files_instruction_see' => [
'ckey' => 'files_instruction_see',
'communName' => 'Voir les fichiers de l\'instruction',
'desc' => 'L\'utilisateur peut-il consulter les fichiers de l\'instruction',
'icon' => 'fa-eye',
'valeur' => 0
],
]
];
public static function updateACLRules($o)
{
$user_id = '0';
$rank_id = '0';
$job_id = '0';
switch ($o->table) {
case 'users':
$user_id = $o->id;
break;
case 'ranks':
$rank_id = $o->id;
break;
case 'jobs':
$job_id = $o->id;
break;
}
foreach (self::ACLRULES as $key => $rule)
{
if ($o->p($key.'_see') == 1) {
if ($o->p($key.'_edit') == 1) {
foreach ($rule['_edit'] as $acl) {
self::updateOrInsertACLRules($user_id,$rank_id,$job_id,'storage',$acl['path'],$acl['access']);
}
} else {
foreach ($rule['_see'] as $acl) {
self::updateOrInsertACLRules($user_id,$rank_id,$job_id,'storage',$acl['path'],$acl['access']);
}
}
} else {
foreach ($rule['_see'] as $acl) {
self::removeACLRules($user_id,$rank_id,$job_id,'storage',$acl['path']);
}
}
}
}
public static function removeACLRules($userId,$rankId,$jobId,$disk,$path)
{
$rules = DB::table('acl_rules')->where([
['user_id',$userId],
['rank_id',$rankId],
['job_id',$jobId],
['disk',$disk],
['path',$path]
]);
$rules->delete();
}
public static function updateOrInsertACLRules($userId,$rankId,$jobId,$disk,$path,$access)
{
DB::table('acl_rules')->updateOrInsert(
['user_id' => $userId, 'rank_id' => $rankId, 'job_id' => $jobId, 'disk' => $disk, 'path' => $path],
['access' => $access]
);
}
public static function addACLRules($userId,$rankId,$jobId,$disk,$path,$access)
{
DB::table('acl_rules')->insertOrIgnore([
'user_id' => $userId,
'rank_id' => $rankId,
'job_id' => $jobId,
'disk' => $disk,
'path' => $path,
'access' => $access
]);
}
public static function all($value = null,$columns = null)
{

View File

@@ -50,4 +50,9 @@ class Rank extends Model
{
return $this->permission($perm);
}
public function updateACLRules()
{
\App\Permission::updateACLRules($this);
}
}

View File

@@ -387,4 +387,30 @@ class User extends Authenticatable
return Carbon::parse($val->created_at)->format('Y-m-d');
});
}
public function checkACLRules($rule)
{
if ($rule->user_id == $this->id || $rule->user_id == '*')
{
return $rule->access;
}
if ($rule->job_id == $this->job_id || $rule->job_id == '*')
{
return $rule->access;
}
if ($rule->rank_id == $this->rank_id || $rule->rank_id == '*')
{
return $rule->access;
}
return -1;
}
public function checkACLRulesVisitor($rule)
{
if ($rule->user_id == '*')
{
return $rule->access;
}
return -1;
}
}

1978
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,20 +1,20 @@
mode: absorb
mode: increment
blade-directive: version
current:
label: ''
major: 3
minor: 2
patch: 5
prerelease: 23-gae00c9e7
patch: 6
prerelease: ''
buildmetadata: ''
commit: 41845
commit: '41847'
timestamp:
year: 2020
month: 6
day: 21
hour: 18
minute: 44
second: 55
month: 10
day: 13
hour: 14
minute: 50
second: 31
timezone: America/New_York
commit:
mode: git-local
@@ -44,10 +44,10 @@ format:
prerelease: '{$prerelease}'
buildmetadata: '{$buildmetadata}'
commit: '{$commit}'
version: 'v {$major}.{$minor}.{$patch} (commit {$commit})'
version: 'v {$major}.{$minor}.{$patch}'
version-only: 'version {$major}.{$minor}.{$patch}'
full: '{$version-only}[.?={$prerelease}][+?={$buildmetadata}] (commit {$commit})'
compact: 'v{$major}.{$minor}.{$patch}-{$commit}'
compact: 'v{$major}.{$minor}.{$patch}'
timestamp-year: '{$timestamp.year}'
timestamp-month: '{$timestamp.month}'
timestamp-day: '{$timestamp.day}'

View File

@@ -232,26 +232,6 @@ class ConfigsTableSeeder extends Seeder
'state' => 0,
'data' => '["#"]'
],
[
'name' => 'GOOGLE_DRIVE_CLIENT_ID',
'state' => 0,
'data' => '["'.\Crypt::encryptString('').'"]'
],
[
'name' => 'GOOGLE_DRIVE_CLIENT_SECRET',
'state' => 0,
'data' => '["'.\Crypt::encryptString('').'"]'
],
[
'name' => 'GOOGLE_DRIVE_REFRESH_TOKEN',
'state' => 0,
'data' => '["'.\Crypt::encryptString('').'"]'
],
[
'name' => 'GOOGLE_DRIVE_FOLDER_ID',
'state' => 0,
'data' => '["'.\Crypt::encryptString('null').'"]'
],
[
'name' => 'is_Google_Drive_enabled',
'state' => 0,

View File

@@ -7,84 +7,10 @@
<h4>Configuration du système de fichier</h4>
</div>
<div class="card-body mt-5">
<form action="/admin/config/files" method="POST">
<form action="/admin/config/files" method="post" enctype="multipart/form-data">
@csrf
<div class="row ml-2">
<h3 class="col-12">Google Drive</h3>
<div class="col-md-6">
<div class="alert alert-info" role="alert">
Vous pouvez suivre un <a class="alert-link" target="_blank" href="https://github.com/ivanvermeyen/laravel-google-drive-demo/blob/master/README/1-getting-your-dlient-id-and-secret.md">tutoriel (Anglais) <i class="fas fa-external-link-square-alt text-white"></i></a> pour trouver c'est information.
</div>
</div>
<div class="col-md-6">
<div id="google-drive-status" class="alert alert-primary" role="alert">
<div class="row pb-1">
<div class="col-10" id="google-drive-status-text">
Google Drive est initialisé correctement
</div>
<div class="col-2">
<div id="loaderDot" class="float-right d-none" style="margin-top: -30px;height: 41px">
@loaderDot
</div>
<div class="float-right" id="btn-sync">
<button type="button" class="btn btn-round btn-fab" style="margin-top: -0.55rem" onclick="checkFileSystem()">
<i class="fas fa-sync"></i>
</button>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-8 p-2">
<div class="togglebutton">
<label>
<input id="is_active" type="checkbox" data-toggle="switch" name="is_active">
<span class="toggle"></span>
Activer Google Drive
</label>
</div>
</div>
<div class="col-md-4">
</div>
<div class="col-md-6 p-2">
<div class="form-group">
<label for="exampleInputEmail1">GOOGLE_DRIVE_CLIENT_ID</label>
<input type="text" class="form-control" id="GOOGLE_DRIVE_CLIENT_ID" name="GOOGLE_DRIVE_CLIENT_ID" aria-describedby="emailHelp" value="{{Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_ID')) }}">
<small id="emailHelp" class="form-text text-muted">ID de client Google Drive</small>
</div>
</div>
<div class="col-md-6 p-2">
<div class="form-group">
<label for="exampleInputEmail1">GOOGLE_DRIVE_CLIENT_SECRET</label>
<input type="text" class="form-control" id="GOOGLE_DRIVE_CLIENT_SECRET" name="GOOGLE_DRIVE_CLIENT_SECRET" aria-describedby="emailHelp" value="{{Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_SECRET'))}}">
<small id="emailHelp" class="form-text text-muted">ID secret du disque Google Drive</small>
</div>
</div>
<div class="col-md-6 p-2">
<div class="form-group">
<label for="exampleInputEmail1">GOOGLE_DRIVE_REFRESH_TOKEN</label>
<input type="text" class="form-control" id="GOOGLE_DRIVE_REFRESH_TOKEN" name="GOOGLE_DRIVE_REFRESH_TOKEN" aria-describedby="emailHelp" value="{{Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_REFRESH_TOKEN'))}}">
<small id="emailHelp" class="form-text text-muted">Token de rafraichissement du disque Google Drive</small>
</div>
</div>
<div class="col-md-6 p-2">
<div class="form-group">
<label for="exampleInputEmail1">GOOGLE_DRIVE_FOLDER_ID</label>
<input type="text" class="form-control" id="GOOGLE_DRIVE_FOLDER_ID" name="GOOGLE_DRIVE_FOLDER_ID" aria-describedby="emailHelp" value="{{Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_FOLDER_ID'))}}">
<small id="emailHelp" class="form-text text-muted">ID du dossier Google Drive, "null" pour la racine</small>
</div>
</div>
<h3 class="col-12">Configuration de la liste nominale</h3>
<div class="col-md-6 p-2">
<div class="form-group">
<label for="exampleInputEmail1">Liste nominative des cadets</label>
<input type="text" class="form-control" id="cadet_list" name="cadet_list" aria-describedby="emailHelp" value="{{\App\Config::getData('cadet_list')}}">
<small id="emailHelp" class="form-text text-muted">Url vers la liste nominative des cadets</small>
</div>
</div>
<div class="col-md-12 p-2">
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
<p class="col-12">Il n'y a rien ici pour le moment</h3>
</div>
</form>
</div>

View File

@@ -54,8 +54,16 @@
<tbody>
@foreach($courses as $course)
<tr class="cursor">
<td>{{$course->ocom}}</td>
<td>{{$course->name}}</td>
<td>
{{ $course->ocom }}
</td>
<td>
@if($course->name != "")
{{$course->name}}
@else
{{$course->desc }}
@endif
</td>
<td>{{$course->instructor()}}</td>
<td>{{$course->event->date_begin}}</td>
<td class="text-center">{{$course->level}}</td>

View File

@@ -12,7 +12,11 @@
<div class="row">
<div class="col-md-4">
<label>Nom</label>
@if($course->name != "")
<p>{{$course->name}}</p>
@else
<p>{{$course->desc}}</p>
@endif
</div>
<div class="col-md-3">
<label>Instructeur</label>
@@ -111,7 +115,7 @@
<div class="col-md-1 text-center">
<label>Télécharger</label>
<p>
<a target="_blank" href="/file/get?d={{urlencode($lessonPlanDir)}}&f={{urlencode($course->lessonPlan->file)}}" class="btn btn-primary btn-fab btn-fab-mini btn-round m-0">
<a target="_blank" href="/admin/lessonPlan/{{$course->lessonPlan->file}}" class="btn btn-primary btn-fab btn-fab-mini btn-round m-0">
<i class="material-icons">cloud_download</i>
</a>
</p>

View File

@@ -0,0 +1,37 @@
@extends('layouts.admin.main')
@section('content')
<div class="col-md-12">
<div class="card">
<div class="card-header card-header-primary">
<h4>Mettre à jour la liste nominative</h4>
</div>
<div class="card-body mt-5">
<form method="post" enctype="multipart/form-data">
@csrf
<div class="row ml-2">
<div class="col-md-6 p-2">
<div class="form-group">
<label for="exampleInputEmail1">Liste nominative des cadets</label>
<div class="fileinput fileinput-new input-group" data-provides="fileinput" style="display: flex !important;">
<div class="form-control" data-trigger="fileinput">
<span class="fileinput-filename"></span>
</div>
<span class="input-group-append"><span class="input-group-text fileinput-exists cursor" data-dismiss="fileinput">Remove</span><span class="input-group-text btn-file"><span class="fileinput-new cursor">Select file</span><span class="fileinput-exists cursor">Change</span><input type="file" required name="nominativeList" accept="application/pdf"></span></span>
</div>
<small id="emailHelp" class="form-text text-muted">Veuillez choisir un pdf</small>
</div>
</div>
<div class="col-md-12 p-2">
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</div>
</form>
</div>
</div>
</div>
@endsection
@section('custom_scripts')
@endsection

View File

@@ -0,0 +1,20 @@
@extends('layouts.admin.main')
@section('content')
<div class="card">
<div class="card-header">
<h4 class="card-title">Liste nominative</h4>
<p class="category">Télécharger ici la liste nominative</p>
</div>
<div class="card-body">
<a href="/admin/nominativelist/download" target="_blank" class="btn btn-info">Télécharger</a>
@if(\Auth::user()->p('cadet_list_edit') == 1)
<a href="/admin/nominativelist/edit" class="btn btn-warning">Modifier</a>
@endif
</div>
</div>
@endsection
@section('custom_scripts')
@endsection

View File

@@ -32,6 +32,7 @@
<th style="width: 4.5rem">Status</th>
<th style="width: 4.5rem">OREN</th>
<th style="width: 4.5rem">OCOM</th>
<th style="width: 4.5rem">Niveau</th>
<th style="width: 7rem">Nb Periode</th>
<th>Objectif de rendement</th>
<th>Objectif de compétence</th>
@@ -56,6 +57,7 @@
</td>
<td onclick="navigate({{$ocom->id}})">{{$ocom->oren}}</td>
<td onclick="navigate({{$ocom->id}})">{{$ocom->ocom}}</td>
<td onclick="navigate({{$ocom->id}})">{{$ocom->niveau()}}</td>
<td onclick="navigate({{$ocom->id}})">{{$ocom->nbPeriode}}</td>
<td onclick="navigate({{$ocom->id}})">{{$ocom->objectif_rendement}}</td>
<td onclick="navigate({{$ocom->id}})">{{$ocom->objectif_competence}}</td>

View File

@@ -70,7 +70,7 @@
<td>{{$course->level}}</td>
<td class="text-center">
@if($course->lessonPlan)
<a href="/file/get?d={{urlencode(\App\GoogleDriveFile::findByPath('.Systeme/.Fichier/.PlanDeCours')->id)}}&f={{urlencode($course->lessonPlan->file)}}">
<a href="/admin/lessonPlan/{{$course->lessonPlan->file}}">
@if($course->lessonPlan->approved == 1)
<i class="fas fa-check-circle text-success fa-2x" data-toggle="tooltip"
data-placement="top" title="Plan de cours remis et vérifié"></i>

View File

@@ -2,13 +2,136 @@
@section('content')
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-sm-6">
<h3 class="card-title">3.2.6</h3>
<p class="category">2020-10-19</p>
</div>
<div class="col-sm-6 text-right">
<span class="badge badge-pill badge-success">STABLE</span>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<p>
Nouveauté
</p>
<ul class="list-group list-group-flush ml-3">
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-plus"></i>
</div>
<div class="col m-auto text-left">
Ajout d'un affichage en table pour l'horaire
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-plus"></i>
</div>
<div class="col m-auto text-left">
Ajout d'une colonne niveau dans la BD des cours
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-coffee"></i>
</div>
<div class="col m-auto text-left">
Mise à jour du système de fichier
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-coffee"></i>
</div>
<div class="col m-auto text-left">
De la gestion de plan de cours
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-coffee"></i>
</div>
<div class="col m-auto text-left">
Mise à jour de la gestion de la liste nominative
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-coffee"></i>
</div>
<div class="col m-auto text-left">
Mise à jour de l'affichage des permissions pour les postes et grades
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-coffee"></i>
</div>
<div class="col m-auto text-left">
Mise à jour du profil d'utilisateur
</div>
</div>
</li>
</ul>
</div>
<div class="col-md-6">
<p>
Bug
</p>
<ul class="list-group list-group-flush ml-3">
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-bug"></i>
</div>
<div class="col m-auto text-left">
Correction de multiples bugs
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-bug"></i>
</div>
<div class="col m-auto text-left">
Correction d'un bug d'affichage des cours
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-sm-6">
<h3 class="card-title">3.2.5</h3>
<p class="category">2019-10-19</p>
<p class="category">2020-10-01</p>
</div>
<div class="col-sm-6 text-right">
<span class="badge badge-pill badge-success">STABLE</span>

View File

@@ -38,7 +38,13 @@
@foreach($courses as $course)
<tr class="cursor">
<td>{{$course->ocom}}</td>
<td>{{$course->name}}</td>
<td>
@if($course->name != "")
{{$course->name}}
@else
{{$course->desc }}
@endif
</td>
<td>{{$course->instructor()}}</td>
<td>{{$course->event->date_begin}}</td>
<td class="text-center">{{$course->level}}</td>

View File

@@ -1,5 +1,5 @@
@php
$sidebar = [
$sidebar = [
'Nouvelle' => [
'route' => 'admin.news',
'icon' => 'new_releases',
@@ -72,12 +72,12 @@ $sidebar = [
'perm' => 'user_see',
'child' => null
],
//'Liste nominative' => [
// 'route' => 'admin.users',
// 'icon' => 'fas fa-address-book',
// 'perm' => 'cadet_list_see',
// 'child' => null
//],
'Liste nominative' => [
'route' => 'admin.admin.list',
'icon' => 'fas fa-address-book',
'perm' => 'cadet_list_see',
'child' => null
],
'Logs' => [
'route' => 'admin.stats.log',
'icon' => 'fas fa-stream',
@@ -86,12 +86,49 @@ $sidebar = [
],
]
],
//'Fichiers' => [
// 'route' => null,
// 'icon' => 'folder',
// 'perm' => 'file_see',
// 'child' => \App\GoogleDriveFile::getSidebarFile(),
//],
'Fichiers' => [
'route' => null,
'icon' => 'folder',
'perm' => null,
'child' => [
'Publique' => [
'route' => 'admin.files.publique',
'icon' => 'fas fa-folder-open',
'perm' => null,
'child' => null
],
'Cadets' => [
'route' => 'admin.files.cadet',
'icon' => 'fas fa-folder-open',
'perm' => 'files_cadets_see',
'child' => null
],
'Staff' => [
'route' => 'admin.files.staff',
'icon' => 'fas fa-folder-open',
'perm' => 'files_staff_see',
'child' => null
],
'Instruction' => [
'route' => 'admin.instruction.files',
'icon' => 'fas fa-folder-open',
'perm' => 'files_instruction_see',
'child' => null
],
'ETAMAS' => [
'route' => 'admin.files.etamas',
'icon' => 'fas fa-folder-open',
'perm' => 'files_etamas_see',
'child' => null
],
'Officiers' => [
'route' => 'admin.files.officier',
'icon' => 'fas fa-folder-open',
'perm' => 'files_officier_see',
'child' => null
]
],
],
'Configuration' => [
'route' => null,
'icon' => 'menu_book',
@@ -127,12 +164,12 @@ $sidebar = [
'perm' => 'config_edit_job',
'child' => null
],
//'Fichier' => [
// 'route' => 'admin.config.files',
// 'icon' => 'fas fa-folder',
// 'perm' => 'config_edit_files',
// 'child' => null
//],
'Fichier' => [
'route' => 'admin.config.files',
'icon' => 'fas fa-folder',
'perm' => 'config_edit_files',
'child' => null
],
'Apparence' => [
'route' => 'admin.config.customisation',
'icon' => 'fas fa-palette',
@@ -141,7 +178,7 @@ $sidebar = [
]
]
],
]
]
@endphp
<div class="sidebar" data-color="white" data-background-color="black" data-image="/images/sidebar.png">
<div class="logo">

View File

@@ -76,12 +76,6 @@ Route::middleware('auth:api')->group(function () {
Route::post('/course/{id}/plan/validate','CourseController@validatePlan')->middleware('courseperm:validate_plan');;
/** File Exlorer Route */
Route::get('/drive/{folder}/permission/{subject}/{id}','GoogleDriveController@editPermissionModal')->middleware('perm:file_see');
Route::get('/drive/{folder}/addpermission/{subject}','GoogleDriveController@addPermissionModal')->middleware('perm:file_see');
Route::get('/drive/folders/{folder?}','GoogleDriveController@list')->middleware('fileperm:folder,r');
Route::get('/drive/path/{folder}','GoogleDriveController@getPath')->middleware('fileperm:folder,r');
Route::get('/drive/patharray','GoogleDriveController@getPathArray')->middleware('perm:file_see');
Route::get('/drive/files/{dir}/{file}','GoogleDriveController@showMetadata')->middleware('fileperm:folder,r');
Route::get('/drive/checkfilestructure','GoogleDriveController@checkFileSystem')->middleware('perm:config_edit');;
Route::get('/user/perm/{id}', function($id) {

View File

@@ -341,10 +341,22 @@ Breadcrumbs::for('admin.stats.instruction', function ($trail) {
$trail->push('Statistique de l\'instruction', route('admin.stats.instruction'));
});
// Admin > List
Breadcrumbs::for('admin.admin.list', function ($trail) {
$trail->parent('admin.dashboard');
$trail->push('Liste Nominative', route('admin.admin.list'));
});
// Admin > List
Breadcrumbs::for('admin.admin.list.update', function ($trail) {
$trail->parent('admin.admin.list');
$trail->push('Mettre à jour la liste Nominative', route('admin.admin.list.update'));
});
// Admin > Files
Breadcrumbs::for('admin.files', function ($trail) {
$trail->parent('admin.dashboard');
$trail->push('Mes fichier', route('admin.files'));
$trail->push('Fichiers', route('admin.files'));
});
// Admin > Files > Cadet

View File

@@ -178,7 +178,7 @@ Route::middleware(['auth', 'firstlogin'])->name('admin.')->group(function () {
/** Instruction */
Route::get('/admin/instruction', 'AdminController@instruction')->name('instruction');
Route::get('/admin/instruction/guide', 'FilesController@guide')->middleware('perm:instruction_guide_see')->name('instruction.guide');
Route::get('/admin/instruction/files', 'FilesController@instruction')->middleware('perm:file_see')->name('instruction.files');
Route::get('/admin/instruction/files', 'FilesController@instruction')->middleware('perm:files_instruction_see')->name('instruction.files');
/** Courses */
Route::get('/admin/course', 'CourseController@index')->name('course');
@@ -188,15 +188,21 @@ Route::middleware(['auth', 'firstlogin'])->name('admin.')->group(function () {
Route::patch('/admin/course/{id}/plan/commentOfficer', 'CourseController@updateCommentOfficerPlan')->middleware('courseperm:comment_plan_officer');
Route::patch('/admin/course/{id}/plan/comment', 'CourseController@updateCommentPlan')->middleware('courseperm:edit');
Route::post('/admin/course/{id}/lessonPlan', 'CourseController@updateLessonPlan')->middleware('courseperm:edit');
Route::get('/admin/lessonPlan/{name}','CourseController@downloadLessonPlan')->where('name','.*');
/** Files */
Route::get('/admin/files', 'FilesController@index')->name('files');
Route::get('/admin/files/cadet', 'FilesController@cadet')->middleware('perm:file_see')->name('files.cadet')->middleware('fileperm:folder,r');
Route::get('/admin/files/staff', 'FilesController@staff')->middleware('perm:file_see')->name('files.staff')->middleware('fileperm:folder,r');
Route::get('/admin/files/etamas', 'FilesController@etamas')->middleware('perm:file_see')->name('files.etamas')->middleware('fileperm:folder,r');
Route::get('/admin/files/officier', 'FilesController@officier')->middleware('perm:file_see')->name('files.officier')->middleware('fileperm:folder,r');
Route::get('/admin/files/publique', 'FilesController@publique')->middleware('perm:file_see')->name('files.publique')->middleware('fileperm:folder,r');
Route::get('/admin/files/cadet', 'FilesController@cadet')->middleware('perm:files_cadets_see')->name('files.cadet');
Route::get('/admin/files/staff', 'FilesController@staff')->middleware('perm:files_staff_see')->name('files.staff');
Route::get('/admin/files/etamas', 'FilesController@etamas')->middleware('perm:files_etamas_see')->name('files.etamas');
Route::get('/admin/files/officier', 'FilesController@officier')->middleware('perm:files_officier_see')->name('files.officier');
Route::get('/admin/files/publique', 'FilesController@publique')->name('files.publique');
/** List Cadet */
Route::get('/admin/nominativelist','FilesController@show_nominativeList')->middleware('perm:cadet_list_see')->name('admin.list');
Route::get('/admin/nominativelist/edit','FilesController@edit_nominativeList')->middleware('perm:cadet_list_edit')->name('admin.list.update');
Route::post('/admin/nominativelist/edit','FilesController@update_nominativeList')->middleware('perm:cadet_list_edit');
Route::get('/admin/nominativelist/download','FilesController@download_nominativeList')->middleware('perm:cadet_list_see');
/** OCOM */
Route::get('/admin/ocom', 'OCOMController@index')->name('ocom')->middleware('perm:instruction_db_ocom_see');