diff --git a/filemanager/filemanager.py b/filemanager/filemanager.py index 3386f34f3..8f55874c7 100755 --- a/filemanager/filemanager.py +++ b/filemanager/filemanager.py @@ -6,6 +6,7 @@ from websiteFunctions.models import Websites from random import randint from django.core.files.storage import FileSystemStorage from plogical.acl import ACLManager +from filemanager.models import Trash class FileManager: def __init__(self, request, data): @@ -172,6 +173,12 @@ class FileManager: finalData['status'] = 1 domainName = self.data['domainName'] + + try: + skipTrash = self.data['skipTrash'] + except: + skipTrash = False + website = Websites.objects.get(domain=domainName) self.homePath = '/home/%s' % (domainName) @@ -180,9 +187,56 @@ class FileManager: if (self.data['path'] + '/' + item).find('..') > -1 or (self.data['path'] + '/' + item).find(self.homePath) == -1: return self.ajaxPre(0, 'Not allowed to move in this path, please choose location inside home!') - command = 'rm -rf ' + self.returnPathEnclosed(self.data['path'] + '/' + item) + if skipTrash: + command = 'rm -rf ' + self.returnPathEnclosed(self.data['path'] + '/' + item) + ProcessUtilities.executioner(command, website.externalApp) + else: + trashPath = '%s/.trash' % (self.homePath) + + command = 'mkdir %s' % (trashPath) + ProcessUtilities.executioner(command, website.externalApp) + + Trash(website=website, originalPath=self.returnPathEnclosed(self.data['path']), fileName=self.returnPathEnclosed(item)).save() + + command = 'mv %s %s' % (self.returnPathEnclosed(self.data['path'] + '/' + item), trashPath) + ProcessUtilities.executioner(command, website.externalApp) + + json_data = json.dumps(finalData) + return HttpResponse(json_data) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def restore(self): + try: + finalData = {} + finalData['status'] = 1 + + domainName = self.data['domainName'] + + try: + skipTrash = self.data['skipTrash'] + except: + skipTrash = False + + website = Websites.objects.get(domain=domainName) + self.homePath = '/home/%s' % (domainName) + + for item in self.data['fileAndFolders']: + + if (self.data['path'] + '/' + item).find('..') > -1 or (self.data['path'] + '/' + item).find(self.homePath) == -1: + return self.ajaxPre(0, 'Not allowed to move in this path, please choose location inside home!') + + trashPath = '%s/.trash' % (self.homePath) + + tItem = Trash.objects.get(website=website, fileName=self.returnPathEnclosed(item)) + + command = 'mv %s %s' % (self.returnPathEnclosed(trashPath + '/' + item), tItem.originalPath) ProcessUtilities.executioner(command, website.externalApp) + tItem.delete() + + json_data = json.dumps(finalData) return HttpResponse(json_data) diff --git a/filemanager/static/filemanager/js/fileManager.js b/filemanager/static/filemanager/js/fileManager.js index d3c1985bd..afe544c22 100755 --- a/filemanager/static/filemanager/js/fileManager.js +++ b/filemanager/static/filemanager/js/fileManager.js @@ -42,6 +42,7 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, $scope.currentPath = "/home/" + domainName; $scope.startingPath = domainName; $scope.completeStartingPath = "/home/" + domainName; + var trashPath = homePathBack + '/.trash' $scope.editDisable = true; // disable loading image on tree loading @@ -218,7 +219,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } } - function prepareChildNodeUL() { // text nodes are created @@ -305,7 +305,7 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, var tableBody = document.getElementById("tableBodyFiles"); var getFileName = tableBody.firstChild.firstChild.innerHTML; - allFilesAndFolders = [] + allFilesAndFolders = []; var collectionOfA = tableBody.getElementsByTagName("tr"); @@ -340,7 +340,7 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, var check = 1; var getFileName = nodeName.getElementsByTagName('td')[0].innerHTML; - if (nodeName.style.backgroundColor == "aliceblue") { + if (nodeName.style.backgroundColor === "aliceblue") { var tempArray = []; nodeName.style.background = "None"; @@ -375,19 +375,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } - /* - - - - public_html - 26KB - 26 Oct - 775 - Folder/File - - - */ - function createTR(fileName, fileSize, lastModified, permissions, dirCheck) { // text nodes are created @@ -396,10 +383,8 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, var lastModifiedNode = document.createTextNode(lastModified); var permissionsNode = document.createTextNode(permissions); - // - var iNodeFolder = document.createElement('i'); iNodeFolder.setAttribute('class', 'fa fa-folder'); iNodeFolder.setAttribute('aria-hidden', 'true'); @@ -454,7 +439,8 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, var fileOrFolderNode = document.createTextNode("Folder"); fifthTDNode.appendChild(fileOrFolderNode) - } else { + } + else { thNode.appendChild(iNodeFile); trNode.appendChild(thNode); trNode.addEventListener("click", function () { @@ -485,6 +471,14 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, $scope.buttonActivator = function () { + // for restore button + if($scope.currentPath === trashPath) { + var restoreBTN = document.getElementById("restoreRight"); + restoreBTN.style.display = "block"; + }else{ + var restoreBTN = document.getElementById("restoreRight"); + restoreBTN.style.display = "none"; + } // for edit button if (allFilesAndFolders.length === 1) { var editNode = document.getElementById("editFile"); @@ -507,7 +501,12 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } else if (result[0] === "php") { aceEditorMode = "ace/mode/php"; editNotRight.style.display = "Block"; - } else if (result[0] === "txt") { + } + else if (result[0] === "py") { + aceEditorMode = "ace/mode/python"; + editNotRight.style.display = "Block"; + } + else if (result[0] === "txt") { aceEditorMode = ""; editNotRight.style.display = "Block"; } else if (result[0] === "htaccess") { @@ -523,7 +522,8 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, editNode.style.pointerEvents = "none"; editNotRight.style.display = "None"; } - } else { + } + else { var editNode = document.getElementById("editFile"); editNode.style.pointerEvents = "none"; } @@ -1385,7 +1385,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } }; - $scope.renameFile = function () { $scope.renameLoading = false; @@ -1494,13 +1493,11 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, $scope.groupPermissions = 0; $scope.wordlPermissions = 0; - $scope.showPermissionsModal = function () { $('#showPermissions').modal('show'); $scope.permissionsPath = allFilesAndFolders[0]; }; - $scope.updateReadPermissions = function (value) { switch (value) { @@ -1618,7 +1615,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } }; - $scope.changePermissionsRecursively = function () { $scope.changePermissions(1); }; @@ -1670,5 +1666,53 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, }; + /// + + // + $scope.cyberPanelLoading = true; + $scope.showRestoreModal = function () { + $scope.createSuccess = true; + $scope.errorMessageFolder = true; + $scope.newFolderName = ""; + $('#showRestore').modal('show'); + }; + + $scope.restoreFinal = function () { + $scope.cyberPanelLoading = false; + var data = { + path: $scope.currentPath, + method: "restore", + fileAndFolders: allFilesAndFolders, + domainRandomSeed: domainRandomSeed, + domainName: domainName, + }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + $('#showRestore').modal('hide'); + var notification = alertify.notify('Successfully restored to its original location!', 'success', 5, function () { + }); + $scope.fetchForTableSecondary(null, 'refresh'); + } else { + var notification = alertify.notify('Files/Folders can not be restored', 'error', 5, function () { + console.log('dismissed'); + }); + } + + } + + function cantLoadInitialDatas(response) { + } + + }; }); \ No newline at end of file diff --git a/filemanager/templates/filemanager/index.html b/filemanager/templates/filemanager/index.html index 9a0ebe39d..af9dd4143 100755 --- a/filemanager/templates/filemanager/index.html +++ b/filemanager/templates/filemanager/index.html @@ -662,6 +662,37 @@ + + + + + + + @@ -704,6 +735,7 @@
  • {% trans "Compress" %}
  • {% trans "Extract" %}
  • {% trans "Edit" %}
  • +
  • {% trans "Restore" %}
  • diff --git a/filemanager/views.py b/filemanager/views.py index 57a3d5d0f..d23d40135 100755 --- a/filemanager/views.py +++ b/filemanager/views.py @@ -120,6 +120,8 @@ def controller(request): return fm.createNewFolder() elif method == 'deleteFolderOrFile': return fm.deleteFolderOrFile() + elif method == 'restore': + return fm.restore() elif method == 'copy': return fm.copy() elif method == 'move': diff --git a/static/filemanager/js/fileManager.js b/static/filemanager/js/fileManager.js index 19e175118..afe544c22 100644 --- a/static/filemanager/js/fileManager.js +++ b/static/filemanager/js/fileManager.js @@ -42,6 +42,7 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, $scope.currentPath = "/home/" + domainName; $scope.startingPath = domainName; $scope.completeStartingPath = "/home/" + domainName; + var trashPath = homePathBack + '/.trash' $scope.editDisable = true; // disable loading image on tree loading @@ -218,7 +219,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } } - function prepareChildNodeUL() { // text nodes are created @@ -305,7 +305,7 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, var tableBody = document.getElementById("tableBodyFiles"); var getFileName = tableBody.firstChild.firstChild.innerHTML; - allFilesAndFolders = [] + allFilesAndFolders = []; var collectionOfA = tableBody.getElementsByTagName("tr"); @@ -340,7 +340,7 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, var check = 1; var getFileName = nodeName.getElementsByTagName('td')[0].innerHTML; - if (nodeName.style.backgroundColor == "aliceblue") { + if (nodeName.style.backgroundColor === "aliceblue") { var tempArray = []; nodeName.style.background = "None"; @@ -375,19 +375,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } - /* - - - - public_html - 26KB - 26 Oct - 775 - Folder/File - - - */ - function createTR(fileName, fileSize, lastModified, permissions, dirCheck) { // text nodes are created @@ -396,10 +383,8 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, var lastModifiedNode = document.createTextNode(lastModified); var permissionsNode = document.createTextNode(permissions); - // - var iNodeFolder = document.createElement('i'); iNodeFolder.setAttribute('class', 'fa fa-folder'); iNodeFolder.setAttribute('aria-hidden', 'true'); @@ -454,7 +439,8 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, var fileOrFolderNode = document.createTextNode("Folder"); fifthTDNode.appendChild(fileOrFolderNode) - } else { + } + else { thNode.appendChild(iNodeFile); trNode.appendChild(thNode); trNode.addEventListener("click", function () { @@ -485,6 +471,14 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, $scope.buttonActivator = function () { + // for restore button + if($scope.currentPath === trashPath) { + var restoreBTN = document.getElementById("restoreRight"); + restoreBTN.style.display = "block"; + }else{ + var restoreBTN = document.getElementById("restoreRight"); + restoreBTN.style.display = "none"; + } // for edit button if (allFilesAndFolders.length === 1) { var editNode = document.getElementById("editFile"); @@ -507,7 +501,12 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } else if (result[0] === "php") { aceEditorMode = "ace/mode/php"; editNotRight.style.display = "Block"; - } else if (result[0] === "txt") { + } + else if (result[0] === "py") { + aceEditorMode = "ace/mode/python"; + editNotRight.style.display = "Block"; + } + else if (result[0] === "txt") { aceEditorMode = ""; editNotRight.style.display = "Block"; } else if (result[0] === "htaccess") { @@ -523,7 +522,8 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, editNode.style.pointerEvents = "none"; editNotRight.style.display = "None"; } - } else { + } + else { var editNode = document.getElementById("editFile"); editNode.style.pointerEvents = "none"; } @@ -1007,7 +1007,8 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, method: "deleteFolderOrFile", fileAndFolders: allFilesAndFolders, domainRandomSeed: domainRandomSeed, - domainName: domainName + domainName: domainName, + skipTrash: $scope.skipTrash }; @@ -1384,7 +1385,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } }; - $scope.renameFile = function () { $scope.renameLoading = false; @@ -1493,13 +1493,11 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, $scope.groupPermissions = 0; $scope.wordlPermissions = 0; - $scope.showPermissionsModal = function () { $('#showPermissions').modal('show'); $scope.permissionsPath = allFilesAndFolders[0]; }; - $scope.updateReadPermissions = function (value) { switch (value) { @@ -1617,7 +1615,6 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, } }; - $scope.changePermissionsRecursively = function () { $scope.changePermissions(1); }; @@ -1669,5 +1666,53 @@ fileManager.controller('fileManagerCtrl', function ($scope, $http, FileUploader, }; + /// + + // + $scope.cyberPanelLoading = true; + $scope.showRestoreModal = function () { + $scope.createSuccess = true; + $scope.errorMessageFolder = true; + $scope.newFolderName = ""; + $('#showRestore').modal('show'); + }; + + $scope.restoreFinal = function () { + $scope.cyberPanelLoading = false; + var data = { + path: $scope.currentPath, + method: "restore", + fileAndFolders: allFilesAndFolders, + domainRandomSeed: domainRandomSeed, + domainName: domainName, + }; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.status === 1) { + $('#showRestore').modal('hide'); + var notification = alertify.notify('Successfully restored to its original location!', 'success', 5, function () { + }); + $scope.fetchForTableSecondary(null, 'refresh'); + } else { + var notification = alertify.notify('Files/Folders can not be restored', 'error', 5, function () { + console.log('dismissed'); + }); + } + + } + + function cantLoadInitialDatas(response) { + } + + }; }); \ No newline at end of file