Merge branch 'staging-fixes' into staging

This commit is contained in:
Ameya Shenoy 2018-10-11 10:10:33 +00:00
commit 4eac464387
No known key found for this signature in database
GPG key ID: AC016A555657D0A3
19 changed files with 1346 additions and 1265 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View 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());
}
}
});

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
boto3
chardet
dropbox==7.3.1
dropbox==9.1.0
gunicorn
jinja2
markdown2==2.3.5