@@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json | |||
from .exceptions import * | |||
from .utils.jinja import get_jenv, get_template, render_template | |||
__version__ = '7.1.14' | |||
__version__ = '7.1.15' | |||
__title__ = "Frappe Framework" | |||
local = Local() | |||
@@ -193,6 +193,10 @@ def set_desktop_icons(visible_list, ignore_duplicate=True): | |||
except frappe.UniqueValidationError, e: | |||
if not ignore_duplicate: | |||
raise e | |||
else: | |||
visible_list.remove(module_name) | |||
if frappe.message_log: | |||
frappe.message_log.pop() | |||
# set the order | |||
set_order(visible_list) | |||
@@ -25,7 +25,7 @@ def get_context(context): | |||
files = [('/backups/' + _file, | |||
get_time(os.path.join(path, _file)), | |||
get_size(os.path.join(path, _file))) for _file in files] | |||
get_size(os.path.join(path, _file))) for _file in files if _file.endswith('sql.gz')] | |||
files.sort(key=lambda x: x[1], reverse=True) | |||
return {"files": files} | |||
@@ -37,8 +37,9 @@ def get_scheduled_backup_limit(): | |||
def cleanup_old_backups(site_path, files, limit): | |||
backup_paths = [] | |||
for f in files: | |||
_path = os.path.abspath(os.path.join(site_path, f)) | |||
backup_paths.append(_path) | |||
if f.endswith('sql.gz'): | |||
_path = os.path.abspath(os.path.join(site_path, f)) | |||
backup_paths.append(_path) | |||
backup_paths = sorted(backup_paths, key=os.path.getctime) | |||
files_to_delete = len(backup_paths) - limit | |||
@@ -198,7 +198,7 @@ def send_email(success, service_name, error_status=None): | |||
if not frappe.db: | |||
frappe.connect() | |||
recipients = split_emails(frappe.db.get_value("Dropbox Backup", None, "send_notifications_to")) | |||
recipients = split_emails(frappe.db.get_value("Dropbox Settings", None, "send_notifications_to")) | |||
frappe.sendmail(recipients=recipients, subject=subject, message=message) | |||
def backup_to_dropbox(): | |||
@@ -198,10 +198,12 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
this.setup_add_section(); | |||
this.setup_edit_heading(); | |||
this.setup_field_settings(); | |||
this.setup_html_data(); | |||
}, | |||
prepare_data: function() { | |||
this.print_heading_template = null; | |||
this.data = JSON.parse(this.print_format.format_data || "[]"); | |||
this.fields_dict = {}; | |||
if(!this.data.length) { | |||
// new layout | |||
this.data = this.meta.fields; | |||
@@ -212,6 +214,15 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
this.data = this.data.splice(1); | |||
} | |||
} | |||
if(!this.print_heading_template) { | |||
// default print heading template | |||
this.print_heading_template = '<div class="print-heading">\ | |||
<h2>'+__(this.print_format.doc_type) | |||
+'<br><small>{{ doc.name }}</small>\ | |||
</h2></div>'; | |||
} | |||
this.layout_data = []; | |||
var section = null, column = null, me = this; | |||
@@ -234,6 +245,7 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
// break the layout into sections and columns | |||
// so that it is easier to render in a template | |||
$.each(this.data, function(i, f) { | |||
me.fields_dict[f.fieldname] = f; | |||
if(!f.name && f.fieldname) { | |||
// from format_data (designed format) | |||
// print_hide should always be false | |||
@@ -467,6 +479,14 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
return false; | |||
}); | |||
}, | |||
setup_html_data: function() { | |||
// set `data` for Custom HTML fields | |||
var me = this; | |||
this.page.main.find('[data-fieldtype="Custom HTML"]').each(function() { | |||
$(this).find('.html-content') | |||
.data('content', me.fields_dict[$(this).attr('data-fieldname')].options); | |||
}) | |||
}, | |||
update_columns_in_section: function(section, no_of_columns, new_no_of_columns) { | |||
var col_size = 12 / new_no_of_columns, | |||
me = this, | |||
@@ -527,12 +547,12 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
}, | |||
setup_edit_heading: function() { | |||
var me = this; | |||
if (!me.print_heading_template) { | |||
$(this.page.main.find(".print-heading")).html('<h2>'+me.print_format.doc_type+'<br><small>{{ doc.name }}</small></h2>') | |||
} | |||
var $heading = this.page.main.find(".print-format-builder-print-heading"); | |||
// set content property | |||
$heading.data('content', this.print_heading_template); | |||
this.page.main.find(".edit-heading").on("click", function() { | |||
var $heading = $(this).parents(".print-format-builder-header:first") | |||
.find(".print-format-builder-print-heading"); | |||
var d = me.get_edit_html_dialog(__("Edit Heading"), __("Heading"), $heading); | |||
}) | |||
}, | |||
@@ -657,12 +677,12 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
}); | |||
// set existing content in input | |||
content = $content.attr('data-html-content'); | |||
content = $content.data('content') || ""; | |||
if(content.indexOf(me.get_no_content())!==-1) content = ""; | |||
d.set_input("content", content); | |||
d.set_primary_action(__("Update"), function() { | |||
$content.attr('data-html-content', d.get_value("content")); | |||
$content.data('content', d.get_value("content")); | |||
$content.html(d.get_value("content")); | |||
d.hide(); | |||
}); | |||
@@ -678,9 +698,11 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
// add print heading as the first field | |||
// this will be removed and set as a doc property | |||
// before rendering | |||
data.push({"fieldname": "print_heading_template", | |||
fieldtype:"HTML", | |||
options: this.page.main.find(".print-format-builder-print-heading").html()}); | |||
data.push({ | |||
fieldname: "print_heading_template", | |||
fieldtype:"Custom HTML", | |||
options: this.page.main.find(".print-format-builder-print-heading").data('content') | |||
}); | |||
// add pages | |||
this.page.main.find(".print-format-builder-section").each(function() { | |||
@@ -722,7 +744,7 @@ frappe.PrintFormatBuilder = Class.extend({ | |||
if(fieldtype==="Custom HTML") { | |||
// custom html as HTML field | |||
df.fieldtype = "HTML"; | |||
df.options = $this.find(".html-content").attr('data-html-content'); | |||
df.options = $this.find(".html-content").data('content'); | |||
} | |||
data.push(df); | |||
}); | |||
@@ -20,8 +20,7 @@ | |||
<a class="edit-html btn btn-default btn-xs"> | |||
{%= __("Edit HTML") %}</a> | |||
</div> | |||
<div class="html-content" | |||
data-html-content="{{ field.options || me.get_no_content() }}"> | |||
<div class="html-content"> | |||
{{ field.options || me.get_no_content() }}</div> | |||
{% } else { %} | |||
<span class="field-label">{{ field.label }}</span> | |||
@@ -1,28 +1,24 @@ | |||
<div class="padding"> | |||
<div class="text-muted text-center"> | |||
{%= __("Drag elements from the sidebar to add. Drag them back to trash.") %}<br><br> | |||
</div> | |||
<div class="print-format-builder-header"> | |||
<div class="text-right"> | |||
<a class="edit-heading btn btn-default btn-xs"> | |||
{%= __("Edit Heading") %}</a> | |||
</div> | |||
<div class="print-format-builder-print-heading"> | |||
{% if (me.print_heading_template ){ %} | |||
{%= me.print_heading_template %} | |||
{% } else { %} | |||
<div class="print-heading"></div> | |||
{% } %} | |||
</div> | |||
</div> | |||
<div class="print-format-builder-layout"> | |||
{% for(var i=0; i < data.length; i++) { %} | |||
{%= frappe.render_template("print_format_builder_section", | |||
{section: data[i], me:me}) %} | |||
{% } %} | |||
</div> | |||
<div class="print-format-builder-add-section text-muted text-center"> | |||
<span class="octicon octicon-plus"></span> | |||
<a class="grey">Add a new section</a> | |||
</div> | |||
<div class="text-muted text-center"> | |||
{%= __("Drag elements from the sidebar to add. Drag them back to trash.") %}<br><br> | |||
</div> | |||
<div class="print-format-builder-header"> | |||
<div class="text-right"> | |||
<a class="edit-heading btn btn-default btn-xs"> | |||
{%= __("Edit Heading") %}</a> | |||
</div> | |||
<div class="print-format-builder-print-heading"> | |||
{{ me.print_heading_template }} | |||
</div> | |||
</div> | |||
<div class="print-format-builder-layout"> | |||
{% for(var i=0; i < data.length; i++) { %} | |||
{%= frappe.render_template("print_format_builder_section", | |||
{section: data[i], me:me}) %} | |||
{% } %} | |||
</div> | |||
<div class="print-format-builder-add-section text-muted text-center"> | |||
<span class="octicon octicon-plus"></span> | |||
<a class="grey">Add a new section</a> | |||
</div> | |||
</div> |