Merge branch 'hotfix'

This commit is contained in:
Sahil Khan 2019-04-22 14:04:09 +05:30
commit 8a9897e156
16 changed files with 182 additions and 101 deletions

View file

@ -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()

View file

@ -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",

View file

@ -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',

View 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"];
}
}
};

View file

@ -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):

View file

@ -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

View file

@ -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)

View file

@ -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": [

View file

@ -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()

View file

@ -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 = {

View file

@ -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
});

View file

@ -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);

View file

@ -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

View file

@ -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:

View file

@ -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",

View file

@ -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"