Merge branch 'hotfix'
This commit is contained in:
commit
8a9897e156
16 changed files with 182 additions and 101 deletions
|
|
@ -24,7 +24,7 @@ if sys.version[0] == '2':
|
|||
reload(sys)
|
||||
sys.setdefaultencoding("utf-8")
|
||||
|
||||
__version__ = '11.1.22'
|
||||
__version__ = '11.1.23'
|
||||
__title__ = "Frappe Framework"
|
||||
|
||||
local = Local()
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "report_name",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
|
|
@ -53,6 +54,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "ref_report_doctype",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 1,
|
||||
|
|
@ -86,6 +88,8 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "Queued",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "status",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 1,
|
||||
|
|
@ -93,12 +97,12 @@
|
|||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_list_view": 1,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Status",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Queued\nCompleted",
|
||||
"options": "Error\nQueued\nCompleted",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
|
|
@ -119,6 +123,39 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break_4",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"remember_last_selected_value": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "report_start_time",
|
||||
"fieldtype": "Datetime",
|
||||
"hidden": 0,
|
||||
|
|
@ -151,6 +188,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "report_end_time",
|
||||
"fieldtype": "Datetime",
|
||||
"hidden": 0,
|
||||
|
|
@ -183,6 +221,73 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.status == 'Error'",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "section_break_7",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 0,
|
||||
"remember_last_selected_value": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "error_message",
|
||||
"fieldtype": "Text",
|
||||
"hidden": 0,
|
||||
"ignore_user_permissions": 0,
|
||||
"ignore_xss_filter": 0,
|
||||
"in_filter": 0,
|
||||
"in_global_search": 0,
|
||||
"in_list_view": 0,
|
||||
"in_standard_filter": 0,
|
||||
"label": "Error Message",
|
||||
"length": 0,
|
||||
"no_copy": 1,
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"print_hide": 1,
|
||||
"print_hide_if_no_value": 0,
|
||||
"read_only": 1,
|
||||
"remember_last_selected_value": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
"unique": 0
|
||||
},
|
||||
{
|
||||
"allow_bulk_edit": 0,
|
||||
"allow_in_quick_entry": 0,
|
||||
"allow_on_submit": 0,
|
||||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "filters_sb",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
|
|
@ -215,6 +320,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "filters",
|
||||
"fieldtype": "Small Text",
|
||||
"hidden": 1,
|
||||
|
|
@ -247,6 +353,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "filter_values",
|
||||
"fieldtype": "HTML",
|
||||
"hidden": 0,
|
||||
|
|
@ -279,6 +386,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "columns",
|
||||
"fieldtype": "Code",
|
||||
"hidden": 1,
|
||||
|
|
@ -315,7 +423,7 @@
|
|||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2018-10-23 16:58:14.879417",
|
||||
"modified": "2019-04-19 12:39:47.211516",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Core",
|
||||
"name": "Prepared Report",
|
||||
|
|
|
|||
|
|
@ -25,31 +25,40 @@ class PreparedReport(Document):
|
|||
def after_insert(self):
|
||||
enqueue(
|
||||
run_background,
|
||||
instance=self, timeout=6000
|
||||
prepared_report=self.name, timeout=6000
|
||||
)
|
||||
|
||||
def on_trash(self):
|
||||
remove_all("PreparedReport", self.name, from_delete=True)
|
||||
|
||||
|
||||
def run_background(instance):
|
||||
def run_background(prepared_report):
|
||||
instance = frappe.get_doc("Prepared Report", prepared_report)
|
||||
report = frappe.get_doc("Report", instance.ref_report_doctype)
|
||||
|
||||
report.custom_columns = []
|
||||
try:
|
||||
report.custom_columns = []
|
||||
|
||||
if report.report_type == 'Custom Report':
|
||||
custom_report_doc = report
|
||||
reference_report = custom_report_doc.reference_report
|
||||
report = frappe.get_doc("Report", reference_report)
|
||||
report.custom_columns = custom_report_doc.json
|
||||
if report.report_type == 'Custom Report':
|
||||
custom_report_doc = report
|
||||
reference_report = custom_report_doc.reference_report
|
||||
report = frappe.get_doc("Report", reference_report)
|
||||
report.custom_columns = custom_report_doc.json
|
||||
|
||||
result = generate_report_result(report, filters=instance.filters, user=instance.owner)
|
||||
create_json_gz_file(result['result'], 'Prepared Report', instance.name)
|
||||
result = generate_report_result(report, filters=instance.filters, user=instance.owner)
|
||||
create_json_gz_file(result['result'], 'Prepared Report', instance.name)
|
||||
|
||||
instance.status = "Completed"
|
||||
instance.columns = json.dumps(result["columns"])
|
||||
instance.report_end_time = frappe.utils.now()
|
||||
instance.save()
|
||||
instance.status = "Completed"
|
||||
instance.columns = json.dumps(result["columns"])
|
||||
instance.report_end_time = frappe.utils.now()
|
||||
instance.save()
|
||||
|
||||
except Exception:
|
||||
frappe.log_error(frappe.get_traceback())
|
||||
instance = frappe.get_doc("Prepared Report", prepared_report)
|
||||
instance.status = "Error"
|
||||
instance.error_message = frappe.get_traceback()
|
||||
instance.save()
|
||||
|
||||
frappe.publish_realtime(
|
||||
'report_generated',
|
||||
|
|
|
|||
12
frappe/core/doctype/prepared_report/prepared_report_list.js
Normal file
12
frappe/core/doctype/prepared_report/prepared_report_list.js
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
frappe.listview_settings['Prepared Report'] = {
|
||||
add_fields: ["status"],
|
||||
get_indicator: function(doc) {
|
||||
if(doc.status==="Completed"){
|
||||
return [__("Completed"), "green", "status,=,Completed"];
|
||||
} else if(doc.status ==="Error"){
|
||||
return [__("Error"), "red", "status,=,Error"];
|
||||
} else if(doc.status ==="Queued"){
|
||||
return [__("Queued"), "orange", "status,=,Queued"];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -6,6 +6,7 @@ from __future__ import unicode_literals
|
|||
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import cint
|
||||
from frappe.desk.form.load import get_docinfo
|
||||
import frappe.share
|
||||
|
||||
|
|
@ -160,7 +161,7 @@ def notify_assignment(assigned_by, owner, doc_type, doc_name, action='CLOSE',
|
|||
'notify': notify
|
||||
}
|
||||
|
||||
if arg and arg.get("notify"):
|
||||
if arg and cint(arg.get("notify")):
|
||||
_notify(arg)
|
||||
|
||||
def _notify(args):
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ def add_data_to_custom_columns(columns, result):
|
|||
fieldname = column['fieldname']
|
||||
key = (column['doctype'], fieldname)
|
||||
link_field = column['link_field']
|
||||
row[fieldname] = custom_fields_data.get(key, {}).get(row[link_field])
|
||||
row[fieldname] = custom_fields_data.get(key, {}).get(row.get(link_field))
|
||||
|
||||
return data
|
||||
|
||||
|
|
|
|||
|
|
@ -118,67 +118,4 @@ def link_communication_to_document(doc, reference_doctype, reference_name, ignor
|
|||
doc.reference_doctype = reference_doctype
|
||||
doc.reference_name = reference_name
|
||||
doc.status = "Linked"
|
||||
doc.save(ignore_permissions=True)
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_issue_from_communication(communication, ignore_communication_links=False):
|
||||
""" raise a issue from email """
|
||||
|
||||
doc = frappe.get_doc("Communication", communication)
|
||||
issue = frappe.get_doc({
|
||||
"doctype": "Issue",
|
||||
"subject": doc.subject,
|
||||
"communication_medium": doc.communication_medium,
|
||||
"raised_by": doc.sender or "",
|
||||
"raised_by_phone": doc.phone_no or ""
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
link_communication_to_document(doc, "Issue", issue.name, ignore_communication_links)
|
||||
|
||||
return issue.name
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_lead_from_communication(communication, ignore_communication_links=False):
|
||||
""" raise a issue from email """
|
||||
|
||||
doc = frappe.get_doc("Communication", communication)
|
||||
lead_name = None
|
||||
if doc.sender:
|
||||
lead_name = frappe.db.get_value("Lead", {"email_id": doc.sender})
|
||||
if not lead_name and doc.mobile_no:
|
||||
lead_name = frappe.db.get_value("Lead", {"mobile_no": doc.phone_no})
|
||||
if not lead_name:
|
||||
lead = frappe.get_doc({
|
||||
"doctype": "Lead",
|
||||
"lead_name": doc.sender_full_name,
|
||||
"email_id": doc.sender,
|
||||
"mobile_no": doc.phone_no
|
||||
})
|
||||
lead.flags.ignore_mandatory = True
|
||||
lead.flags.ignore_permissions = True
|
||||
lead.insert()
|
||||
|
||||
lead_name = lead.name
|
||||
|
||||
link_communication_to_document(doc, "Lead", lead_name, ignore_communication_links)
|
||||
return lead_name
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_opportunity_from_communication(communication, ignore_communication_links=False):
|
||||
doc = frappe.get_doc("Communication", communication)
|
||||
|
||||
lead = doc.reference_name if doc.reference_doctype == "Lead" else None
|
||||
if not lead:
|
||||
lead = make_lead_from_communication(communication, ignore_communication_links=True)
|
||||
|
||||
enquiry_from = "Lead"
|
||||
|
||||
opportunity = frappe.get_doc({
|
||||
"doctype": "Opportunity",
|
||||
"enquiry_from": enquiry_from,
|
||||
"lead": lead
|
||||
}).insert(ignore_permissions=True)
|
||||
|
||||
link_communication_to_document(doc, "Opportunity", opportunity.name, ignore_communication_links)
|
||||
|
||||
return opportunity.name
|
||||
doc.save(ignore_permissions=True)
|
||||
|
|
@ -156,6 +156,7 @@ scheduler_events = {
|
|||
"frappe.utils.error.collect_error_snapshots",
|
||||
"frappe.desk.page.backups.backups.delete_downloadable_backups",
|
||||
"frappe.limits.update_space_usage",
|
||||
"frappe.limits.update_site_usage",
|
||||
"frappe.desk.doctype.auto_repeat.auto_repeat.make_auto_repeat_entry",
|
||||
],
|
||||
"daily": [
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ from frappe.utils import now_datetime, getdate, flt, cint, get_fullname
|
|||
from frappe.installer import update_site_config
|
||||
from frappe.utils.data import formatdate
|
||||
from frappe.utils.user import get_enabled_system_users, disable_users
|
||||
import os, subprocess
|
||||
from frappe.utils.__init__ import get_site_info
|
||||
import os, subprocess, json
|
||||
from six.moves.urllib.parse import parse_qsl, urlsplit, urlunsplit, urlencode
|
||||
from six import string_types
|
||||
|
||||
|
|
@ -235,3 +236,10 @@ def get_database_size():
|
|||
FROM information_schema.TABLES WHERE table_schema = %s GROUP BY table_schema''', db_name, as_dict=True)
|
||||
|
||||
return flt(db_size[0].get('database_size'), 2)
|
||||
|
||||
def update_site_usage():
|
||||
data = get_site_info()
|
||||
# exists = os.path.isfile(frappe.get_site_path("site_data.json"))
|
||||
with open(os.path.join(frappe.get_site_path(), 'site_data.json'), 'w') as outfile:
|
||||
json.dump(data, outfile)
|
||||
outfile.close()
|
||||
|
|
|
|||
|
|
@ -30,7 +30,8 @@ frappe.call = function(opts) {
|
|||
indicator: 'orange',
|
||||
message: __('You are not connected to Internet. Retry after sometime.')
|
||||
}, 3);
|
||||
return;
|
||||
opts.always && opts.always();
|
||||
return $.ajax();
|
||||
}
|
||||
if (typeof arguments[0]==='string') {
|
||||
opts = {
|
||||
|
|
|
|||
|
|
@ -1020,6 +1020,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
|
|||
label: df.label,
|
||||
link_field: this.doctype_field_map[values.doctype],
|
||||
doctype: values.doctype,
|
||||
options: df.fieldtype === "Link" ? values.doctype : undefined,
|
||||
width: 100
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -720,9 +720,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView {
|
|||
let out = {};
|
||||
|
||||
const standard_fields_filter = df =>
|
||||
!in_list(frappe.model.no_value_type, df.fieldtype) &&
|
||||
!df.report_hide && df.fieldname !== 'naming_series' &&
|
||||
!df.hidden;
|
||||
!in_list(frappe.model.no_value_type, df.fieldtype) && !df.report_hide;
|
||||
|
||||
let doctype_fields = frappe.meta.get_docfields(this.doctype).filter(standard_fields_filter);
|
||||
|
||||
|
|
|
|||
|
|
@ -541,6 +541,8 @@ def get_site_info():
|
|||
system_settings = frappe.db.get_singles_dict('System Settings')
|
||||
space_usage = frappe._dict((frappe.local.conf.limits or {}).get('space_usage', {}))
|
||||
|
||||
kwargs = {"fields": ["user", "creation", "full_name"], "filters":{"Operation": "Login", "Status": "Success"}, "limit": "10"}
|
||||
|
||||
site_info = {
|
||||
'installed_apps': get_installed_apps_info(),
|
||||
'users': users,
|
||||
|
|
@ -555,7 +557,8 @@ def get_site_info():
|
|||
'space_used': flt((space_usage.total or 0) / 1024.0, 2),
|
||||
'database_size': space_usage.database_size,
|
||||
'backup_size': space_usage.backup_size,
|
||||
'files_size': space_usage.files_size
|
||||
'files_size': space_usage.files_size,
|
||||
'last_logins': frappe.get_all("Activity Log", **kwargs)
|
||||
}
|
||||
|
||||
# from other apps
|
||||
|
|
|
|||
|
|
@ -312,13 +312,15 @@ def disable_users(limits=None):
|
|||
return
|
||||
|
||||
if limits.get('users'):
|
||||
system_manager = get_system_managers(only_name=True)[-1]
|
||||
|
||||
system_manager = get_system_managers(only_name=True)
|
||||
user_list = ['Administrator', 'Guest']
|
||||
if system_manager:
|
||||
user_list.append(system_manager[-1])
|
||||
#exclude system manager from active user list
|
||||
active_users = frappe.db.sql_list("""select name from tabUser
|
||||
where name not in ('Administrator', 'Guest', %s) and user_type = 'System User' and enabled=1
|
||||
order by creation desc""", system_manager)
|
||||
|
||||
# active_users = frappe.db.sql_list("""select name from tabUser
|
||||
# where name not in ('Administrator', 'Guest', %s) and user_type = 'System User' and enabled=1
|
||||
# order by creation desc""", system_manager)
|
||||
active_users = frappe.get_all("User", filters={"user_type":"System User", "enabled":1, "name": ["not in", user_list]}, fields=["name"])
|
||||
user_limit = cint(limits.get('users')) - 1
|
||||
|
||||
if len(active_users) > user_limit:
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
"cookie": "^0.3.1",
|
||||
"express": "^4.16.2",
|
||||
"fast-deep-equal": "^2.0.1",
|
||||
"frappe-datatable": "^1.12.0",
|
||||
"frappe-datatable": "^1.12.1",
|
||||
"frappe-gantt": "^0.1.0",
|
||||
"fuse.js": "^3.2.0",
|
||||
"highlight.js": "^9.12.0",
|
||||
|
|
|
|||
|
|
@ -1224,10 +1224,10 @@ forwarded@~0.1.2:
|
|||
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
|
||||
integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
|
||||
|
||||
frappe-datatable@^1.12.0:
|
||||
version "1.12.0"
|
||||
resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.12.0.tgz#2273535ead4404e5b165b6564c622acbacfdf61e"
|
||||
integrity sha512-rrsRaxP9+CwPdJiYzmgmYD5ud+0pWzon8n+DKBrnrbFheN5SFnbuRdR58G8qA4/psHIN3rrSEximiQsbTUNdzw==
|
||||
frappe-datatable@^1.12.1:
|
||||
version "1.12.1"
|
||||
resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.12.1.tgz#6efe342346025ffeed822e188a05da6c9c9230c9"
|
||||
integrity sha512-AC2sJDuJOr0nSfT+w7DPZd7zPW7PHGhg9XxdRNlaAYpy45r3owdJVF+R6lCMQRvFvvzmPMht02EOE6cFpkzLKw==
|
||||
dependencies:
|
||||
hyperlist "^1.0.0-beta"
|
||||
lodash "^4.17.5"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue