From df30f47f4e922b7fe582df70faa7248e506eeddb Mon Sep 17 00:00:00 2001 From: phot0n Date: Wed, 9 Mar 2022 12:23:34 +0530 Subject: [PATCH 01/22] chore: remove razorpay.js --- frappe/public/js/integrations/razorpay.js | 148 ---------------------- 1 file changed, 148 deletions(-) delete mode 100644 frappe/public/js/integrations/razorpay.js diff --git a/frappe/public/js/integrations/razorpay.js b/frappe/public/js/integrations/razorpay.js deleted file mode 100644 index eda4ac1894..0000000000 --- a/frappe/public/js/integrations/razorpay.js +++ /dev/null @@ -1,148 +0,0 @@ -/* HOW-TO - -Razorpay Payment - -1. Include checkout script in your code - {{ include_script('checkout.bundle.js) }} - -2. Create the Order controller in your backend - def get_razorpay_order(self): - controller = get_payment_gateway_controller("Razorpay") - - payment_details = { - "amount": 300, - ... - "reference_doctype": "Conference Participant", - "reference_docname": self.name, - ... - "receipt": self.name - } - - return controller.create_order(**payment_details) - -3. Inititate the payment in client using checkout API - function make_payment(ticket) { - var options = { - "name": "", - "description": "", - "image": "", - "prefill": { - "name": "", - "email": "", - "contact": "" - }, - "theme": { - "color": "" - }, - "doctype": "", - "docname": " { - - -{% endblock %} - -{%- block page_content -%} -
-
- -
-
- -
-
- -
-
-
-
-
-
- - -
- -
-
- - -{% endblock %} diff --git a/frappe/templates/pages/integrations/braintree_checkout.py b/frappe/templates/pages/integrations/braintree_checkout.py deleted file mode 100644 index c4c79ea74f..0000000000 --- a/frappe/templates/pages/integrations/braintree_checkout.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors -# License: MIT. See LICENSE - -import json - -import frappe -from frappe import _ -from frappe.integrations.doctype.braintree_settings.braintree_settings import ( - get_client_token, - get_gateway_controller, -) -from frappe.utils import flt - -no_cache = 1 - -expected_keys = ( - "amount", - "title", - "description", - "reference_doctype", - "reference_docname", - "payer_name", - "payer_email", - "order_id", - "currency", -) - - -def get_context(context): - context.no_cache = 1 - - # all these keys exist in form_dict - if not (set(expected_keys) - set(list(frappe.form_dict))): - for key in expected_keys: - context[key] = frappe.form_dict[key] - - context.client_token = get_client_token(context.reference_docname) - - context["amount"] = flt(context["amount"]) - - gateway_controller = get_gateway_controller(context.reference_docname) - context["header_img"] = frappe.db.get_value( - "Braintree Settings", gateway_controller, "header_img" - ) - - else: - frappe.redirect_to_message( - _("Some information is missing"), - _("Looks like someone sent you to an incomplete URL. Please ask them to look into it."), - ) - frappe.local.flags.redirect_location = frappe.local.response.location - raise frappe.Redirect - - -@frappe.whitelist(allow_guest=True) -def make_payment(payload_nonce, data, reference_doctype, reference_docname): - data = json.loads(data) - - data.update({"payload_nonce": payload_nonce}) - - gateway_controller = get_gateway_controller(reference_docname) - data = frappe.get_doc("Braintree Settings", gateway_controller).create_payment_request(data) - frappe.db.commit() - return data diff --git a/frappe/templates/pages/integrations/payment-cancel.html b/frappe/templates/pages/integrations/payment-cancel.html deleted file mode 100644 index a7c327508f..0000000000 --- a/frappe/templates/pages/integrations/payment-cancel.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "templates/web.html" %} - -{% block title %}{{ _("Payment Cancelled") }}{% endblock %} - -{%- block page_content -%} -
-
- - {{ _("Payment Cancelled") }} -
-

{{ _("Your payment is cancelled.") }}

- -
- - -{% endblock %} diff --git a/frappe/templates/pages/integrations/payment-failed.html b/frappe/templates/pages/integrations/payment-failed.html deleted file mode 100644 index 8f416b563a..0000000000 --- a/frappe/templates/pages/integrations/payment-failed.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "templates/web.html" %} - -{% block title %}{{ _("Payment Failed") }}{% endblock %} - -{%- block page_content -%} -
-
- - {{ _("Payment Failed") }} -
-

{{ _("Your payment has failed.") }}

- -
- - -{% endblock %} diff --git a/frappe/templates/pages/integrations/payment-success.html b/frappe/templates/pages/integrations/payment-success.html deleted file mode 100644 index 76c5db93bf..0000000000 --- a/frappe/templates/pages/integrations/payment-success.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends "templates/web.html" %} - -{% block title %}{{ _("Payment Success") }}{% endblock %} - -{%- block page_content -%} -
-
- - {{ _("Success") }} -
-

{{ payment_message or _("Your payment was successfully accepted") }}

- {% if not payment_message %} - - {% endif %} -
- - -{% endblock %} diff --git a/frappe/templates/pages/integrations/payment_cancel.py b/frappe/templates/pages/integrations/payment_cancel.py deleted file mode 100644 index cf2a10f8c7..0000000000 --- a/frappe/templates/pages/integrations/payment_cancel.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: MIT. See LICENSE - -import frappe - - -def get_context(context): - token = frappe.local.form_dict.token - - if token: - frappe.db.set_value("Integration Request", token, "status", "Cancelled") - frappe.db.commit() diff --git a/frappe/templates/pages/integrations/payment_success.py b/frappe/templates/pages/integrations/payment_success.py deleted file mode 100644 index 8985850a81..0000000000 --- a/frappe/templates/pages/integrations/payment_success.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: MIT. See LICENSE - -import frappe - -no_cache = True - - -def get_context(context): - token = frappe.local.form_dict.token - doc = frappe.get_doc(frappe.local.form_dict.doctype, frappe.local.form_dict.docname) - - context.payment_message = "" - if hasattr(doc, "get_payment_success_message"): - context.payment_message = doc.get_payment_success_message() diff --git a/frappe/templates/pages/integrations/paytm_checkout.html b/frappe/templates/pages/integrations/paytm_checkout.html deleted file mode 100644 index 168f6597e5..0000000000 --- a/frappe/templates/pages/integrations/paytm_checkout.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "templates/web.html" %} - -{% block title %} Payment {% endblock %} - -{%- block header -%} - - Merchant Checkout Page - -{% endblock %} - -{% block script %} - -{% endblock %} - -{%- block page_content -%} - -
-

Please do not refresh this page...

- -
- {% for name, value in payment_details.items() %} - - {% endfor %} -
-
- -{% endblock %} - -{% block style %} - -{% endblock %} \ No newline at end of file diff --git a/frappe/templates/pages/integrations/paytm_checkout.py b/frappe/templates/pages/integrations/paytm_checkout.py deleted file mode 100644 index 93097e038b..0000000000 --- a/frappe/templates/pages/integrations/paytm_checkout.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors -# License: MIT. See LICENSE -import json - -import frappe -from frappe import _ -from frappe.integrations.doctype.paytm_settings.paytm_settings import ( - get_paytm_config, - get_paytm_params, -) - - -def get_context(context): - context.no_cache = 1 - paytm_config = get_paytm_config() - - try: - doc = frappe.get_doc("Integration Request", frappe.form_dict["order_id"]) - - context.payment_details = get_paytm_params(json.loads(doc.data), doc.name, paytm_config) - - context.url = paytm_config.url - - except Exception: - frappe.log_error() - frappe.redirect_to_message( - _("Invalid Token"), - _("Seems token you are using is invalid!"), - http_status_code=400, - indicator_color="red", - ) - - frappe.local.flags.redirect_location = frappe.local.response.location - raise frappe.Redirect diff --git a/frappe/templates/pages/integrations/razorpay_checkout.html b/frappe/templates/pages/integrations/razorpay_checkout.html deleted file mode 100644 index fa1101c216..0000000000 --- a/frappe/templates/pages/integrations/razorpay_checkout.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends "templates/web.html" %} - -{% block title %} Payment {% endblock %} - -{%- block header -%}{% endblock %} - -{% block script %} - - -{% endblock %} - -{%- block page_content -%} - -

- Loading Payment System - -

- -{% endblock %} - -{% block style %} - -{% endblock %} \ No newline at end of file diff --git a/frappe/templates/pages/integrations/razorpay_checkout.py b/frappe/templates/pages/integrations/razorpay_checkout.py deleted file mode 100644 index d0e77f6d8a..0000000000 --- a/frappe/templates/pages/integrations/razorpay_checkout.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors -# License: MIT. See LICENSE -import json - -import frappe -from frappe import _ -from frappe.utils import cint, flt - -no_cache = 1 - -expected_keys = ( - "amount", - "title", - "description", - "reference_doctype", - "reference_docname", - "payer_name", - "payer_email", - "order_id", - "currency", -) - - -def get_context(context): - context.no_cache = 1 - context.api_key = get_api_key() - - try: - doc = frappe.get_doc("Integration Request", frappe.form_dict["token"]) - payment_details = json.loads(doc.data) - - for key in expected_keys: - context[key] = payment_details[key] - - context["token"] = frappe.form_dict["token"] - context["amount"] = flt(context["amount"]) - context["subscription_id"] = ( - payment_details["subscription_id"] if payment_details.get("subscription_id") else "" - ) - - except Exception as e: - frappe.redirect_to_message( - _("Invalid Token"), - _("Seems token you are using is invalid!"), - http_status_code=400, - indicator_color="red", - ) - - frappe.local.flags.redirect_location = frappe.local.response.location - raise frappe.Redirect - - -def get_api_key(): - api_key = frappe.db.get_single_value("Razorpay Settings", "api_key") - if cint(frappe.form_dict.get("use_sandbox")): - api_key = frappe.conf.sandbox_api_key - - return api_key - - -@frappe.whitelist(allow_guest=True) -def make_payment(razorpay_payment_id, options, reference_doctype, reference_docname, token): - data = {} - - if isinstance(options, str): - data = json.loads(options) - - data.update( - { - "razorpay_payment_id": razorpay_payment_id, - "reference_docname": reference_docname, - "reference_doctype": reference_doctype, - "token": token, - } - ) - - data = frappe.get_doc("Razorpay Settings").create_request(data) - frappe.db.commit() - return data diff --git a/frappe/templates/pages/integrations/stripe_checkout.css b/frappe/templates/pages/integrations/stripe_checkout.css deleted file mode 100644 index a42808aa7f..0000000000 --- a/frappe/templates/pages/integrations/stripe_checkout.css +++ /dev/null @@ -1,113 +0,0 @@ -.StripeElement { - background-color: white; - height: 40px; - padding: 10px 12px; - border-radius: 4px; - border: 1px solid transparent; - box-shadow: 0 1px 3px 0 #e6ebf1; - -webkit-transition: box-shadow 150ms ease; - transition: box-shadow 150ms ease; -} - -.StripeElement--focus { - box-shadow: 0 1px 3px 0 #cfd7df; -} - -.StripeElement--invalid { - border-color: #fa755a; -} - -.StripeElement--webkit-autofill { - background-color: #fefde5; -} - -.stripe #payment-form { - margin-top: 80px; -} - -.stripe button { - float: right; - display: block; - background: #5e64ff; - color: white; - box-shadow: 0 7px 14px 0 rgba(49, 49, 93, 0.10), 0 3px 6px 0 rgba(0, 0, 0, 0.08); - border-radius: 4px; - border: 0; - margin-top: 20px; - font-size: 15px; - font-weight: 400; - max-width: 40%; - height: 40px; - line-height: 38px; - outline: none; -} - -.stripe button:hover, .stripe button:focus { - background: #2b33ff; - border-color: #0711ff; -} - -.stripe button:active { - background: #5e64ff; -} - -.stripe button:disabled { - background: #515e80; -} - -.stripe .group { - background: white; - box-shadow: 2px 7px 14px 2px rgba(49, 49, 93, 0.10), 0 3px 6px 0 rgba(0, 0, 0, 0.08); - border-radius: 4px; - margin-bottom: 20px; -} - -.stripe label { - position: relative; - color: #8898AA; - font-weight: 300; - height: 40px; - line-height: 40px; - margin-left: 20px; - display: block; -} - -.stripe .group label:not(:last-child) { - border-bottom: 1px solid #F0F5FA; -} - -.stripe label>span { - width: 20%; - text-align: right; - float: left; -} - -.current-card { - margin-left: 20px; -} - -.field { - background: transparent; - font-weight: 300; - border: 0; - color: #31325F; - outline: none; - padding-right: 10px; - padding-left: 10px; - cursor: text; - width: 70%; - height: 40px; - float: right; -} - -.field::-webkit-input-placeholder { - color: #CFD7E0; -} - -.field::-moz-placeholder { - color: #CFD7E0; -} - -.field:-ms-input-placeholder { - color: #CFD7E0; -} diff --git a/frappe/templates/pages/integrations/stripe_checkout.html b/frappe/templates/pages/integrations/stripe_checkout.html deleted file mode 100644 index ec3d9783c5..0000000000 --- a/frappe/templates/pages/integrations/stripe_checkout.html +++ /dev/null @@ -1,58 +0,0 @@ -{% extends "templates/web.html" %} - -{% block title %} Payment {% endblock %} - -{%- block header -%} -{% endblock %} - -{% block script %} - - -{% endblock %} - -{%- block page_content -%} - -
-
- {% if image %} - - {% endif %} -

{{description}}

-
-
-
-
- -
-
-
-
- -
-
-
- -
- -
- -
- - -
-
-
-
- - -{% endblock %} diff --git a/frappe/templates/pages/integrations/stripe_checkout.py b/frappe/templates/pages/integrations/stripe_checkout.py deleted file mode 100644 index 1c0e20c631..0000000000 --- a/frappe/templates/pages/integrations/stripe_checkout.py +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors -# License: MIT. See LICENSE -import json - -import frappe -from frappe import _ -from frappe.integrations.doctype.stripe_settings.stripe_settings import get_gateway_controller -from frappe.utils import cint, fmt_money - -no_cache = 1 - -expected_keys = ( - "amount", - "title", - "description", - "reference_doctype", - "reference_docname", - "payer_name", - "payer_email", - "order_id", - "currency", -) - - -def get_context(context): - context.no_cache = 1 - - # all these keys exist in form_dict - if not (set(expected_keys) - set(list(frappe.form_dict))): - for key in expected_keys: - context[key] = frappe.form_dict[key] - - gateway_controller = get_gateway_controller(context.reference_doctype, context.reference_docname) - context.publishable_key = get_api_key(context.reference_docname, gateway_controller) - context.image = get_header_image(context.reference_docname, gateway_controller) - - context["amount"] = fmt_money(amount=context["amount"], currency=context["currency"]) - - if is_a_subscription(context.reference_doctype, context.reference_docname): - payment_plan = frappe.db.get_value( - context.reference_doctype, context.reference_docname, "payment_plan" - ) - recurrence = frappe.db.get_value("Payment Plan", payment_plan, "recurrence") - - context["amount"] = context["amount"] + " " + _(recurrence) - - else: - frappe.redirect_to_message( - _("Some information is missing"), - _("Looks like someone sent you to an incomplete URL. Please ask them to look into it."), - ) - frappe.local.flags.redirect_location = frappe.local.response.location - raise frappe.Redirect - - -def get_api_key(doc, gateway_controller): - publishable_key = frappe.db.get_value("Stripe Settings", gateway_controller, "publishable_key") - if cint(frappe.form_dict.get("use_sandbox")): - publishable_key = frappe.conf.sandbox_publishable_key - - return publishable_key - - -def get_header_image(doc, gateway_controller): - header_image = frappe.db.get_value("Stripe Settings", gateway_controller, "header_img") - - return header_image - - -@frappe.whitelist(allow_guest=True) -def make_payment(stripe_token_id, data, reference_doctype=None, reference_docname=None): - data = json.loads(data) - - data.update({"stripe_token_id": stripe_token_id}) - - gateway_controller = get_gateway_controller(reference_doctype, reference_docname) - - if is_a_subscription(reference_doctype, reference_docname): - reference = frappe.get_doc(reference_doctype, reference_docname) - data = reference.create_subscription("stripe", gateway_controller, data) - else: - data = frappe.get_doc("Stripe Settings", gateway_controller).create_request(data) - - frappe.db.commit() - return data - - -def is_a_subscription(reference_doctype, reference_docname): - if not frappe.get_meta(reference_doctype).has_field("is_a_subscription"): - return False - return frappe.db.get_value(reference_doctype, reference_docname, "is_a_subscription") From 725b8fb13a1b7eaf97df59b4614d6761b5f76abc Mon Sep 17 00:00:00 2001 From: phot0n Date: Tue, 29 Mar 2022 13:38:54 +0530 Subject: [PATCH 06/22] chore: remove payments card from integration workspace --- .../workspace/integrations/integrations.json | 152 ++++++------------ 1 file changed, 45 insertions(+), 107 deletions(-) diff --git a/frappe/integrations/workspace/integrations/integrations.json b/frappe/integrations/workspace/integrations/integrations.json index bbd2e1199f..8d1dfd64af 100644 --- a/frappe/integrations/workspace/integrations/integrations.json +++ b/frappe/integrations/workspace/integrations/integrations.json @@ -1,6 +1,6 @@ { "charts": [], - "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Backup\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Google Services\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Authentication\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Payments\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]", + "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Backup\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Google Services\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Authentication\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]", "creation": "2020-03-02 15:16:18.714190", "docstatus": 0, "doctype": "Workspace", @@ -106,11 +106,52 @@ { "hidden": 0, "is_query_report": 0, - "label": "Authentication", + "label": "Settings", "link_count": 0, "onboard": 0, "type": "Card Break" }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Webhook", + "link_count": 0, + "link_to": "Webhook", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Slack Webhook URL", + "link_count": 0, + "link_to": "Slack Webhook URL", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "SMS Settings", + "link_count": 0, + "link_to": "SMS Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Authentication", + "link_count": 4, + "onboard": 0, + "type": "Card Break" + }, { "dependencies": "", "hidden": 0, @@ -154,119 +195,16 @@ "link_type": "DocType", "onboard": 0, "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Payments", - "link_count": 0, - "onboard": 0, - "type": "Card Break" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Braintree Settings", - "link_count": 0, - "link_to": "Braintree Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "PayPal Settings", - "link_count": 0, - "link_to": "PayPal Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Razorpay Settings", - "link_count": 0, - "link_to": "Razorpay Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Stripe Settings", - "link_count": 0, - "link_to": "Stripe Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Paytm Settings", - "link_count": 0, - "link_to": "Paytm Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Settings", - "link_count": 0, - "onboard": 0, - "type": "Card Break" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Webhook", - "link_count": 0, - "link_to": "Webhook", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Slack Webhook URL", - "link_count": 0, - "link_to": "Slack Webhook URL", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "SMS Settings", - "link_count": 0, - "link_to": "SMS Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" } ], - "modified": "2022-01-13 17:39:01.292154", + "modified": "2022-07-23 18:00:28.805405", "modified_by": "Administrator", "module": "Integrations", "name": "Integrations", "owner": "Administrator", "parent_page": "", "public": 1, + "quick_lists": [], "restrict_to_domain": "", "roles": [], "sequence_id": 15.0, From f3473b059e7ae1b15967dacc3243966c390f1682 Mon Sep 17 00:00:00 2001 From: phot0n Date: Tue, 5 Apr 2022 23:30:59 +0530 Subject: [PATCH 07/22] chore: remove payment gateway and integration request doctype --- .../core/doctype/payment_gateway/__init__.py | 0 .../payment_gateway/payment_gateway.js | 8 - .../payment_gateway/payment_gateway.json | 55 ------- .../payment_gateway/payment_gateway.py | 8 - .../payment_gateway/test_payment_gateway.py | 9 - .../doctype/integration_request/__init__.py | 0 .../integration_request.js | 8 - .../integration_request.json | 154 ------------------ .../integration_request.py | 37 ----- .../test_integration_request.py | 11 -- 10 files changed, 290 deletions(-) delete mode 100644 frappe/core/doctype/payment_gateway/__init__.py delete mode 100644 frappe/core/doctype/payment_gateway/payment_gateway.js delete mode 100644 frappe/core/doctype/payment_gateway/payment_gateway.json delete mode 100644 frappe/core/doctype/payment_gateway/payment_gateway.py delete mode 100644 frappe/core/doctype/payment_gateway/test_payment_gateway.py delete mode 100644 frappe/integrations/doctype/integration_request/__init__.py delete mode 100644 frappe/integrations/doctype/integration_request/integration_request.js delete mode 100644 frappe/integrations/doctype/integration_request/integration_request.json delete mode 100644 frappe/integrations/doctype/integration_request/integration_request.py delete mode 100644 frappe/integrations/doctype/integration_request/test_integration_request.py diff --git a/frappe/core/doctype/payment_gateway/__init__.py b/frappe/core/doctype/payment_gateway/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/core/doctype/payment_gateway/payment_gateway.js b/frappe/core/doctype/payment_gateway/payment_gateway.js deleted file mode 100644 index 0eff5a5608..0000000000 --- a/frappe/core/doctype/payment_gateway/payment_gateway.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Payment Gateway', { - refresh: function(frm) { - - } -}); diff --git a/frappe/core/doctype/payment_gateway/payment_gateway.json b/frappe/core/doctype/payment_gateway/payment_gateway.json deleted file mode 100644 index 7195b3949e..0000000000 --- a/frappe/core/doctype/payment_gateway/payment_gateway.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "actions": [], - "autoname": "field:gateway", - "creation": "2022-01-24 21:09:47.229371", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "gateway", - "gateway_settings", - "gateway_controller" - ], - "fields": [ - { - "fieldname": "gateway", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Gateway", - "reqd": 1, - "unique": 1 - }, - { - "fieldname": "gateway_settings", - "fieldtype": "Link", - "label": "Gateway Settings", - "options": "DocType" - }, - { - "fieldname": "gateway_controller", - "fieldtype": "Dynamic Link", - "label": "Gateway Controller", - "options": "gateway_settings" - } - ], - "links": [], - "modified": "2022-01-24 21:17:03.864719", - "modified_by": "Administrator", - "module": "Core", - "name": "Payment Gateway", - "naming_rule": "By fieldname", - "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "read": 1, - "role": "System Manager", - "write": 1 - } - ], - "quick_entry": 1, - "sort_field": "modified", - "sort_order": "DESC", - "states": [] -} \ No newline at end of file diff --git a/frappe/core/doctype/payment_gateway/payment_gateway.py b/frappe/core/doctype/payment_gateway/payment_gateway.py deleted file mode 100644 index 74306ae4ad..0000000000 --- a/frappe/core/doctype/payment_gateway/payment_gateway.py +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors -# License: MIT. See LICENSE - -from frappe.model.document import Document - - -class PaymentGateway(Document): - pass diff --git a/frappe/core/doctype/payment_gateway/test_payment_gateway.py b/frappe/core/doctype/payment_gateway/test_payment_gateway.py deleted file mode 100644 index 6900e79434..0000000000 --- a/frappe/core/doctype/payment_gateway/test_payment_gateway.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: MIT. See LICENSE -import unittest - -# test_records = frappe.get_test_records('Payment Gateway') - - -class TestPaymentGateway(unittest.TestCase): - pass diff --git a/frappe/integrations/doctype/integration_request/__init__.py b/frappe/integrations/doctype/integration_request/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/integrations/doctype/integration_request/integration_request.js b/frappe/integrations/doctype/integration_request/integration_request.js deleted file mode 100644 index 4b3b9a2de7..0000000000 --- a/frappe/integrations/doctype/integration_request/integration_request.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2016, Frappe Technologies and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Integration Request', { - refresh: function(frm) { - - } -}); diff --git a/frappe/integrations/doctype/integration_request/integration_request.json b/frappe/integrations/doctype/integration_request/integration_request.json deleted file mode 100644 index 98db8ea748..0000000000 --- a/frappe/integrations/doctype/integration_request/integration_request.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "actions": [], - "creation": "2022-03-28 12:25:29.929952", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "request_id", - "integration_request_service", - "is_remote_request", - "column_break_5", - "request_description", - "status", - "section_break_8", - "url", - "request_headers", - "data", - "response_section", - "output", - "error", - "reference_section", - "reference_doctype", - "column_break_16", - "reference_docname" - ], - "fields": [ - { - "fieldname": "integration_request_service", - "fieldtype": "Data", - "label": "Service", - "read_only": 1 - }, - { - "default": "Queued", - "fieldname": "status", - "fieldtype": "Select", - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Status", - "options": "\nQueued\nAuthorized\nCompleted\nCancelled\nFailed", - "read_only": 1 - }, - { - "fieldname": "data", - "fieldtype": "Code", - "label": "Request Data", - "read_only": 1 - }, - { - "fieldname": "output", - "fieldtype": "Code", - "label": "Output", - "read_only": 1 - }, - { - "fieldname": "error", - "fieldtype": "Code", - "label": "Error", - "read_only": 1 - }, - { - "fieldname": "reference_doctype", - "fieldtype": "Link", - "label": "Reference Document Type", - "options": "DocType", - "read_only": 1 - }, - { - "fieldname": "reference_docname", - "fieldtype": "Dynamic Link", - "label": "Reference Document Name", - "options": "reference_doctype", - "read_only": 1 - }, - { - "default": "0", - "fieldname": "is_remote_request", - "fieldtype": "Check", - "label": "Is Remote Request?", - "read_only": 1 - }, - { - "fieldname": "request_description", - "fieldtype": "Data", - "label": "Request Description", - "read_only": 1 - }, - { - "fieldname": "request_id", - "fieldtype": "Data", - "label": "Request ID", - "read_only": 1 - }, - { - "fieldname": "column_break_5", - "fieldtype": "Column Break" - }, - { - "fieldname": "section_break_8", - "fieldtype": "Section Break" - }, - { - "fieldname": "url", - "fieldtype": "Data", - "label": "URL", - "read_only": 1 - }, - { - "fieldname": "response_section", - "fieldtype": "Section Break", - "label": "Response" - }, - { - "depends_on": "eval:doc.reference_doctype", - "fieldname": "reference_section", - "fieldtype": "Section Break", - "label": "Reference" - }, - { - "fieldname": "column_break_16", - "fieldtype": "Column Break" - }, - { - "fieldname": "request_headers", - "fieldtype": "Code", - "label": "Request Headers", - "read_only": 1 - } - ], - "in_create": 1, - "links": [], - "modified": "2022-04-07 11:32:27.557548", - "modified_by": "Administrator", - "module": "Integrations", - "name": "Integration Request", - "owner": "Administrator", - "permissions": [ - { - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "share": 1 - } - ], - "sort_field": "modified", - "sort_order": "DESC", - "states": [], - "title_field": "integration_request_service", - "track_changes": 1 -} \ No newline at end of file diff --git a/frappe/integrations/doctype/integration_request/integration_request.py b/frappe/integrations/doctype/integration_request/integration_request.py deleted file mode 100644 index 334736bc9b..0000000000 --- a/frappe/integrations/doctype/integration_request/integration_request.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies and contributors -# License: MIT. See LICENSE - -import json - -import frappe -from frappe.integrations.utils import json_handler -from frappe.model.document import Document - - -class IntegrationRequest(Document): - def autoname(self): - if self.flags._name: - self.name = self.flags._name - - def update_status(self, params, status): - data = json.loads(self.data) - data.update(params) - - self.data = json.dumps(data) - self.status = status - self.save(ignore_permissions=True) - frappe.db.commit() - - def handle_success(self, response): - """update the output field with the response along with the relevant status""" - if isinstance(response, str): - response = json.loads(response) - self.db_set("status", "Completed") - self.db_set("output", json.dumps(response, default=json_handler)) - - def handle_failure(self, response): - """update the error field with the response along with the relevant status""" - if isinstance(response, str): - response = json.loads(response) - self.db_set("status", "Failed") - self.db_set("error", json.dumps(response, default=json_handler)) diff --git a/frappe/integrations/doctype/integration_request/test_integration_request.py b/frappe/integrations/doctype/integration_request/test_integration_request.py deleted file mode 100644 index 45963d5096..0000000000 --- a/frappe/integrations/doctype/integration_request/test_integration_request.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies and Contributors -# License: MIT. See LICENSE -import unittest - -import frappe - -# test_records = frappe.get_test_records('Integration Request') - - -class TestIntegrationRequest(unittest.TestCase): - pass From 5c2cfdd1e91c6627b86275aaf84acab36161f687 Mon Sep 17 00:00:00 2001 From: phot0n Date: Tue, 5 Apr 2022 23:54:34 +0530 Subject: [PATCH 08/22] fix: remove integration request check from test_is_set_is_not_set --- frappe/tests/test_db_query.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/frappe/tests/test_db_query.py b/frappe/tests/test_db_query.py index ad9f59b3cd..e031bc87e3 100644 --- a/frappe/tests/test_db_query.py +++ b/frappe/tests/test_db_query.py @@ -501,10 +501,9 @@ class TestReportview(unittest.TestCase): ) def test_is_set_is_not_set(self): - res = DatabaseQuery("DocType").execute(filters={"autoname": ["is", "not set"]}) - self.assertTrue({"name": "Integration Request"} in res) - self.assertTrue({"name": "User"} in res) - self.assertFalse({"name": "Blogger"} in res) + res = DatabaseQuery('DocType').execute(filters={'autoname': ['is', 'not set']}) + self.assertTrue({'name': 'User'} in res) + self.assertFalse({'name': 'Blogger'} in res) res = DatabaseQuery("DocType").execute(filters={"autoname": ["is", "set"]}) self.assertTrue({"name": "DocField"} in res) From 6c75787d406b9e1eb1d3e48715ba7d201ae52f8b Mon Sep 17 00:00:00 2001 From: phot0n Date: Wed, 6 Apr 2022 11:34:33 +0530 Subject: [PATCH 09/22] chore: remove payments section from webform doctype --- frappe/website/doctype/web_form/web_form.json | 56 ------------------- 1 file changed, 56 deletions(-) diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json index 0872c1d654..56b957e274 100644 --- a/frappe/website/doctype/web_form/web_form.json +++ b/frappe/website/doctype/web_form/web_form.json @@ -233,62 +233,6 @@ "fieldtype": "Check", "label": "Show Sidebar" }, - { - "default": "0", - "fieldname": "accept_payment", - "fieldtype": "Check", - "label": "Accept Payment" - }, - { - "depends_on": "accept_payment", - "fieldname": "payment_gateway", - "fieldtype": "Link", - "label": "Payment Gateway", - "options": "Payment Gateway" - }, - { - "default": "Buy Now", - "depends_on": "accept_payment", - "fieldname": "payment_button_label", - "fieldtype": "Data", - "label": "Button Label" - }, - { - "depends_on": "accept_payment", - "fieldname": "payment_button_help", - "fieldtype": "Text", - "label": "Button Help" - }, - { - "fieldname": "column_break_28", - "fieldtype": "Column Break" - }, - { - "default": "0", - "depends_on": "accept_payment", - "fieldname": "amount_based_on_field", - "fieldtype": "Check", - "label": "Amount Based On Field" - }, - { - "depends_on": "eval:doc.accept_payment && doc.amount_based_on_field", - "fieldname": "amount_field", - "fieldtype": "Select", - "label": "Amount Field" - }, - { - "depends_on": "eval:doc.accept_payment && !doc.amount_based_on_field", - "fieldname": "amount", - "fieldtype": "Currency", - "label": "Amount" - }, - { - "depends_on": "accept_payment", - "fieldname": "currency", - "fieldtype": "Link", - "label": "Currency", - "options": "Currency" - }, { "description": "List as [{\"label\": _(\"Jobs\"), \"route\":\"jobs\"}]", "fieldname": "breadcrumbs", From be4b7906c0a0e5f8df39a50d3945f474a7f751c3 Mon Sep 17 00:00:00 2001 From: phot0n Date: Wed, 6 Apr 2022 23:03:26 +0530 Subject: [PATCH 10/22] chore: remove payment stuff from web form controller class --- frappe/website/doctype/web_form/web_form.py | 41 +-------------------- 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index e1c9e798e5..836ec8f632 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -10,7 +10,6 @@ from frappe.core.api.file import get_max_file_size from frappe.core.doctype.file import remove_file_by_url from frappe.custom.doctype.customize_form.customize_form import docfield_properties from frappe.desk.form.meta import get_code_files_via_hooks -from frappe.integrations.utils import get_payment_gateway_controller from frappe.modules.utils import export_module_json, get_doc_module from frappe.rate_limiter import rate_limit from frappe.utils import cstr, dict_with_keys, strip_html @@ -50,9 +49,6 @@ class WebForm(WebsiteGenerator): if not frappe.flags.in_import: self.validate_fields() - if self.accept_payment: - self.validate_payment_amount() - def validate_fields(self): """Validate all fields are present""" from frappe.model import no_value_fields @@ -66,12 +62,6 @@ class WebForm(WebsiteGenerator): if missing: frappe.throw(_("Following fields are missing:") + "
" + "
".join(missing)) - def validate_payment_amount(self): - if self.amount_based_on_field and not self.amount_field: - frappe.throw(_("Please select a Amount Field.")) - elif not self.amount_based_on_field and not self.amount > 0: - frappe.throw(_("Amount must be greater than 0.")) - def reset_field_parent(self): """Convert link fields to select with names as options""" for df in self.web_form_fields: @@ -320,36 +310,6 @@ def get_context(context): context.reference_doc = json.loads(context.reference_doc.as_json()) - def get_payment_gateway_url(self, doc): - if self.accept_payment: - controller = get_payment_gateway_controller(self.payment_gateway) - - title = f"Payment for {doc.doctype} {doc.name}" - amount = self.amount - if self.amount_based_on_field: - amount = doc.get(self.amount_field) - - from decimal import Decimal - - if amount is None or Decimal(amount) <= 0: - return frappe.utils.get_url(self.success_url or self.route) - - payment_details = { - "amount": amount, - "title": title, - "description": title, - "reference_doctype": doc.doctype, - "reference_docname": doc.name, - "payer_email": frappe.session.user, - "payer_name": frappe.utils.get_fullname(frappe.session.user), - "order_id": doc.name, - "currency": self.currency, - "redirect_to": frappe.utils.get_url(self.success_url or self.route), - } - - # Redirect the user to this url - return controller.get_payment_url(**payment_details) - def add_custom_context_and_script(self, context): """Update context from module if standard and append script""" if self.web_form_module: @@ -591,6 +551,7 @@ def accept(web_form, data, docname=None, for_payment=False): frappe.flags.web_form_doc = doc if for_payment: + # this is needed for Payments app return web_form.get_payment_gateway_url(doc) else: return doc From 83fe747f755c369245e7f5eb2b2d633944d094e4 Mon Sep 17 00:00:00 2001 From: phot0n Date: Thu, 7 Apr 2022 00:03:42 +0530 Subject: [PATCH 11/22] chore: remove payment utils and hooks --- frappe/hooks.py | 3 +- frappe/integrations/utils.py | 108 ----------------------------------- 2 files changed, 1 insertion(+), 110 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index 66820ecd0f..90c64b006f 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -199,8 +199,7 @@ scheduler_events = { "frappe.email.queue.flush", "frappe.email.doctype.email_account.email_account.pull", "frappe.email.doctype.email_account.email_account.notify_unreplied", - "frappe.integrations.doctype.razorpay_settings.razorpay_settings.capture_payment", - "frappe.utils.global_search.sync_global_search", + 'frappe.utils.global_search.sync_global_search', "frappe.monitor.flush", ], "hourly": [ diff --git a/frappe/integrations/utils.py b/frappe/integrations/utils.py index f215a73dc6..8d3d23bb85 100644 --- a/frappe/integrations/utils.py +++ b/frappe/integrations/utils.py @@ -2,7 +2,6 @@ # License: MIT. See LICENSE import datetime -import json from urllib.parse import parse_qs import frappe @@ -28,122 +27,15 @@ def make_request(method, url, auth=None, headers=None, data=None): frappe.log_error() raise exc - def make_get_request(url, **kwargs): return make_request("GET", url, **kwargs) - def make_post_request(url, **kwargs): return make_request("POST", url, **kwargs) - def make_put_request(url, **kwargs): return make_request("PUT", url, **kwargs) - -def create_request_log( - data, - integration_type=None, - service_name=None, - name=None, - error=None, - request_headers=None, - output=None, - **kwargs, -): - """ - DEPRECATED: The parameter integration_type will be removed in the next major release. - Use is_remote_request instead. - """ - if integration_type == "Remote": - kwargs["is_remote_request"] = 1 - - elif integration_type == "Subscription Notification": - kwargs["request_description"] = integration_type - - reference_doctype = reference_docname = None - if "reference_doctype" not in kwargs: - if isinstance(data, str): - data = json.loads(data) - - reference_doctype = data.get("reference_doctype") - reference_docname = data.get("reference_docname") - - integration_request = frappe.get_doc( - { - "doctype": "Integration Request", - "integration_request_service": service_name, - "request_headers": get_json(request_headers), - "data": get_json(data), - "output": get_json(output), - "error": get_json(error), - "reference_doctype": reference_doctype, - "reference_docname": reference_docname, - **kwargs, - } - ) - - if name: - integration_request.flags._name = name - - integration_request.insert(ignore_permissions=True) - frappe.db.commit() - - return integration_request - - -def get_json(obj): - return obj if isinstance(obj, str) else frappe.as_json(obj, indent=1) - - -def get_payment_gateway_controller(payment_gateway): - """Return payment gateway controller""" - gateway = frappe.get_doc("Payment Gateway", payment_gateway) - if gateway.gateway_controller is None: - try: - return frappe.get_doc(f"{payment_gateway} Settings") - except Exception: - frappe.throw(_("{0} Settings not found").format(payment_gateway)) - else: - try: - return frappe.get_doc(gateway.gateway_settings, gateway.gateway_controller) - except Exception: - frappe.throw(_("{0} Settings not found").format(payment_gateway)) - - -@frappe.whitelist(allow_guest=True, xss_safe=True) -def get_checkout_url(**kwargs): - try: - if kwargs.get("payment_gateway"): - doc = frappe.get_doc("{} Settings".format(kwargs.get("payment_gateway"))) - return doc.get_payment_url(**kwargs) - else: - raise Exception - except Exception: - frappe.respond_as_web_page( - _("Something went wrong"), - _( - "Looks like something is wrong with this site's payment gateway configuration. No payment has been made." - ), - indicator_color="red", - http_status_code=frappe.ValidationError.http_status_code, - ) - - -def create_payment_gateway(gateway, settings=None, controller=None): - # NOTE: we don't translate Payment Gateway name because it is an internal doctype - if not frappe.db.exists("Payment Gateway", gateway): - payment_gateway = frappe.get_doc( - { - "doctype": "Payment Gateway", - "gateway": gateway, - "gateway_settings": settings, - "gateway_controller": controller, - } - ) - payment_gateway.insert(ignore_permissions=True) - - def json_handler(obj): if isinstance(obj, (datetime.date, datetime.timedelta, datetime.datetime)): return str(obj) From 91b04c21544a6d2e2ac5c79cfa6d2e075b34efcc Mon Sep 17 00:00:00 2001 From: phot0n Date: Sat, 23 Jul 2022 16:16:06 +0530 Subject: [PATCH 12/22] test: fix test_set_field_tables removed amount_field from groupby and fields --- frappe/tests/test_db_query.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/tests/test_db_query.py b/frappe/tests/test_db_query.py index e031bc87e3..03bdf8b5ee 100644 --- a/frappe/tests/test_db_query.py +++ b/frappe/tests/test_db_query.py @@ -516,8 +516,7 @@ class TestReportview(unittest.TestCase): data = frappe.db.get_list( "Web Form", filters=[["Web Form Field", "reqd", "=", 1]], - group_by="amount_field", - fields=["count(*) as count", "`amount_field` as name"], + fields=["count(*) as count"], order_by="count desc", limit=50, ) From f71562fd49ba917cffaba2b4d93e15705a672b35 Mon Sep 17 00:00:00 2001 From: phot0n Date: Sat, 23 Jul 2022 16:23:06 +0530 Subject: [PATCH 13/22] chore: add integration request doctype back (with utils) --- .../doctype/integration_request/__init__.py | 0 .../integration_request.js | 8 + .../integration_request.json | 154 ++++++++++++++++++ .../integration_request.py | 37 +++++ .../test_integration_request.py | 11 ++ frappe/integrations/utils.py | 54 ++++++ 6 files changed, 264 insertions(+) create mode 100644 frappe/integrations/doctype/integration_request/__init__.py create mode 100644 frappe/integrations/doctype/integration_request/integration_request.js create mode 100644 frappe/integrations/doctype/integration_request/integration_request.json create mode 100644 frappe/integrations/doctype/integration_request/integration_request.py create mode 100644 frappe/integrations/doctype/integration_request/test_integration_request.py diff --git a/frappe/integrations/doctype/integration_request/__init__.py b/frappe/integrations/doctype/integration_request/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/integrations/doctype/integration_request/integration_request.js b/frappe/integrations/doctype/integration_request/integration_request.js new file mode 100644 index 0000000000..4b3b9a2de7 --- /dev/null +++ b/frappe/integrations/doctype/integration_request/integration_request.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Integration Request', { + refresh: function(frm) { + + } +}); diff --git a/frappe/integrations/doctype/integration_request/integration_request.json b/frappe/integrations/doctype/integration_request/integration_request.json new file mode 100644 index 0000000000..98db8ea748 --- /dev/null +++ b/frappe/integrations/doctype/integration_request/integration_request.json @@ -0,0 +1,154 @@ +{ + "actions": [], + "creation": "2022-03-28 12:25:29.929952", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "request_id", + "integration_request_service", + "is_remote_request", + "column_break_5", + "request_description", + "status", + "section_break_8", + "url", + "request_headers", + "data", + "response_section", + "output", + "error", + "reference_section", + "reference_doctype", + "column_break_16", + "reference_docname" + ], + "fields": [ + { + "fieldname": "integration_request_service", + "fieldtype": "Data", + "label": "Service", + "read_only": 1 + }, + { + "default": "Queued", + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Status", + "options": "\nQueued\nAuthorized\nCompleted\nCancelled\nFailed", + "read_only": 1 + }, + { + "fieldname": "data", + "fieldtype": "Code", + "label": "Request Data", + "read_only": 1 + }, + { + "fieldname": "output", + "fieldtype": "Code", + "label": "Output", + "read_only": 1 + }, + { + "fieldname": "error", + "fieldtype": "Code", + "label": "Error", + "read_only": 1 + }, + { + "fieldname": "reference_doctype", + "fieldtype": "Link", + "label": "Reference Document Type", + "options": "DocType", + "read_only": 1 + }, + { + "fieldname": "reference_docname", + "fieldtype": "Dynamic Link", + "label": "Reference Document Name", + "options": "reference_doctype", + "read_only": 1 + }, + { + "default": "0", + "fieldname": "is_remote_request", + "fieldtype": "Check", + "label": "Is Remote Request?", + "read_only": 1 + }, + { + "fieldname": "request_description", + "fieldtype": "Data", + "label": "Request Description", + "read_only": 1 + }, + { + "fieldname": "request_id", + "fieldtype": "Data", + "label": "Request ID", + "read_only": 1 + }, + { + "fieldname": "column_break_5", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_8", + "fieldtype": "Section Break" + }, + { + "fieldname": "url", + "fieldtype": "Data", + "label": "URL", + "read_only": 1 + }, + { + "fieldname": "response_section", + "fieldtype": "Section Break", + "label": "Response" + }, + { + "depends_on": "eval:doc.reference_doctype", + "fieldname": "reference_section", + "fieldtype": "Section Break", + "label": "Reference" + }, + { + "fieldname": "column_break_16", + "fieldtype": "Column Break" + }, + { + "fieldname": "request_headers", + "fieldtype": "Code", + "label": "Request Headers", + "read_only": 1 + } + ], + "in_create": 1, + "links": [], + "modified": "2022-04-07 11:32:27.557548", + "modified_by": "Administrator", + "module": "Integrations", + "name": "Integration Request", + "owner": "Administrator", + "permissions": [ + { + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [], + "title_field": "integration_request_service", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/integrations/doctype/integration_request/integration_request.py b/frappe/integrations/doctype/integration_request/integration_request.py new file mode 100644 index 0000000000..334736bc9b --- /dev/null +++ b/frappe/integrations/doctype/integration_request/integration_request.py @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Frappe Technologies and contributors +# License: MIT. See LICENSE + +import json + +import frappe +from frappe.integrations.utils import json_handler +from frappe.model.document import Document + + +class IntegrationRequest(Document): + def autoname(self): + if self.flags._name: + self.name = self.flags._name + + def update_status(self, params, status): + data = json.loads(self.data) + data.update(params) + + self.data = json.dumps(data) + self.status = status + self.save(ignore_permissions=True) + frappe.db.commit() + + def handle_success(self, response): + """update the output field with the response along with the relevant status""" + if isinstance(response, str): + response = json.loads(response) + self.db_set("status", "Completed") + self.db_set("output", json.dumps(response, default=json_handler)) + + def handle_failure(self, response): + """update the error field with the response along with the relevant status""" + if isinstance(response, str): + response = json.loads(response) + self.db_set("status", "Failed") + self.db_set("error", json.dumps(response, default=json_handler)) diff --git a/frappe/integrations/doctype/integration_request/test_integration_request.py b/frappe/integrations/doctype/integration_request/test_integration_request.py new file mode 100644 index 0000000000..45963d5096 --- /dev/null +++ b/frappe/integrations/doctype/integration_request/test_integration_request.py @@ -0,0 +1,11 @@ +# Copyright (c) 2015, Frappe Technologies and Contributors +# License: MIT. See LICENSE +import unittest + +import frappe + +# test_records = frappe.get_test_records('Integration Request') + + +class TestIntegrationRequest(unittest.TestCase): + pass diff --git a/frappe/integrations/utils.py b/frappe/integrations/utils.py index 8d3d23bb85..b05d2ef74d 100644 --- a/frappe/integrations/utils.py +++ b/frappe/integrations/utils.py @@ -2,6 +2,7 @@ # License: MIT. See LICENSE import datetime +import json from urllib.parse import parse_qs import frappe @@ -36,6 +37,59 @@ def make_post_request(url, **kwargs): def make_put_request(url, **kwargs): return make_request("PUT", url, **kwargs) +def create_request_log( + data, + integration_type=None, + service_name=None, + name=None, + error=None, + request_headers=None, + output=None, + **kwargs, +): + """ + DEPRECATED: The parameter integration_type will be removed in the next major release. + Use is_remote_request instead. + """ + if integration_type == "Remote": + kwargs["is_remote_request"] = 1 + + elif integration_type == "Subscription Notification": + kwargs["request_description"] = integration_type + + reference_doctype = reference_docname = None + if "reference_doctype" not in kwargs: + if isinstance(data, str): + data = json.loads(data) + + reference_doctype = data.get("reference_doctype") + reference_docname = data.get("reference_docname") + + integration_request = frappe.get_doc( + { + "doctype": "Integration Request", + "integration_request_service": service_name, + "request_headers": get_json(request_headers), + "data": get_json(data), + "output": get_json(output), + "error": get_json(error), + "reference_doctype": reference_doctype, + "reference_docname": reference_docname, + **kwargs, + } + ) + + if name: + integration_request.flags._name = name + + integration_request.insert(ignore_permissions=True) + frappe.db.commit() + + return integration_request + +def get_json(obj): + return obj if isinstance(obj, str) else frappe.as_json(obj, indent=1) + def json_handler(obj): if isinstance(obj, (datetime.date, datetime.timedelta, datetime.datetime)): return str(obj) From a52483f110cb040ebd2e46a1dade30607c55577a Mon Sep 17 00:00:00 2001 From: phot0n Date: Sat, 23 Jul 2022 16:23:10 +0530 Subject: [PATCH 14/22] Revert "fix: remove integration request check from test_is_set_is_not_set" This reverts commit b3f57f0e7774928df90bdf84c7ec23b5d3be53c8. --- frappe/tests/test_db_query.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/tests/test_db_query.py b/frappe/tests/test_db_query.py index 03bdf8b5ee..0eb54c7ab0 100644 --- a/frappe/tests/test_db_query.py +++ b/frappe/tests/test_db_query.py @@ -501,9 +501,10 @@ class TestReportview(unittest.TestCase): ) def test_is_set_is_not_set(self): - res = DatabaseQuery('DocType').execute(filters={'autoname': ['is', 'not set']}) - self.assertTrue({'name': 'User'} in res) - self.assertFalse({'name': 'Blogger'} in res) + res = DatabaseQuery("DocType").execute(filters={"autoname": ["is", "not set"]}) + self.assertTrue({"name": "Integration Request"} in res) + self.assertTrue({"name": "User"} in res) + self.assertFalse({"name": "Blogger"} in res) res = DatabaseQuery("DocType").execute(filters={"autoname": ["is", "set"]}) self.assertTrue({"name": "DocField"} in res) From 090d0321a8cf2da00696302093278bc9f8741813 Mon Sep 17 00:00:00 2001 From: phot0n Date: Sat, 23 Jul 2022 17:27:50 +0530 Subject: [PATCH 15/22] chore: fix linter --- frappe/hooks.py | 2 +- frappe/integrations/utils.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index 90c64b006f..14e76adc22 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -199,7 +199,7 @@ scheduler_events = { "frappe.email.queue.flush", "frappe.email.doctype.email_account.email_account.pull", "frappe.email.doctype.email_account.email_account.notify_unreplied", - 'frappe.utils.global_search.sync_global_search', + "frappe.utils.global_search.sync_global_search", "frappe.monitor.flush", ], "hourly": [ diff --git a/frappe/integrations/utils.py b/frappe/integrations/utils.py index b05d2ef74d..5ae8965c83 100644 --- a/frappe/integrations/utils.py +++ b/frappe/integrations/utils.py @@ -28,15 +28,19 @@ def make_request(method, url, auth=None, headers=None, data=None): frappe.log_error() raise exc + def make_get_request(url, **kwargs): return make_request("GET", url, **kwargs) + def make_post_request(url, **kwargs): return make_request("POST", url, **kwargs) + def make_put_request(url, **kwargs): return make_request("PUT", url, **kwargs) + def create_request_log( data, integration_type=None, @@ -87,9 +91,11 @@ def create_request_log( return integration_request + def get_json(obj): return obj if isinstance(obj, str) else frappe.as_json(obj, indent=1) + def json_handler(obj): if isinstance(obj, (datetime.date, datetime.timedelta, datetime.datetime)): return str(obj) From a02bd94d16368bee40a2ba7bfb6baba7d7751f30 Mon Sep 17 00:00:00 2001 From: phot0n Date: Sat, 23 Jul 2022 18:39:23 +0530 Subject: [PATCH 16/22] chore: remove payment gateway libraries --- pyproject.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2d9027309d..3c47edc440 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,16 +75,12 @@ dependencies = [ # integration dependencies "boto3~=1.17.53", - "braintree~=4.8.0", "dropbox~=11.7.0", "google-api-python-client~=2.2.0", "google-auth-httplib2~=0.1.0", "google-auth-oauthlib~=0.4.4", "google-auth~=1.29.0", "googlemaps~=4.4.5", - "paytmchecksum~=1.7.0", - "razorpay~=1.2.0", - "stripe~=2.56.0", ] [build-system] From 4b069374f5b3649405d7cde920b86db7cf8e0162 Mon Sep 17 00:00:00 2001 From: phot0n Date: Sat, 23 Jul 2022 18:43:59 +0530 Subject: [PATCH 17/22] chore: remove stripe patch --- frappe/patches.txt | 1 - .../sync_stripe_settings_before_migrate.py | 25 ------------------- 2 files changed, 26 deletions(-) delete mode 100644 frappe/patches/v11_0/sync_stripe_settings_before_migrate.py diff --git a/frappe/patches.txt b/frappe/patches.txt index ee2eb0d2a1..240a96cb7d 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -66,7 +66,6 @@ execute:frappe.delete_doc_if_exists('Page', 'user-permissions') frappe.patches.v10_0.set_no_copy_to_workflow_state frappe.patches.v10_0.increase_single_table_column_length frappe.patches.v11_0.create_contact_for_user -frappe.patches.v11_0.sync_stripe_settings_before_migrate frappe.patches.v11_0.update_list_user_settings frappe.patches.v11_0.rename_workflow_action_to_workflow_action_master #13-06-2018 frappe.patches.v11_0.rename_email_alert_to_notification #13-06-2018 diff --git a/frappe/patches/v11_0/sync_stripe_settings_before_migrate.py b/frappe/patches/v11_0/sync_stripe_settings_before_migrate.py deleted file mode 100644 index 019ecef67c..0000000000 --- a/frappe/patches/v11_0/sync_stripe_settings_before_migrate.py +++ /dev/null @@ -1,25 +0,0 @@ -import frappe -from frappe.utils.password import get_decrypted_password - - -def execute(): - publishable_key = frappe.db.sql( - "select value from tabSingles where doctype='Stripe Settings' and field='publishable_key'" - ) - if publishable_key: - secret_key = get_decrypted_password( - "Stripe Settings", "Stripe Settings", fieldname="secret_key", raise_exception=False - ) - if secret_key: - frappe.reload_doc("integrations", "doctype", "stripe_settings") - frappe.db.commit() - - settings = frappe.new_doc("Stripe Settings") - settings.gateway_name = ( - frappe.db.get_value("Global Defaults", None, "default_company") or "Stripe Settings" - ) - settings.publishable_key = publishable_key - settings.secret_key = secret_key - settings.save(ignore_permissions=True) - - frappe.db.delete("Singles", {"doctype": "Stripe Settings"}) From a2571b5490726cd1454b3de1ab1b3a0fb769fc4b Mon Sep 17 00:00:00 2001 From: phot0n Date: Sun, 24 Jul 2022 01:40:35 +0530 Subject: [PATCH 18/22] chore: patch for deleting payment doctypes --- frappe/patches.txt | 1 + frappe/patches/v14_0/delete_payment_gateways.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 frappe/patches/v14_0/delete_payment_gateways.py diff --git a/frappe/patches.txt b/frappe/patches.txt index 240a96cb7d..0dce4b9f71 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -195,6 +195,7 @@ frappe.patches.v14_0.clear_long_pending_stale_logs frappe.patches.v14_0.log_settings_migration frappe.patches.v14_0.setup_likes_from_feedback frappe.patches.v14_0.update_webforms +frappe.patches.v14_0.delete_payment_gateways [post_model_sync] frappe.patches.v14_0.drop_data_import_legacy diff --git a/frappe/patches/v14_0/delete_payment_gateways.py b/frappe/patches/v14_0/delete_payment_gateways.py new file mode 100644 index 0000000000..c06f63a2d3 --- /dev/null +++ b/frappe/patches/v14_0/delete_payment_gateways.py @@ -0,0 +1,16 @@ +import frappe + + +def execute(): + if "payments" in frappe.get_installed_apps(): + return + + for doctype in ( + "Payment Gateway", + "Razorpay Settings", + "Braintree Settings", + "PayPal Settings", + "Paytm Settings", + "Stripe Settings", + ): + frappe.delete_doc_if_exists("DocType", doctype, force=True) From 332919317d2f8c0b02de951a74d6b46e8d1ef606 Mon Sep 17 00:00:00 2001 From: phot0n Date: Sun, 24 Jul 2022 20:31:00 +0530 Subject: [PATCH 19/22] chore: remove payments_tab from web form --- frappe/website/doctype/web_form/web_form.json | 21 ++----------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json index 56b957e274..f9ebb3a4e7 100644 --- a/frappe/website/doctype/web_form/web_form.json +++ b/frappe/website/doctype/web_form/web_form.json @@ -48,17 +48,7 @@ "website_sidebar", "scripting_style_tab", "client_script", - "custom_css", - "payments_tab", - "accept_payment", - "payment_gateway", - "payment_button_label", - "payment_button_help", - "column_break_28", - "amount_based_on_field", - "amount_field", - "amount", - "currency" + "custom_css" ], "fields": [ { @@ -329,20 +319,13 @@ "fieldname": "scripting_style_tab", "fieldtype": "Tab Break", "label": "Scripting / Style" - }, - { - "collapsible": 1, - "collapsible_depends_on": "accept_payment", - "fieldname": "payments_tab", - "fieldtype": "Tab Break", - "label": "Payments" } ], "has_web_view": 1, "icon": "icon-edit", "is_published_field": "published", "links": [], - "modified": "2022-07-18 15:51:15.288860", + "modified": "2022-07-24 20:29:23.059834", "modified_by": "Administrator", "module": "Website", "name": "Web Form", From a1ffcb37ee5a00e9129d60ee2952eed77d73f9e2 Mon Sep 17 00:00:00 2001 From: phot0n Date: Mon, 25 Jul 2022 14:07:33 +0530 Subject: [PATCH 20/22] chore: remove payments fields from edit_profile, request_data & request_to_delete_data webforms --- frappe/core/web_form/edit_profile/edit_profile.json | 3 --- frappe/website/web_form/request_data/request_data.json | 5 ----- .../request_to_delete_data/request_to_delete_data.json | 5 ----- 3 files changed, 13 deletions(-) diff --git a/frappe/core/web_form/edit_profile/edit_profile.json b/frappe/core/web_form/edit_profile/edit_profile.json index cedef71c0e..8abb2164f9 100644 --- a/frappe/core/web_form/edit_profile/edit_profile.json +++ b/frappe/core/web_form/edit_profile/edit_profile.json @@ -1,13 +1,10 @@ { - "accept_payment": 0, "allow_comments": 0, "allow_delete": 0, "allow_edit": 1, "allow_incomplete": 0, "allow_multiple": 0, "allow_print": 0, - "amount": 0.0, - "amount_based_on_field": 0, "apply_document_permissions": 0, "breadcrumbs": "[{\"title\": _(\"My Account\"), \"route\": \"me\"}]", "creation": "2016-09-19 05:16:59.242754", diff --git a/frappe/website/web_form/request_data/request_data.json b/frappe/website/web_form/request_data/request_data.json index c52a2f6203..e895ec9ff4 100644 --- a/frappe/website/web_form/request_data/request_data.json +++ b/frappe/website/web_form/request_data/request_data.json @@ -1,19 +1,15 @@ { - "accept_payment": 0, "allow_comments": 0, "allow_delete": 0, "allow_edit": 0, "allow_incomplete": 0, "allow_multiple": 0, "allow_print": 0, - "amount": 0.0, - "amount_based_on_field": 0, "apply_document_permissions": 0, "breadcrumbs": "", "button_label": "Request Data", "client_script": "", "creation": "2019-01-24 16:19:26.886096", - "currency": "INR", "doc_type": "Personal Data Download Request", "docstatus": 0, "doctype": "Web Form", @@ -29,7 +25,6 @@ "module": "Website", "name": "request-data", "owner": "Administrator", - "payment_button_label": "Buy Now", "published": 1, "route": "request-data", "route_to_success_link": 1, diff --git a/frappe/website/web_form/request_to_delete_data/request_to_delete_data.json b/frappe/website/web_form/request_to_delete_data/request_to_delete_data.json index ce11666a34..b3bf7d6b42 100644 --- a/frappe/website/web_form/request_to_delete_data/request_to_delete_data.json +++ b/frappe/website/web_form/request_to_delete_data/request_to_delete_data.json @@ -1,19 +1,15 @@ { - "accept_payment": 0, "allow_comments": 0, "allow_delete": 0, "allow_edit": 0, "allow_incomplete": 0, "allow_multiple": 0, "allow_print": 0, - "amount": 0.0, - "amount_based_on_field": 0, "apply_document_permissions": 0, "breadcrumbs": "", "button_label": "Submit", "client_script": "", "creation": "2019-01-25 14:24:12.588810", - "currency": "INR", "custom_css": "[data-doctype=\"Web Form\"] {\n width: 50%;\n margin: 6rem auto;\n}", "doc_type": "Personal Data Deletion Request", "docstatus": 0, @@ -30,7 +26,6 @@ "module": "Website", "name": "request-to-delete-data", "owner": "Administrator", - "payment_button_label": "Buy Now", "published": 1, "route": "request-for-account-deletion", "route_to_success_link": 0, From cd2664bf998d5b1804f0382fb24dfe0cadd889f5 Mon Sep 17 00:00:00 2001 From: phot0n Date: Tue, 26 Jul 2022 23:18:23 +0530 Subject: [PATCH 21/22] chore: remove get_payment_gateway_controller safe global --- frappe/utils/safe_exec.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/utils/safe_exec.py b/frappe/utils/safe_exec.py index 8e983f11b2..6fdfba19e3 100644 --- a/frappe/utils/safe_exec.py +++ b/frappe/utils/safe_exec.py @@ -146,7 +146,6 @@ def get_safe_globals(): ), make_get_request=frappe.integrations.utils.make_get_request, make_post_request=frappe.integrations.utils.make_post_request, - get_payment_gateway_controller=frappe.integrations.utils.get_payment_gateway_controller, socketio_port=frappe.conf.socketio_port, get_hooks=get_hooks, enqueue=safe_enqueue, From ed39d2c6ed9e9203a516a11ef67c80102f8d8489 Mon Sep 17 00:00:00 2001 From: phot0n Date: Wed, 27 Jul 2022 02:16:48 +0530 Subject: [PATCH 22/22] chore: remove payments params from webform's whitelisted accept fuction --- frappe/public/js/frappe/web_form/web_form.js | 2 ++ frappe/website/doctype/web_form/web_form.py | 14 ++------------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/frappe/public/js/frappe/web_form/web_form.js b/frappe/public/js/frappe/web_form/web_form.js index 21d88eac49..8cb30be529 100644 --- a/frappe/public/js/frappe/web_form/web_form.js +++ b/frappe/public/js/frappe/web_form/web_form.js @@ -280,6 +280,7 @@ export default class WebForm extends frappe.ui.FieldGroup { if (!doc_values) return; if (window.saving) return; + // TODO: remove this (used for payments app) let for_payment = Boolean(this.accept_payment && !this.doc.paid); Object.assign(this.doc, doc_values); @@ -342,6 +343,7 @@ export default class WebForm extends frappe.ui.FieldGroup { } handle_success(data) { + // TODO: remove this (used for payments app) if (this.accept_payment && !this.doc.paid) { window.location.href = data; } diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index 836ec8f632..95f58e12fd 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -454,10 +454,9 @@ def get_context(context): @frappe.whitelist(allow_guest=True) @rate_limit(key="web_form", limit=5, seconds=60, methods=["POST"]) -def accept(web_form, data, docname=None, for_payment=False): +def accept(web_form, data, docname=None): """Save the web form""" data = frappe._dict(json.loads(data)) - for_payment = frappe.parse_json(for_payment) files = [] files_to_delete = [] @@ -495,10 +494,6 @@ def accept(web_form, data, docname=None, for_payment=False): doc.set(fieldname, value) - if for_payment: - web_form.validate_mandatory(doc) - doc.run_method("validate_payment") - if doc.name: if web_form.has_web_form_permission(doc.doctype, doc.name, "write"): doc.save(ignore_permissions=True) @@ -549,12 +544,7 @@ def accept(web_form, data, docname=None, for_payment=False): remove_file_by_url(f, doctype=doc.doctype, name=doc.name) frappe.flags.web_form_doc = doc - - if for_payment: - # this is needed for Payments app - return web_form.get_payment_gateway_url(doc) - else: - return doc + return doc @frappe.whitelist()