Merge branch 'develop' into workspace-2_0-fixes

This commit is contained in:
Shariq Ansari 2021-09-01 10:45:39 +05:30 committed by GitHub
commit 0ca9df7ecb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 215 additions and 117 deletions

View file

@ -38,8 +38,12 @@ if __name__ == "__main__":
pr_number = os.environ.get("PR_NUMBER")
repo = os.environ.get("REPO_NAME")
if not files_list and pr_number:
files_list = get_files_list(pr_number=pr_number, repo=repo)
# this is a push build, run all builds
if not pr_number:
os.system('echo "::set-output name=build::strawberry"')
sys.exit(0)
files_list = files_list or get_files_list(pr_number=pr_number, repo=repo)
if not files_list:
print("No files' changes detected. Build is shutting")

View file

@ -28,6 +28,7 @@
"sb1",
"autoname",
"name_case",
"allow_rename",
"column_break_15",
"description",
"documentation",
@ -39,7 +40,6 @@
"column_break_23",
"hide_toolbar",
"allow_copy",
"allow_rename",
"allow_import",
"allow_events_in_timeline",
"allow_auto_repeat",
@ -276,7 +276,7 @@
"oldfieldtype": "Check"
},
{
"default": "0",
"default": "1",
"fieldname": "allow_rename",
"fieldtype": "Check",
"label": "Allow Rename",
@ -635,7 +635,7 @@
"link_fieldname": "reference_doctype"
}
],
"modified": "2021-06-17 23:31:44.974199",
"modified": "2021-08-31 15:26:19.077164",
"modified_by": "Administrator",
"module": "Core",
"name": "DocType",

View file

@ -193,6 +193,16 @@ class CustomizeForm(Document):
if prop == "fieldtype":
self.validate_fieldtype_change(df, meta_df[0].get(prop), df.get(prop))
elif prop == "length":
old_value_length = cint(meta_df[0].get(prop))
new_value_length = cint(df.get(prop))
if new_value_length and (old_value_length > new_value_length):
self.check_length_for_fieldtypes.append({'df': df, 'old_value': meta_df[0].get(prop)})
self.validate_fieldtype_length()
else:
self.flags.update_db = True
elif prop == "allow_on_submit" and df.get(prop):
if not frappe.db.get_value("DocField",
{"parent": self.doc_type, "fieldname": df.fieldname}, "allow_on_submit"):

View file

@ -188,6 +188,26 @@ class TestCustomizeForm(unittest.TestCase):
def test_core_doctype_customization(self):
self.assertRaises(frappe.ValidationError, self.get_customize_form, 'User')
def test_save_customization_length_field_property(self):
# Using Notification Log doctype as it doesn't have any other custom fields
d = self.get_customize_form("Notification Log")
document_name = d.get("fields", {"fieldname": "document_name"})[0]
document_name.length = 255
d.run_method("save_customization")
self.assertEqual(frappe.db.get_value("Property Setter",
{"doc_type": "Notification Log", "property": "length", "field_name": "document_name"}, "value"), '255')
self.assertTrue(d.flags.update_db)
length = frappe.db.sql("""SELECT character_maximum_length
FROM information_schema.columns
WHERE table_name = 'tabNotification Log'
AND column_name = 'document_name'""")[0][0]
self.assertEqual(length, 255)
def test_custom_link(self):
try:
# create a dummy doctype linked to Event

View file

@ -151,18 +151,6 @@ frappe.ui.form.on("Email Account", {
callback: function (r) {
if (r.message) {
frm.events.set_domain_fields(frm, r.message);
} else {
frm.set_value("domain", "");
frappe.confirm(__('Email Domain not configured for this account, Create one?'),
function () {
frappe.model.with_doctype("Email Domain", function() {
frappe.route_options = { email_id: frm.doc.email_id };
frappe.route_flags.return_to_email_account = 1;
var doc = frappe.model.get_new_doc("Email Domain");
frappe.set_route("Form", "Email Domain", doc.name);
});
}
);
}
}
});

