From 7f787135cf2be4626114d160dab8fd290df9d0e3 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 25 Jan 2012 18:47:34 +0530 Subject: [PATCH 1/5] minor fixes --- css/legacy/body.css | 12 ++++++++---- css/legacy/default.css | 17 +++++++++++------ css/legacy/dialog.css | 5 +++-- js/legacy/utils/dom.js | 32 +++++++++++++++++++------------- js/legacy/webpage/freeze_page.js | 2 -- js/legacy/webpage/page.js | 14 +++++++++----- js/legacy/wnf.compressed.js | 11 +++++------ py/webnotes/boot.py | 16 +++++----------- 8 files changed, 60 insertions(+), 49 deletions(-) diff --git a/css/legacy/body.css b/css/legacy/body.css index 7650104b50..4a28b29d1a 100644 --- a/css/legacy/body.css +++ b/css/legacy/body.css @@ -11,8 +11,6 @@ body { color: #000; } -input, select, button { font-size: 12px; font-family: Arial, Helvetica, Sans; } - h1, h2, h3, h4, h5 { font-family: Tahoma, Sans; font-weight: normal; @@ -28,12 +26,18 @@ pre { margin: 0px; padding: 0px; } button { margin: 2px; margin-left: 0px; } +label { + padding-top: 15px; + color: #404040; +} + select, input, textarea { border: 1px solid #AAA; -moz-border-radius: 4px; -webkit-border-radius: 4px; - font-size: 13px - padding: 2px; + font-size: 13px; + padding: 4px; + color: #222; } textarea { font-family: arial, helvetica, sans serif; height: 120px; width: 90%; overflow-x: auto; font-size: 12px; } diff --git a/css/legacy/default.css b/css/legacy/default.css index f8eb5b2816..0ccdff6004 100644 --- a/css/legacy/default.css +++ b/css/legacy/default.css @@ -15,8 +15,6 @@ body { color: #000; } -input, select, button { font-size: 12px; font-family: Arial, Helvetica, Sans; } - h1, h2, h3, h4, h5 { font-family: Tahoma, Sans; font-weight: normal; @@ -32,12 +30,18 @@ pre { margin: 0px; padding: 0px; } button { margin: 2px; margin-left: 0px; } +label { + padding-top: 15px; + color: #404040; +} + select, input, textarea { border: 1px solid #AAA; -moz-border-radius: 4px; -webkit-border-radius: 4px; - font-size: 13px - padding: 2px; + font-size: 13px; + padding: 4px; + color: #222; } textarea { font-family: arial, helvetica, sans serif; height: 120px; width: 90%; overflow-x: auto; font-size: 12px; } @@ -1182,11 +1186,12 @@ div.dialog_body { } div.dialog_back { - position: absolute; + position: fixed; display: none; top: 0px; left: 0px; - width: 100%; + bottom: 0px; + right: 0px; background-color: #EEE; opacity: 0.6; z-index: 50; diff --git a/css/legacy/dialog.css b/css/legacy/dialog.css index f417994bb4..9de683c435 100644 --- a/css/legacy/dialog.css +++ b/css/legacy/dialog.css @@ -31,11 +31,12 @@ div.dialog_body { } div.dialog_back { - position: absolute; + position: fixed; display: none; top: 0px; left: 0px; - width: 100%; + bottom: 0px; + right: 0px; background-color: #EEE; opacity: 0.6; z-index: 50; diff --git a/js/legacy/utils/dom.js b/js/legacy/utils/dom.js index f7b1454b3f..bccd3e4d69 100644 --- a/js/legacy/utils/dom.js +++ b/js/legacy/utils/dom.js @@ -106,20 +106,26 @@ $item_selected = function(ele) { } $item_pressed = function(ele) { $bg(ele,'#F90'); $fg(ele,'#FFF'); -} -$item_set_working = function(ele) { - if(ele.loading_img) { - $di(ele.loading_img) - } else { - ele.disabled = 1; - ele.loading_img = $a(ele.parentNode,'img','',{marginLeft:'4px',marginBottom:'-2px',display:'inline'}); - ele.loading_img.src = 'lib/images/ui/button-load.gif'; +}; + +(function($) { + $.fn.set_working = function() { + var ele = this.get(0); + if(ele.loading_img) { + $di(ele.loading_img) + } else { + ele.disabled = 1; + ele.loading_img = $a(ele.parentNode,'img','', + {marginLeft:'4px',marginBottom:'-2px',display:'inline'}); + ele.loading_img.src = 'lib/images/ui/button-load.gif'; + } } -} -$item_done_working = function(ele) { - ele.disabled = 0; - if(ele.loading_img) { $dh(ele.loading_img) }; -} + $.fn.done_working = function() { + var ele = this.get(0); + ele.disabled = 0; + if(ele.loading_img) { $dh(ele.loading_img) }; + } +})(jQuery); // set out of 100 function set_opacity(ele, ieop) { diff --git a/js/legacy/webpage/freeze_page.js b/js/legacy/webpage/freeze_page.js index d0eb6d579d..0a8db029bb 100644 --- a/js/legacy/webpage/freeze_page.js +++ b/js/legacy/webpage/freeze_page.js @@ -9,9 +9,7 @@ function freeze(msg, do_freeze) { dialog_back = $a($i('body_div'), 'div', 'dialog_back'); if(isIE) dialog_back.style['filter'] = 'alpha(opacity=60)'; } - $ds(dialog_back); - $y(dialog_back, {height: $(document).height() + 'px'}); fcount++; frozen = 1; diff --git a/js/legacy/webpage/page.js b/js/legacy/webpage/page.js index 836bc74aac..3eb811fd2d 100644 --- a/js/legacy/webpage/page.js +++ b/js/legacy/webpage/page.js @@ -42,12 +42,14 @@ function render_page(page_name, menuitem) { } var pdoc = locals['Page'][page_name]; - // style if(pdoc.style) set_style(pdoc.style) // stylesheet - if(pdoc.stylesheet) { set_style(locals.Stylesheet[pdoc.stylesheet].stylesheet); stylesheets.push(pdoc.stylesheet); } + if(pdoc.stylesheet) { + set_style(locals.Stylesheet[pdoc.stylesheet].stylesheet); + stylesheets.push(pdoc.stylesheet); + } // create page var p = new Page(page_name, pdoc._Page__content?pdoc._Page__content:pdoc.content); @@ -64,10 +66,12 @@ function render_page(page_name, menuitem) { // run onload try { - if(pscript['onload_'+page_name]) pscript['onload_'+page_name](); // onload - } catch(e) { submit_error(e); } + if(pscript['onload_'+page_name]) + pscript['onload_'+page_name](page_body.pages[page_name]); // onload + } catch(e) { + submit_error(e); + } - //setTimeout('page_body.pages[cur_page].set_page_height()', 100); return p; } diff --git a/js/legacy/wnf.compressed.js b/js/legacy/wnf.compressed.js index d62ff07556..9052eadd79 100644 --- a/js/legacy/wnf.compressed.js +++ b/js/legacy/wnf.compressed.js @@ -137,10 +137,8 @@ function addEvent(ev,fn){if(isIE){document.attachEvent('on'+ev,function(){fn(win $item_normal=function(ele){$y(ele,{padding:'6px 8px',cursor:'pointer',marginRight:'8px',whiteSpace:'nowrap',overflow:'hidden',borderBottom:'1px solid #DDD'});$bg(ele,'#FFF');$fg(ele,'#000');} $item_active=function(ele){$bg(ele,'#FE8');$fg(ele,'#000');} $item_selected=function(ele){$bg(ele,'#777');$fg(ele,'#FFF');} -$item_pressed=function(ele){$bg(ele,'#F90');$fg(ele,'#FFF');} -$item_set_working=function(ele){if(ele.loading_img){$di(ele.loading_img)}else{ele.disabled=1;ele.loading_img=$a(ele.parentNode,'img','',{marginLeft:'4px',marginBottom:'-2px',display:'inline'});ele.loading_img.src='lib/images/ui/button-load.gif';}} -$item_done_working=function(ele){ele.disabled=0;if(ele.loading_img){$dh(ele.loading_img)};} -function set_opacity(ele,ieop){var op=ieop/100;if(ele.filters){try{ele.filters.item("DXImageTransform.Microsoft.Alpha").opacity=ieop;}catch(e){ele.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';}}else{ele.style.opacity=op;}} +$item_pressed=function(ele){$bg(ele,'#F90');$fg(ele,'#FFF');};(function($){$.fn.set_working=function(){var ele=this.get(0);if(ele.loading_img){$di(ele.loading_img)}else{ele.disabled=1;ele.loading_img=$a(ele.parentNode,'img','',{marginLeft:'4px',marginBottom:'-2px',display:'inline'});ele.loading_img.src='lib/images/ui/button-load.gif';}} +$.fn.done_working=function(){var ele=this.get(0);ele.disabled=0;if(ele.loading_img){$dh(ele.loading_img)};}})(jQuery);function set_opacity(ele,ieop){var op=ieop/100;if(ele.filters){try{ele.filters.item("DXImageTransform.Microsoft.Alpha").opacity=ieop;}catch(e){ele.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';}}else{ele.style.opacity=op;}} function set_gradient(ele,from,to){var no_gradient=0;if(isIE)no_gradient=1;if(isFF&&ffversion<3.6)no_gradient=1;if(no_gradient){var rgb_from=get_rgb(from.substr(1));var rgb_to=get_rgb(to.substr(1));$y(ele,{backgroundColor:'#' +d2h(rgb_to[0]+(rgb_from[0]-rgb_to[0])/2) +d2h(rgb_to[1]+(rgb_from[1]-rgb_to[1])/2) @@ -750,7 +748,7 @@ function hide_loading(){pending_req--;if(!pending_req){$('body').css('cursor','d */ var fcount=0;var frozen=0;var dialog_message;var dialog_back;function freeze(msg,do_freeze){if(!dialog_back){dialog_back=$a($i('body_div'),'div','dialog_back');if(isIE)dialog_back.style['filter']='alpha(opacity=60)';} -$ds(dialog_back);$y(dialog_back,{height:$(document).height()+'px'});fcount++;frozen=1;} +$ds(dialog_back);fcount++;frozen=1;} function unfreeze(){if(dialog_message) $dh(dialog_message);if(!fcount)return;fcount--;if(!fcount){$dh(dialog_back);frozen=0;}} /* @@ -831,7 +829,8 @@ function render_page(page_name,menuitem){if(!page_name)return;if((!locals['Page' var pdoc=locals['Page'][page_name];if(pdoc.style)set_style(pdoc.style) if(pdoc.stylesheet){set_style(locals.Stylesheet[pdoc.stylesheet].stylesheet);stylesheets.push(pdoc.stylesheet);} var p=new Page(page_name,pdoc._Page__content?pdoc._Page__content:pdoc.content);var script=pdoc.__script?pdoc.__script:pdoc.script;p.doc=pdoc;if(script){eval(script);} -page_body.change_to(page_name);try{if(pscript['onload_'+page_name])pscript['onload_'+page_name]();}catch(e){submit_error(e);} +page_body.change_to(page_name);try{if(pscript['onload_'+page_name]) +pscript['onload_'+page_name](page_body.pages[page_name]);}catch(e){submit_error(e);} return p;} function refresh_page(page_name){var fn=function(r,rt){render_page(page_name)} $c('webnotes.widgets.page.getpage',{'name':page_name,stylesheets:JSON.stringify(stylesheets)},fn);} diff --git a/py/webnotes/boot.py b/py/webnotes/boot.py index 271f631a99..aeee5e3518 100644 --- a/py/webnotes/boot.py +++ b/py/webnotes/boot.py @@ -27,7 +27,7 @@ def get_bootinfo(): import webnotes.widgets.menus bootinfo['start_items'] = webnotes.widgets.menus.get_menu_items() bootinfo['dt_labels'] = get_dt_labels() - + # home page get_home_page(bootinfo, doclist) @@ -62,15 +62,9 @@ def get_home_page(bootinfo, doclist): doclist += webnotes.widgets.page.get(home_page) bootinfo['home_page'] = home_page or '' + + def get_dt_labels(): import webnotes - d = {} - try: - res = webnotes.conn.sql("select name, dt_label from `tabDocType Label`") - except: - return {} - - for r in res: - d[r[0]] = r[1] - - return d + res = webnotes.conn.sql("select name, dt_label from `tabDocType Label`") + return dict(res) From bc69801d94174281de26c46d9212e9c4993a0525 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 27 Jan 2012 09:38:50 +0530 Subject: [PATCH 2/5] Resolved default print format issue due to doclayer changes --- py/core/doctype/doclayer/doclayer.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/py/core/doctype/doclayer/doclayer.py b/py/core/doctype/doclayer/doclayer.py index a41391ae06..cdee62d9ee 100644 --- a/py/core/doctype/doclayer/doclayer.py +++ b/py/core/doctype/doclayer/doclayer.py @@ -38,10 +38,17 @@ class DocType: 'default', 'name' ] + self.set_true_doctype() + + def set_true_doctype(self): + """ + Sets a value of self.true_doctype as the actual doctype and not its label + """ if self.doc.doc_type: from webnotes.utils import get_label_doctype self.true_doctype = get_label_doctype(self.doc.doc_type) + else: self.true_doctype = None def get(self): @@ -51,6 +58,7 @@ class DocType: self.clear() if self.doc.doc_type: + if not self.true_doctype: self.set_true_doctype() from webnotes.model.doc import addchild for d in self.get_ref_doclist(): @@ -133,16 +141,6 @@ class DocType: self.set_properties(diff_list) - #webnotes.msgprint('End of Post') - #webnotes.msgprint('this doc') - #webnotes.msgprint([[d.name, d.idx, 'label' in d.fields and d.label or None] for d in this_doclist]) - #webnotes.msgprint('ref doc') - #webnotes.msgprint([[d.name, d.idx, 'label' in d.fields and d.label or None] for d in ref_doclist]) - #webnotes.msgprint('def doc') - #webnotes.msgprint([[d.name, d.idx, 'label' in d.fields and d.label or None] for d in dt_doclist]) - - #webnotes.msgprint([[d.fields['property'], d.fields['value'], d.fields['doc_name'], d.fields['select_item'], 'delete' in d.fields and d.fields['delete'] or None] for d in diff_list]) - def diff(self, new_dl, ref_dl, dt_dl): """ From cb7d2e0b80574d8c7440d5d7c7dd799ff55c839f Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 27 Jan 2012 12:16:03 +0530 Subject: [PATCH 3/5] redid file system naming, fixed bug that did not clear roles on 'clear cache' --- css/legacy/bootstrap-buttons.css | 1 + py/core/doctype/file_data/file_data.py | 14 ++++++------- py/webnotes/auth.py | 8 +++++--- py/webnotes/db.py | 15 ++++---------- py/webnotes/install_lib/db_init.py | 4 +++- py/webnotes/install_lib/install.py | 7 ++++++- py/webnotes/model/doc.py | 27 ++++++++++++++++++++++++-- py/webnotes/profile.py | 4 ++-- py/webnotes/session_cache.py | 23 ++++++++-------------- py/webnotes/utils/__init__.py | 7 ------- py/webnotes/widgets/auto_master.py | 3 ++- 11 files changed, 63 insertions(+), 50 deletions(-) diff --git a/css/legacy/bootstrap-buttons.css b/css/legacy/bootstrap-buttons.css index 1ac4454a33..ae1e263289 100644 --- a/css/legacy/bootstrap-buttons.css +++ b/css/legacy/bootstrap-buttons.css @@ -196,4 +196,5 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { -moz-opacity: 0.4; opacity: 0.4; cursor: pointer; + font-weight: bold; } diff --git a/py/core/doctype/file_data/file_data.py b/py/core/doctype/file_data/file_data.py index c3982276ac..f474287d56 100644 --- a/py/core/doctype/file_data/file_data.py +++ b/py/core/doctype/file_data/file_data.py @@ -28,13 +28,13 @@ class DocType(): other_list = webnotes.conn.sql("""select name from `tabFile Data` where name like '%s-%%.%s' order by name desc""" % (parts[0], '.'.join(parts[1:]))) - if other_list: - last_name = other_list[0][0] - - from webnotes.utils import cint - new_id = str(cint(last_name.split('.')[0].split('-')[-1]) + 1) - else: - new_id = '1' + if other_list: + last_name = other_list[0][0] + + from webnotes.utils import cint + new_id = str(cint(last_name.split('.')[0].split('-')[-1]) + 1) + else: + new_id = '1' # new name self.doc.file_name = parts[0] + '-' + new_id + '.' + '.'.join(parts[1:]) diff --git a/py/webnotes/auth.py b/py/webnotes/auth.py index 293632dd5b..01abd08491 100644 --- a/py/webnotes/auth.py +++ b/py/webnotes/auth.py @@ -65,7 +65,7 @@ class HTTPRequest: if webnotes.session['data'].get('profile'): webnotes.user.load_from_session(webnotes.session['data']['profile']) else: - webnotes.user.load_profile() + webnotes.user.load_profile() # set database login # ------------------ @@ -318,7 +318,8 @@ class Session: r=None try: - r = webnotes.conn.sql("select user, sessiondata, status from tabSessions where sid='%s'" % self.sid) + r = webnotes.conn.sql("""select user, sessiondata, status from + tabSessions where sid='%s'""" % self.sid) except Exception, e: if e.args[0]==1054: self.add_status_column() @@ -344,7 +345,8 @@ class Session: webnotes.response['session_status'] = 'Logged Out' raise Exception, 'Logged Out' else: - self.data = {'data':eval(r[1]), 'user':r[0], 'sid': self.sid} + self.data = {'data': (r[1] and eval(r[1]) or {}), + 'user':r[0], 'sid': self.sid} else: webnotes.login_manager.login_as_guest() self.start() diff --git a/py/webnotes/db.py b/py/webnotes/db.py index 2197b81a1b..25f02ea013 100644 --- a/py/webnotes/db.py +++ b/py/webnotes/db.py @@ -64,7 +64,8 @@ class Database: Connect to a database """ self._conn = MySQLdb.connect(user=self.user, host=self.host, passwd=self.password) - self._conn.set_character_set('utf8') + self._conn.converter[246]=float + self._conn.set_character_set('utf8') self._cursor = self._conn.cursor() def use(self, db_name): @@ -119,7 +120,7 @@ class Database: """ * Execute a `query`, with given `values` * returns as a dictionary if as_dict = 1 - * returns as a list of lists (with cleaned up dates and decimals) if as_list = 1 + * returns as a list of lists (with cleaned up dates) if as_list = 1 """ # in transaction validations self.check_transaction_status(query) @@ -168,8 +169,6 @@ class Database: # ====================================================================================== def convert_to_simple_type(self, v, formatted=0): - try: import decimal # for decimal Python 2.5 onwards - except: pass import datetime from webnotes.utils import formatdate, fmt_money @@ -193,12 +192,6 @@ class Database: # long elif type(v)==long: v=int(v) - - # decimal - try: - if type(v)==decimal.Decimal: - v=float(v) - except: pass # convert to strings... (if formatted) if formatted: @@ -309,7 +302,7 @@ class Database: defkey=%s and parent = "Control Panel" """, key): # update - self.sql("""update `tabDefaultValue` set defvalue="%s" + self.sql("""update `tabDefaultValue` set defvalue=%s where parent = "Control Panel" and defkey=%s""", (val, key)) else: from webnotes.model.doc import Document diff --git a/py/webnotes/install_lib/db_init.py b/py/webnotes/install_lib/db_init.py index ae76889c2f..944aafebd7 100644 --- a/py/webnotes/install_lib/db_init.py +++ b/py/webnotes/install_lib/db_init.py @@ -94,7 +94,9 @@ class DatabaseInstance: def create_doctypecache(self): self.conn.sql("DROP TABLE IF EXISTS `__DocTypeCache`") self.conn.sql("create table `__DocTypeCache` (name VARCHAR(120), modified DATETIME, content TEXT, server_code_compiled TEXT)") - + self.conn.sql(""" + create table `__SessionCache` (user VARCHAR(120), country VARCHAR(120), cache LONGTEXT) + """) diff --git a/py/webnotes/install_lib/install.py b/py/webnotes/install_lib/install.py index c22dcdcb6f..9f21dd128f 100755 --- a/py/webnotes/install_lib/install.py +++ b/py/webnotes/install_lib/install.py @@ -42,7 +42,12 @@ class Installer: import webnotes self.dbman.drop_table('__DocTypeCache') - webnotes.conn.sql("create table `__DocTypeCache` (name VARCHAR(120), modified DATETIME, content TEXT, server_code_compiled TEXT)") + webnotes.conn.sql("""create table `__DocTypeCache` + (name VARCHAR(120), modified DATETIME, content TEXT, server_code_compiled TEXT)""") + + self.dbman.drop_table('__SessionCache') + webnotes.conn.sq.("""create table `__SessionCache` + (user VARCHAR(120), country VARCHAR(120), cache LONGTEXT)""") # set the basic passwords webnotes.conn.begin() diff --git a/py/webnotes/model/doc.py b/py/webnotes/model/doc.py index 48f30c7da5..bc49f8e3d7 100755 --- a/py/webnotes/model/doc.py +++ b/py/webnotes/model/doc.py @@ -244,7 +244,7 @@ class Document: # Insert # --------------------------------------------------------------------------- - def _makenew(self, autoname, istable, case='', make_autoname=1): + def insert(self, autoname, istable, case='', make_autoname=1): # set name if make_autoname: self._set_name(autoname, istable) @@ -371,9 +371,14 @@ class Document: res = webnotes.model.meta.get_dt_values(self.doctype, 'autoname, issingle, istable, name_case', as_dict=1) res = res and res[0] or {} + # add missing parentinfo (if reqd) + if self.parent and not (self.parenttype and self.parentfield): + self.update_parentinfo() + # if required, make new if new or (not new and self.fields.get('__islocal')) and (not res.get('issingle')): - r = self._makenew(res.get('autoname'), res.get('istable'), res.get('name_case'), make_autoname) + r = self.insert(res.get('autoname'), res.get('istable'), res.get('name_case'), \ + make_autoname) if r: return r @@ -381,6 +386,24 @@ class Document: self._update_values(res.get('issingle'), check_links and self.make_link_list() or {}, ignore_fields) self._clear_temp_fields() + def update_parentinfo(self): + """update parent type and parent field, if not explicitly specified""" + + tmp = webnotes.conn.sql("""select parent, fieldname from tabDocField + where fieldtype='Table' and options=%s""", self.doctype) + + if len(tmp)==0: + raise Exception, 'Incomplete parent info in child table (%s, %s)' \ + % (self.doctype, self.fields.get('name', '[new]')) + + elif len(tmp)>1: + raise Exception, 'Ambiguous parent info (%s, %s)' \ + % (self.doctype, self.fields.get('name', '[new]')) + + else: + self.parenttype = tmp[0][0] + self.parentfield = tmp[0][1] + # check permissions # --------------------------------------------------------------------------- diff --git a/py/webnotes/profile.py b/py/webnotes/profile.py index 656dad3fee..fe467d7fed 100644 --- a/py/webnotes/profile.py +++ b/py/webnotes/profile.py @@ -15,7 +15,7 @@ class Profile: self.can_get_report = [] def _load_roles(self): - res = webnotes.conn.sql('select role from tabUserRole where parent = "%s"' % self.name) + res = webnotes.conn.sql('select role from tabUserRole where parent = %s', self.name) self.roles = [] for t in res: if t[0]: self.roles.append(t[0]) @@ -32,7 +32,7 @@ class Profile: """ if self.roles: return self.roles - + return self._load_roles() def get_allow_list(self, key): diff --git a/py/webnotes/session_cache.py b/py/webnotes/session_cache.py index ff29f77416..b020042f10 100644 --- a/py/webnotes/session_cache.py +++ b/py/webnotes/session_cache.py @@ -13,16 +13,14 @@ def clear(): def clear_cache(user=''): """clear cache""" - try: - if user: - webnotes.conn.sql("delete from __SessionCache where user=%s", user) - else: - webnotes.conn.sql("delete from __SessionCache") - except Exception, e: - if e.args[0]==1146: - make_cache_table() - else: - raise e + if user: + webnotes.conn.sql("delete from __SessionCache where user=%s", user) + webnotes.conn.sql("update tabSessions set sessiondata=NULL where user=%s", user) + else: + webnotes.conn.sql("delete from __SessionCache") + webnotes.conn.sql("update tabSessions set sessiondata=NULL") + + webnotes.session['data'] = {} def get(): """get session boot info""" @@ -70,8 +68,3 @@ def add_to_cache(sd, country): # make new webnotes.conn.sql("insert into `__SessionCache` (user, country, cache) VALUES (%s, %s, %s)", (webnotes.session['user'], country, str(sd))) - -def make_cache_table(): - webnotes.conn.commit() - webnotes.conn.sql("create table `__SessionCache` (user VARCHAR(120), country VARCHAR(120), cache LONGTEXT)") - webnotes.conn.begin() diff --git a/py/webnotes/utils/__init__.py b/py/webnotes/utils/__init__.py index 3a309cd524..b1932a1b94 100644 --- a/py/webnotes/utils/__init__.py +++ b/py/webnotes/utils/__init__.py @@ -327,9 +327,6 @@ def parse_val(v): """ import datetime - try: import decimal # for decimal Python 2.5 (?) - except: pass - if type(v)==datetime.date: v = str(v) elif type(v)==datetime.timedelta: @@ -338,10 +335,6 @@ def parse_val(v): v = str(v) elif type(v)==long: v=int(v) - try: - if type(v)==decimal.Decimal: v=float(v) - except: pass - return v # ============================================================================== diff --git a/py/webnotes/widgets/auto_master.py b/py/webnotes/widgets/auto_master.py index 9adea1b39c..bfda896ba5 100644 --- a/py/webnotes/widgets/auto_master.py +++ b/py/webnotes/widgets/auto_master.py @@ -26,7 +26,8 @@ def get_master_fields(dt): webnotes.session['data']['auto_masters'] = {} if webnotes.session['data']['auto_masters'].get(dt, None)==None: - fl = webnotes.conn.sql("select fieldname from tabDocField where fieldtype='Data' and options='Suggest' and parent=%s", dt) + fl = webnotes.conn.sql("select fieldname from tabDocField where fieldtype='Data' \ + and options='Suggest' and parent=%s", dt) webnotes.session['data']['auto_masters'][dt] = fl return webnotes.session['data']['auto_masters'][dt] From becfd56e07194bbc9a5efa1d9dec3baf2d4e4a87 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 27 Jan 2012 15:56:35 +0530 Subject: [PATCH 4/5] cleaned up pages and minor style fixes, removed submit_error in js --- css/legacy/body.css | 9 ++++- css/legacy/default.css | 10 +++++- js/legacy/form.compressed.js | 8 ++--- js/legacy/webpage/error_console.js | 9 ----- js/legacy/webpage/loaders.js | 2 +- js/legacy/webpage/page.js | 10 +++--- js/legacy/widgets/form/fields.js | 1 - js/legacy/widgets/form/form.js | 4 +-- js/legacy/widgets/form/form_fields.js | 1 - js/legacy/wn/widgets/listing.js | 24 +++++++++++--- js/legacy/wnf.compressed.js | 16 ++++----- js/wn/ui/toolbar.min.js | 2 +- js/wn/ui/toolbar/selector_dialog.js | 9 +++-- py/core/doctype/page/page.py | 2 +- py/core/doctype/page/page.txt | 47 +++++++++++++++++++++++---- py/webnotes/model/doc.py | 3 ++ py/webnotes/session_cache.py | 7 ++-- 17 files changed, 112 insertions(+), 52 deletions(-) diff --git a/css/legacy/body.css b/css/legacy/body.css index 4a28b29d1a..60e0f6a990 100644 --- a/css/legacy/body.css +++ b/css/legacy/body.css @@ -40,7 +40,13 @@ select, input, textarea { color: #222; } -textarea { font-family: arial, helvetica, sans serif; height: 120px; width: 90%; overflow-x: auto; font-size: 12px; } +textarea { + font-family: inherit; + height: 120px; + width: 90%; + font-size: 12px; + white-space: normal; +} table { padding: 0px; border-collapse: 'collapse'} @@ -63,6 +69,7 @@ div#body_div { position: relative; display: none; margin-top: 56px; + padding-right: 7px; } div.no_script { diff --git a/css/legacy/default.css b/css/legacy/default.css index 0ccdff6004..3fa1a27e6f 100644 --- a/css/legacy/default.css +++ b/css/legacy/default.css @@ -44,7 +44,13 @@ select, input, textarea { color: #222; } -textarea { font-family: arial, helvetica, sans serif; height: 120px; width: 90%; overflow-x: auto; font-size: 12px; } +textarea { + font-family: inherit; + height: 120px; + width: 90%; + font-size: 12px; + white-space: normal; +} table { padding: 0px; border-collapse: 'collapse'} @@ -67,6 +73,7 @@ div#body_div { position: relative; display: none; margin-top: 56px; + padding-right: 7px; } div.no_script { @@ -1829,4 +1836,5 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { -moz-opacity: 0.4; opacity: 0.4; cursor: pointer; + font-weight: bold; } diff --git a/js/legacy/form.compressed.js b/js/legacy/form.compressed.js index 7cce7cce76..b568794ca7 100644 --- a/js/legacy/form.compressed.js +++ b/js/legacy/form.compressed.js @@ -176,8 +176,8 @@ _f.Frm.prototype.runscript=function(scriptname,callingfield,onrefresh){var me=th onrefresh(r,rtxt);me.refresh_fields();me.refresh_dependency();if(callingfield)callingfield.input.done_working();});}} _f.Frm.prototype.runclientscript=function(caller,cdt,cdn){var _dt=this.parent_doctype?this.parent_doctype:this.doctype;var _dn=this.parent_docname?this.parent_docname:this.docname;var doc=get_local(_dt,_dn);if(!cdt)cdt=this.doctype;if(!cdn)cdn=this.docname;var ret=null;try{if(this.cscript[caller]) ret=this.cscript[caller](doc,cdt,cdn);if(this.cscript['custom_'+caller]) -ret+=this.cscript['custom_'+caller](doc,cdt,cdn);}catch(e){submit_error(e);} -if(caller&&caller.toLowerCase()=='setup'){var doctype=get_local('DocType',this.doctype);var cs=doctype.__js||(doctype.client_script_core+doctype.client_script);if(cs){try{var tmp=eval(cs);}catch(e){submit_error(e);}} +ret+=this.cscript['custom_'+caller](doc,cdt,cdn);}catch(e){console.log(e);} +if(caller&&caller.toLowerCase()=='setup'){var doctype=get_local('DocType',this.doctype);var cs=doctype.__js||(doctype.client_script_core+doctype.client_script);if(cs){try{var tmp=eval(cs);}catch(e){console.log(e);}} if(doctype.__css)set_style(doctype.__css) if(doctype.client_string){this.cstring={};var elist=doctype.client_string.split('---');for(var i=1;i%(owner)s \ ×',d[i]))} $(this.body).find('a.close').click(function(){$c('webnotes.widgets.form.assign_to.remove',{doctype:me.doctype,name:me.name,assign_to:$(this).attr('data-owner')},function(r,rt){me.render(r.message);});return false;});},add:function(){var me=this;if(!me.dialog){me.dialog=new wn.widgets.Dialog({title:'Add to To Do',width:350,fields:[{fieldtype:'Link',fieldname:'assign_to',options:'Profile',label:'Assign To',description:'Add to To Do List of',reqd:true},{fieldtype:'Data',fieldname:'description',label:'Comment','default':'Assigned by '+user},{fieldtype:'Date',fieldname:'date',label:'Complete By'},{fieldtype:'Select',fieldname:'priority',label:'Priority',options:'Low\nMedium\nHigh','default':'Medium'},{fieldtype:'Button',label:'Add',fieldname:'add_btn'}]});me.dialog.fields_dict.add_btn.input.onclick=function(){var assign_to=me.dialog.fields_dict.assign_to.get_value();if(assign_to){$c('webnotes.widgets.form.assign_to.add',{doctype:me.doctype,name:me.name,assign_to:assign_to,description:me.dialog.fields_dict.description.get_value(),priority:me.dialog.fields_dict.priority.get_value(),date:me.dialog.fields_dict.date.get_value()},function(r,rt){me.render(r.message);});}}} -me.dialog.clear();me.dialog.show();}}); +me.dialog.clear();me.dialog.show();}}); \ No newline at end of file diff --git a/js/legacy/webpage/error_console.js b/js/legacy/webpage/error_console.js index 0fe312275e..a3c1ee1daa 100644 --- a/js/legacy/webpage/error_console.js +++ b/js/legacy/webpage/error_console.js @@ -7,15 +7,6 @@ function errprint(t) { err_list[err_list.length] = ('
'+t+'
'); } -function submit_error(e) { - if(isIE) { - var t = 'Explorer: ' + e + '\n' + e.description; - } else { - var t = 'Mozilla: ' + e.toString() + '\n' + e.message + '\nLine Number:' + e.lineNumber;// + '\nStack:' + e.stack; - } - errprint(e + '\nLine Number:' + e.lineNumber + '\nStack:' + e.stack); -} - function setup_err_console() { err_console = new Dialog(640, 480, 'Error Console') err_console.make_body([ diff --git a/js/legacy/webpage/loaders.js b/js/legacy/webpage/loaders.js index d0ff2090fd..01334b7318 100644 --- a/js/legacy/webpage/loaders.js +++ b/js/legacy/webpage/loaders.js @@ -212,7 +212,7 @@ function loadpage(page_name, call_back, no_history) { try { if(pscript['refresh_'+page_name]) pscript['refresh_'+page_name](); // onload } catch(e) { - submit_error(e); + console.log(e); } } diff --git a/js/legacy/webpage/page.js b/js/legacy/webpage/page.js index 3eb811fd2d..fde2a2f756 100644 --- a/js/legacy/webpage/page.js +++ b/js/legacy/webpage/page.js @@ -9,12 +9,14 @@ function Page(page_name, content) { this.onshow = function() { // default set_title - set_title(me.doc.page_title ? me.doc.page_title : me.name); + set_title(me.doc.title ? me.doc.title : me.name); // onshow try { - if(pscript['onshow_'+me.name]) pscript['onshow_'+me.name](); // onload - } catch(e) { submit_error(e); } + if(pscript['onshow_'+me.name]) pscript['onshow_'+me.name](me.wrapper); // onload + } catch(e) { + console.log(e); + } // clear cur_frm cur_frm = null; @@ -69,7 +71,7 @@ function render_page(page_name, menuitem) { if(pscript['onload_'+page_name]) pscript['onload_'+page_name](page_body.pages[page_name]); // onload } catch(e) { - submit_error(e); + console.log(e); } return p; diff --git a/js/legacy/widgets/form/fields.js b/js/legacy/widgets/form/fields.js index bf2910b9cb..74195efec8 100644 --- a/js/legacy/widgets/form/fields.js +++ b/js/legacy/widgets/form/fields.js @@ -853,7 +853,6 @@ TextField.prototype.make_input = function() { return; // do nothing, text dialog will take over this.input = $a(this.input_area, 'textarea'); - this.input.wrap = 'off'; if(this.df.fieldtype=='Small Text') this.input.style.height = "80px"; this.input.set_input = function(v) { diff --git a/js/legacy/widgets/form/form.js b/js/legacy/widgets/form/form.js index 374324c59e..7629c74b2a 100644 --- a/js/legacy/widgets/form/form.js +++ b/js/legacy/widgets/form/form.js @@ -979,7 +979,7 @@ _f.Frm.prototype.runclientscript = function(caller, cdt, cdn) { if(this.cscript['custom_'+caller]) ret += this.cscript['custom_'+caller](doc, cdt, cdn); } catch(e) { - submit_error(e); + console.log(e); } if(caller && caller.toLowerCase()=='setup') { @@ -992,7 +992,7 @@ _f.Frm.prototype.runclientscript = function(caller, cdt, cdn) { try { var tmp = eval(cs); } catch(e) { - submit_error(e); + console.log(e); } } diff --git a/js/legacy/widgets/form/form_fields.js b/js/legacy/widgets/form/form_fields.js index be5e14e932..1c5aa1360f 100644 --- a/js/legacy/widgets/form/form_fields.js +++ b/js/legacy/widgets/form/form_fields.js @@ -335,7 +335,6 @@ _f.CodeField.prototype.make_input = function() { this.input = $a(this.input_area, 'textarea','code_text',{fontSize:'12px'}); this.myid = wn.dom.set_unique_id(this.input); - this.input.setAttribute('wrap', 'off'); this.input.set_input = function(v) { if(me.editor) { me.editor.setContent(v); diff --git a/js/legacy/wn/widgets/listing.js b/js/legacy/wn/widgets/listing.js index 22802f958e..86392c3c1f 100644 --- a/js/legacy/wn/widgets/listing.js +++ b/js/legacy/wn/widgets/listing.js @@ -2,6 +2,19 @@ // uses FieldGroup for rendering filters // removed rarely used functionality // +// opts: +// parent +// query or get_query +// query_max +// no_result_message ("No result") +// page_length (20) +// filters ([{docfield}, ..]) +// hide_refresh (False) +// new_doctype +// [function] render_row(parent, data) +// [function] onrun +// no_loading (no ajax indicator) + wn.widgets.Listing = function(opts) { this.opts = opts; @@ -63,7 +76,7 @@ wn.widgets.Listing = function(opts) { // make more button // that shows more results when they are displayed this.make_more_button = function() { - this.more_btn = $btn(this.more_button_area, 'Show more results...', + this.more_btn = $btn(this.more_button_area, 'More...', function() { me.more_btn.set_working(); me.run(function() { @@ -137,14 +150,13 @@ wn.widgets.Listing = function(opts) { this.start = 0; // load query - this.query = this.opts.get_query(); + this.query = this.opts.get_query ? this.opts.get_query() : this.opts.query; this.add_limits(); - args={ query_max: this.query_max ? this.query_max : '' } + args={ query_max: this.query_max || this.opts.query_max || '' } args.simple_query = this.query; - if(this.opts.as_dict) args.as_dict = 1; - if(this.opts.formatted) args.formatted = 1; + args.as_dict = 1; // show loading if(this.loading_img) $di(this.loading_img); @@ -152,6 +164,8 @@ wn.widgets.Listing = function(opts) { function(r, rt) { me.make_results(r, rt) }, null, this.opts.no_loading); } + this.refresh = this.run; + this.add_limits = function() { this.query += ' LIMIT ' + this.start + ',' + (this.page_length+1); } diff --git a/js/legacy/wnf.compressed.js b/js/legacy/wnf.compressed.js index 9052eadd79..14b2310a7f 100644 --- a/js/legacy/wnf.compressed.js +++ b/js/legacy/wnf.compressed.js @@ -490,7 +490,7 @@ this.make_filters=function(){if(this.opts.filters){$ds(this.filters_area);this.f this.make_toolbar=function(){if(!this.opts.hide_refresh){this.ref_img=$a(this.toolbar_area,'span','link_type',{color:'#888'},'[refresh]');this.ref_img.onclick=function(){me.run();} this.loading_img=$a(this.toolbar_area,'img','lib/images/ui/button-load.gif',{display:'none',marginLeft:'3px',marginBottom:'-2px'});} if(this.opts.new_doctype){this.new_btn=$btn(this.toolbar_area,'New '+get_doctype_label(this.opts.new_doctype),function(){newdoc(me.opts.new_doctype,me.opts.new_doc_onload,me.opts.new_doc_indialog,me.opts.new_doc_onsave);},{marginLeft:'7px'});}} -this.make_more_button=function(){this.more_btn=$btn(this.more_button_area,'Show more results...',function(){me.more_btn.set_working();me.run(function(){me.more_btn.done_working();},1);},{fontSize:'14px'},0,1);$y(this.more_btn.loading_img,{marginBottom:'0px'});} +this.make_more_button=function(){this.more_btn=$btn(this.more_button_area,'More...',function(){me.more_btn.set_working();me.run(function(){me.more_btn.done_working();},1);},{fontSize:'14px'},0,1);$y(this.more_btn.loading_img,{marginBottom:'0px'});} this.clear=function(){this.results_area.innerHTML='';this.table=null;$ds(this.results_area);$dh(this.no_results_area);} this.make_results=function(r,rt){if(this.start==0)this.clear();$dh(this.more_button_area);if(this.loading_img)$dh(this.loading_img) if(r.values&&r.values.length){this.values=r.values;var m=Math.min(r.values.length,this.page_length);for(var i=0;i'+t+'');} -function submit_error(e){if(isIE){var t='Explorer: '+e+'\n'+e.description;}else{var t='Mozilla: '+e.toString()+'\n'+e.message+'\nLine Number:'+e.lineNumber;} -errprint(e+'\nLine Number:'+e.lineNumber+'\nStack:'+e.stack);} function setup_err_console(){err_console=new Dialog(640,480,'Error Console') err_console.make_body([['HTML','Error List'],['Button','Clear'],['HTML','Error Report']]);var span=$a(err_console.widgets['Error Report'],'span','link_type');span.innerHTML='Send Error Report';span.onclick=function(){msg=prompt('How / where did you get the error [optional]') var call_back=function(r,rt){err_console.hide();msgprint("Error Report Sent")} @@ -797,7 +795,7 @@ var newdoc=new_doc;var pscript={};var cur_page;function loadpage(page_name,call_ page_name=home_page;var fn=function(r,rt){page_body.set_status('Done');if(page_body.pages[page_name]){var p=page_body.pages[page_name] page_body.change_to(page_name);}else{var p=render_page(page_name);if(!p)return;} cur_page=page_name;if(call_back)call_back();scroll(0,0);pscript.update_page_history(page_name,no_history) -try{if(pscript['refresh_'+page_name])pscript['refresh_'+page_name]();}catch(e){submit_error(e);}} +try{if(pscript['refresh_'+page_name])pscript['refresh_'+page_name]();}catch(e){console.log(e);}} if(get_local('Page',page_name)||page_body.pages[page_name]) fn();else{args=get_url_dict();args.name=page_name;$c('webnotes.widgets.page.getpage',args,fn);}} pscript.update_page_history=function(page_name,no_history){var arg=null;var t=null;if(window.location.hash){var t=nav_obj.get_page(window.location.hash)}else if(get_url_arg('page')){var t=nav_obj.get_page(get_url_arg('page'))} @@ -819,7 +817,7 @@ function upload_callback(id,fid){uploaders[id].callback(fid);} * lib/js/legacy/webpage/page.js */ -var pages=[];var stylesheets=[];function Page(page_name,content){var me=this;this.name=page_name;this.onshow=function(){set_title(me.doc.page_title?me.doc.page_title:me.name);try{if(pscript['onshow_'+me.name])pscript['onshow_'+me.name]();}catch(e){submit_error(e);} +var pages=[];var stylesheets=[];function Page(page_name,content){var me=this;this.name=page_name;this.onshow=function(){set_title(me.doc.title?me.doc.title:me.name);try{if(pscript['onshow_'+me.name])pscript['onshow_'+me.name](me.wrapper);}catch(e){console.log(e);} cur_frm=null;} this.wrapper=page_body.add_page(page_name,this.onshow);this.cont=this.wrapper if(content) @@ -830,7 +828,7 @@ var pdoc=locals['Page'][page_name];if(pdoc.style)set_style(pdoc.style) if(pdoc.stylesheet){set_style(locals.Stylesheet[pdoc.stylesheet].stylesheet);stylesheets.push(pdoc.stylesheet);} var p=new Page(page_name,pdoc._Page__content?pdoc._Page__content:pdoc.content);var script=pdoc.__script?pdoc.__script:pdoc.script;p.doc=pdoc;if(script){eval(script);} page_body.change_to(page_name);try{if(pscript['onload_'+page_name]) -pscript['onload_'+page_name](page_body.pages[page_name]);}catch(e){submit_error(e);} +pscript['onload_'+page_name](page_body.pages[page_name]);}catch(e){console.log(e);} return p;} function refresh_page(page_name){var fn=function(r,rt){render_page(page_name)} $c('webnotes.widgets.page.getpage',{'name':page_name,stylesheets:JSON.stringify(stylesheets)},fn);} diff --git a/js/wn/ui/toolbar.min.js b/js/wn/ui/toolbar.min.js index a647e4a4a5..e854d6b075 100644 --- a/js/wn/ui/toolbar.min.js +++ b/js/wn/ui/toolbar.min.js @@ -63,7 +63,7 @@ */ wn.ui.toolbar.SelectorDialog=Class.extend({init:function(opts){this.opts=opts;try{this.make_dialog();}catch(e){console.log(e);} -this.bind_events();},make_dialog:function(){this.dialog=new wn.widgets.Dialog({title:this.opts.title,width:300,fields:[{fieldtype:'Select',fieldname:'doctype',options:'Select...',label:'Select Type'},{fieldtype:'Button',label:'Go',fieldname:'go'}]});},bind_events:function(){var me=this;$(this.dialog.fields_dict.go.input).click(function(){me.dialog.hide();me.opts.execute(me.dialog.fields_dict.doctype.get_value());});$(this.dialog.fields_dict.doctype.input).change(function(){me.dialog.hide();me.opts.execute($(this).val());});},show:function(){this.dialog.show();this.dialog.fields_dict.doctype.input.focus();return false;},set_values:function(lst){for(var i=0;iTo add images, use $image(filename)
Where file name is the ID or Name of the File record' + 'fieldtype': 'Section Break' }, # DocField @@ -157,5 +168,27 @@ 'options': 'Page Role', 'reqd': 0, 'search_index': 0 + }, + + # DocField + { + 'doctype': 'DocField', + 'fieldtype': 'Section Break' + }, + + # DocField + { + 'doctype': 'DocField', + 'fieldname': 'script', + 'fieldtype': 'Code', + 'label': 'Script (JS)' + }, + + # DocField + { + 'doctype': 'DocField', + 'fieldname': 'style', + 'fieldtype': 'Code', + 'label': 'Style (CSS)' } ] \ No newline at end of file diff --git a/py/webnotes/model/doc.py b/py/webnotes/model/doc.py index bc49f8e3d7..954714d656 100755 --- a/py/webnotes/model/doc.py +++ b/py/webnotes/model/doc.py @@ -82,6 +82,9 @@ class Document: if (doctype and name): self._loadfromdb(doctype, name) + else: + if not fielddata: + self.fields['__islocal'] = 1 def __nonzero__(self): return True diff --git a/py/webnotes/session_cache.py b/py/webnotes/session_cache.py index b020042f10..8381fae213 100644 --- a/py/webnotes/session_cache.py +++ b/py/webnotes/session_cache.py @@ -19,9 +19,10 @@ def clear_cache(user=''): else: webnotes.conn.sql("delete from __SessionCache") webnotes.conn.sql("update tabSessions set sessiondata=NULL") - - webnotes.session['data'] = {} - + + if webnotes.session: + webnotes.session['data'] = {} + def get(): """get session boot info""" import webnotes.defs From 6b9cf61fcfe5bae88506db94265c520fc2ea62da Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 27 Jan 2012 17:58:38 +0530 Subject: [PATCH 5/5] cleaned up handler --- css/legacy/default.css | 3 +- css/legacy/forms.css | 3 +- js/legacy/utils/datetime.js | 74 ++++++------ js/legacy/utils/handler.js | 221 ++++------------------------------- js/legacy/webpage/history.js | 2 +- js/legacy/wnf.compressed.js | 48 +++----- js/lib/prettydate.js | 39 +++++++ py/webnotes/model/doc.py | 2 + 8 files changed, 123 insertions(+), 269 deletions(-) create mode 100644 js/lib/prettydate.js diff --git a/css/legacy/default.css b/css/legacy/default.css index 3fa1a27e6f..34a5125977 100644 --- a/css/legacy/default.css +++ b/css/legacy/default.css @@ -441,10 +441,9 @@ div.time_field select{ .datainputcell { padding: 2px 0px; } -.field_description { +.field_description, .help { margin: 3px 0px 11px 0px; color: #888; - font-size: 12px; font-style: italic; } diff --git a/css/legacy/forms.css b/css/legacy/forms.css index b99410aee6..a073ffe598 100644 --- a/css/legacy/forms.css +++ b/css/legacy/forms.css @@ -142,10 +142,9 @@ div.time_field select{ .datainputcell { padding: 2px 0px; } -.field_description { +.field_description, .help { margin: 3px 0px 11px 0px; color: #888; - font-size: 12px; font-style: italic; } diff --git a/js/legacy/utils/datetime.js b/js/legacy/utils/datetime.js index 89f20d27ac..ecea72c147 100644 --- a/js/legacy/utils/datetime.js +++ b/js/legacy/utils/datetime.js @@ -220,47 +220,51 @@ wn.datetime.time_to_hhmm = function(hh,mm,am) { return hh + ':' + mm; } -// when +/* + * JavaScript Pretty Date + * Copyright (c) 2011 John Resig (ejohn.org) + * Licensed under the MIT and GPL licenses. + */ -wn.datetime.comment_when = function(dt, only_days) { - - if(only_days) { - var cdate = dateutil.str_to_obj(dt.split(' ')[0]); - var diff = (new Date() - cdate) / 1000; - - if(diff < 604800) { - var t = Math.floor(diff/86400); - if(t==0) return "Today"; - if(t==1) return "Yesterday"; - return t + " days ago" - } else { - return cdate.getDate() + " " + month_list[cdate.getMonth()] + " " + cdate.getFullYear(); - } - } else { - var cdate = dateutil.str_to_obj(dt); - var diff = (new Date() - cdate) / 1000; - - if(diff < 60) { - return "Few moments ago" - } else if(diff < 3600) { - var t = Math.floor(diff/60); - return t + " minute" + (t==1?"":"s") + " ago" - } else if(diff < 86400) { - var t = Math.floor(diff/3600); - return t + " hour" + (t==1?"":"s") + " ago" - } else if(diff < 604800) { - var t = Math.floor(diff/86400); - return t + " day" + (t==1?"":"s") + " ago" - } else { - return cdate.getDate() + " " + month_list[cdate.getMonth()] + " " + cdate.getFullYear(); - } - } +// Takes an ISO time and returns a string representing how +// long ago the date represents. +function prettyDate(time){ + if(!time) return '' + var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, "")), + diff = (((new Date()).getTime() - date.getTime()) / 1000), + day_diff = Math.floor(diff / 86400); + + if ( isNaN(day_diff) || day_diff < 0 ) + return ''; + + return day_diff == 0 && ( + diff < 60 && "just now" || + diff < 120 && "1 minute ago" || + diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" || + diff < 7200 && "1 hour ago" || + diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") || + day_diff == 1 && "Yesterday" || + day_diff < 7 && day_diff + " days ago" || + day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" || + day_diff < 365 && Math.ceil( day_diff / 30) + " months ago" || + "more than " + Math.floor( day_diff / 365 ) + " year(s) ago"; } +// If jQuery is included in the page, adds a jQuery plugin to handle it as well +if ( typeof jQuery != "undefined" ) + jQuery.fn.prettyDate = function(){ + return this.each(function(){ + var date = prettyDate(this.title); + if ( date ) + jQuery(this).text( date ); + }); + }; + +var comment_when = prettyDate; + // globals (deprecate) var date = dateutil = wn.datetime; var get_today = wn.datetime.get_today -var comment_when = wn.datetime.comment_when; var time_to_ampm = wn.datetime.time_to_ampm; var time_to_hhmm = wn.datetime.time_to_hhmm; var only_date = wn.datetime.only_date; diff --git a/js/legacy/utils/handler.js b/js/legacy/utils/handler.js index 0fb94789b6..31217e738c 100644 --- a/js/legacy/utils/handler.js +++ b/js/legacy/utils/handler.js @@ -33,11 +33,13 @@ function newHttpReq() { } // call execute serverside request -function $c(command, args, fn, on_timeout, no_spinner, freeze_msg) { +function $c(command, args, fn, on_timeout, no_spinner, freeze_msg, btn) { var req=newHttpReq(); ret_fn=function() { if (checkResponse(req, on_timeout, no_spinner, freeze_msg)) { - if(!no_spinner)hide_loading(); // Loaded + if(btn)$(btn).done_working(); + if(!no_spinner) + hide_loading(); // Loaded var rtxt = req.responseText; @@ -61,6 +63,7 @@ function $c(command, args, fn, on_timeout, no_spinner, freeze_msg) { if(fn)fn(r, rtxt); } } + if(btn) $(btn).set_working(); req.onreadystatechange=ret_fn; req.open("POST",outUrl,true); req.setRequestHeader("ENCTYPE", "multipart/form-data"); @@ -103,22 +106,37 @@ function validate_session(r,rt) { } // For calling an object -function $c_obj(doclist, method, arg, call_back, no_spinner, freeze_msg) { +function $c_obj(doclist, method, arg, call_back, no_spinner, freeze_msg, btn) { var args = { 'method':method, 'arg': (typeof arg=='string' ? arg : JSON.stringify(arg)) } if(typeof doclist=='string') args.doctype = doclist; else args.docs = compress_doclist(doclist) // single - $c('runserverobj',args, call_back, null, no_spinner, freeze_msg); + $c('runserverobj',args, call_back, null, no_spinner, freeze_msg, btn); } // For call a page metho -function $c_page(module, page, method, arg, call_back, no_spinner, freeze_msg) { +function $c_page(module, page, method, arg, call_back, no_spinner, freeze_msg, btn) { if(arg && !arg.substr) arg = JSON.stringify(arg); - $c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg}, call_back, null, no_spinner, freeze_msg); + $c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg}, + call_back, null, no_spinner, freeze_msg, btn); } +// generic server call (call page, object) +wn.call = function(args) { + if(args.module && args.page) { + $c_page(args.module, args.page, args.method, args.args, args.callback, + args.no_spinner, false, args.btn); + } else if(args.docs) { + $c_obj(args.doc, args.method, args.args, args.callback, args.no_spinner, + false, args.btn); + } else { + $c(args.method, args.args, args.callback, args.no_spinner, false, args.btn); + } +} + + // For calling an for output as csv function $c_obj_csv(doclist, method, arg) { // single @@ -138,12 +156,6 @@ function $c_obj_csv(doclist, method, arg) { open_url_post(outUrl, args); } - -// For loading a matplotlib Plot -function $c_graph(img, control_dt, method, arg) { - img.src = outUrl + '?' + makeArgString({cmd:'get_graph', dt:control_dt, method:method, arg:arg}); -} - function my_eval(co) { var w = window; @@ -159,93 +171,6 @@ function my_eval(co) { } } - -// For loading javascript file on demand using AJAX -function $c_js(fn, callback) { - var req=newHttpReq(); - - ret_fn=function() { - if (checkResponse(req, function() { }, 1, null)) { - if(req.responseText.substr(0,9)=='Not Found') { - alert(req.responseText); - return; - } - hide_loading(); - my_eval(req.responseText); - callback(); - } - } - - req.onreadystatechange=ret_fn; - req.open("POST",'cgi-bin/getjsfile.cgi',true); - req.setRequestHeader("ENCTYPE", "multipart/form-data"); - req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); - req.send(makeArgString({filename:fn})); - set_loading(); -} - -var load_queue = {}; -var currently_loading = {}; -var widgets = {}; -var single_widgets = {}; - -// load a widget on demand -// -------------------------------------------------------------- -function new_widget(widget, callback, single_type) { - var namespace = ''; - var widget_name = widget; - - if(widget.search(/\./) != -1) { - namespace = widget.split('.')[0]; - widget_name = widget.split('.')[1]; - } - - var widget_loaded = function() { - currently_loading[widget] = 0; - for(var i in load_queue[widget]) { - // callback - load_queue[widget][i](create_widget()); - } - - // clear the queue - load_queue[widget] = []; - } - - var create_widget = function() { - if(single_type && single_widgets[widget_name]) - return null; - - if(namespace) - var w = new window[namespace][widget_name](); - else - var w = new window[widget_name](); - - // add to singles - if(single_type) - single_widgets[widget_name] = w; - - return w; - } - - if(namespace ? window[namespace][widget_name] : window[widget_name]) { - // loaded? - callback(create_widget()); - } else { - - // loading in process - if(!load_queue[widget]) load_queue[widget] = []; - load_queue[widget].push(callback); - - // load only if not currently loading - if(!currently_loading[widget]) { - $c_js(widget_files[widget], widget_loaded); - } - - // flag it as loading - currently_loading[widget] = 1; - } -} - function makeArgString(dict) { var varList = []; @@ -273,100 +198,4 @@ function open_url_post(URL, PARAMS, new_window) { document.body.appendChild(temp); temp.submit(); return temp; -} - - -// Resume sessions -var resume_dialog = null; - -function resume_session() { - if(!resume_dialog) { - var d = new Dialog(400,200,'Session Expired'); - d.make_body([ - ['Password','password','Re-enter your password to resume the session'], ['Button','Go']]); - - // check password - d.widgets['Go'].onclick = function() { - resume_dialog.widgets['Go'].set_working(); - var callback = function(r, rt) { - resume_dialog.widgets['Go'].done_working(); - if(r.message == 'Logged In') { - - // okay - resume_dialog.allow_close=1; - resume_dialog.hide(); - setTimeout('resume_dialog.allow_close=0',100); - } else { - - // wrong password - msgprint('Wrong Password, try again'); - resume_dialog.wrong_count++; - if(resume_dialog.wrong_count > 2) logout(); - } - } - $c('resume_session',{pwd:resume_dialog.widgets['password'].value},callback) - } - d.onhide = function() { - if(!resume_dialog.allow_close) logout(); - } - resume_dialog = d; - } - resume_dialog.wrong_count = 0; - resume_dialog.show(); -} - -/** -* require is used for on demand loading of JavaScript -* -* require r1 // 2008.02.05 // jQuery 1.2.2 -* -* // basic usage (just like .accordion) -* $.require("comp1.js"); -* - -* @param jsFiles string array or string holding the js file names to load -* @param params object holding parameter like browserType, callback, cache -* @return The jQuery object -* @author Manish Shanker -*/ - -(function($){ - $.require = function(jsFiles, params) { - - var params = params || {}; - var bType = params.browserType===false?false:true; - - if (!bType){ - return $; - } - - var cBack = params.callBack || function(){}; - var eCache = params.cache===false?false:true; - - if (!$.require.loadedLib) $.require.loadedLib = {}; - - if ( !$.scriptPath ) { - var path = $('script').attr('src'); - $.scriptPath = path.replace(/\w+\.js$/, ''); - } - if (typeof jsFiles === "string") { - jsFiles = new Array(jsFiles); - } - for (var n=0; n< jsFiles.length; n++) { - if (!$.require.loadedLib[jsFiles[n]]) { - $.ajax({ - type: "GET", - url: $.scriptPath + jsFiles[n], - success: cBack, - dataType: "script", - cache: eCache, - async: false - }); - $.require.loadedLib[jsFiles[n]] = true; - } - } - //console.dir($.require.loadedLib); - - return $; - }; -})(jQuery); +} \ No newline at end of file diff --git a/js/legacy/webpage/history.js b/js/legacy/webpage/history.js index f6514db5d7..fce818c74c 100644 --- a/js/legacy/webpage/history.js +++ b/js/legacy/webpage/history.js @@ -144,7 +144,7 @@ function historyChange(newLocation) { if(t[0]=='Form') { _history_current = newLocation; - if(docname.substr(0, 3)=='New') { + if(docname.substr(0, 3)=='New' && !(locals[t[1]] && locals[t[1]][docname])) { newdoc(t[1]); } else { loaddoc(t[1], docname); diff --git a/js/legacy/wnf.compressed.js b/js/legacy/wnf.compressed.js index 14b2310a7f..0a4a58f7aa 100644 --- a/js/legacy/wnf.compressed.js +++ b/js/legacy/wnf.compressed.js @@ -117,9 +117,13 @@ if(t.length!=2){show_alert('[set_time] Incorect time format');return;} if(cint(t[0])==0)var ret=['12',t[1],'AM'];else if(cint(t[0])<12)var ret=[cint(t[0])+'',t[1],'AM'];else if(cint(t[0])==12)var ret=['12',t[1],'PM'];else var ret=[(cint(t[0])-12)+'',t[1],'PM'];return ret;} wn.datetime.time_to_hhmm=function(hh,mm,am){if(am=='AM'&&hh=='12'){hh='00';}else if(am=='PM'&&hh!='12'){hh=cint(hh)+12;} return hh+':'+mm;} -wn.datetime.comment_when=function(dt,only_days){if(only_days){var cdate=dateutil.str_to_obj(dt.split(' ')[0]);var diff=(new Date()-cdate)/1000;if(diff<604800){var t=Math.floor(diff/86400);if(t==0)return"Today";if(t==1)return"Yesterday";return t+" days ago"}else{return cdate.getDate()+" "+month_list[cdate.getMonth()]+" "+cdate.getFullYear();}}else{var cdate=dateutil.str_to_obj(dt);var diff=(new Date()-cdate)/1000;if(diff<60){return"Few moments ago"}else if(diff<3600){var t=Math.floor(diff/60);return t+" minute"+(t==1?"":"s")+" ago"}else if(diff<86400){var t=Math.floor(diff/3600);return t+" hour"+(t==1?"":"s")+" ago"}else if(diff<604800){var t=Math.floor(diff/86400);return t+" day"+(t==1?"":"s")+" ago"}else{return cdate.getDate()+" "+month_list[cdate.getMonth()]+" "+cdate.getFullYear();}}} -var date=dateutil=wn.datetime;var get_today=wn.datetime.get_today -var comment_when=wn.datetime.comment_when;var time_to_ampm=wn.datetime.time_to_ampm;var time_to_hhmm=wn.datetime.time_to_hhmm;var only_date=wn.datetime.only_date; +function prettyDate(time){if(!time)return'' +var date=new Date((time||"").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/,"")),diff=(((new Date()).getTime()-date.getTime())/1000),day_diff=Math.floor(diff/86400);if(isNaN(day_diff)||day_diff<0) +return'';return day_diff==0&&(diff<60&&"just now"||diff<120&&"1 minute ago"||diff<3600&&Math.floor(diff/60)+" minutes ago"||diff<7200&&"1 hour ago"||diff<86400&&Math.floor(diff/3600)+" hours ago")||day_diff==1&&"Yesterday"||day_diff<7&&day_diff+" days ago"||day_diff<31&&Math.ceil(day_diff/7)+" weeks ago"||day_diff<365&&Math.ceil(day_diff/30)+" months ago"||"more than "+Math.floor(day_diff/365)+" year(s) ago";} +if(typeof jQuery!="undefined") +jQuery.fn.prettyDate=function(){return this.each(function(){var date=prettyDate(this.title);if(date) +jQuery(this).text(date);});};var comment_when=prettyDate;var date=dateutil=wn.datetime;var get_today=wn.datetime.get_today +var time_to_ampm=wn.datetime.time_to_ampm;var time_to_hhmm=wn.datetime.time_to_hhmm;var only_date=wn.datetime.only_date; /* * lib/js/legacy/utils/dom.js */ @@ -240,54 +244,32 @@ unfreeze();return false;}} var pending_req=0;function newHttpReq(){if(!isIE) var r=new XMLHttpRequest();else if(window.ActiveXObject) var r=new ActiveXObject("Microsoft.XMLHTTP");return r;} -function $c(command,args,fn,on_timeout,no_spinner,freeze_msg){var req=newHttpReq();ret_fn=function(){if(checkResponse(req,on_timeout,no_spinner,freeze_msg)){if(!no_spinner)hide_loading();var rtxt=req.responseText;try{var r=JSON.parse(rtxt);}catch(e){alert('Handler Exception:'+rtxt);return;} +function $c(command,args,fn,on_timeout,no_spinner,freeze_msg,btn){var req=newHttpReq();ret_fn=function(){if(checkResponse(req,on_timeout,no_spinner,freeze_msg)){if(btn)$(btn).done_working();if(!no_spinner) +hide_loading();var rtxt=req.responseText;try{var r=JSON.parse(rtxt);}catch(e){alert('Handler Exception:'+rtxt);return;} if(freeze_msg)unfreeze();if(!validate_session(r,rtxt))return;if(r.exc){errprint(r.exc);console.log(r.exc);};if(r.server_messages){msgprint(r.server_messages);};if(r.docs){LocalDB.sync(r.docs);} saveAllowed=true;if(fn)fn(r,rtxt);}} -req.onreadystatechange=ret_fn;req.open("POST",outUrl,true);req.setRequestHeader("ENCTYPE","multipart/form-data");req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");args['cmd']=command;req.send(makeArgString(args));if(!no_spinner)set_loading();if(freeze_msg)freeze(freeze_msg,1);} +if(btn)$(btn).set_working();req.onreadystatechange=ret_fn;req.open("POST",outUrl,true);req.setRequestHeader("ENCTYPE","multipart/form-data");req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");args['cmd']=command;req.send(makeArgString(args));if(!no_spinner)set_loading();if(freeze_msg)freeze(freeze_msg,1);} function validate_session(r,rt){if(r.message=='Logged In'){start_sid=get_cookie('sid');return true;} if(start_sid&&start_sid!=get_cookie('sid')&&user&&user!='Guest'){page_body.set_session_changed();return;} if(r.exc&&r.session_status=='Session Expired'){resume_session();return;} if(r.exc&&r.session_status=='Logged Out'){msgprint('You have been logged out');setTimeout('redirect_to_login()',3000);return;} if(r.exc&&r.exc_type&&r.exc_type=='PermissionError'){loadpage('_home');} return true;} -function $c_obj(doclist,method,arg,call_back,no_spinner,freeze_msg){var args={'method':method,'arg':(typeof arg=='string'?arg:JSON.stringify(arg))} +function $c_obj(doclist,method,arg,call_back,no_spinner,freeze_msg,btn){var args={'method':method,'arg':(typeof arg=='string'?arg:JSON.stringify(arg))} if(typeof doclist=='string')args.doctype=doclist;else args.docs=compress_doclist(doclist) -$c('runserverobj',args,call_back,null,no_spinner,freeze_msg);} -function $c_page(module,page,method,arg,call_back,no_spinner,freeze_msg){if(arg&&!arg.substr)arg=JSON.stringify(arg);$c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg},call_back,null,no_spinner,freeze_msg);} +$c('runserverobj',args,call_back,null,no_spinner,freeze_msg,btn);} +function $c_page(module,page,method,arg,call_back,no_spinner,freeze_msg,btn){if(arg&&!arg.substr)arg=JSON.stringify(arg);$c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg},call_back,null,no_spinner,freeze_msg,btn);} +wn.call=function(args){if(args.module&&args.page){$c_page(args.module,args.page,args.method,args.args,args.callback,args.no_spinner,false,args.btn);}else if(args.docs){$c_obj(args.doc,args.method,args.args,args.callback,args.no_spinner,false,args.btn);}else{$c(args.method,args.args,args.callback,args.no_spinner,false,args.btn);}} function $c_obj_csv(doclist,method,arg){var args={} args.cmd='runserverobj';args.as_csv=1;args.method=method;args.arg=arg;if(doclist.substr) args.doctype=doclist;else args.docs=compress_doclist(doclist);open_url_post(outUrl,args);} -function $c_graph(img,control_dt,method,arg){img.src=outUrl+'?'+makeArgString({cmd:'get_graph',dt:control_dt,method:method,arg:arg});} function my_eval(co){var w=window;if(!w.execScript){if(/Gecko/.test(navigator.userAgent)){eval(co,w);}else{eval.call(w,co);}}else{w.execScript(co);}} -function $c_js(fn,callback){var req=newHttpReq();ret_fn=function(){if(checkResponse(req,function(){},1,null)){if(req.responseText.substr(0,9)=='Not Found'){alert(req.responseText);return;} -hide_loading();my_eval(req.responseText);callback();}} -req.onreadystatechange=ret_fn;req.open("POST",'cgi-bin/getjsfile.cgi',true);req.setRequestHeader("ENCTYPE","multipart/form-data");req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");req.send(makeArgString({filename:fn}));set_loading();} -var load_queue={};var currently_loading={};var widgets={};var single_widgets={};function new_widget(widget,callback,single_type){var namespace='';var widget_name=widget;if(widget.search(/\./)!=-1){namespace=widget.split('.')[0];widget_name=widget.split('.')[1];} -var widget_loaded=function(){currently_loading[widget]=0;for(var i in load_queue[widget]){load_queue[widget][i](create_widget());} -load_queue[widget]=[];} -var create_widget=function(){if(single_type&&single_widgets[widget_name]) -return null;if(namespace) -var w=new window[namespace][widget_name]();else -var w=new window[widget_name]();if(single_type) -single_widgets[widget_name]=w;return w;} -if(namespace?window[namespace][widget_name]:window[widget_name]){callback(create_widget());}else{if(!load_queue[widget])load_queue[widget]=[];load_queue[widget].push(callback);if(!currently_loading[widget]){$c_js(widget_files[widget],widget_loaded);} -currently_loading[widget]=1;}} function makeArgString(dict){var varList=[];for(key in dict){varList[varList.length]=key+'='+encodeURIComponent(dict[key]);} return varList.join('&');} function open_url_post(URL,PARAMS,new_window){var temp=document.createElement("form");temp.action=URL;temp.method="POST";temp.style.display="none";if(new_window){temp.target='_blank';} for(var x in PARAMS){var opt=document.createElement("textarea");opt.name=x;opt.value=PARAMS[x];temp.appendChild(opt);} document.body.appendChild(temp);temp.submit();return temp;} -var resume_dialog=null;function resume_session(){if(!resume_dialog){var d=new Dialog(400,200,'Session Expired');d.make_body([['Password','password','Re-enter your password to resume the session'],['Button','Go']]);d.widgets['Go'].onclick=function(){resume_dialog.widgets['Go'].set_working();var callback=function(r,rt){resume_dialog.widgets['Go'].done_working();if(r.message=='Logged In'){resume_dialog.allow_close=1;resume_dialog.hide();setTimeout('resume_dialog.allow_close=0',100);}else{msgprint('Wrong Password, try again');resume_dialog.wrong_count++;if(resume_dialog.wrong_count>2)logout();}} -$c('resume_session',{pwd:resume_dialog.widgets['password'].value},callback)} -d.onhide=function(){if(!resume_dialog.allow_close)logout();} -resume_dialog=d;} -resume_dialog.wrong_count=0;resume_dialog.show();} -(function($){$.require=function(jsFiles,params){var params=params||{};var bType=params.browserType===false?false:true;if(!bType){return $;} -var cBack=params.callBack||function(){};var eCache=params.cache===false?false:true;if(!$.require.loadedLib)$.require.loadedLib={};if(!$.scriptPath){var path=$('script').attr('src');$.scriptPath=path.replace(/\w+\.js$/,'');} -if(typeof jsFiles==="string"){jsFiles=new Array(jsFiles);} -for(var n=0;n