Some checks failed
Frontend / Unit Tests & Coverage (push) Has been skipped
Regenerate POT file (translatable strings) / Regenerate POT file (develop) (push) Failing after 1m13s
Regenerate POT file (translatable strings) / Regenerate POT file (main-hotfix) (push) Failing after 6s
Server / Tests (frappe ${{ matrix.frappe-branch }}) (push) Has been skipped
Server / Resolve frappe matrix (push) Failing after 1s
Frontend / Lint (push) Failing after 1s
Frontend / Production Build (push) Failing after 1s
Server / Coverage Wrap Up (push) Has been skipped
Frontend / Coverage Wrap Up (push) Has been skipped
368 lines
10 KiB
Python
368 lines
10 KiB
Python
app_name = "crm"
|
|
app_title = "Frappe CRM"
|
|
app_publisher = "Frappe Technologies Pvt. Ltd."
|
|
app_description = "Kick-ass Open Source CRM"
|
|
app_email = "shariq@frappe.io"
|
|
app_license = "AGPLv3"
|
|
app_icon_url = "/assets/crm/images/logo.svg"
|
|
app_icon_title = "CRM"
|
|
app_icon_route = "/crm"
|
|
|
|
# Apps
|
|
# ------------------
|
|
|
|
# required_apps = []
|
|
add_to_apps_screen = [
|
|
{
|
|
"name": "crm",
|
|
"logo": "/assets/crm/images/logo.svg",
|
|
"title": "CRM",
|
|
"route": "/crm",
|
|
"has_permission": "crm.api.check_app_permission",
|
|
}
|
|
]
|
|
|
|
get_site_info = "crm.activation.get_site_info"
|
|
|
|
export_python_type_annotations = True
|
|
require_type_annotated_api_methods = True
|
|
|
|
# Includes in <head>
|
|
# ------------------
|
|
|
|
# include js, css files in header of desk.html
|
|
# app_include_css = "/assets/crm/css/crm.css"
|
|
# app_include_js = "/assets/crm/js/crm.js"
|
|
|
|
# include js, css files in header of web template
|
|
# web_include_css = "/assets/crm/css/crm.css"
|
|
# web_include_js = "/assets/crm/js/crm.js"
|
|
|
|
# include custom scss in every website theme (without file extension ".scss")
|
|
# website_theme_scss = "crm/public/scss/website"
|
|
|
|
# include js, css files in header of web form
|
|
# webform_include_js = {"doctype": "public/js/doctype.js"}
|
|
# webform_include_css = {"doctype": "public/css/doctype.css"}
|
|
|
|
# include js in page
|
|
# page_js = {"page" : "public/js/file.js"}
|
|
|
|
# include js in doctype views
|
|
doctype_js = {
|
|
"Quotation": "public/js/erpnext_quotation_prefill.js",
|
|
"Sales Order": "public/js/erpnext_sales_order_customer.js",
|
|
"CRM Lead": "public/js/domain_enrichment.js",
|
|
"CRM Organization": "public/js/domain_enrichment.js",
|
|
"CRM Deal": "public/js/domain_enrichment.js",
|
|
}
|
|
# doctype_list_js = {"doctype" : "public/js/doctype_list.js"}
|
|
# doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"}
|
|
# doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"}
|
|
|
|
# Home Pages
|
|
# ----------
|
|
|
|
# application home page (will override Website Settings)
|
|
# home_page = "login"
|
|
|
|
# website user home page (by Role)
|
|
# role_home_page = {
|
|
# "Role": "home_page"
|
|
# }
|
|
|
|
website_route_rules = [
|
|
{"from_route": "/crm/<path:app_path>", "to_route": "crm"},
|
|
{"from_route": "/crm-form/<route>", "to_route": "crm_form"},
|
|
]
|
|
|
|
# Generators
|
|
# ----------
|
|
|
|
# automatically create page for each record of this doctype
|
|
# website_generators = ["Web Page"]
|
|
|
|
# Jinja
|
|
# ----------
|
|
|
|
# add methods and filters to jinja environment
|
|
# jinja = {
|
|
# "methods": "crm.utils.jinja_methods",
|
|
# "filters": "crm.utils.jinja_filters"
|
|
# }
|
|
|
|
# Setup wizard
|
|
# setup_wizard_requires = "assets/crm/js/setup_wizard.js"
|
|
# setup_wizard_stages = "crm.setup.setup_wizard.setup_wizard.get_setup_stages"
|
|
setup_wizard_complete = "crm.demo.api.create_demo_data"
|
|
# setup_wizard_test = "crm.setup.setup_wizard.test_setup_wizard.run_setup_wizard_test"
|
|
|
|
# Installation
|
|
# ------------
|
|
|
|
before_install = "crm.install.before_install"
|
|
after_install = "crm.install.after_install"
|
|
|
|
# Uninstallation
|
|
# ------------
|
|
|
|
before_uninstall = "crm.uninstall.before_uninstall"
|
|
# after_uninstall = "crm.uninstall.after_uninstall"
|
|
|
|
# Integration Setup
|
|
# ------------------
|
|
# To set up dependencies/integrations with other apps
|
|
# Name of the app being installed is passed as an argument
|
|
|
|
# before_app_install = "crm.utils.before_app_install"
|
|
# after_app_install = "crm.utils.after_app_install"
|
|
|
|
# Integration Cleanup
|
|
# -------------------
|
|
# To clean up dependencies/integrations with other apps
|
|
# Name of the app being uninstalled is passed as an argument
|
|
|
|
# before_app_uninstall = "crm.utils.before_app_uninstall"
|
|
# after_app_uninstall = "crm.utils.after_app_uninstall"
|
|
|
|
# Desk Notifications
|
|
# ------------------
|
|
# See frappe.core.notifications.get_notification_config
|
|
|
|
# notification_config = "crm.notifications.get_notification_config"
|
|
|
|
# Permissions
|
|
# -----------
|
|
# Permissions evaluated in scripted ways
|
|
|
|
permission_query_conditions = {
|
|
"CRM Lead": "crm.permissions.org_hierarchy.get_lead_permission_query_conditions",
|
|
"CRM Deal": "crm.permissions.org_hierarchy.get_deal_permission_query_conditions",
|
|
"CRM Notification": "crm.fcrm.doctype.crm_notification.crm_notification.get_permission_query_conditions",
|
|
}
|
|
|
|
has_permission = {
|
|
"CRM Lead": "crm.permissions.org_hierarchy.has_lead_permission",
|
|
"CRM Deal": "crm.permissions.org_hierarchy.has_deal_permission",
|
|
"CRM Notification": "crm.fcrm.doctype.crm_notification.crm_notification.has_permission",
|
|
}
|
|
|
|
# DocType Class
|
|
# ---------------
|
|
# Override standard doctype classes
|
|
|
|
override_doctype_class = {
|
|
"Contact": "crm.overrides.contact.CustomContact",
|
|
"Email Template": "crm.overrides.email_template.CustomEmailTemplate",
|
|
}
|
|
|
|
# Document Events
|
|
# ---------------
|
|
# Hook on document methods and events
|
|
|
|
doc_events = {
|
|
"Contact": {
|
|
"validate": ["crm.api.contact.validate"],
|
|
},
|
|
"Notification Log": {
|
|
"before_insert": ["crm.extends.notification_log.before_insert"],
|
|
},
|
|
"ToDo": {
|
|
"validate": ["crm.api.todo.validate"],
|
|
"after_insert": ["crm.api.todo.after_insert"],
|
|
"on_update": ["crm.api.todo.on_update"],
|
|
},
|
|
"Communication": {
|
|
"after_insert": ["crm.utils.on_communication_insert"],
|
|
"on_update": ["crm.utils.on_communication_update"],
|
|
},
|
|
"Comment": {
|
|
"after_insert": ["crm.utils.on_comment_insert"],
|
|
"on_update": ["crm.api.comment.on_update"],
|
|
},
|
|
"WhatsApp Message": {
|
|
"validate": ["crm.api.whatsapp.validate"],
|
|
"on_update": ["crm.api.whatsapp.on_update"],
|
|
},
|
|
"CRM Deal": {
|
|
"on_update": [
|
|
"crm.fcrm.doctype.erpnext_crm_settings.erpnext_crm_settings.create_customer_in_erpnext"
|
|
],
|
|
},
|
|
"Sales Order": {
|
|
"before_validate": [
|
|
"crm.fcrm.doctype.erpnext_crm_settings.erpnext_crm_settings.create_customer_on_sales_order"
|
|
],
|
|
},
|
|
"Item": {
|
|
"after_insert": ["crm.integrations.erpnext.item.after_insert"],
|
|
"on_update": ["crm.integrations.erpnext.item.on_update"],
|
|
"before_rename": ["crm.integrations.erpnext.item.before_rename"],
|
|
"after_rename": ["crm.integrations.erpnext.item.after_rename"],
|
|
"on_trash": ["crm.integrations.erpnext.item.on_trash"],
|
|
},
|
|
"User Permission": {
|
|
"before_validate": ["crm.integrations.erpnext.user_permission.before_validate"],
|
|
"after_insert": ["crm.integrations.erpnext.user_permission.after_insert"],
|
|
"on_update": ["crm.integrations.erpnext.user_permission.on_update"],
|
|
"on_trash": ["crm.integrations.erpnext.user_permission.on_trash"],
|
|
},
|
|
"DocShare": {
|
|
"before_validate": ["crm.integrations.erpnext.doc_share.before_validate"],
|
|
"after_insert": ["crm.integrations.erpnext.doc_share.after_insert"],
|
|
"on_update": ["crm.integrations.erpnext.doc_share.on_update"],
|
|
"on_trash": ["crm.integrations.erpnext.doc_share.on_trash"],
|
|
},
|
|
"User": {
|
|
"before_validate": ["crm.api.live_demo.validate_user"],
|
|
"validate_reset_password": ["crm.api.live_demo.validate_reset_password"],
|
|
},
|
|
}
|
|
|
|
# Scheduled Tasks
|
|
# ---------------
|
|
|
|
scheduler_events = {
|
|
"all": ["crm.api.event.trigger_offset_event_notifications"],
|
|
"hourly": ["crm.api.event.trigger_hourly_event_notifications"],
|
|
"daily": [
|
|
"crm.api.event.trigger_daily_event_notifications",
|
|
"crm.fcrm.doctype.crm_invitation.crm_invitation.expire_invitations",
|
|
"crm.fcrm.doctype.crm_view_settings.crm_view_settings.clear_old_versions",
|
|
"crm.telemetry.capture_feature_state",
|
|
],
|
|
"weekly": ["crm.api.event.trigger_weekly_event_notifications"],
|
|
"daily_long": ["crm.lead_syncing.background_sync.sync_leads_from_sources_daily"],
|
|
"hourly_long": ["crm.lead_syncing.background_sync.sync_leads_from_sources_hourly"],
|
|
"monthly_long": ["crm.lead_syncing.background_sync.sync_leads_from_sources_monthly"],
|
|
"cron": {
|
|
"*/5 * * * *": ["crm.lead_syncing.background_sync.sync_leads_from_sources_5_minutes"],
|
|
"*/10 * * * *": ["crm.lead_syncing.background_sync.sync_leads_from_sources_10_minutes"],
|
|
"*/15 * * * *": ["crm.lead_syncing.background_sync.sync_leads_from_sources_15_minutes"],
|
|
},
|
|
}
|
|
|
|
# Testing
|
|
# -------
|
|
|
|
before_tests = "crm.tests.before_tests"
|
|
|
|
# Overriding Methods
|
|
# ------------------------------
|
|
#
|
|
# override_whitelisted_methods = {
|
|
# "frappe.desk.doctype.event.event.get_events": "crm.event.get_events"
|
|
# }
|
|
#
|
|
# each overriding function accepts a `data` argument;
|
|
# generated from the base implementation of the doctype dashboard,
|
|
# along with any modifications made in other Frappe apps
|
|
# override_doctype_dashboards = {
|
|
# "Task": "crm.task.get_dashboard_data"
|
|
# }
|
|
|
|
# exempt linked doctypes from being automatically cancelled
|
|
#
|
|
# auto_cancel_exempted_doctypes = ["Auto Repeat"]
|
|
|
|
# Ignore links to specified DocTypes when deleting documents
|
|
# -----------------------------------------------------------
|
|
|
|
ignore_links_on_delete = ["Failed Lead Sync Log"]
|
|
|
|
# Request Events
|
|
# ----------------
|
|
# before_request = ["crm.utils.before_request"]
|
|
# after_request = ["crm.utils.after_request"]
|
|
|
|
# Job Events
|
|
# ----------
|
|
# before_job = ["crm.utils.before_job"]
|
|
# after_job = ["crm.utils.after_job"]
|
|
|
|
# User Data Protection
|
|
# --------------------
|
|
|
|
# user_data_fields = [
|
|
# {
|
|
# "doctype": "{doctype_1}",
|
|
# "filter_by": "{filter_by}",
|
|
# "redact_fields": ["{field_1}", "{field_2}"],
|
|
# "partial": 1,
|
|
# },
|
|
# {
|
|
# "doctype": "{doctype_2}",
|
|
# "filter_by": "{filter_by}",
|
|
# "partial": 1,
|
|
# },
|
|
# {
|
|
# "doctype": "{doctype_3}",
|
|
# "strict": False,
|
|
# },
|
|
# {
|
|
# "doctype": "{doctype_4}"
|
|
# }
|
|
# ]
|
|
|
|
# Authentication and authorization
|
|
# --------------------------------
|
|
|
|
# auth_hooks = [
|
|
# "crm.auth.validate"
|
|
# ]
|
|
|
|
after_migrate = [
|
|
"crm.fcrm.doctype.fcrm_settings.fcrm_settings.after_migrate",
|
|
"crm.api.whatsapp.add_roles",
|
|
"crm.domain_enrichment.install.seed_default_rules_and_mappings",
|
|
"crm.install.add_default_scripts",
|
|
"crm.install.add_web_form_custom_fields",
|
|
]
|
|
|
|
standard_dropdown_items = [
|
|
{
|
|
"name1": "app_selector",
|
|
"label": "Apps",
|
|
"type": "Route",
|
|
"route": "#",
|
|
"is_standard": 1,
|
|
},
|
|
{
|
|
"name1": "settings",
|
|
"label": "Settings",
|
|
"type": "Route",
|
|
"icon": "settings",
|
|
"route": "#",
|
|
"is_standard": 1,
|
|
},
|
|
{
|
|
"name1": "login_to_fc",
|
|
"label": "Login to Frappe Cloud",
|
|
"type": "Route",
|
|
"route": "#",
|
|
"is_standard": 1,
|
|
},
|
|
{
|
|
"name1": "about",
|
|
"label": "About",
|
|
"type": "Route",
|
|
"icon": "info",
|
|
"route": "#",
|
|
"is_standard": 1,
|
|
},
|
|
{
|
|
"name1": "separator",
|
|
"label": "",
|
|
"type": "Separator",
|
|
"is_standard": 1,
|
|
},
|
|
{
|
|
"name1": "logout",
|
|
"label": "Log out",
|
|
"type": "Route",
|
|
"icon": "log-out",
|
|
"route": "#",
|
|
"is_standard": 1,
|
|
},
|
|
]
|