diff --git a/web/pgadmin/misc/file_manager/__init__.py b/web/pgadmin/misc/file_manager/__init__.py index 32afb5e3..b34caf69 100644 --- a/web/pgadmin/misc/file_manager/__init__.py +++ b/web/pgadmin/misc/file_manager/__init__.py @@ -211,7 +211,6 @@ def utility(): status=200, mimetype="application/javascript") - @blueprint.route("/file_manager.js") @login_required def file_manager_js(): diff --git a/web/pgadmin/misc/file_manager/static/js/file_manager.js b/web/pgadmin/misc/file_manager/static/js/file_manager.js index 10de1ea8..9f28769a 100644 --- a/web/pgadmin/misc/file_manager/static/js/file_manager.js +++ b/web/pgadmin/misc/file_manager/static/js/file_manager.js @@ -294,7 +294,8 @@ define('misc.file_manager', [ var innerbody; if (closeEvent.button.text == gettext('Select')) { - var newFile = $('.storage_dialog #uploader .input-path').val(), + var newFile = [$('.storage_dialog #uploader .input-path').val(), + '*'], file_data = { 'path': $('.currentpath').val(), }; @@ -305,7 +306,7 @@ define('misc.file_manager', [ innerbody.remove(); removeTransId(trans_id); // Ajax call to store the last directory visited once user press select button - + set_last_traversed_dir(file_data, trans_id); } else if (closeEvent.button.text == gettext('Cancel')) { innerbody = $(this.elements.body).find('.storage_content'); @@ -578,8 +579,11 @@ define('misc.file_manager', [ $('.replace_file, .fm_dimmer').hide(); $yesBtn.off(); $noBtn.off(); - var newFile = $('.storage_dialog #uploader .input-path').val(); - + var newFile = [ + $('.storage_dialog #uploader .input-path').val(), + $('.change_file_types select').val(), + ]; + pgAdmin.Browser.Events.trigger('pgadmin-storage:finish_btn:create_file', newFile); $('.file_manager_create_cancel').trigger('click'); $('.storage_dialog #uploader .input-path').attr('disabled', false); @@ -660,18 +664,23 @@ define('misc.file_manager', [ }, callback: function(closeEvent) { if (closeEvent.button.text == gettext('Create')) { - var newFile = $('.storage_dialog #uploader .input-path').val(), + var newFile = [ + $('.storage_dialog #uploader .input-path').val(), + $('.change_file_types select').val(), + ], file_data = { 'path': $('.currentpath').val(), }, innerbody; - if (!this.check_permission(newFile)) { + // var file_type = $('.change_file_types select').val() + + if (!this.check_permission(newFile[0])) { closeEvent.cancel = true; return; } - if (!_.isUndefined(newFile) && newFile !== '' && this.is_file_exist()) { + if (!_.isUndefined(newFile[0]) && newFile[0] !== '' && this.is_file_exist()) { this.replace_file(); closeEvent.cancel = true; } else { diff --git a/web/pgadmin/misc/file_manager/static/js/utility.js b/web/pgadmin/misc/file_manager/static/js/utility.js index 249b0fe8..fc4b8edf 100755 --- a/web/pgadmin/misc/file_manager/static/js/utility.js +++ b/web/pgadmin/misc/file_manager/static/js/utility.js @@ -19,6 +19,14 @@ define([ Define functions used for various operations ---------------------------------------------------------*/ + //get Format type. +// var getFormattype = function(name){ + // $('.allowed_file_types select').on('change', function() { + // var selected_val = $(this).val(), + // return selected_val + //}); + // } + // Return file extension var getFileExtension = function(name) { var found = name.lastIndexOf('.') + 1; diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py index fae527c7..d348a3d0 100644 --- a/web/pgadmin/tools/sqleditor/__init__.py +++ b/web/pgadmin/tools/sqleditor/__init__.py @@ -41,6 +41,7 @@ from pgadmin.tools.sqleditor.utils.query_tool_preferences import \ from pgadmin.tools.sqleditor.utils.query_tool_fs_utils import \ read_file_generator from pgadmin.tools.sqleditor.utils.filter_dialog import FilterDialog +from pgadmin.tools.sqleditor.utils.save_query_to_file_utils import save_query_to_file MODULE_NAME = 'sqleditor' @@ -1294,7 +1295,6 @@ def load_file(): return Response(read_file_generator(file_path, enc), mimetype='text/plain') - @blueprint.route('/save_file/', methods=["PUT", "POST"], endpoint='save_file') @login_required def save_file(): @@ -1305,52 +1305,13 @@ def save_file(): if request.data: file_data = json.loads(request.data, encoding='utf-8') - # retrieve storage directory path - storage_manager_path = get_storage_directory() - - # generate full path of file - file_path = unquote(file_data['file_name']) - if hasattr(str, 'decode'): - file_path = unquote( - file_data['file_name'] - ).encode('utf-8').decode('utf-8') - - try: - Filemanager.check_access_permission(storage_manager_path, file_path) - except Exception as e: - return internal_server_error(errormsg=str(e)) - - if storage_manager_path is not None: - file_path = os.path.join( - storage_manager_path, - file_path.lstrip('/').lstrip('\\') - ) - - if hasattr(str, 'decode'): - file_content = file_data['file_content'] - else: - file_content = file_data['file_content'].encode() - - # write to file - try: - with open(file_path, 'wb+') as output_file: - if hasattr(str, 'decode'): - output_file.write(file_content.encode('utf-8')) - else: - output_file.write(file_content) - except IOError as e: - if e.strerror == 'Permission denied': - err_msg = "Error: {0}".format(e.strerror) - else: - err_msg = "Error: {0}".format(e.strerror) - return internal_server_error(errormsg=err_msg) - except Exception as e: - err_msg = "Error: {0}".format(e.strerror) - return internal_server_error(errormsg=err_msg) + filepath1=save_query_to_file(file_data); return make_json_response( data={ - 'status': True, + 'result': filepath1, + 'status': True + } ) diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js index f8cb05af..3ca436ce 100644 --- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js +++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js @@ -1947,6 +1947,7 @@ define('tools.querytool', [ self.gridView.editor_title = _.unescape(editor_title); self.gridView.current_file = undefined; + self.gridView.current_file_type = undefined; // Render the header self.gridView.render(); @@ -2588,8 +2589,10 @@ define('tools.querytool', [ // Open save file dialog if query tool if (self.is_query_tool) { - var current_file = self.gridView.current_file; - if (!_.isUndefined(current_file) && !save_as) { + + var current_file = [ self.gridView.current_file, self.gridView.current_file_type]; + alertify.success(self.gridView.current_file); + if (!_.isUndefined(current_file[0]) && !save_as) { self._save_file_handler(current_file); } else { // provide custom option to save file dialog @@ -2868,7 +2871,8 @@ define('tools.querytool', [ var self = this, _e = e, data = { - 'file_name': decodeURI(e), + 'file_name': decodeURI(e[0]), + 'file_type': e[1], }; self.trigger( @@ -2887,7 +2891,8 @@ define('tools.querytool', [ data: JSON.stringify(data), success: function(res) { self.gridView.query_tool_obj.setValue(res); - self.gridView.current_file = e; + self.gridView.current_file = e[0]; + self.gridView.current_file_type= e[1]; self.setTitle(self.gridView.current_file.split('\\').pop().split('/').pop(), true); self.trigger('pgadmin-sqleditor:loading-icon:hide'); // hide cursor @@ -2919,8 +2924,9 @@ define('tools.querytool', [ var self = this, _e = e, data = { - 'file_name': decodeURI(e), + 'file_name': decodeURI(e[0]), 'file_content': self.gridView.query_tool_obj.getValue(), + 'file_type': e[1], }; self.trigger( 'pgadmin-sqleditor:loading-icon:show', @@ -2935,8 +2941,10 @@ define('tools.querytool', [ data: JSON.stringify(data), success: function(res) { if (res.data.status) { + // alertify.success(res.data.result); alertify.success(gettext('File saved successfully.')); - self.gridView.current_file = e; + self.gridView.current_file = res.data.result; + self.gridView.current_file_type = e[1]; self.setTitle(self.gridView.current_file.replace(/^.*[\\\/]/g, ''), true); // disable save button on file save $('#btn-save').prop('disabled', true); @@ -2971,6 +2979,7 @@ define('tools.querytool', [ self.is_query_changed = true; if (self.gridView.current_file) { + alertify.success(self.gridView.current_file); var title = self.gridView.current_file.replace(/^.*[\\\/]/g, '') + ' *'; self.setTitle(title, true); } else { diff --git a/web/pgadmin/tools/sqleditor/utils/save_query_to_file_utils.py b/web/pgadmin/tools/sqleditor/utils/save_query_to_file_utils.py new file mode 100644 index 00000000..a67c3e83 --- /dev/null +++ b/web/pgadmin/tools/sqleditor/utils/save_query_to_file_utils.py @@ -0,0 +1,71 @@ +import os +from pgadmin.misc.file_manager import Filemanager +from pgadmin.utils import get_storage_directory +from pgadmin.utils.ajax import make_json_response, bad_request, \ + success_return, internal_server_error, unauthorized + +try: + from urllib import unquote +except ImportError: + from urllib.parse import unquote + + +def save_query_to_file(file_data): + # retrieve storage directory path + storage_manager_path = get_storage_directory() + + # generate full path of file + file_path = unquote(file_data['file_name']) + + if hasattr(str, 'decode'): + file_path = unquote( + file_data['file_name'] + ).encode('utf-8').decode('utf-8') + + file_type = file_data['file_type'] + + + #file_type=file_data['file_type'] + if file_type == 'sql': + if not file_path.endswith('.sql'): + file_path = file_path + ".sql" + + file_path = file_path.encode('utf-8') + + try: + Filemanager.check_access_permission(storage_manager_path, file_path) + except Exception as e: + return internal_server_error(errormsg=str(e)) + + # lstrip() returns a copy of the string + # in which all chars have been stripped + # from the beginning of the string (default whitespace characters). + if storage_manager_path is not None: + file_path = os.path.join( + storage_manager_path, + file_path.lstrip('/').lstrip('\\') + ) + + if hasattr(str, 'decode'): + file_content = file_data['file_content'] + else: + file_content = file_data['file_content'].encode() + + # write to file + try: + with open(file_path, 'wb+') as output_file: + if hasattr(str, 'decode'): + output_file.write(file_content.encode('utf-8')) + return file_path + else: + output_file.write(file_content) + return file_path + except IOError as e: + if e.strerror == 'Permission denied': + err_msg = "Error: {0}".format(e.strerror) + else: + err_msg = "Error: {0}".format(e.strerror) + return internal_server_error(errormsg=err_msg) + except Exception as e: + err_msg = "Error: {0}".format(e.strerror) + return internal_server_error(errormsg=err_msg)