@@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json | |||||
from .exceptions import * | from .exceptions import * | ||||
from .utils.jinja import get_jenv, get_template, render_template | from .utils.jinja import get_jenv, get_template, render_template | ||||
__version__ = '8.0.16' | |||||
__version__ = '8.0.17' | |||||
__title__ = "Frappe Framework" | __title__ = "Frappe Framework" | ||||
local = Local() | local = Local() | ||||
@@ -233,7 +233,7 @@ def load_print_css(bootinfo, print_settings): | |||||
bootinfo.print_css = frappe.get_attr("frappe.www.print.get_print_style")(print_settings.print_style or "Modern", for_legacy=True) | bootinfo.print_css = frappe.get_attr("frappe.www.print.get_print_style")(print_settings.print_style or "Modern", for_legacy=True) | ||||
def get_unseen_notes(): | def get_unseen_notes(): | ||||
return frappe.db.sql('''select name, title, content from tabNote where notify_on_login=1 | |||||
return frappe.db.sql('''select name, title, content, notify_on_every_login from tabNote where notify_on_login=1 | |||||
and expire_notification_on > %s and %s not in | and expire_notification_on > %s and %s not in | ||||
(select user from `tabNote Seen By` nsb | (select user from `tabNote Seen By` nsb | ||||
where nsb.parent=tabNote.name)''', (frappe.utils.now(), frappe.session.user), as_dict=True) | where nsb.parent=tabNote.name)''', (frappe.utils.now(), frappe.session.user), as_dict=True) |
@@ -328,6 +328,10 @@ frappe.UserPermissions = Class.extend({ | |||||
} | } | ||||
d.fields_dict["defvalue"].get_query = function(txt) { | d.fields_dict["defvalue"].get_query = function(txt) { | ||||
if(!d.get_value("defkey")) { | |||||
frappe.throw(__("Please select Document Type")); | |||||
} | |||||
return { | return { | ||||
doctype: d.get_value("defkey") | doctype: d.get_value("defkey") | ||||
} | } | ||||
@@ -97,6 +97,38 @@ | |||||
"search_index": 0, | "search_index": 0, | ||||
"set_only_once": 0, | "set_only_once": 0, | ||||
"unique": 0 | "unique": 0 | ||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"bold": 1, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"default": "0", | |||||
"depends_on": "notify_on_login", | |||||
"description": "If enabled, users will be notified every time they login. If not enabled, users will only be notified once.", | |||||
"fieldname": "notify_on_every_login", | |||||
"fieldtype": "Check", | |||||
"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": "Notify Users On Every Login", | |||||
"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, | |||||
"unique": 0 | |||||
}, | }, | ||||
{ | { | ||||
"allow_on_submit": 0, | "allow_on_submit": 0, | ||||
@@ -262,4 +294,4 @@ | |||||
"sort_order": "ASC", | "sort_order": "ASC", | ||||
"track_changes": 1, | "track_changes": 1, | ||||
"track_seen": 0 | "track_seen": 0 | ||||
} | |||||
} |
@@ -53,12 +53,13 @@ def get_list(arg=None): | |||||
limit %(start)s, %(page_length)s""".format(fields), | limit %(start)s, %(page_length)s""".format(fields), | ||||
frappe.local.form_dict, as_dict=1) | frappe.local.form_dict, as_dict=1) | ||||
else: | else: | ||||
return frappe.db.sql("""select * from `tabCommunication` | |||||
return frappe.db.sql("""select {0} from `tabCommunication` | |||||
where | where | ||||
communication_type in ('Chat', 'Notification') | communication_type in ('Chat', 'Notification') | ||||
and comment_type != 'Bot' | |||||
and reference_doctype ='User' | and reference_doctype ='User' | ||||
and ((owner=%(contact)s and reference_name=%(user)s) | and ((owner=%(contact)s and reference_name=%(user)s) | ||||
or (owner=%(contact)s and reference_name=%(contact)s)) | |||||
or (owner=%(user)s and reference_name=%(contact)s)) | |||||
order by creation desc | order by creation desc | ||||
limit %(start)s, %(page_length)s""".format(fields), | limit %(start)s, %(page_length)s""".format(fields), | ||||
frappe.local.form_dict, as_dict=1) | frappe.local.form_dict, as_dict=1) | ||||
@@ -39,6 +39,11 @@ def install_db(root_login="root", root_password=None, db_name=None, source_sql=N | |||||
frappe.connect(db_name=db_name) | frappe.connect(db_name=db_name) | ||||
check_if_ready_for_barracuda() | check_if_ready_for_barracuda() | ||||
import_db_from_sql(source_sql, verbose) | import_db_from_sql(source_sql, verbose) | ||||
if not 'tabDefaultValue' in frappe.db.get_tables(): | |||||
print '''Database not installed, this can due to lack of permission, or that the database name exists. | |||||
Check your mysql root password, or use --force to reinstall''' | |||||
sys.exit(1) | |||||
remove_missing_apps() | remove_missing_apps() | ||||
create_auth_table() | create_auth_table() | ||||
@@ -434,17 +434,22 @@ frappe.Application = Class.extend({ | |||||
var me = this; | var me = this; | ||||
if(frappe.boot.notes.length) { | if(frappe.boot.notes.length) { | ||||
frappe.boot.notes.forEach(function(note) { | frappe.boot.notes.forEach(function(note) { | ||||
if(!note.seen) { | |||||
if(!note.seen || note.notify_on_every_login) { | |||||
var d = frappe.msgprint({message:note.content, title:note.title}); | var d = frappe.msgprint({message:note.content, title:note.title}); | ||||
d.keep_open = true; | d.keep_open = true; | ||||
d.custom_onhide = function() { | d.custom_onhide = function() { | ||||
note.seen = true; | note.seen = true; | ||||
frappe.call({ | |||||
method: "frappe.desk.doctype.note.note.mark_as_seen", | |||||
args: { | |||||
note: note.name | |||||
} | |||||
}); | |||||
// Mark note as read if the Notify On Every Login flag is not set | |||||
if (!note.notify_on_every_login) { | |||||
frappe.call({ | |||||
method: "frappe.desk.doctype.note.note.mark_as_seen", | |||||
args: { | |||||
note: note.name | |||||
} | |||||
}); | |||||
} | |||||
// next note | // next note | ||||
me.show_notes(); | me.show_notes(); | ||||
@@ -1806,15 +1806,9 @@ frappe.ui.form.ControlTextEditor = frappe.ui.form.ControlCode.extend({ | |||||
} | } | ||||
} else { | } else { | ||||
this.upload_options.on_attach = function(fileobj, dataurl) { | this.upload_options.on_attach = function(fileobj, dataurl) { | ||||
me.editor.summernote('insertImage', dataurl); | |||||
me.image_dialog.hide(); | me.image_dialog.hide(); | ||||
me.fileobj = fileobj; | |||||
me.dataurl = dataurl; | |||||
if(me.on_attach) { | |||||
me.on_attach() | |||||
} | |||||
if(me.df.on_attach) { | |||||
me.df.on_attach(fileobj, dataurl); | |||||
} | |||||
frappe.hide_progress(); | |||||
} | } | ||||
} | } | ||||
}, | }, | ||||
@@ -90,7 +90,7 @@ frappe.views.ListSidebar = Class.extend({ | |||||
if(!r.ref_doctype || r.ref_doctype==me.doctype) { | if(!r.ref_doctype || r.ref_doctype==me.doctype) { | ||||
var report_type = r.report_type==='Report Builder' | var report_type = r.report_type==='Report Builder' | ||||
? 'Report/' + r.ref_doctype : 'query-report'; | ? 'Report/' + r.ref_doctype : 'query-report'; | ||||
var route = r.route || report_type + '/' + r.title; | |||||
var route = r.route || report_type + '/' + (r.title || r.name); | |||||
if(added.indexOf(route)===-1) { | if(added.indexOf(route)===-1) { | ||||
// don't repeat | // don't repeat | ||||
@@ -102,7 +102,7 @@ frappe.views.ListSidebar = Class.extend({ | |||||
} | } | ||||
$('<li><a href="#'+ route + '">' | $('<li><a href="#'+ route + '">' | ||||
+ __(r.title)+'</a></li>').appendTo(dropdown); | |||||
+ __(r.title || r.name)+'</a></li>').appendTo(dropdown); | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
@@ -107,7 +107,9 @@ frappe.views.GanttView = frappe.views.ListRenderer.extend({ | |||||
var $dropdown = $(dropdown) | var $dropdown = $(dropdown) | ||||
$dropdown.find(".dropdown-menu") | $dropdown.find(".dropdown-menu") | ||||
.append(dropdown_list); | .append(dropdown_list); | ||||
me.list_view.$page.find(`[data-list-renderer='Gantt'] .list-row-right`).css("margin-right", "15px").html($dropdown) | |||||
me.list_view.$page | |||||
.find(`[data-list-renderer='Gantt'] > .list-row-right`) | |||||
.css("margin-right", "15px").html($dropdown) | |||||
$dropdown.on("click", ".option", function() { | $dropdown.on("click", ".option", function() { | ||||
var mode = $(this).data('value'); | var mode = $(this).data('value'); | ||||
me.gantt.change_view_mode(mode); | me.gantt.change_view_mode(mode); | ||||