Kaynağa Gözat

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
version-14
Anand Doshi 11 yıl önce
ebeveyn
işleme
aa8331e6ea
10 değiştirilmiş dosya ile 169 ekleme ve 106 silme
  1. +6
    -5
      core/page/desktop/desktop.js
  2. +8
    -1
      public/js/wn/form/control.js
  3. +96
    -85
      public/js/wn/form/grid.js
  4. +1
    -1
      webnotes/db.py
  5. +1
    -1
      webnotes/memc.py
  6. +6
    -4
      webnotes/model/bean.py
  7. +4
    -4
      webnotes/utils/file_manager.py
  8. +16
    -4
      webnotes/webutils.py
  9. +30
    -0
      website/sitemap.py
  10. +1
    -1
      wnf.py

+ 6
- 5
core/page/desktop/desktop.js Dosyayı Görüntüle

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

});
}



+ 8
- 1
public/js/wn/form/control.js Dosyayı Görüntüle

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


+ 96
- 85
public/js/wn/form/grid.js Dosyayı Görüntüle

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


+ 1
- 1
webnotes/db.py Dosyayı Görüntüle

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


+ 1
- 1
webnotes/memc.py Dosyayı Görüntüle

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


+ 6
- 4
webnotes/model/bean.py Dosyayı Görüntüle

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


+ 4
- 4
webnotes/utils/file_manager.py Dosyayı Görüntüle

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


+ 16
- 4
webnotes/webutils.py Dosyayı Görüntüle

@@ -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
- 0
website/sitemap.py Dosyayı Görüntüle

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

+ 1
- 1
wnf.py Dosyayı Görüntüle

@@ -327,4 +327,4 @@ def search_replace_with_prompt(fpath, txt1, txt2, force=False):
print colored('Updated', 'green')
if __name__=="__main__":
main()
main()

Yükleniyor…
İptal
Kaydet