View file

@ -7,30 +7,34 @@
"document_type": "Setup",
"engine": "InnoDB",
"field_order": [
"account_section",
"email_id",
"login_id_is_different",
"login_id",
"email_account_name",
"column_break_3",
"domain",
"service",
"authentication_column",
"password",
"awaiting_password",
"ascii_encode_password",
"email_account_name",
"email_settings",
"domain",
"service",
"column_break_10",
"login_id_is_different",
"login_id",
"mailbox_settings",
"enable_incoming",
"use_imap",
"email_server",
"use_ssl",
"append_emails_to_sent_folder",
"incoming_port",
"attachment_limit",
"append_to",
"default_incoming",
"use_imap",
"use_ssl",
"email_server",
"incoming_port",
"column_break_18",
"attachment_limit",
"email_sync_option",
"initial_sync_count",
"create_contact",
"section_break_12",
"append_emails_to_sent_folder",
"append_to",
"create_contact",
"enable_automatic_linking",
"section_break_13",
"notify_if_unreplied",
@ -42,6 +46,7 @@
"use_tls",
"use_ssl_for_outgoing",
"smtp_port",
"column_break_38",
"default_outgoing",
"always_use_account_email_id_as_sender",
"always_use_account_name_as_sender_name",
@ -80,7 +85,7 @@
"fieldtype": "Check",
"hide_days": 1,
"hide_seconds": 1,
"label": "Use Different Email Login ID"
"label": "Use different login"
},
{
"depends_on": "login_id_is_different",
@ -122,12 +127,6 @@
"label": "Email Account Name",
"unique": 1
},
{
"fieldname": "email_settings",
"fieldtype": "Section Break",
"hide_days": 1,
"hide_seconds": 1
},
{
"depends_on": "eval:!doc.service",
"fieldname": "domain",
@ -136,7 +135,7 @@
"hide_seconds": 1,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Domain",
"label": "Domain (optional)",
"options": "Email Domain"
},
{
@ -145,18 +144,18 @@
"fieldtype": "Select",
"hide_days": 1,
"hide_seconds": 1,
"label": "Service",
"label": "Service (optional)",
"options": "\nGMail\nSendgrid\nSparkPost\nYahoo Mail\nOutlook.com\nYandex.Mail"
},
{
"fieldname": "mailbox_settings",
"fieldtype": "Section Break",
"hide_days": 1,
"hide_seconds": 1
"hide_seconds": 1,
"label": "Incoming (POP/IMAP) Settings"
},
{
"default": "0",
"description": "Check this to pull emails from your mailbox",
"fieldname": "enable_incoming",
"fieldtype": "Check",
"hide_days": 1,
@ -237,6 +236,7 @@
},
{
"default": "250",
"depends_on": "eval: doc.enable_incoming",
"description": "Total number of emails to sync in initial sync process ",
"fieldname": "initial_sync_count",
"fieldtype": "Select",
@ -248,7 +248,7 @@
{
"depends_on": "enable_incoming",
"fieldname": "section_break_13",
"fieldtype": "Section Break",
"fieldtype": "Column Break",
"hide_days": 1,
"hide_seconds": 1
},
@ -282,7 +282,8 @@
"fieldname": "outgoing_mail_settings",
"fieldtype": "Section Break",
"hide_days": 1,
"hide_seconds": 1
"hide_seconds": 1,
"label": "Outgoing (SMTP) Settings"
},
{
"default": "0",
@ -336,22 +337,20 @@
{
"default": "0",
"depends_on": "enable_outgoing",
"description": "Uses the Email Address mentioned in this Account as the Sender for all emails sent using this Account. ",
"fieldname": "always_use_account_email_id_as_sender",
"fieldtype": "Check",
"hide_days": 1,
"hide_seconds": 1,
"label": "Always use Account's Email Address as Sender"
"label": "Always use this email address as sender address"
},
{
"default": "0",
"depends_on": "enable_outgoing",
"description": "Uses the Email Address Name mentioned in this Account as the Sender's Name for all emails sent using this Account.",
"fieldname": "always_use_account_name_as_sender_name",
"fieldtype": "Check",
"hide_days": 1,
"hide_seconds": 1,
"label": "Always use Account's Name as Sender's Name"
"label": "Always use this name as sender name"
},
{
"default": "1",
@ -379,10 +378,13 @@
"label": "Disable SMTP server authentication"
},
{
"collapsible": 1,
"collapsible_depends_on": "add_signature",
"fieldname": "signature_section",
"fieldtype": "Section Break",
"hide_days": 1,
"hide_seconds": 1
"hide_seconds": 1,
"label": "Signature"
},
{
"default": "0",
@ -401,10 +403,13 @@
"label": "Signature"
},
{
"collapsible": 1,
"collapsible_depends_on": "enable_auto_reply",
"fieldname": "auto_reply",
"fieldtype": "Section Break",
"hide_days": 1,
"hide_seconds": 1
"hide_seconds": 1,
"label": "Auto Reply"
},
{
"default": "0",
@ -424,17 +429,20 @@
"label": "Auto Reply Message"
},
{
"collapsible": 1,
"collapsible_depends_on": "eval:frappe.utils.html2text(doc.footer || '')!=''",
"fieldname": "set_footer",
"fieldtype": "Section Break",
"hide_days": 1,
"hide_seconds": 1
"hide_seconds": 1,
"label": "Footer"
},
{
"fieldname": "footer",
"fieldtype": "Text Editor",
"hide_days": 1,
"hide_seconds": 1,
"label": "Footer"
"label": "Footer Content"
},
{
"fieldname": "uidvalidity",
@ -477,7 +485,8 @@
"fieldname": "section_break_12",
"fieldtype": "Section Break",
"hide_days": 1,
"hide_seconds": 1
"hide_seconds": 1,
"label": "Document Linking"
},
{
"default": "0",
@ -527,12 +536,38 @@
"fieldname": "brand_logo",
"fieldtype": "Attach Image",
"label": "Brand Logo"
},
{
"fieldname": "authentication_column",
"fieldtype": "Section Break",
"label": "Authentication"
},
{
"fieldname": "column_break_10",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_18",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_38",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_3",
"fieldtype": "Column Break"
},
{
"fieldname": "account_section",
"fieldtype": "Section Break",
"label": "Account"
}
],
"icon": "fa fa-inbox",
"index_web_pages_for_search": 1,
"links": [],
"modified": "2021-01-21 10:05:24.820597",
"modified": "2021-08-31 15:23:25.714366",
"modified_by": "Administrator",
"module": "Email",
"name": "Email Account",

