diff --git a/frappe/templates/generators/web_form.html b/frappe/templates/generators/web_form.html index 6c8ca1f6de..a7376c2586 100644 --- a/frappe/templates/generators/web_form.html +++ b/frappe/templates/generators/web_form.html @@ -332,7 +332,6 @@ frappe.ready(function() { var input = $input.get(0); var reader = new FileReader(); - input.filedata = null; if(input.files.length) { file = input.files[0]; frappe.file_reading = true; @@ -396,9 +395,11 @@ frappe.ready(function() { // change attach $form.on("click", ".change-attach", function() { - $(this).parent().addClass("hide") + var input_wrapper = $(this).parent().addClass("hide") .parent().find(".attach-input-wrap").removeClass("hide"); + input_wrapper.find('input').val(''); + frappe.form_dirty = true; return false; @@ -513,7 +514,12 @@ frappe.ready(function() { var $input = $(this); var input_type = $input.attr("type"); if(input_type==="file") { - var val = $input.get(0).filedata; + // save filedata dict as value + if($input.get(0).filedata) { + var val = $input.get(0).filedata; + } else { + var val = {'__no_attachment': 1} + } } else if(input_type==="checkbox") { var val = $input.prop("checked") ? 1 : 0; } else if($input.attr("data-fieldtype")==="Date") { @@ -639,11 +645,11 @@ frappe.ready(function() { dateFormat: frappe.datepicker_format, }); - // convert dates from YYYY-MM-DD to user format + // initialize dates from YYYY-MM-DD to user format $dates.each(function() { - var val = $(this).val(); + var val = $(this).attr('value'); if(val) { - $(this).val(moment(val, 'YYYY-MM-DD').format()); + $(this).val(moment(val, 'YYYY-MM-DD').format()).trigger('change'); } }); } diff --git a/frappe/utils/file_manager.py b/frappe/utils/file_manager.py index ece60b2e3a..63997aa9da 100644 --- a/frappe/utils/file_manager.py +++ b/frappe/utils/file_manager.py @@ -259,6 +259,8 @@ def remove_file(fid, attached_to_doctype=None, attached_to_name=None): if attached_to_doctype and attached_to_name: doc = frappe.get_doc(attached_to_doctype, attached_to_name) ignore_permissions = doc.has_permission("write") or False + if frappe.flags.in_web_form: + ignore_permissions = True if not file_name: file_name = frappe.db.get_value("File", fid, "file_name") comment = doc.add_comment("Attachment Removed", _("Removed {0}").format(file_name)) diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index 4d28d5ee3e..7c3ab06d2d 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -304,6 +304,7 @@ def get_context(context): def accept(web_form, data): data = frappe._dict(json.loads(data)) files = [] + files_to_delete = [] web_form = frappe.get_doc("Web Form", web_form) if data.doctype != web_form.doc_type: @@ -312,6 +313,8 @@ def accept(web_form, data): elif data.name and not web_form.allow_edit: frappe.throw(_("You are not allowed to update this Web Form Document")) + frappe.flags.in_web_form = True + if data.name: # update doc = frappe.get_doc(data.doctype, data.name) @@ -326,6 +329,9 @@ def accept(web_form, data): if "__file_attachment" in value: files.append((fieldname, value)) continue + if '__no_attachment' in value: + files_to_delete.append(doc.get(fieldname)) + value = '' except ValueError: pass @@ -351,7 +357,7 @@ def accept(web_form, data): for f in files: fieldname, filedata = f - # remove earlier attachmed file (if exists) + # remove earlier attached file (if exists) if doc.get(fieldname): remove_file_by_url(doc.get(fieldname), doc.doctype, doc.name) @@ -364,6 +370,11 @@ def accept(web_form, data): doc.save() + if files_to_delete: + for f in files_to_delete: + if f: + remove_file_by_url(f, doc.doctype, doc.name) + return doc.name @frappe.whitelist()