parent
ddfdca1b73
commit
592ebf68c0
@ -0,0 +1,4 @@ |
|||||||
|
CleanDeleted Files Maintenance plugin |
||||||
|
=== |
||||||
|
|
||||||
|
This plugin allows the administrator to permanently delete files marked as deleted |
@ -0,0 +1,190 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
/** |
||||||
|
* Plugin. |
||||||
|
* |
||||||
|
* @author Jose Angel Ruiz |
||||||
|
* |
||||||
|
* @package chamilo.plugin.CleanDeletedFiles |
||||||
|
*/ |
||||||
|
$cidReset = true; |
||||||
|
require_once __DIR__.'/config.php'; |
||||||
|
|
||||||
|
api_protect_admin_script(); |
||||||
|
|
||||||
|
/** @var \CleanDeletedFilesPlugin $plugin */ |
||||||
|
$plugin = CleanDeletedFilesPlugin::create(); |
||||||
|
$plugin_info = $plugin->get_info(); |
||||||
|
|
||||||
|
$isPlatformAdmin = api_is_platform_admin(); |
||||||
|
|
||||||
|
if ($plugin->isEnabled() && $isPlatformAdmin) { |
||||||
|
$htmlHeadXtra[] = '<script> |
||||||
|
$(document).ready(function() { |
||||||
|
$(".delete-file").click(function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
var path = $(this).prop("href").substr(7); |
||||||
|
if (confirm("'.$plugin->get_lang("ConfirmDelete").'")) { |
||||||
|
$.post( |
||||||
|
"src/ajax.php", |
||||||
|
{a:"delete-file", path:path}, |
||||||
|
function(data){ |
||||||
|
if (data.status == "false") { |
||||||
|
alert(data.message); |
||||||
|
} else { |
||||||
|
location.reload(); |
||||||
|
} |
||||||
|
}, |
||||||
|
"json" |
||||||
|
); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
$(".select_all").click(function(e) { |
||||||
|
var id = $(this).prop("id").substr(7); |
||||||
|
if( $(this).prop("checked") ) { |
||||||
|
$(".checkbox-"+id).prop( "checked", true); |
||||||
|
} else { |
||||||
|
$(".checkbox-"+id).prop( "checked", false); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
$("#delete-selected-files").click(function(e) { |
||||||
|
if (confirm("'.$plugin->get_lang("ConfirmDeleteFiles").'")) { |
||||||
|
var list = []; |
||||||
|
$.each($(".checkbox-item:checked"), function() { |
||||||
|
list.push($(this).prop("id")); |
||||||
|
}); |
||||||
|
|
||||||
|
$.post( |
||||||
|
"src/ajax.php", |
||||||
|
{a:"delete-files-list", list:list}, |
||||||
|
function(data){ |
||||||
|
if (data.status == "false") { |
||||||
|
alert(data.message); |
||||||
|
} else { |
||||||
|
location.reload(); |
||||||
|
} |
||||||
|
}, |
||||||
|
"json" |
||||||
|
); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
</script>'; |
||||||
|
|
||||||
|
$nameTools = $plugin->get_lang("FileList"); |
||||||
|
Display::display_header($nameTools); |
||||||
|
echo Display::page_header($nameTools); |
||||||
|
|
||||||
|
$pathList = [ |
||||||
|
"app/courses", |
||||||
|
"app/upload", |
||||||
|
]; |
||||||
|
|
||||||
|
function findDeletedFiles($pathRelative) { |
||||||
|
global $sizePath; |
||||||
|
$pathAbsolute = api_get_path(SYS_PATH).$pathRelative; |
||||||
|
$result = []; |
||||||
|
if (is_dir($pathAbsolute)) { |
||||||
|
$dir = dir($pathAbsolute); |
||||||
|
while ($file = $dir->read()) { |
||||||
|
if (is_file($pathAbsolute.'/'.$file)) { |
||||||
|
$filesize = round(filesize($pathAbsolute.'/'.$file)/1024, 1); |
||||||
|
$pos = strpos($file, "DELETED"); |
||||||
|
if ($pos !== FALSE) { |
||||||
|
$result[] = [ |
||||||
|
'path_complete' => $pathAbsolute.'/'.$file, |
||||||
|
'path_relative' => $pathRelative.'/'.$file, |
||||||
|
'size' => $filesize, |
||||||
|
]; |
||||||
|
$sizePath += $filesize; |
||||||
|
} |
||||||
|
} else if ($file!='..' && $file!='.') { |
||||||
|
$result = array_merge($result, findDeletedFiles($pathRelative.'/'.$file)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return $result; |
||||||
|
} |
||||||
|
|
||||||
|
$sizeTotal = 0; |
||||||
|
$i = 0; |
||||||
|
foreach ($pathList as $pathItem) { |
||||||
|
$sizePath = 0; |
||||||
|
$filesDeletedList = findDeletedFiles($pathItem); |
||||||
|
echo Display::page_subheader($plugin->get_lang("path_dir").": ".$pathItem); |
||||||
|
|
||||||
|
if (count($filesDeletedList) > 0) { |
||||||
|
echo "<ul>"; |
||||||
|
echo "<li>".$plugin->get_lang('FilesDeletedMark').": <strong>".count($filesDeletedList)."</strong>"; |
||||||
|
echo "<li>".$plugin->get_lang('FileDirSize').": "; |
||||||
|
if ($sizePath >= 1024) { |
||||||
|
echo "<strong>".round($sizePath/1024,1)." Mb</strong>"; |
||||||
|
} else { |
||||||
|
echo "<strong>".$sizePath." Kb</strong>"; |
||||||
|
} |
||||||
|
echo "</ul>"; |
||||||
|
|
||||||
|
$header = [ |
||||||
|
[ |
||||||
|
'<input type="checkbox" id="select_'.$i.'" class="select_all" />', |
||||||
|
false, |
||||||
|
null, |
||||||
|
['style' => 'text-align:center'] |
||||||
|
], |
||||||
|
[$plugin->get_lang('path_dir'), true], |
||||||
|
[$plugin->get_lang('size'), true, null, ['style' => 'min-width:85px']], |
||||||
|
[get_lang('Actions'), false], |
||||||
|
]; |
||||||
|
|
||||||
|
$data = []; |
||||||
|
$deleteIcon = Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL); |
||||||
|
|
||||||
|
foreach ($filesDeletedList as $value) { |
||||||
|
$tools = Display::url( |
||||||
|
$deleteIcon, |
||||||
|
'file://'.$value['path_complete'], |
||||||
|
['class' => 'delete-file'] |
||||||
|
); |
||||||
|
|
||||||
|
$row = [ |
||||||
|
'<input type="checkbox" |
||||||
|
class="checkbox-'.$i.' checkbox-item" |
||||||
|
id="file://'.$value['path_complete'].'" />', |
||||||
|
$value['path_relative'], |
||||||
|
$value['size'].' '.($value['size'] >= 1024 ? 'Mb' : 'Kb'), |
||||||
|
$tools |
||||||
|
]; |
||||||
|
$data[] = $row; |
||||||
|
} |
||||||
|
|
||||||
|
echo Display::return_sortable_table( |
||||||
|
$header, |
||||||
|
$data, |
||||||
|
[], |
||||||
|
['per_page' => 100], |
||||||
|
[] |
||||||
|
); |
||||||
|
} else { |
||||||
|
$message = $plugin->get_lang('NoFilesDeleted'); |
||||||
|
echo Display::return_message($message, 'warning', false); |
||||||
|
} |
||||||
|
$sizeTotal += $sizePath; |
||||||
|
echo '<hr>'; |
||||||
|
$i++; |
||||||
|
} |
||||||
|
|
||||||
|
if ($sizeTotal >= 1024) { |
||||||
|
echo $plugin->get_lang('SizeTotalAllDir').": <strong>".round($sizeTotal/1024,1).' Mb</strong>'; |
||||||
|
} else { |
||||||
|
echo $plugin->get_lang('SizeTotalAllDir').": <strong>".$sizeTotal.' Kb</strong>'; |
||||||
|
} |
||||||
|
echo '<hr>'; |
||||||
|
echo '<a href="#" id="delete-selected-files" class="btn btn-primary">'. |
||||||
|
$plugin->get_lang("DeleteSelectedFiles"). |
||||||
|
'</a>'; |
||||||
|
|
||||||
|
Display::display_footer(); |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
/** |
||||||
|
* Config the plugin. |
||||||
|
* |
||||||
|
* @author Jose Angel Ruiz |
||||||
|
* |
||||||
|
* @package chamilo.plugin.CleanDeletedFiles |
||||||
|
*/ |
||||||
|
require_once __DIR__.'/../../main/inc/global.inc.php'; |
@ -0,0 +1,3 @@ |
|||||||
|
<?php |
||||||
|
/* For license terms, see /license.txt */ |
||||||
|
require_once 'config.php'; |
@ -0,0 +1 @@ |
|||||||
|
<?php |
@ -0,0 +1,17 @@ |
|||||||
|
<?php |
||||||
|
$strings['plugin_title'] = "Clean deleted files"; |
||||||
|
$strings['plugin_comment'] = "Permanently delete files marked as deleted"; |
||||||
|
$strings['tool_enable'] = "Enable plugin"; |
||||||
|
$strings['FileList'] = "List of files marked as deleted"; |
||||||
|
$strings['SizeTotalAllDir'] = "Total size (all directories)"; |
||||||
|
$strings['NoFilesDeleted'] = "There are no files marked as deleted"; |
||||||
|
$strings['FilesDeletedMark'] = "Files marked as deleted"; |
||||||
|
$strings['FileDirSize'] = "Directory files size"; |
||||||
|
$strings['ConfirmDelete'] = "Are you sure you want to delete the file?"; |
||||||
|
$strings['ErrorDeleteFile'] = "An error occurred while deleting the file"; |
||||||
|
$strings['ErrorEmptyPath'] = "There was a problem deleting the file, the path cannot be empty"; |
||||||
|
$strings['DeleteSelectedFiles'] = "Delete selected files"; |
||||||
|
$strings['ConfirmDeleteFiles'] = "Are you sure you want to delete all the selected files?"; |
||||||
|
$strings['DeletedSuccess'] = "The file deletion was successful"; |
||||||
|
$strings['path_dir'] = "Directory"; |
||||||
|
$strings['size'] = "Size"; |
@ -0,0 +1,17 @@ |
|||||||
|
<?php |
||||||
|
$strings['plugin_title'] = "Limpiar ficheros borrados"; |
||||||
|
$strings['plugin_comment'] = "Elimina de forma definitiva los ficheros marcados como eliminados"; |
||||||
|
$strings['tool_enable'] = "Activar plugin"; |
||||||
|
$strings['FileList'] = "Lista de archivos marcados como eliminados"; |
||||||
|
$strings['SizeTotalAllDir'] = "Tamaño total (todos los directorios)"; |
||||||
|
$strings['NoFilesDeleted'] = "No hay ficheros marcados como eliminados"; |
||||||
|
$strings['FilesDeletedMark'] = "Ficheros marcados como eliminados"; |
||||||
|
$strings['FileDirSize'] = "Tamaño de los ficheros del directorio"; |
||||||
|
$strings['ConfirmDelete'] = "¿Está seguro que desea borrar el fichero?"; |
||||||
|
$strings['ErrorDeleteFile'] = "Se ha producido un error al borrar el fichero"; |
||||||
|
$strings['ErrorEmptyPath'] = "Ha habido un problema al borrar el fichero, la ruta no puede ser vacía"; |
||||||
|
$strings['DeleteSelectedFiles'] = "Borrar archivos seleccionados"; |
||||||
|
$strings['ConfirmDeleteFiles'] = "¿Esta seguro que desea borrar todos los ficheros seleccionados?"; |
||||||
|
$strings['DeletedSuccess'] = "El borrado de archivos ha sido correcto"; |
||||||
|
$strings['path_dir'] = "Directorio"; |
||||||
|
$strings['size'] = "Tamaño"; |
@ -0,0 +1,14 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
/** |
||||||
|
* Plugin. |
||||||
|
* |
||||||
|
* @author Jose Angel Ruiz |
||||||
|
* |
||||||
|
* @package chamilo.plugin.CleanDeletedFiles |
||||||
|
*/ |
||||||
|
|
||||||
|
/* Plugin config */ |
||||||
|
require_once __DIR__.'/config.php'; |
||||||
|
$plugin_info = CleanDeletedFilesPlugin::create()->get_info(); |
@ -0,0 +1,35 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
/** |
||||||
|
* Clean deleted files plugin. |
||||||
|
* |
||||||
|
* @author Jose Angel Ruiz |
||||||
|
* |
||||||
|
* @package chamilo.plugin.CleanDeletedFiles |
||||||
|
*/ |
||||||
|
class CleanDeletedFilesPlugin extends Plugin |
||||||
|
{ |
||||||
|
public $isAdminPlugin = true; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class constructor. |
||||||
|
*/ |
||||||
|
protected function __construct() |
||||||
|
{ |
||||||
|
$version = '1.0'; |
||||||
|
$author = 'José Angel Ruiz (NOSOLORED)'; |
||||||
|
parent::__construct($version, $author, ['enabled' => 'boolean']); |
||||||
|
$this->isAdminPlugin = true; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return RedirectionPlugin |
||||||
|
*/ |
||||||
|
public static function create() |
||||||
|
{ |
||||||
|
static $result = null; |
||||||
|
|
||||||
|
return $result ? $result : $result = new self(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
/** |
||||||
|
* Responses to AJAX calls |
||||||
|
*/ |
||||||
|
|
||||||
|
require_once '../config.php'; |
||||||
|
|
||||||
|
api_protect_admin_script(); |
||||||
|
|
||||||
|
$plugin = CleanDeletedFilesPlugin::create(); |
||||||
|
$action = isset($_REQUEST['a']) ? $_REQUEST['a'] : null; |
||||||
|
|
||||||
|
switch ($action) { |
||||||
|
case 'delete-file': |
||||||
|
$path = isset($_REQUEST['path']) ? $_REQUEST['path'] : null; |
||||||
|
if (empty($path)) { |
||||||
|
echo json_encode(["status" => "false", "message"=>$plugin->get_lang('ErrorEmptyPath')]); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
if (unlink($path)) { |
||||||
|
Display::addFlash($plugin->get_lang("DeletedSuccess"), 'success'); |
||||||
|
echo json_encode(["status" => "true"]); |
||||||
|
} else { |
||||||
|
echo json_encode(["status" => "false", "message"=>$plugin->get_lang('ErrorDeleteFile')]); |
||||||
|
} |
||||||
|
break; |
||||||
|
case 'delete-files-list': |
||||||
|
$list = isset($_REQUEST['list']) ? $_REQUEST['list'] : []; |
||||||
|
if (empty($list)) { |
||||||
|
echo json_encode(["status" => "false", "message"=>$plugin->get_lang('ErrorEmptyPath')]); |
||||||
|
exit; |
||||||
|
} |
||||||
|
|
||||||
|
foreach ($list as $value) { |
||||||
|
if (empty($value)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
unlink($value); |
||||||
|
} |
||||||
|
|
||||||
|
Display::addFlash($plugin->get_lang("DeletedSuccess"), 'success'); |
||||||
|
echo json_encode(["status" => "true"]); |
||||||
|
break; |
||||||
|
} |
Loading…
Reference in new issue