Merge branch 'master' of github.com:webnotes/wnframework into wsgi
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.py
This commit is contained in:
commit
aa8331e6ea
10 changed files with 169 additions and 106 deletions
|
|
@ -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())
|
||||
|
|
|
|||
30
website/sitemap.py
Normal file
30
website/sitemap.py
Normal file
|
|
@ -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
|
||||
2
wnf.py
2
wnf.py
|
|
@ -327,4 +327,4 @@ def search_replace_with_prompt(fpath, txt1, txt2, force=False):
|
|||
print colored('Updated', 'green')
|
||||
|
||||
if __name__=="__main__":
|
||||
main()
|
||||
main()
|
||||
Loading…
Add table
Reference in a new issue