View file

@ -13,6 +13,13 @@ frappe.data_import.DataExporter = class DataExporter {
this.dialog = new frappe.ui.Dialog({
title: __('Export Data'),
fields: [
{
fieldtype: 'Select',
fieldname: 'file_type',
label: __('File Type'),
options: ['Excel', 'CSV'],
default: 'CSV'
},
{
fieldtype: 'Select',
fieldname: 'export_records',
@ -45,13 +52,6 @@ frappe.data_import.DataExporter = class DataExporter {
fieldname: 'filter_area',
depends_on: doc => doc.export_records === 'by_filter'
},
{
fieldtype: 'Select',
fieldname: 'file_type',
label: __('File Type'),
options: ['Excel', 'CSV'],
default: 'CSV'
},
{
fieldtype: 'Section Break'
},
@ -141,7 +141,7 @@ frappe.data_import.DataExporter = class DataExporter {
let for_insert = this.exporting_for === 'Insert New Records';
let section_title = for_insert ? __('Select Fields To Insert') : __('Select Fields To Update');
let $select_all_buttons = $(`
<div>
<div class="mb-3">
<h6 class="form-section-heading uppercase">${section_title}</h6>
<button class="btn btn-default btn-xs" data-action="select_all">
${__('Select All')}

View file

@ -786,6 +786,7 @@ export default class Grid {
doctype: link_field.options,
fieldname: link,
qty_fieldname: qty,
get_query: link_field.get_query,
target: this,
txt: ""
});

View file

@ -96,10 +96,10 @@ frappe.ui.form.LinkSelector = class LinkSelector {
.attr('data-value', v[0])
.click(function () {
var value = $(this).attr("data-value");
var $link = this;
if (me.target.is_grid) {
// set in grid
me.set_in_grid(value);
// call search after value is set to get latest filtered results
me.set_in_grid(value).then(() => me.search());
} else {
if (me.target.doctype)
me.target.parse_validate_and_set_in_model(value);
@ -110,8 +110,8 @@ frappe.ui.form.LinkSelector = class LinkSelector {
me.dialog.hide();
}
return false;
})
})
});
});
} else {
$('<p><br><span class="text-muted">' + __("No Results") + '</span>'
+ (frappe.model.can_create(me.doctype) ?
@ -131,48 +131,55 @@ frappe.ui.form.LinkSelector = class LinkSelector {
}
set_in_grid(value) {
var me = this, updated = false;
var d = null;
return new Promise((resolve) => {
if (this.qty_fieldname) {
frappe.prompt({
fieldname: "qty", fieldtype: "Float", label: "Qty",
"default": 1, reqd: 1
}, function (data) {
$.each(me.target.frm.doc[me.target.df.fieldname] || [], function (i, d) {
if (d[me.fieldname] === value) {
frappe.model.set_value(d.doctype, d.name, me.qty_fieldname, data.qty);
frappe.show_alert(__("Added {0} ({1})", [value, d[me.qty_fieldname]]));
updated = true;
return false;
fieldname: "qty",
fieldtype: "Float",
label: "Qty",
default: 1,
reqd: 1
}, (data) => {
let updated = (this.target.frm.doc[this.target.df.fieldname] || []).some(d => {
if (d[this.fieldname] === value) {
frappe.model.set_value(d.doctype, d.name, this.qty_fieldname, data.qty).then(() => {
frappe.show_alert(__("Added {0} ({1})", [value, d[this.qty_fieldname]]));
resolve();
});
return true;
}
});
if (!updated) {
let d = null;
frappe.run_serially([
() => {
d = me.target.add_new_row();
},
() => d = this.target.add_new_row(),
() => frappe.timeout(0.1),
() => {
let args = {};
args[me.fieldname] = value;
args[me.qty_fieldname] = data.qty;
args[this.fieldname] = value;
args[this.qty_fieldname] = data.qty;
return frappe.model.set_value(d.doctype, d.name, args);
},
() => frappe.show_alert(__("Added {0} ({1})", [value, data.qty]))
() => frappe.show_alert(__("Added {0} ({1})", [value, data.qty])),
() => resolve()
]);
}
}, __("Set Quantity"), __("Set"));
} else if (me.dynamic_link_field) {
var d = me.target.add_new_row();
frappe.model.set_value(d.doctype, d.name, me.dynamic_link_field, me.dynamic_link_reference);
frappe.model.set_value(d.doctype, d.name, me.fieldname, value);
frappe.show_alert(__("{0} {1} added", [me.dynamic_link_reference, value]));
} else if (this.dynamic_link_field) {
let d = this.target.add_new_row();
frappe.model.set_value(d.doctype, d.name, this.dynamic_link_field, this.dynamic_link_reference);
frappe.model.set_value(d.doctype, d.name, this.fieldname, value).then(() => {
frappe.show_alert(__("{0} {1} added", [this.dynamic_link_reference, value]));
resolve();
});
} else {
var d = me.target.add_new_row();
frappe.model.set_value(d.doctype, d.name, me.fieldname, value);
let d = this.target.add_new_row();
frappe.model.set_value(d.doctype, d.name, this.fieldname, value).then(() => {
frappe.show_alert(__("{0} added", [value]));
resolve();
});
}
});
}
};

View file

@ -261,4 +261,14 @@ export default class BulkOperations {
});
dialog.show();
}
export(doctype, docnames) {
frappe.require('data_import_tools.bundle.js', () => {
const data_exporter = new frappe.data_import.DataExporter(doctype, 'Insert New Records');
data_exporter.dialog.set_value('export_records', 'by_filter');
data_exporter.filter_group.add_filters_to_filter_group(
[[doctype, "name", "in", docnames, false]]
);
});
}
}

View file

@ -1732,11 +1732,25 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
};
};
const bulk_export = () => {
return {
label: __("Export"),
action: () => {
const docnames = this.get_checked_items(true);
bulk_operations.export(doctype, docnames);
},
standard: true
};
};
// bulk edit
if (has_editable_fields(doctype)) {
actions_menu_items.push(bulk_edit());
}
actions_menu_items.push(bulk_export());
// bulk assignment
actions_menu_items.push(bulk_assignment());

View file

@ -31,8 +31,6 @@ function open_web_template_values_editor(template, current_values = {}) {
let current_table = null;
for (let df of doc.fields) {
if (current_table) {
current_table.fields = current_table.fields || [];
if (df.fieldtype != 'Table Break') {
current_table.fields.push(df);
} else {
@ -44,6 +42,9 @@ function open_web_template_values_editor(template, current_values = {}) {
} else {
table_fields.push(df);
current_table = df;
// start capturing fields in current_table till the next table break
current_table.fields = [];
}
}

View file

@ -66,7 +66,7 @@
padding: 4px 10px;
}
.btn-primary, .btn-secondary {
min-width: 35px;
min-width: 40px;
}
.custom-btn-group {
display: inline-flex;

View file

@ -3,12 +3,14 @@ import socket
import time
from uuid import uuid4
from collections import defaultdict
from typing import List
import redis
from typing import List
from redis.exceptions import BusyLoadingError, ConnectionError
from rq import Connection, Queue, Worker
from rq.logutils import setup_loghandlers
from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_fixed
import frappe
from frappe import _
@ -233,6 +235,11 @@ def validate_queue(queue, default_queue_list=None):
if queue not in default_queue_list:
frappe.throw(_("Queue should be one of {0}").format(', '.join(default_queue_list)))
@retry(
retry=retry_if_exception_type(BusyLoadingError) | retry_if_exception_type(ConnectionError),
stop=stop_after_attempt(10),
wait=wait_fixed(1)
)
def get_redis_conn(username=None, password=None):
if not hasattr(frappe.local, 'conf'):
raise Exception('You need to call frappe.init')

View file

@ -2,11 +2,6 @@
// MIT License. See license.txt
frappe.ui.form.on('Web Page', {
title: function(frm) {
if (frm.doc.title && !frm.doc.route) {
frm.set_value('route', frappe.scrub(frm.doc.title, '-'));
}
},
layout: function(frm) {
if (frm.is_new()) {
if (frm.doc.insert_code) {
@ -28,6 +23,11 @@ frappe.ui.form.on('Web Page', {
};
});
},
validate: function(frm) {
if (frm.doc.title && !frm.doc.route) {
frm.set_value('route', frappe.scrub(frm.doc.title, '-'));
}
},
refresh: function(frm) {
if (frm.doc.template_path) {
frm.set_read_only();

View file

@ -77,3 +77,4 @@ Whoosh~=2.7.4
wrapt~=1.12.1
xlrd~=2.0.1
zxcvbn-python~=4.4.24
tenacity~=8.0.1