Added webnotes.in_test check in too many writes check Conflicts: public/js/wn/form/control.js webnotes/utils/file_manager.py webnotes/webutils.py website/sitemap.py wnf.pyversion-14
@@ -88,12 +88,13 @@ wn.core.pages.desktop.show_pending_notifications = function() { | |||
&& wn.boot.notification_info.open_count_module[module]!=null) { | |||
sum = wn.boot.notification_info.open_count_module[module]; | |||
} | |||
var notifier = $("#module-count-" + wn.modules[module]._link); | |||
if(notifier.length) { | |||
notifier.toggle(sum ? true : false); | |||
notifier.find(".circle-text").html(sum || ""); | |||
if (wn.modules[module]) { | |||
var notifier = $("#module-count-" + wn.modules[module]._link); | |||
if(notifier.length) { | |||
notifier.toggle(sum ? true : false); | |||
notifier.find(".circle-text").html(sum || ""); | |||
} | |||
} | |||
}); | |||
} | |||
@@ -370,6 +370,9 @@ wn.ui.form.ControlDate = wn.ui.form.ControlData.extend({ | |||
set_datepicker: function() { | |||
this.datepicker_options.dateFormat = | |||
(wn.boot.sysdefaults.date_format || 'yyyy-mm-dd').replace("yyyy", "yy") | |||
if(this.not_in_form && this.dialog_wrapper) { | |||
this.$input.css("z-index", cint($(this.dialog_wrapper).zIndex())); | |||
} | |||
this.$input.datepicker(this.datepicker_options); | |||
}, | |||
parse: function(value) { | |||
@@ -408,8 +411,12 @@ wn.ui.form.ControlTime = wn.ui.form.ControlData.extend({ | |||
wn.ui.form.ControlDatetime = wn.ui.form.ControlDate.extend({ | |||
set_datepicker: function() { | |||
this.datepicker_options.dateFormat = | |||
(wn.boot.sysdefaults.date_format || 'yy-mm-dd').replace('yyyy','yy') | |||
(wn.boot.sysdefaults.date_format || 'yy-mm-dd').replace('yyyy','yy'); | |||
this.datepicker_options.timeFormat = "hh:mm:ss"; | |||
if(this.not_in_form && this.dialog_wrapper) { | |||
this.$input.css("z-index", cint($(this.dialog_wrapper).zIndex())); | |||
} | |||
this.$input.datetimepicker(this.datepicker_options); | |||
}, | |||
@@ -51,28 +51,29 @@ wn.ui.form.Grid = Class.extend({ | |||
if(!force && this.data_rows_are_same(data)) { | |||
// soft refresh | |||
this.header_row.refresh(); | |||
$.each(this.grid_rows, function(i, g) { | |||
g.refresh(); | |||
}); | |||
for(var i in this.grid_rows) { | |||
this.grid_rows[i].refresh(); | |||
} | |||
} else { | |||
// redraw | |||
this.wrapper.find(".grid-row").remove(); | |||
this.make_head(); | |||
this.grid_rows = []; | |||
this.grid_rows_by_docname = {}; | |||
$.each(data || [], function(ri, d) { | |||
for(var ri in data) { | |||
var d = data[ri]; | |||
var grid_row = new wn.ui.form.GridRow({ | |||
parent: $rows, | |||
parent_df: me.df, | |||
docfields: me.docfields, | |||
parent_df: this.df, | |||
docfields: this.docfields, | |||
doc: d, | |||
frm: me.frm, | |||
grid: me | |||
frm: this.frm, | |||
grid: this | |||
}); | |||
me.grid_rows.push(grid_row) | |||
me.grid_rows_by_docname[d.name] = grid_row; | |||
}); | |||
this.grid_rows.push(grid_row) | |||
this.grid_rows_by_docname[d.name] = grid_row; | |||
} | |||
this.wrapper.find(".grid-add-row").toggle(this.is_editable()); | |||
if(this.is_editable()) { | |||
this.make_sortable($rows); | |||
@@ -183,9 +184,7 @@ wn.ui.form.GridRow = Class.extend({ | |||
return false; | |||
}); | |||
this.form_panel = $('<div class="panel panel-warning" style="display: none;"></div>').appendTo(this.wrapper); | |||
$('<div class="divider row"></div>').appendTo(this.wrapper); | |||
this.divider = $('<div class="divider row"></div>').appendTo(this.wrapper); | |||
this.set_row_index(); | |||
this.make_static_display(); | |||
@@ -220,6 +219,7 @@ wn.ui.form.GridRow = Class.extend({ | |||
this.doc = locals[this.doc.doctype][this.doc.name]; | |||
// re write columns | |||
this.grid.static_display_template = null; | |||
this.make_static_display(); | |||
// refersh form fields | |||
@@ -230,76 +230,38 @@ wn.ui.form.GridRow = Class.extend({ | |||
} | |||
}, | |||
make_static_display: function() { | |||
var me = this, | |||
total_colsize = 1; | |||
me.row.empty(); | |||
col = $('<div class="col col-xs-1 row-index">' + (me.doc ? me.doc.idx : "#")+ '</div>') | |||
.appendTo(me.row); | |||
var me = this; | |||
this.make_static_display_template(); | |||
this.row.empty(); | |||
$('<div class="col col-xs-1 row-index">' + (this.doc ? this.doc.idx : "#")+ '</div>') | |||
.appendTo(this.row); | |||
$.each(me.docfields, function(ci, df) { | |||
if(!df.hidden && df.in_list_view && me.grid.frm.get_perm(df.permlevel, READ) | |||
&& !in_list(["Section Break", "Column Break"], df.fieldtype)) { | |||
var colsize = 2, | |||
txt = me.doc ? | |||
wn.format(me.doc[df.fieldname], df, null, me.doc) : | |||
wn._(df.label); | |||
switch(df.fieldtype) { | |||
case "Text": | |||
case "Small Text": | |||
colsize = 3; | |||
break; | |||
case "Check": | |||
colsize = 1; | |||
break; | |||
case "Select": | |||
txt = wn._(txt) | |||
} | |||
total_colsize += colsize | |||
if(total_colsize > 11) | |||
return false; | |||
$col = $('<div class="col col-xs-'+colsize+'"></div>') | |||
.html(txt) | |||
.attr("data-fieldname", df.fieldname) | |||
.data("df", df) | |||
.appendTo(me.row) | |||
if(["Text", "Small Text"].indexOf(df.fieldtype)!==-1) { | |||
$col.addClass("grid-overflow-no-ellipsis"); | |||
} else { | |||
$col.addClass("grid-overflow-ellipsis"); | |||
} | |||
if(in_list(["Int", "Currency", "Float"], df.fieldtype)) | |||
$col.addClass("text-right"); | |||
for(var ci in this.static_display_template) { | |||
var df = this.static_display_template[ci][0]; | |||
var colsize = this.static_display_template[ci][1]; | |||
var txt = this.doc ? | |||
wn.format(this.doc[df.fieldname], df, null, this.doc) : | |||
wn._(df.label); | |||
if(df.fieldtype === "Select") { | |||
txt = wn._(txt); | |||
} | |||
}); | |||
var add_class = (["Text", "Small Text"].indexOf(df.fieldtype)===-1) ? | |||
" grid-overflow-ellipsis" : " grid-overflow-no-ellipsis"; | |||
add_class += (["Int", "Currency", "Float"].indexOf(df.fieldtype)!==-1) ? | |||
" text-right": ""; | |||
// redistribute if total-col size is less than 12 | |||
var passes = 0; | |||
while(total_colsize < 11 && passes < 10) { | |||
me.row.find(".col").each(function() { | |||
var $col = $(this); | |||
if(!$col.hasClass("col-xs-1") | |||
&& !in_list(["Int", "Currency", "Float"], $col.data("df").fieldtype)) { | |||
for(var i=2; i<12; i++) { | |||
if($col.hasClass("col-xs-" + i)) { | |||
$col.removeClass("col-xs-" + i).addClass("col-xs-" + (i+1)); | |||
total_colsize++; | |||
break; | |||
} | |||
} | |||
} | |||
if(total_colsize >= 11) | |||
return false; | |||
}); | |||
passes++; | |||
$col = $('<div class="col col-xs-'+colsize+add_class+'"></div>') | |||
.html(txt) | |||
.attr("data-fieldname", df.fieldname) | |||
.data("df", df) | |||
.appendTo(this.row) | |||
} | |||
// TODO find a better solution | |||
// append button column | |||
if(me.doc && this.grid.is_editable()) { | |||
if(!me.grid.$row_actions) { | |||
me.grid.$row_actions = $('<div class="col-md-1 pull-right" \ | |||
if(this.doc && this.grid.is_editable()) { | |||
if(!this.grid.$row_actions) { | |||
this.grid.$row_actions = $('<div class="col-md-1 pull-right" \ | |||
style="text-align: right; padding-right: 5px;">\ | |||
<button class="btn btn-small btn-success grid-insert-row" style="padding: 4px;">\ | |||
<i class="icon icon-plus-sign"></i></button>\ | |||
@@ -307,11 +269,12 @@ wn.ui.form.GridRow = Class.extend({ | |||
<i class="icon icon-trash"></i></button>\ | |||
</div>'); | |||
} | |||
$col = me.grid.$row_actions.clone().appendTo(me.row); | |||
$col = this.grid.$row_actions.clone().appendTo(this.row); | |||
if($col.width() < 50) { | |||
$col.remove(); | |||
$col.toggle(false); | |||
} else { | |||
$col.toggle(true); | |||
$col.find(".grid-insert-row").click(function() { me.insert(); return false; }); | |||
$col.find(".grid-delete-row").click(function() { me.remove(); return false; }); | |||
} | |||
@@ -319,6 +282,49 @@ wn.ui.form.GridRow = Class.extend({ | |||
$(this.frm.wrapper).trigger("grid-row-render", [this]); | |||
}, | |||
make_static_display_template: function() { | |||
if(this.static_display_template) return; | |||
var total_colsize = 1; | |||
this.static_display_template = []; | |||
for(var ci in this.docfields) { | |||
var df = this.docfields[ci]; | |||
if(!df.hidden && df.in_list_view && this.grid.frm.get_perm(df.permlevel, READ) | |||
&& !in_list(["Section Break", "Column Break"], df.fieldtype)) { | |||
var colsize = 2; | |||
switch(df.fieldtype) { | |||
case "Text": | |||
case "Small Text": | |||
colsize = 3; | |||
break; | |||
case "Check": | |||
colsize = 1; | |||
break; | |||
} | |||
total_colsize += colsize | |||
if(total_colsize > 11) | |||
return false; | |||
this.static_display_template.push([df, colsize]); | |||
} | |||
} | |||
// redistribute if total-col size is less than 12 | |||
var passes = 0; | |||
while(total_colsize < 11 && passes < 10) { | |||
for(var i in this.static_display_template) { | |||
var df = this.static_display_template[i][0]; | |||
var colsize = this.static_display_template[i][1]; | |||
if(colsize>1 && colsize<12 && ["Int", "Currency", "Float"].indexOf(df.fieldtype)===-1) { | |||
this.static_display_template[i][1] += 1; | |||
total_colsize++; | |||
} | |||
if(total_colsize >= 11) | |||
break; | |||
} | |||
passes++; | |||
} | |||
}, | |||
toggle_view: function(show, callback) { | |||
if(!this.doc) return this; | |||
@@ -349,10 +355,15 @@ wn.ui.form.GridRow = Class.extend({ | |||
} | |||
this.wrapper.toggleClass("grid-row-open", this.show); | |||
this.show && this.render_form() | |||
this.show && this.row.toggle(false); | |||
if(this.show) { | |||
if(!this.form_panel) { | |||
this.form_panel = $('<div class="panel panel-warning" style="display: none;"></div>') | |||
.insertBefore(this.divider); | |||
} | |||
this.render_form(); | |||
this.row.toggle(false); | |||
} | |||
this.form_panel.toggle(this.show); | |||
if(me.show) { | |||
if(me.frm.doc.docstatus===0) | |||
@@ -155,7 +155,7 @@ class Database: | |||
if query[:6].lower() in ['update', 'insert']: | |||
self.transaction_writes += 1 | |||
if self.transaction_writes > 10000: | |||
if not webnotes.in_test and self.transaction_writes > 10000: | |||
if self.auto_commit_on_many_writes: | |||
webnotes.conn.commit() | |||
webnotes.conn.begin() | |||
@@ -18,7 +18,7 @@ class MClient(memcache.Client): | |||
return builder() | |||
val = self.get(self.n(key)) | |||
if val==None and builder: | |||
if not val and builder: | |||
val = builder() | |||
self.set_value(key, val) | |||
return val | |||
@@ -213,6 +213,8 @@ class Bean: | |||
d.parent = self.doc.name | |||
if not d.idx: | |||
d.idx = idx_map.setdefault(d.parentfield, 0) + 1 | |||
else: | |||
d.idx = cint(d.idx) | |||
if is_local: | |||
# if parent is new, all children should be new | |||
d.fields["__islocal"] = 1 | |||
@@ -220,18 +222,18 @@ class Bean: | |||
idx_map[d.parentfield] = d.idx | |||
def run_method(self, method): | |||
def run_method(self, method, *args, **kwargs): | |||
self.make_controller() | |||
if hasattr(self.controller, method): | |||
getattr(self.controller, method)() | |||
getattr(self.controller, method)(*args, **kwargs) | |||
if hasattr(self.controller, 'custom_' + method): | |||
getattr(self.controller, 'custom_' + method)() | |||
getattr(self.controller, 'custom_' + method)(*args, **kwargs) | |||
notify(self.controller, method) | |||
self.set_doclist(self.controller.doclist) | |||
def get_method(self, method): | |||
self.make_controller() | |||
return getattr(self.controller, method, None) | |||
@@ -74,7 +74,7 @@ def save_file(fname, content, dt, dn): | |||
file_size = check_max_file_size(content) | |||
temp_fname = write_file(content, files_path) | |||
fname = scrub_file_name(fname) | |||
fpath = os.path.join(files_path, fname) | |||
fpath = os.path.join(files_path, fname).encode("utf-8") | |||
fname_parts = fname.split(".", -1) | |||
main = ".".join(fname_parts[:-1]) | |||
@@ -96,10 +96,10 @@ def save_file(fname, content, dt, dn): | |||
fname = get_new_fname_based_on_version(files_path, main, extn, versions) | |||
# rename | |||
os.rename(temp_fname, os.path.join(files_path, fname)) | |||
os.rename(temp_fname, fpath) | |||
else: | |||
# rename new file | |||
os.rename(temp_fname, os.path.join(files_path, fname)) | |||
os.rename(temp_fname, fpath) | |||
f = webnotes.bean({ | |||
"doctype": "File Data", | |||
@@ -124,7 +124,7 @@ def get_new_fname_based_on_version(files_path, main, extn, versions): | |||
version = 1 | |||
new_fname = main + "-" + str(version) + "." + extn | |||
while os.path.exists(os.path.join(files_path, new_fname)): | |||
while os.path.exists(os.path.join(files_path, new_fname).encode("utf-8")): | |||
version += 1 | |||
new_fname = main + "-" + str(version) + "." + extn | |||
if version > 100: | |||
@@ -117,6 +117,12 @@ def build_sitemap(): | |||
sitemap = {} | |||
config = webnotes.cache().get_value("website_sitemap_config", build_website_sitemap_config) | |||
sitemap.update(config["pages"]) | |||
# pages | |||
for p in config["pages"].values(): | |||
if p.get("controller"): | |||
module = webnotes.get_module(p["controller"]) | |||
p["no_cache"] = getattr(module, "no_cache", False) | |||
# generators | |||
for g in config["generators"].values(): | |||
@@ -134,6 +140,7 @@ def build_sitemap(): | |||
`tab%s` %s""" % (page_name_field, module.doctype, condition)): | |||
opts = g.copy() | |||
opts["doctype"] = module.doctype | |||
opts["no_cache"] = getattr(module, "no_cache", False) | |||
opts["page_name"] = page_name | |||
if page_name_field != "page_name": | |||
opts["page_name_field"] = page_name_field | |||
@@ -181,7 +188,7 @@ def build_website_sitemap_config(): | |||
return options | |||
for path, folders, files in os.walk(basepath): | |||
for path, folders, files in os.walk(basepath, followlinks=True): | |||
if os.path.basename(path)=="pages" and os.path.basename(os.path.dirname(path))=="templates": | |||
for fname in files: | |||
if fname.split(".")[-1] in ("html", "xml"): | |||
@@ -263,10 +270,13 @@ def clear_cache(page_name=None): | |||
else: | |||
cache = webnotes.cache() | |||
for p in get_all_pages(): | |||
cache.delete_value("page:" + p) | |||
if p is not None: | |||
cache.delete_value("page:" + p) | |||
cache.delete_value("page:index") | |||
cache.delete_value("website_sitemap") | |||
cache.delete_value("website_sitemap_config") | |||
def get_website_sitemap(): | |||
return webnotes.cache().get_value("website_sitemap", build_sitemap) | |||
@@ -275,7 +285,9 @@ def get_all_pages(): | |||
def delete_page_cache(page_name): | |||
if page_name: | |||
webnotes.cache().delete_value("page:" + page_name) | |||
cache = webnotes.cache() | |||
cache.delete_value("page:" + page_name) | |||
cache.delete_value("website_sitemap") | |||
def get_hex_shade(color, percent): | |||
def p(c): | |||
@@ -337,7 +349,7 @@ def page_name(title): | |||
"""make page name from title""" | |||
import re | |||
name = title.lower() | |||
name = re.sub('[~!@#$%^&*()<>,."\']', '', name) | |||
name = re.sub('[~!@#$%^&*+()<>,."\']', '', name) | |||
name = re.sub('[:/]', '-', name) | |||
name = '-'.join(name.split()) | |||
@@ -0,0 +1,30 @@ | |||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. | |||
# MIT License. See license.txt | |||
from __future__ import unicode_literals | |||
import urllib | |||
import webnotes | |||
import webnotes.webutils | |||
from webnotes.utils import nowdate | |||
def generate(domain): | |||
"""generate the sitemap XML""" | |||
frame_xml = """<?xml version="1.0" encoding="UTF-8"?> | |||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">%s | |||
</urlset>""" | |||
link_xml = """\n<url><loc>%s</loc><lastmod>%s</lastmod></url>""" | |||
site_map = "" | |||
if domain: | |||
today = nowdate() | |||
for page_name, page_options in webnotes.webutils.get_website_sitemap().items(): | |||
if page_options.get("no_cache"): | |||
continue | |||
url = urllib.basejoin(domain, urllib.quote(page_name.encode("utf-8"))) | |||
site_map += link_xml % (url, today) | |||
return frame_xml % site_map |
@@ -327,4 +327,4 @@ def search_replace_with_prompt(fpath, txt1, txt2, force=False): | |||
print colored('Updated', 'green') | |||
if __name__=="__main__": | |||
main() | |||
main() |