@@ -251,14 +251,14 @@ | |||||
"bold": 0, | "bold": 0, | ||||
"collapsible": 1, | "collapsible": 1, | ||||
"columns": 0, | "columns": 0, | ||||
"fieldname": "schedular_event_details", | |||||
"fieldname": "background_events", | |||||
"fieldtype": "Section Break", | "fieldtype": "Section Break", | ||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | "in_filter": 0, | ||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"label": "Schedular Event Details", | |||||
"label": "Background Events", | |||||
"length": 0, | "length": 0, | ||||
"no_copy": 0, | "no_copy": 0, | ||||
"permlevel": 0, | "permlevel": 0, | ||||
@@ -308,7 +308,7 @@ | |||||
"issingle": 0, | "issingle": 0, | ||||
"istable": 0, | "istable": 0, | ||||
"max_attachments": 0, | "max_attachments": 0, | ||||
"modified": "2016-09-01 08:45:15.304959", | |||||
"modified": "2016-09-23 13:25:33.548752", | |||||
"modified_by": "Administrator", | "modified_by": "Administrator", | ||||
"module": "Integration Broker", | "module": "Integration Broker", | ||||
"name": "Integration Service", | "name": "Integration Service", | ||||
@@ -226,6 +226,10 @@ def confirm_payment(token): | |||||
if data.get("reference_doctype") and data.get("reference_docname"): | if data.get("reference_doctype") and data.get("reference_docname"): | ||||
redirect_to = frappe.get_doc(data.get("reference_doctype"), data.get("reference_docname")).run_method("on_payment_authorized", "Completed") | redirect_to = frappe.get_doc(data.get("reference_doctype"), data.get("reference_docname")).run_method("on_payment_authorized", "Completed") | ||||
if not redirect_to: | |||||
if data.get('redirect_to'): | |||||
redirect_to = data.get('redirect_to') | |||||
redirect_to = redirect_to or get_url("/integrations/payment-success") | redirect_to = redirect_to or get_url("/integrations/payment-success") | ||||
else: | else: | ||||
@@ -11,7 +11,7 @@ Example: | |||||
from frappe.integration_broker.doctype.integration_service.integration_service import get_integration_controller | from frappe.integration_broker.doctype.integration_service.integration_service import get_integration_controller | ||||
controller = get_integration_controller("Razorpay", setup=False) | |||||
controller = get_integration_controller("Razorpay") | |||||
controller().validate_transaction_currency(currency) | controller().validate_transaction_currency(currency) | ||||
### 2. Redirect for payment | ### 2. Redirect for payment | ||||
@@ -30,8 +30,6 @@ Example: | |||||
"currency": "INR" | "currency": "INR" | ||||
} | } | ||||
from frappe.integration.razorpay import get_checkout_url | |||||
# Redirect the user to this url | # Redirect the user to this url | ||||
url = controller().get_payment_url(**payment_details) | url = controller().get_payment_url(**payment_details) | ||||
@@ -142,6 +140,7 @@ class Controller(IntegrationController): | |||||
""" | """ | ||||
settings = self.get_settings() | settings = self.get_settings() | ||||
data = json.loads(self.integration_request.data) | |||||
if self.integration_request.status != "Authorized": | if self.integration_request.status != "Authorized": | ||||
resp = self.get_request("https://api.razorpay.com/v1/payments/{0}" | resp = self.get_request("https://api.razorpay.com/v1/payments/{0}" | ||||
@@ -154,7 +153,11 @@ class Controller(IntegrationController): | |||||
if self.flags.status_changed_to == "Authorized": | if self.flags.status_changed_to == "Authorized": | ||||
if self.data.reference_doctype and self.data.reference_docname: | if self.data.reference_doctype and self.data.reference_docname: | ||||
redirect_to = frappe.get_doc(self.data.reference_doctype, self.data.reference_docname).run_method("on_payment_authorized", self.flags.status_changed_to) | |||||
redirect_to = frappe.get_doc(self.data.reference_doctype, | |||||
self.data.reference_docname).run_method("on_payment_authorized", self.flags.status_changed_to) | |||||
if not redirect_to: | |||||
if data.get('redirect_to'): | |||||
redirect_to = data.get('redirect_to') | |||||
return { | return { | ||||
"redirect_to": redirect_to or "payment-success", | "redirect_to": redirect_to or "payment-success", | ||||
@@ -103,8 +103,8 @@ class DbTable: | |||||
for col in columns: | for col in columns: | ||||
if len(col.fieldname) >= 64: | if len(col.fieldname) >= 64: | ||||
frappe.throw(_("Fieldname is limited to 64 characters")) | |||||
frappe.throw(_("Fieldname is limited to 64 characters ({0})").format(frappe.bold(col.fieldname))) | |||||
if col.fieldtype in type_map and type_map[col.fieldtype][0]=="varchar": | if col.fieldtype in type_map and type_map[col.fieldtype][0]=="varchar": | ||||
# validate length range | # validate length range | ||||
@@ -595,8 +595,9 @@ frappe.ui.form.GridRow = Class.extend({ | |||||
this.grid.refresh(); | this.grid.refresh(); | ||||
} | } | ||||
}, | }, | ||||
insert: function(show) { | |||||
insert: function(show, below) { | |||||
var idx = this.doc.idx; | var idx = this.doc.idx; | ||||
if(below) idx ++; | |||||
this.toggle_view(false); | this.toggle_view(false); | ||||
this.grid.add_new_row(idx, null, show); | this.grid.add_new_row(idx, null, show); | ||||
}, | }, | ||||
@@ -1060,6 +1061,8 @@ frappe.ui.form.GridRowForm = Class.extend({ | |||||
.click(function() { me.row.remove(); return false; }) | .click(function() { me.row.remove(); return false; }) | ||||
this.wrapper.find(".grid-insert-row") | this.wrapper.find(".grid-insert-row") | ||||
.click(function() { me.row.insert(true); return false; }) | .click(function() { me.row.insert(true); return false; }) | ||||
this.wrapper.find(".grid-insert-row-below") | |||||
.click(function() { me.row.insert(true, true); return false; }) | |||||
this.wrapper.find(".grid-append-row") | this.wrapper.find(".grid-append-row") | ||||
.click(function() { | .click(function() { | ||||
me.row.toggle_view(false); | me.row.toggle_view(false); | ||||
@@ -1072,7 +1075,7 @@ frappe.ui.form.GridRowForm = Class.extend({ | |||||
}); | }); | ||||
}, | }, | ||||
toggle_add_delete_button_display: function($parent) { | toggle_add_delete_button_display: function($parent) { | ||||
$parent.find(".grid-delete-row, .grid-insert-row, .grid-append-row") | |||||
$parent.find(".grid-header-toolbar .btn, .grid-footer-toolbar .btn") | |||||
.toggle(this.row.grid.is_editable()); | .toggle(this.row.grid.is_editable()); | ||||
}, | }, | ||||
refresh_field: function(fieldname) { | refresh_field: function(fieldname) { | ||||
@@ -1,5 +1,5 @@ | |||||
<div class="grid-form-heading sortable-handle"> | <div class="grid-form-heading sortable-handle"> | ||||
<div class="toolbar"> | |||||
<div class="toolbar grid-header-toolbar"> | |||||
<span class="panel-title"> | <span class="panel-title"> | ||||
{%= __("Editing Row") %} #<span class="grid-form-row-index"></span></span> | {%= __("Editing Row") %} #<span class="grid-form-row-index"></span></span> | ||||
<button class="btn btn-default btn-xs pull-right" style="margin-left: 7px;"> | <button class="btn btn-default btn-xs pull-right" style="margin-left: 7px;"> | ||||
@@ -8,6 +8,9 @@ | |||||
<button class="btn btn-default btn-xs pull-right grid-insert-row" | <button class="btn btn-default btn-xs pull-right grid-insert-row" | ||||
style="margin-left: 7px;"> | style="margin-left: 7px;"> | ||||
{%= __("Insert Above") %}</button> | {%= __("Insert Above") %}</button> | ||||
<button class="btn btn-default btn-xs pull-right grid-insert-row-below hidden-xs" | |||||
style="margin-left: 7px;"> | |||||
{%= __("Insert Below") %}</button> | |||||
<button class="btn btn-danger btn-xs pull-right grid-delete-row"> | <button class="btn btn-danger btn-xs pull-right grid-delete-row"> | ||||
<i class="octicon octicon-trashcan" | <i class="octicon octicon-trashcan" | ||||
style="padding-bottom: 2px; margin-top: 1px;"></i> | style="padding-bottom: 2px; margin-top: 1px;"></i> | ||||
@@ -6,7 +6,7 @@ frappe.integration_service.razorpay = { | |||||
}, | }, | ||||
scheduler_job_helper: function(){ | scheduler_job_helper: function(){ | ||||
return { | return { | ||||
"Execute on every few minits of interval": "Take backup of database and files to dropbox on daily basis" | |||||
"Every few minutes": "Check and capture new payments" | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -21,7 +21,6 @@ frappe.integration_service.Razorpay = Class.extend({ | |||||
this.frm.add_custom_button(__("Show Log"), function(frm){ | this.frm.add_custom_button(__("Show Log"), function(frm){ | ||||
frappe.route_options = {"integration_request_service": "Razorpay"}; | frappe.route_options = {"integration_request_service": "Razorpay"}; | ||||
frappe.set_route("List", "Integration Request"); | frappe.set_route("List", "Integration Request"); | ||||
}).addClass("btn-primary") | |||||
}); | |||||
} | } | ||||
}) | }) | ||||
@@ -252,6 +252,20 @@ | |||||
</div> | </div> | ||||
{% endfor %} | {% endfor %} | ||||
</div> | </div> | ||||
{% if accept_payment and payment_url %} | |||||
<div class="well payment-details"> | |||||
{% if not doc.paid %} | |||||
{% if payment_button_help %} | |||||
<div class='text-muted' style='padding-bottom: 15px;'> | |||||
{{ payment_button_help }}</div> | |||||
{% endif %} | |||||
<a class="btn btn-primary" href="{{ payment_url }}"> | |||||
{{ payment_button_label }}</a> | |||||
{% else %} | |||||
<div>{{ _("Payment Complete") }}</div> | |||||
{% endif %} | |||||
</div> | |||||
{% endif %} | |||||
</div> | </div> | ||||
{% endfor %} | {% endfor %} | ||||
<!-- page footer buttons --> | <!-- page footer buttons --> | ||||
@@ -275,6 +289,7 @@ | |||||
{% endfor %} | {% endfor %} | ||||
</form> | </form> | ||||
{% if allow_comments and not frappe.form_dict.new -%} | {% if allow_comments and not frappe.form_dict.new -%} | ||||
<div class="comments"> | <div class="comments"> | ||||
<br><br> | <br><br> | ||||
@@ -9,6 +9,7 @@ from frappe.utils import cstr | |||||
from frappe.utils.file_manager import save_file, remove_file_by_url | from frappe.utils.file_manager import save_file, remove_file_by_url | ||||
from frappe.website.utils import get_comment_list | from frappe.website.utils import get_comment_list | ||||
from frappe.custom.doctype.customize_form.customize_form import docfield_properties | from frappe.custom.doctype.customize_form.customize_form import docfield_properties | ||||
from frappe.integration_broker.doctype.integration_service.integration_service import get_integration_controller | |||||
class WebForm(WebsiteGenerator): | class WebForm(WebsiteGenerator): | ||||
website = frappe._dict( | website = frappe._dict( | ||||
@@ -162,6 +163,30 @@ 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) | |||||
def add_payment_gateway_url(self, context): | |||||
if context.doc and self.accept_payment: | |||||
controller = get_integration_controller(self.payment_gateway) | |||||
title = "Payment for {0} {1}".format(context.doc.doctype, context.doc.name) | |||||
payment_details = { | |||||
"amount": self.amount, | |||||
"title": title, | |||||
"description": title, | |||||
"reference_doctype": context.doc.doctype, | |||||
"reference_docname": context.doc.name, | |||||
"payer_email": frappe.session.user, | |||||
"payer_name": frappe.utils.get_fullname(frappe.session.user), | |||||
"order_id": context.doc.name, | |||||
"currency": self.currency, | |||||
"redirect_to": frappe.utils.get_url(self.route) | |||||
} | |||||
# Redirect the user to this url | |||||
context.payment_url = 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''' | ||||