@@ -1248,9 +1248,9 @@ def logger(module=None, with_more_info=True): | |||||
from frappe.utils.logger import get_logger | from frappe.utils.logger import get_logger | ||||
return get_logger(module or 'default', with_more_info=with_more_info) | return get_logger(module or 'default', with_more_info=with_more_info) | ||||
def log_error(message, title=None): | |||||
def log_error(message=None, title=None): | |||||
'''Log error to Error Log''' | '''Log error to Error Log''' | ||||
get_doc(dict(doctype='Error Log', error=str(message), | |||||
get_doc(dict(doctype='Error Log', error=str(message or get_traceback()), | |||||
method=title)).insert(ignore_permissions=True) | method=title)).insert(ignore_permissions=True) | ||||
def get_desk_link(doctype, name): | def get_desk_link(doctype, name): | ||||
@@ -56,6 +56,7 @@ class IntegrationService(Document): | |||||
return res.json() | return res.json() | ||||
except Exception, exc: | except Exception, exc: | ||||
frappe.log_error() | |||||
raise exc | raise exc | ||||
def put_request(url, auth=None, data=None): | def put_request(url, auth=None, data=None): | ||||
@@ -276,14 +276,14 @@ | |||||
</div> | </div> | ||||
{% endfor %} | {% endfor %} | ||||
</div> | </div> | ||||
{% if last_page and accept_payment and payment_url %} | |||||
{% if last_page and accept_payment %} | |||||
<div class="well payment-details"> | <div class="well payment-details"> | ||||
{% if not doc.paid %} | {% if not doc.paid %} | ||||
{% if payment_button_help %} | {% if payment_button_help %} | ||||
<div class='text-muted' style='padding-bottom: 15px;'> | <div class='text-muted' style='padding-bottom: 15px;'> | ||||
{{ payment_button_help }}</div> | {{ payment_button_help }}</div> | ||||
{% endif %} | {% endif %} | ||||
<a class="btn btn-primary btn-payment" href="{{ payment_url }}"> | |||||
<a class="btn btn-primary btn-payment"> | |||||
{{ payment_button_label }}</a> | {{ payment_button_label }}</a> | ||||
{% else %} | {% else %} | ||||
<div>{{ _("Payment Complete") }}</div> | <div>{{ _("Payment Complete") }}</div> | ||||
@@ -418,11 +418,7 @@ frappe.ready(function() { | |||||
// allow payment only if | // allow payment only if | ||||
$('.btn-payment').on('click', function() { | $('.btn-payment').on('click', function() { | ||||
var data = get_data(); | |||||
if(frappe.mandatory_missing.length) { | |||||
show_mandatory_missing(); | |||||
return false; | |||||
} | |||||
save(true); | |||||
}); | }); | ||||
// change attach | // change attach | ||||
@@ -594,7 +590,7 @@ frappe.ready(function() { | |||||
return out; | return out; | ||||
} | } | ||||
function save() { | |||||
function save(for_payment) { | |||||
if(window.saving) | if(window.saving) | ||||
return; | return; | ||||
window.saving = true; | window.saving = true; | ||||
@@ -602,7 +598,8 @@ frappe.ready(function() { | |||||
if(frappe.file_reading) { | if(frappe.file_reading) { | ||||
window.saving = false; | window.saving = false; | ||||
frappe.msgprint("Reading file, please retry."); | |||||
frappe.msgprint(__("Uploading files please wait for a few seconds.")); | |||||
throw 'reading files'; | |||||
return; | return; | ||||
} | } | ||||
@@ -610,6 +607,7 @@ frappe.ready(function() { | |||||
if(frappe.allow_incomplete && frappe.mandatory_missing.length) { | if(frappe.allow_incomplete && frappe.mandatory_missing.length) { | ||||
window.saving = false; | window.saving = false; | ||||
show_mandatory_missing(); | show_mandatory_missing(); | ||||
throw 'mandatory missing'; | |||||
return; | return; | ||||
} | } | ||||
@@ -618,7 +616,8 @@ frappe.ready(function() { | |||||
method: "frappe.website.doctype.web_form.web_form.accept", | method: "frappe.website.doctype.web_form.web_form.accept", | ||||
args: { | args: { | ||||
data: data, | data: data, | ||||
web_form: frappe.web_form_name | |||||
web_form: frappe.web_form_name, | |||||
for_payment: for_payment | |||||
}, | }, | ||||
freeze: true, | freeze: true, | ||||
btn: $form.find("[type='submit']"), | btn: $form.find("[type='submit']"), | ||||
@@ -636,6 +635,11 @@ frappe.ready(function() { | |||||
if(frappe.is_new) { | if(frappe.is_new) { | ||||
window.location.href = window.location.pathname + "?name=" + frappe.doc_name; | window.location.href = window.location.pathname + "?name=" + frappe.doc_name; | ||||
} | } | ||||
if(for_payment && data.message) { | |||||
window.location.href = data.message; | |||||
} | |||||
} else { | |||||
set_message(__('Not Saved')); | |||||
} | } | ||||
}, | }, | ||||
always: function() { | always: function() { | ||||
@@ -155,7 +155,6 @@ def get_context(context): | |||||
"<br>").replace("'", "\'") | "<br>").replace("'", "\'") | ||||
self.add_custom_context_and_script(context) | self.add_custom_context_and_script(context) | ||||
self.add_payment_gateway_url(context) | |||||
if not context.max_attachment_size: | if not context.max_attachment_size: | ||||
context.max_attachment_size = get_max_file_size() / 1024 / 1024 | context.max_attachment_size = get_max_file_size() / 1024 / 1024 | ||||
@@ -195,27 +194,27 @@ def get_context(context): | |||||
if self.web_form_module and hasattr(self.web_form_module, 'get_list_context'): | if self.web_form_module and hasattr(self.web_form_module, 'get_list_context'): | ||||
self.web_form_module.get_list_context(context) | self.web_form_module.get_list_context(context) | ||||
def add_payment_gateway_url(self, context): | |||||
if context.doc and self.accept_payment: | |||||
def get_payment_gateway_url(self, doc): | |||||
if self.accept_payment: | |||||
controller = get_integration_controller(self.payment_gateway) | controller = get_integration_controller(self.payment_gateway) | ||||
title = "Payment for {0} {1}".format(context.doc.doctype, context.doc.name) | |||||
title = "Payment for {0} {1}".format(doc.doctype, doc.name) | |||||
payment_details = { | payment_details = { | ||||
"amount": self.amount, | "amount": self.amount, | ||||
"title": title, | "title": title, | ||||
"description": title, | "description": title, | ||||
"reference_doctype": context.doc.doctype, | |||||
"reference_docname": context.doc.name, | |||||
"reference_doctype": doc.doctype, | |||||
"reference_docname": doc.name, | |||||
"payer_email": frappe.session.user, | "payer_email": frappe.session.user, | ||||
"payer_name": frappe.utils.get_fullname(frappe.session.user), | "payer_name": frappe.utils.get_fullname(frappe.session.user), | ||||
"order_id": context.doc.name, | |||||
"order_id": doc.name, | |||||
"currency": self.currency, | "currency": self.currency, | ||||
"redirect_to": frappe.utils.get_url(self.route) | "redirect_to": frappe.utils.get_url(self.route) | ||||
} | } | ||||
# Redirect the user to this url | # Redirect the user to this url | ||||
context.payment_url = controller.get_payment_url(**payment_details) | |||||
return controller.get_payment_url(**payment_details) | |||||
def add_custom_context_and_script(self, context): | def add_custom_context_and_script(self, context): | ||||
'''Update context from module if standard and append script''' | '''Update context from module if standard and append script''' | ||||
@@ -303,9 +302,21 @@ def get_context(context): | |||||
else: | else: | ||||
self.web_form_module = None | self.web_form_module = None | ||||
def validate_mandatory(self, doc): | |||||
'''Validate mandatory web form fields''' | |||||
missing = [] | |||||
for f in self.web_form_fields: | |||||
if f.reqd and doc.get(f.fieldname) in (None, []): | |||||
missing.append(f) | |||||
if missing: | |||||
frappe.throw(_('Mandatory Information missing:') + '<br><br>' | |||||
+ '<br>'.join([d.label for d in missing])) | |||||
@frappe.whitelist(allow_guest=True) | @frappe.whitelist(allow_guest=True) | ||||
def accept(web_form, data): | |||||
def accept(web_form, data, for_payment=False): | |||||
'''Save the web form''' | |||||
data = frappe._dict(json.loads(data)) | data = frappe._dict(json.loads(data)) | ||||
files = [] | files = [] | ||||
files_to_delete = [] | files_to_delete = [] | ||||
@@ -342,6 +353,9 @@ def accept(web_form, data): | |||||
doc.set(fieldname, value) | doc.set(fieldname, value) | ||||
if for_payment: | |||||
web_form.validate_mandatory(doc) | |||||
if doc.name: | if doc.name: | ||||
if has_web_form_permission(doc.doctype, doc.name, "write"): | if has_web_form_permission(doc.doctype, doc.name, "write"): | ||||
doc.save(ignore_permissions=True) | doc.save(ignore_permissions=True) | ||||
@@ -379,7 +393,12 @@ def accept(web_form, data): | |||||
if f: | if f: | ||||
remove_file_by_url(f, doc.doctype, doc.name) | remove_file_by_url(f, doc.doctype, doc.name) | ||||
return doc.name | |||||
frappe.flags.web_form_doc = doc | |||||
if for_payment: | |||||
return web_form.get_payment_gateway_url(doc) | |||||
else: | |||||
return doc.name | |||||
@frappe.whitelist() | @frappe.whitelist() | ||||
def delete(web_form, name): | def delete(web_form, name): | ||||