Merge branch 'staging-fixes' into staging
This commit is contained in:
commit
4eac464387
19 changed files with 1346 additions and 1265 deletions
|
|
@ -69,7 +69,7 @@
|
|||
"read_only": 0,
|
||||
"remember_last_selected_value": 0,
|
||||
"report_hide": 0,
|
||||
"reqd": 1,
|
||||
"reqd": 0,
|
||||
"search_index": 0,
|
||||
"set_only_once": 0,
|
||||
"translatable": 0,
|
||||
|
|
@ -627,7 +627,7 @@
|
|||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2018-08-29 06:24:53.192890",
|
||||
"modified": "2018-10-09 06:24:53.192890",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Contacts",
|
||||
"name": "Address",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -9,6 +9,7 @@ from frappe import _, throw, msgprint
|
|||
from frappe.utils import nowdate
|
||||
|
||||
from frappe.model.document import Document
|
||||
import six
|
||||
from six import string_types
|
||||
|
||||
class SMSSettings(Document):
|
||||
|
|
@ -51,6 +52,8 @@ def send_sms(receiver_list, msg, sender_name = '', success_msg = True):
|
|||
|
||||
receiver_list = validate_receiver_nos(receiver_list)
|
||||
|
||||
if six.PY3: unicode = str
|
||||
|
||||
arg = {
|
||||
'receiver_list' : receiver_list,
|
||||
'message' : unicode(msg).encode('utf-8'),
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ import re
|
|||
from frappe.limits import get_limits
|
||||
from frappe.website.utils import is_signup_enabled
|
||||
from frappe.utils.background_jobs import enqueue
|
||||
from six import string_types
|
||||
|
||||
STANDARD_USERS = ("Guest", "Administrator")
|
||||
|
||||
|
|
@ -801,6 +802,9 @@ def reset_password(user):
|
|||
if user=="Administrator":
|
||||
return 'not allowed'
|
||||
|
||||
if isinstance(send_email, string_types):
|
||||
if send_email=='false': send_email = False
|
||||
|
||||
try:
|
||||
user = frappe.get_doc("User", user)
|
||||
if not user.enabled:
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ docfield_properties = {
|
|||
}
|
||||
|
||||
allowed_fieldtype_change = (('Currency', 'Float', 'Percent'), ('Small Text', 'Data'),
|
||||
('Text', 'Data'), ('Text', 'Text Editor', 'Code', 'Signature'), ('Data', 'Select'),
|
||||
('Text', 'Data'), ('Text', 'Text Editor', 'Code', 'Signature', 'HTML Editor'), ('Data', 'Select'),
|
||||
('Text', 'Small Text'), ('Text', 'Data', 'Barcode'), ('Code', 'Geolocation'))
|
||||
|
||||
allowed_fieldtype_for_options_change = ('Read Only', 'HTML', 'Select', 'Data')
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@
|
|||
"no_copy": 0,
|
||||
"oldfieldname": "fieldtype",
|
||||
"oldfieldtype": "Select",
|
||||
"options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSignature\nSmall Text\nTable\nText\nText Editor\nTime",
|
||||
"options": "Attach\nAttach Image\nBarcode\nButton\nCheck\nCode\nColor\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nFold\nGeolocation\nHeading\nHTML\nHTML Editor\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSignature\nSmall Text\nTable\nText\nText Editor\nTime",
|
||||
"permlevel": 0,
|
||||
"print_hide": 0,
|
||||
"print_hide_if_no_value": 0,
|
||||
|
|
@ -1304,7 +1304,7 @@
|
|||
"issingle": 0,
|
||||
"istable": 1,
|
||||
"max_attachments": 0,
|
||||
"modified": "2018-05-22 14:45:09.417168",
|
||||
"modified": "2018-10-11 14:45:09.417168",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Custom",
|
||||
"name": "Customize Form Field",
|
||||
|
|
@ -1317,4 +1317,4 @@
|
|||
"sort_order": "ASC",
|
||||
"track_changes": 0,
|
||||
"track_seen": 0
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ source_link = "https://github.com/frappe/frappe"
|
|||
app_license = "MIT"
|
||||
|
||||
develop_version = '11.x.x-develop'
|
||||
staging_version = '11.0.3-beta.8'
|
||||
staging_version = '11.0.3-beta.9'
|
||||
|
||||
app_email = "info@frappe.io"
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ type_map = {
|
|||
'Long Text': ('longtext', ''),
|
||||
'Code': ('longtext', ''),
|
||||
'Text Editor': ('longtext', ''),
|
||||
'HTML Editor': ('longtext', ''),
|
||||
'Date': ('date', ''),
|
||||
'Datetime': ('datetime', '6'),
|
||||
'Time': ('time', '6'),
|
||||
|
|
@ -556,7 +557,7 @@ class DbManager:
|
|||
def restore_database(self,target,source,user,password):
|
||||
from frappe.utils import make_esc
|
||||
esc = make_esc('$ ')
|
||||
|
||||
|
||||
from distutils.spawn import find_executable
|
||||
pipe = find_executable('pv')
|
||||
if pipe:
|
||||
|
|
@ -580,7 +581,7 @@ class DbManager:
|
|||
target = esc(target),
|
||||
source = source
|
||||
)
|
||||
os.system(command)
|
||||
os.system(command)
|
||||
|
||||
def drop_table(self,table_name):
|
||||
"""drop table if exists"""
|
||||
|
|
|
|||
|
|
@ -228,3 +228,4 @@ frappe.patches.v11_0.rename_google_maps_doctype
|
|||
frappe.patches.v10_0.modify_smallest_currency_fraction
|
||||
frappe.patches.v10_0.enhance_security
|
||||
frappe.patches.v11_0.multiple_references_in_events
|
||||
frappe.patches.v11_0.set_allow_self_approval_in_workflow
|
||||
|
|
@ -1,68 +1,75 @@
|
|||
import frappe
|
||||
import json
|
||||
from frappe.utils import cint
|
||||
from frappe.permissions import get_valid_perms, get_linked_doctypes
|
||||
|
||||
def execute():
|
||||
user_permissions = frappe.get_all('User Permission', fields=['allow', 'name', 'user'])
|
||||
frappe.reload_doctype("User Permission")
|
||||
user_permissions = frappe.get_all('User Permission', fields=['allow', 'name', 'user'])
|
||||
|
||||
doctype_to_skip_map = {}
|
||||
doctype_to_skip_map = {}
|
||||
|
||||
for permission in user_permissions:
|
||||
doctype_to_skip_map[permission.name] = get_doctypes_to_skip(permission.allow, permission.user)
|
||||
for permission in user_permissions:
|
||||
if (permission.allow, permission.user) not in doctype_to_skip_map:
|
||||
doctype_to_skip_map[(permission.allow, permission.user)] = get_doctypes_to_skip(permission.allow, permission.user)
|
||||
|
||||
if not doctype_to_skip_map: return
|
||||
|
||||
for perm_name, doctype_to_skip in doctype_to_skip_map.items():
|
||||
if not doctype_to_skip: continue
|
||||
doctype_to_skip = '\n'.join(doctype_to_skip)
|
||||
frappe.db.set_value('User Permission', perm_name, 'skip_for_doctype', doctype_to_skip)
|
||||
if not doctype_to_skip_map: return
|
||||
for key, doctype_to_skip in doctype_to_skip_map.items():
|
||||
if not doctype_to_skip: continue
|
||||
doctype_to_skip = '\n'.join(doctype_to_skip)
|
||||
frappe.db.sql("""
|
||||
update `tabUser Permission`
|
||||
set skip_for_doctype = %s
|
||||
where user=%s and allow=%s
|
||||
""", (doctype_to_skip, key[1], key[0]))
|
||||
|
||||
|
||||
def get_doctypes_to_skip(doctype, user):
|
||||
''' Returns doctypes to be skipped from user permission check'''
|
||||
doctypes_to_skip = []
|
||||
valid_perms = get_user_valid_perms(user) or []
|
||||
''' Returns doctypes to be skipped from user permission check'''
|
||||
doctypes_to_skip = []
|
||||
valid_perms = get_user_valid_perms(user) or []
|
||||
for perm in valid_perms:
|
||||
parent_doctype = perm.parent
|
||||
try:
|
||||
linked_doctypes = get_linked_doctypes(parent_doctype)
|
||||
child_doctypes = [d.options for d in frappe.get_meta(parent_doctype).get_table_fields()]
|
||||
for child_dt in child_doctypes:
|
||||
linked_doctypes += get_linked_doctypes(child_dt)
|
||||
if doctype not in linked_doctypes: continue
|
||||
except frappe.DoesNotExistError:
|
||||
# if doctype not found (may be due to rename) it should not be considered for skip
|
||||
continue
|
||||
|
||||
for perm in valid_perms:
|
||||
if not cint(perm.apply_user_permissions):
|
||||
# add doctype to skip list if any of the perm does not apply user permission
|
||||
doctypes_to_skip.append(parent_doctype)
|
||||
|
||||
parent_doctype = perm.parent
|
||||
|
||||
try:
|
||||
if doctype not in get_linked_doctypes(parent_doctype): continue
|
||||
except frappe.DoesNotExistError:
|
||||
# if doctype not found (may be due to rename) it should not be considered for skip
|
||||
continue
|
||||
elif parent_doctype not in doctypes_to_skip:
|
||||
|
||||
if not perm.apply_user_permission:
|
||||
# add doctype to skip list if any of the perm does not apply user permission
|
||||
doctypes_to_skip.append(doctype)
|
||||
user_permission_doctypes = get_user_permission_doctypes(perm)
|
||||
|
||||
elif parent_doctype not in doctypes_to_skip:
|
||||
# "No doctypes present" indicates that user permission will be applied to each link field
|
||||
if not user_permission_doctypes: continue
|
||||
|
||||
user_permission_doctypes = get_user_permission_doctypes(perm)
|
||||
elif doctype in user_permission_doctypes: continue
|
||||
|
||||
# "No doctypes present" indicates that user permission will be applied to each link field
|
||||
if not user_permission_doctypes: continue
|
||||
else: doctypes_to_skip.append(parent_doctype)
|
||||
# to remove possible duplicates
|
||||
doctypes_to_skip = list(set(doctypes_to_skip))
|
||||
|
||||
elif doctype in user_permission_doctypes: continue
|
||||
|
||||
else: doctypes_to_skip.append(doctype)
|
||||
|
||||
# to remove possible duplicates
|
||||
doctypes_to_skip = list(set(doctypes_to_skip))
|
||||
|
||||
return doctypes_to_skip
|
||||
return doctypes_to_skip
|
||||
|
||||
# store user's valid perms to avoid repeated query
|
||||
user_valid_perm = {}
|
||||
|
||||
def get_user_valid_perms(user):
|
||||
if not user_valid_perm.get(user):
|
||||
user_valid_perm[user] = get_valid_perms(user=user)
|
||||
return user_valid_perm.get(user)
|
||||
if not user_valid_perm.get(user):
|
||||
user_valid_perm[user] = get_valid_perms(user=user)
|
||||
return user_valid_perm.get(user)
|
||||
|
||||
def get_user_permission_doctypes(perm):
|
||||
try:
|
||||
return json.loads(perm.user_permission_doctypes or '[]')
|
||||
except ValueError:
|
||||
return []
|
||||
try:
|
||||
return json.loads(perm.user_permission_doctypes or '[]')
|
||||
except ValueError:
|
||||
return []
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
import frappe
|
||||
|
||||
def execute():
|
||||
frappe.reload_doc("workflow", "doctype", "workflow_transition")
|
||||
frappe.db.sql("update `tabWorkflow Transition` set allow_self_approval=1")
|
||||
|
|
@ -117,6 +117,8 @@ def get_doc_permissions(doc, verbose=False, user=None, ptype=None):
|
|||
if(doc.owner == frappe.session.user):
|
||||
|
||||
permissions = permissions.get("if_owner")
|
||||
# if_owner does not come with create rights...
|
||||
permissions['create'] = 0
|
||||
else:
|
||||
permissions = {}
|
||||
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@
|
|||
"public/js/frappe/form/controls/read_only.js",
|
||||
"public/js/frappe/form/controls/button.js",
|
||||
"public/js/frappe/form/controls/html.js",
|
||||
"public/js/frappe/form/controls/html_editor.js",
|
||||
"public/js/frappe/form/controls/heading.js",
|
||||
"public/js/frappe/form/controls/autocomplete.js",
|
||||
"public/js/frappe/form/controls/barcode.js",
|
||||
|
|
|
|||
32
frappe/public/js/frappe/form/controls/html_editor.js
Normal file
32
frappe/public/js/frappe/form/controls/html_editor.js
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
frappe.ui.form.ControlHTMLEditor = frappe.ui.form.ControlCode.extend({
|
||||
make_input() {
|
||||
this._super();
|
||||
this.$input.height(150);
|
||||
this.make_preview_container();
|
||||
},
|
||||
|
||||
make_preview_container() {
|
||||
this.html_preview_container = $('<div>').appendTo(this.input_area).addClass('html-preview-container');
|
||||
this.preview_label = $('<div>').appendTo(this.html_preview_container).addClass('html-preview-label');
|
||||
this.html_preview_area = $('<div>').appendTo(this.html_preview_container).addClass('html-preview-area');
|
||||
this.$input.on('change keyup paste', frappe.utils.debounce(() => {
|
||||
this.build_preview();
|
||||
}, 300));
|
||||
},
|
||||
|
||||
set_formatted_input(value) {
|
||||
this._super(value);
|
||||
this.build_preview();
|
||||
},
|
||||
|
||||
build_preview() {
|
||||
if (this.get_value() == '') {
|
||||
this.preview_label.text(__('No Preview available'));
|
||||
this.html_preview_area.hide();
|
||||
} else {
|
||||
this.preview_label.text(__('Preview'));
|
||||
this.html_preview_area.show();
|
||||
this.html_preview_area.html(this.get_value());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
@ -310,9 +310,10 @@ frappe.ui.form.Timeline = class Timeline {
|
|||
c["edit"] = '<a class="edit-comment text-muted" title="Edit" href="#">Edit</a>';
|
||||
}
|
||||
}
|
||||
c.comment_on_small = comment_when(c.communication_date, true);
|
||||
c.comment_on = comment_when(c.communication_date);
|
||||
c.futur_date = c.communication_date > frappe.datetime.now_datetime() ? true : false;
|
||||
let communication_date = c.communication_date || c.creation;
|
||||
c.comment_on_small = comment_when(communication_date, true);
|
||||
c.comment_on = comment_when(communication_date);
|
||||
c.futur_date = communication_date > frappe.datetime.now_datetime() ? true : false;
|
||||
if(!c.fullname) {
|
||||
c.fullname = c.sender_full_name || frappe.user.full_name(c.sender);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,3 +44,15 @@
|
|||
z-index: 3;
|
||||
}
|
||||
|
||||
.html-preview-container {
|
||||
.html-preview-label {
|
||||
.text-muted;
|
||||
margin: 10px 0;
|
||||
font-size: @text-medium
|
||||
}
|
||||
.html-preview-area {
|
||||
.border;
|
||||
padding: 5px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -343,3 +343,15 @@ def reset_simultaneous_sessions(user_limit):
|
|||
else:
|
||||
frappe.db.set_value("User", user.name, "simultaneous_sessions", 1)
|
||||
user_limit = user_limit - 1
|
||||
|
||||
def get_link_to_reset_password(user):
|
||||
link = ''
|
||||
|
||||
if not cint(frappe.db.get_single_value('System Settings', 'setup_complete')):
|
||||
user = frappe.get_doc("User", user)
|
||||
link = user.reset_password(send_email=False)
|
||||
frappe.db.commit()
|
||||
|
||||
return {
|
||||
'link': link
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"default": "0",
|
||||
"default": "1",
|
||||
"description": "Allow approval for creator of the document",
|
||||
"fieldname": "allow_self_approval",
|
||||
"fieldtype": "Check",
|
||||
|
|
@ -320,7 +320,7 @@
|
|||
"issingle": 0,
|
||||
"istable": 1,
|
||||
"max_attachments": 0,
|
||||
"modified": "2018-06-19 10:28:53.294908",
|
||||
"modified": "2018-10-09 10:28:53.294908",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Workflow",
|
||||
"name": "Workflow Transition",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
boto3
|
||||
chardet
|
||||
dropbox==7.3.1
|
||||
dropbox==9.1.0
|
||||
gunicorn
|
||||
jinja2
|
||||
markdown2==2.3.5
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue