Merge github.com:web2py/web2py
This commit is contained in:
commit
5f1566db49
16 files changed
+211
-125
No files matched your search
@@ -1 +1 @@
|
|||||||
Version 2.2.1 (2012-11-05 12:39:09) stable
|
Version 2.2.1 (2012-11-15 14:34:13) stable
|
||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
/*! jQuery v@1.8.0 jquery.com | jquery.org/license */
|
/*! jQuery v1.8.2 jquery.com | jquery.org/license */
|
||||||
(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bX(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bV.length;while(e--){b=bV[e]+c;if(b in a)return b}return d}function bY(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function bZ(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bY(c)&&(e[f]=p._data(c,"olddisplay",cb(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b$(a,b,c){var d=bO.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function b_(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bU[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bU[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bU[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bU[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bU[e]+"Width"))||0));return f}function ca(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bP.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+b_(a,b,c||(f?"border":"content"),e)+"px"}function cb(a){if(bR[a])return bR[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cz(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cu;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cz(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cz(a,c,d,e,"*",g)),h}function cA(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((fLine truncated
|
(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]Line truncated
|
||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
/*! jQuery v@1.8.0 jquery.com | jquery.org/license */
|
/*! jQuery v1.8.2 jquery.com | jquery.org/license */
|
||||||
(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bX(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bV.length;while(e--){b=bV[e]+c;if(b in a)return b}return d}function bY(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function bZ(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bY(c)&&(e[f]=p._data(c,"olddisplay",cb(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b$(a,b,c){var d=bO.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function b_(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bU[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bU[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bU[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bU[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bU[e]+"Width"))||0));return f}function ca(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bP.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+b_(a,b,c||(f?"border":"content"),e)+"px"}function cb(a){if(bR[a])return bR[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cz(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cu;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cz(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cz(a,c,d,e,"*",g)),h}function cA(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((fLine truncated
|
(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]Line truncated
|
||||||
@@ -1,15 +1 @@
|
|||||||
{{
|
{{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}}
|
||||||
###
|
|
||||||
# response._vars contains the dictionary returned by thecontroller action
|
|
||||||
###
|
|
||||||
try:
|
|
||||||
from gluon.serializers import xml
|
|
||||||
response.write(xml(response._vars), escape=False)
|
|
||||||
response.headers['Content-Type'] = 'text/xml'
|
|
||||||
except (TypeError, ValueError):
|
|
||||||
raise HTTP(405, 'XML serialization error')
|
|
||||||
except ImportError:
|
|
||||||
raise HTTP(405, 'XML not available')
|
|
||||||
except:
|
|
||||||
raise HTTP(405, 'XML error')
|
|
||||||
}}
|
|
||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
/*! jQuery v@1.8.0 jquery.com | jquery.org/license */
|
/*! jQuery v1.8.2 jquery.com | jquery.org/license */
|
||||||
(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bX(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bV.length;while(e--){b=bV[e]+c;if(b in a)return b}return d}function bY(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function bZ(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bY(c)&&(e[f]=p._data(c,"olddisplay",cb(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b$(a,b,c){var d=bO.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function b_(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bU[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bU[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bU[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bU[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bU[e]+"Width"))||0));return f}function ca(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bP.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+b_(a,b,c||(f?"border":"content"),e)+"px"}function cb(a){if(bR[a])return bR[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cz(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cu;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cz(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cz(a,c,d,e,"*",g)),h}function cA(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((fLine truncated
|
(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]Line truncated
|
||||||
@@ -1 +1 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>{{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}}
|
{{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}}
|
||||||
+1
-1
@@ -453,7 +453,7 @@ def compile_views(folder):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
path = pjoin(folder, 'views')
|
path = pjoin(folder, 'views')
|
||||||
for file in listdir(path, '^[\w/\-]+(\.\w+)+$'):
|
for file in listdir(path, '^[\w/\-]+(\.\w+)*$'):
|
||||||
try:
|
try:
|
||||||
data = parse_template(file, path)
|
data = parse_template(file, path)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
|
|||||||
@@ -150,6 +150,8 @@ class WebClient(object):
|
|||||||
match = self.session_regex.match(cookie)
|
match = self.session_regex.match(cookie)
|
||||||
if match:
|
if match:
|
||||||
name = match.group('name')
|
name = match.group('name')
|
||||||
|
print repr(cookie)
|
||||||
|
print name, self.sessions.get(name,None), value
|
||||||
if name in self.sessions and self.sessions[name] != value:
|
if name in self.sessions and self.sessions[name] != value:
|
||||||
raise RuntimeError('Broken sessions %s' % name)
|
raise RuntimeError('Broken sessions %s' % name)
|
||||||
self.sessions[name] = value
|
self.sessions[name] = value
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ INVALID_MODULES = set(('', 'gluon', 'applications', 'custom_import'))
|
|||||||
|
|
||||||
|
|
||||||
def custom_import_install():
|
def custom_import_install():
|
||||||
if __builtin__.__import__ != custom_importer:
|
if __builtin__.__import__ == NATIVE_IMPORTER:
|
||||||
INVALID_MODULES.update(sys.modules.keys())
|
INVALID_MODULES.update(sys.modules.keys())
|
||||||
__builtin__.__import__ = custom_importer
|
__builtin__.__import__ = custom_importer
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -1199,7 +1199,7 @@ class BaseAdapter(ConnectionPool):
|
|||||||
def BELONGS(self, first, second):
|
def BELONGS(self, first, second):
|
||||||
if isinstance(second, str):
|
if isinstance(second, str):
|
||||||
return '(%s IN (%s))' % (self.expand(first), second[:-1])
|
return '(%s IN (%s))' % (self.expand(first), second[:-1])
|
||||||
elif second==[] or second==():
|
elif not second:
|
||||||
return '(1=0)'
|
return '(1=0)'
|
||||||
items = ','.join(self.expand(item, first.type) for item in second)
|
items = ','.join(self.expand(item, first.type) for item in second)
|
||||||
return '(%s IN (%s))' % (self.expand(first), items)
|
return '(%s IN (%s))' % (self.expand(first), items)
|
||||||
@@ -4588,7 +4588,7 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
|||||||
processor = attributes.get('processor',self.parse)
|
processor = attributes.get('processor',self.parse)
|
||||||
return processor(rows,fields,colnames,False)
|
return processor(rows,fields,colnames,False)
|
||||||
|
|
||||||
def count(self,query,distinct=None):
|
def count(self,query,distinct=None,limit=None):
|
||||||
if distinct:
|
if distinct:
|
||||||
raise RuntimeError("COUNT DISTINCT not supported")
|
raise RuntimeError("COUNT DISTINCT not supported")
|
||||||
(items, tablename, fields) = self.select_raw(query)
|
(items, tablename, fields) = self.select_raw(query)
|
||||||
@@ -4596,7 +4596,7 @@ class GoogleDatastoreAdapter(NoSQLAdapter):
|
|||||||
try:
|
try:
|
||||||
return len(items)
|
return len(items)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
return items.count(limit=None)
|
return items.count(limit=limit)
|
||||||
|
|
||||||
def delete(self,tablename, query):
|
def delete(self,tablename, query):
|
||||||
"""
|
"""
|
||||||
@@ -8987,7 +8987,7 @@ class LazySet(object):
|
|||||||
def _count(self,distinct=None):
|
def _count(self,distinct=None):
|
||||||
return self._getset()._count(distinct)
|
return self._getset()._count(distinct)
|
||||||
def _select(self, *fields, **attributes):
|
def _select(self, *fields, **attributes):
|
||||||
return self._getset()._select(*field,**attributes)
|
return self._getset()._select(*fields,**attributes)
|
||||||
def _delete(self):
|
def _delete(self):
|
||||||
return self._getset()._delete()
|
return self._getset()._delete()
|
||||||
def _update(self, **update_fields):
|
def _update(self, **update_fields):
|
||||||
|
|||||||
+2
-1
@@ -554,7 +554,8 @@ class Session(Storage):
|
|||||||
else:
|
else:
|
||||||
response.session_id = None
|
response.session_id = None
|
||||||
# do not try load the data from file is these was data in cookie
|
# do not try load the data from file is these was data in cookie
|
||||||
if response.session_id and not session_cookie_data:
|
if response.session_id and not session_cookie_data and \
|
||||||
|
os.path.exists(response.session_filename):
|
||||||
try:
|
try:
|
||||||
response.session_file = \
|
response.session_file = \
|
||||||
open(response.session_filename, 'rb+')
|
open(response.session_filename, 'rb+')
|
||||||
|
|||||||
+26
-20
@@ -129,6 +129,11 @@ def xmlescape(data, quote=True):
|
|||||||
data = cgi.escape(data, quote).replace("'", "'")
|
data = cgi.escape(data, quote).replace("'", "'")
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
def call_as_list(f,*a,**b):
|
||||||
|
if not isinstance(f, (list,tuple)):
|
||||||
|
f = [f]
|
||||||
|
for item in f:
|
||||||
|
item(*a,**b)
|
||||||
|
|
||||||
def truncate_string(text, length, dots='...'):
|
def truncate_string(text, length, dots='...'):
|
||||||
text = text.decode('utf-8')
|
text = text.decode('utf-8')
|
||||||
@@ -1247,19 +1252,20 @@ class HTML(DIV):
|
|||||||
lang = 'en'
|
lang = 'en'
|
||||||
self.attributes['_lang'] = lang
|
self.attributes['_lang'] = lang
|
||||||
doctype = self['doctype']
|
doctype = self['doctype']
|
||||||
if doctype:
|
if doctype is None:
|
||||||
if doctype == 'strict':
|
|
||||||
doctype = self.strict
|
|
||||||
elif doctype == 'transitional':
|
|
||||||
doctype = self.transitional
|
|
||||||
elif doctype == 'frameset':
|
|
||||||
doctype = self.frameset
|
|
||||||
elif doctype == 'html5':
|
|
||||||
doctype = self.html5
|
|
||||||
else:
|
|
||||||
doctype = '%s\n' % doctype
|
|
||||||
else:
|
|
||||||
doctype = self.transitional
|
doctype = self.transitional
|
||||||
|
elif doctype == 'strict':
|
||||||
|
doctype = self.strict
|
||||||
|
elif doctype == 'transitional':
|
||||||
|
doctype = self.transitional
|
||||||
|
elif doctype == 'frameset':
|
||||||
|
doctype = self.frameset
|
||||||
|
elif doctype == 'html5':
|
||||||
|
doctype = self.html5
|
||||||
|
elif doctype == '':
|
||||||
|
doctype = ''
|
||||||
|
else:
|
||||||
|
doctype = '%s\n' % doctype
|
||||||
(fa, co) = self._xml()
|
(fa, co) = self._xml()
|
||||||
return '%s<%s%s>%s</%s>' % (doctype, self.tag, fa, co, self.tag)
|
return '%s<%s%s>%s</%s>' % (doctype, self.tag, fa, co, self.tag)
|
||||||
|
|
||||||
@@ -1757,7 +1763,7 @@ class INPUT(DIV):
|
|||||||
t = self['_type'] = 'text'
|
t = self['_type'] = 'text'
|
||||||
t = t.lower()
|
t = t.lower()
|
||||||
value = self['value']
|
value = self['value']
|
||||||
if self['_value'] is None:
|
if self['_value'] is None or isinstance(self['_value'],cgi.FieldStorage):
|
||||||
_value = None
|
_value = None
|
||||||
else:
|
else:
|
||||||
_value = str(self['_value'])
|
_value = str(self['_value'])
|
||||||
@@ -1997,20 +2003,20 @@ class FORM(DIV):
|
|||||||
onsuccess = onvalidation.get('onsuccess', None)
|
onsuccess = onvalidation.get('onsuccess', None)
|
||||||
onfailure = onvalidation.get('onfailure', None)
|
onfailure = onvalidation.get('onfailure', None)
|
||||||
onchange = onvalidation.get('onchange', None)
|
onchange = onvalidation.get('onchange', None)
|
||||||
|
if [k for k in onvalidation if not k in (
|
||||||
|
'onsuccess','onfailure','onchange')]:
|
||||||
|
raise RuntimeError('Invalid key in onvalidate dict')
|
||||||
if onsuccess and status:
|
if onsuccess and status:
|
||||||
onsuccess(self)
|
call_as_list(onsuccess,self)
|
||||||
if onfailure and request_vars and not status:
|
if onfailure and request_vars and not status:
|
||||||
onfailure(self)
|
call_as_list(onfailure,self)
|
||||||
status = len(self.errors) == 0
|
status = len(self.errors) == 0
|
||||||
if changed:
|
if changed:
|
||||||
if onchange and self.record_changed and \
|
if onchange and self.record_changed and \
|
||||||
self.detect_record_change:
|
self.detect_record_change:
|
||||||
onchange(self)
|
call_as_list(onchange,self)
|
||||||
elif status:
|
elif status:
|
||||||
if isinstance(onvalidation, (list, tuple)):
|
call_as_list(onvalidation, self)
|
||||||
[f(self) for f in onvalidation]
|
|
||||||
else:
|
|
||||||
onvalidation(self)
|
|
||||||
if self.errors:
|
if self.errors:
|
||||||
status = False
|
status = False
|
||||||
if not session is None:
|
if not session is None:
|
||||||
|
|||||||
+4
-4
@@ -951,10 +951,10 @@ class Scheduler(MetaScheduler):
|
|||||||
orderby = ~st.id | ~sr.id
|
orderby = ~st.id | ~sr.id
|
||||||
row = self.db(q).select(
|
row = self.db(q).select(
|
||||||
*fields,
|
*fields,
|
||||||
orderby=orderby,
|
**dict(orderby=orderby,
|
||||||
left=left,
|
left=left,
|
||||||
limitby=(0, 1)
|
limitby=(0, 1))
|
||||||
).first()
|
).first()
|
||||||
if output:
|
if output:
|
||||||
row.result = row.scheduler_run.result and \
|
row.result = row.scheduler_run.result and \
|
||||||
loads(row.scheduler_run.result,
|
loads(row.scheduler_run.result,
|
||||||
|
|||||||
+133
-48
@@ -1675,6 +1675,8 @@ class SQLFORM(FORM):
|
|||||||
createargs={},
|
createargs={},
|
||||||
editargs={},
|
editargs={},
|
||||||
viewargs={},
|
viewargs={},
|
||||||
|
buttons_placement = 'right',
|
||||||
|
links_placement = 'right'
|
||||||
):
|
):
|
||||||
|
|
||||||
# jQuery UI ThemeRoller classes (empty if ui is disabled)
|
# jQuery UI ThemeRoller classes (empty if ui is disabled)
|
||||||
@@ -1729,12 +1731,18 @@ class SQLFORM(FORM):
|
|||||||
|
|
||||||
def url(**b):
|
def url(**b):
|
||||||
b['args'] = args + b.get('args', [])
|
b['args'] = args + b.get('args', [])
|
||||||
|
localvars = request.vars.copy()
|
||||||
|
localvars.update(b.get('vars', {}))
|
||||||
|
b['vars'] = localvars
|
||||||
b['hash_vars'] = False
|
b['hash_vars'] = False
|
||||||
b['user_signature'] = user_signature
|
b['user_signature'] = user_signature
|
||||||
return URL(**b)
|
return URL(**b)
|
||||||
|
|
||||||
def url2(**b):
|
def url2(**b):
|
||||||
b['args'] = request.args + b.get('args', [])
|
b['args'] = request.args + b.get('args', [])
|
||||||
|
localvars = request.vars.copy()
|
||||||
|
localvars.update(b.get('vars', {}))
|
||||||
|
b['vars'] = localvars
|
||||||
b['hash_vars'] = False
|
b['hash_vars'] = False
|
||||||
b['user_signature'] = user_signature
|
b['user_signature'] = user_signature
|
||||||
return URL(**b)
|
return URL(**b)
|
||||||
@@ -1824,6 +1832,14 @@ class SQLFORM(FORM):
|
|||||||
buttons.append(link(record))
|
buttons.append(link(record))
|
||||||
return buttons
|
return buttons
|
||||||
|
|
||||||
|
def linsert(lst, i, x):
|
||||||
|
"""
|
||||||
|
a = [1,2]
|
||||||
|
linsert(a, 1, [0,3])
|
||||||
|
a = [1, 0, 3, 2]
|
||||||
|
"""
|
||||||
|
lst[i:i] = x
|
||||||
|
|
||||||
formfooter = DIV(
|
formfooter = DIV(
|
||||||
_class='form_footer row_buttons %(header)s %(cornerbottom)s' % ui)
|
_class='form_footer row_buttons %(header)s %(cornerbottom)s' % ui)
|
||||||
|
|
||||||
@@ -1903,6 +1919,9 @@ class SQLFORM(FORM):
|
|||||||
(ExporterTSV, 'TSV (Excel compatible, hidden cols)'),
|
(ExporterTSV, 'TSV (Excel compatible, hidden cols)'),
|
||||||
tsv=(ExporterTSV, 'TSV (Excel compatible)'))
|
tsv=(ExporterTSV, 'TSV (Excel compatible)'))
|
||||||
if not exportclasses is None:
|
if not exportclasses is None:
|
||||||
|
"""
|
||||||
|
remember: allow to set exportclasses=dict(csv=False) to disable the csv format
|
||||||
|
"""
|
||||||
exportManager.update(exportclasses)
|
exportManager.update(exportclasses)
|
||||||
|
|
||||||
export_type = request.vars._export_type
|
export_type = request.vars._export_type
|
||||||
@@ -1919,23 +1938,22 @@ class SQLFORM(FORM):
|
|||||||
if sign == '~':
|
if sign == '~':
|
||||||
orderby = ~orderby
|
orderby = ~orderby
|
||||||
|
|
||||||
table_fields = [f for f in fields if f._tablename in tablenames]
|
expcolumns = columns
|
||||||
if export_type in ('csv_with_hidden_cols', 'tsv_with_hidden_cols'):
|
if export_type.endswith('with_hidden_cols'):
|
||||||
|
expcolumns = [f for f in fields if f._tablename in tablenames]
|
||||||
|
if export_type in exportManager and exportManager[export_type]:
|
||||||
if request.vars.keywords:
|
if request.vars.keywords:
|
||||||
try:
|
try:
|
||||||
dbset = dbset(SQLFORM.build_query(
|
dbset = dbset(SQLFORM.build_query(
|
||||||
fields, request.vars.get('keywords', '')))
|
fields, request.vars.get('keywords', '')))
|
||||||
rows = dbset.select(cacheable=True)
|
rows = dbset.select(cacheable=True, *expcolumns)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
response.flash = T('Internal Error')
|
response.flash = T('Internal Error')
|
||||||
rows = []
|
rows = []
|
||||||
else:
|
else:
|
||||||
rows = dbset.select(cacheable=True)
|
rows = dbset.select(left=left, orderby=orderby,
|
||||||
else:
|
cacheable=True, *expcolumns)
|
||||||
rows = dbset.select(left=left, orderby=orderby,
|
|
||||||
cacheable=True, *columns)
|
|
||||||
|
|
||||||
if export_type in exportManager:
|
|
||||||
value = exportManager[export_type]
|
value = exportManager[export_type]
|
||||||
clazz = value[0] if hasattr(value, '__getitem__') else value
|
clazz = value[0] if hasattr(value, '__getitem__') else value
|
||||||
oExp = clazz(rows)
|
oExp = clazz(rows)
|
||||||
@@ -2000,6 +2018,9 @@ class SQLFORM(FORM):
|
|||||||
c = 'count(*)'
|
c = 'count(*)'
|
||||||
nrows = dbset.select(c, left=left, cacheable=True,
|
nrows = dbset.select(c, left=left, cacheable=True,
|
||||||
groupby=groupby).first()[c]
|
groupby=groupby).first()[c]
|
||||||
|
elif dbset._db._adapter.dbengine=='google:datastore':
|
||||||
|
#if we don't set a limit, this can timeout for a large table
|
||||||
|
nrows = dbset.db._adapter.count(dbset.query, limit=1000)
|
||||||
else:
|
else:
|
||||||
nrows = dbset.count()
|
nrows = dbset.count()
|
||||||
except:
|
except:
|
||||||
@@ -2017,9 +2038,9 @@ class SQLFORM(FORM):
|
|||||||
else:
|
else:
|
||||||
orderby = (order[:1] == '~' and ~sort_field) or sort_field
|
orderby = (order[:1] == '~' and ~sort_field) or sort_field
|
||||||
|
|
||||||
head = TR(_class=ui.get('header'))
|
headcols = []
|
||||||
if selectable:
|
if selectable:
|
||||||
head.append(TH(_class=ui.get('default')))
|
headcols.append(TH(_class=ui.get('default')))
|
||||||
for field in fields:
|
for field in fields:
|
||||||
if columns and not str(field) in columns:
|
if columns and not str(field) in columns:
|
||||||
continue
|
continue
|
||||||
@@ -2037,22 +2058,88 @@ class SQLFORM(FORM):
|
|||||||
header = A(header, marker, _href=url(vars=dict(
|
header = A(header, marker, _href=url(vars=dict(
|
||||||
keywords=request.vars.keywords or '',
|
keywords=request.vars.keywords or '',
|
||||||
order=key)), _class=trap_class())
|
order=key)), _class=trap_class())
|
||||||
head.append(TH(header, _class=ui.get('default')))
|
headcols.append(TH(header, _class=ui.get('default')))
|
||||||
|
|
||||||
|
toadd = []
|
||||||
if links and links_in_grid:
|
if links and links_in_grid:
|
||||||
for link in links:
|
for link in links:
|
||||||
if isinstance(link, dict):
|
if isinstance(link, dict):
|
||||||
head.append(TH(link['header'], _class=ui.get('default')))
|
toadd.append(TH(link['header'], _class=ui.get('default')))
|
||||||
|
if links_placement in ['right', 'both']:
|
||||||
|
headcols.extend(toadd)
|
||||||
|
if links_placement in ['left', 'both']:
|
||||||
|
linsert(headcols, 0, toadd)
|
||||||
|
|
||||||
# Include extra column for buttons if needed.
|
# Include extra column for buttons if needed.
|
||||||
include_buttons_column = (details or editable or deletable or
|
include_buttons_column = (details or editable or deletable or
|
||||||
(links and links_in_grid and
|
(links and links_in_grid and
|
||||||
not all([isinstance(link, dict) for link in links])))
|
not all([isinstance(link, dict) for link in links])))
|
||||||
if include_buttons_column:
|
if include_buttons_column:
|
||||||
head.append(TH(_class=ui.get('default')))
|
if buttons_placement in ['right', 'both']:
|
||||||
|
headcols.append(TH(_class=ui.get('default','')))
|
||||||
|
if buttons_placement in ['left', 'both']:
|
||||||
|
headcols.insert(0, TH(_class=ui.get('default','')))
|
||||||
|
|
||||||
|
head = TR(*headcols, **dict(_class=ui.get('header')))
|
||||||
|
|
||||||
|
cursor = True
|
||||||
|
#figure out what page we are one to setup the limitby
|
||||||
|
if paginate and dbset._db._adapter.dbengine=='google:datastore':
|
||||||
|
cursor = request.vars.cursor or True
|
||||||
|
limitby = (0, paginate)
|
||||||
|
try: page = int(request.vars.page or 1)-1
|
||||||
|
except ValueError: page = 0
|
||||||
|
elif paginate and paginate<nrows:
|
||||||
|
try: page = int(request.vars.page or 1)-1
|
||||||
|
except ValueError: page = 0
|
||||||
|
limitby = (paginate*page,paginate*(page+1))
|
||||||
|
else:
|
||||||
|
limitby = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
table_fields = [f for f in fields if f._tablename in tablenames]
|
||||||
|
if dbset._db._adapter.dbengine=='google:datastore':
|
||||||
|
rows = dbset.select(left=left,orderby=orderby,
|
||||||
|
groupby=groupby,limitby=limitby,
|
||||||
|
reusecursor=cursor,
|
||||||
|
cacheable=True,*table_fields)
|
||||||
|
next_cursor = dbset._db.get('_lastcursor', None)
|
||||||
|
else:
|
||||||
|
rows = dbset.select(left=left,orderby=orderby,
|
||||||
|
groupby=groupby,limitby=limitby,
|
||||||
|
cacheable=True,*table_fields)
|
||||||
|
except SyntaxError:
|
||||||
|
rows = None
|
||||||
|
next_cursor = None
|
||||||
|
error = T("Query Not Supported")
|
||||||
|
except Exception, e:
|
||||||
|
rows = None
|
||||||
|
next_cursor = None
|
||||||
|
error = T("Query Not Supported: %s")%e
|
||||||
|
|
||||||
|
message = error
|
||||||
|
if not message and nrows:
|
||||||
|
if dbset._db._adapter.dbengine=='google:datastore' and nrows>=1000:
|
||||||
|
message = T('at least %(nrows)s records found') % dict(nrows=nrows)
|
||||||
|
else:
|
||||||
|
message = T('%(nrows)s records found') % dict(nrows=nrows)
|
||||||
|
console.append(DIV(message,_class='web2py_counter'))
|
||||||
|
|
||||||
paginator = UL()
|
paginator = UL()
|
||||||
if paginate and paginate < nrows:
|
if paginate and dbset._db._adapter.dbengine=='google:datastore':
|
||||||
|
#this means we may have a large table with an unknown number of rows.
|
||||||
|
try:
|
||||||
|
page = int(request.vars.page or 1)-1
|
||||||
|
except ValueError:
|
||||||
|
page = 0
|
||||||
|
paginator.append(LI('page %s'%(page+1)))
|
||||||
|
if next_cursor:
|
||||||
|
d = dict(page=page+2, cursor=next_cursor)
|
||||||
|
if order: d['order']=order
|
||||||
|
if request.vars.keywords: d['keywords']=request.vars.keywords
|
||||||
|
paginator.append(LI(
|
||||||
|
A('next',_href=url(vars=d),_class=trap_class())))
|
||||||
|
elif paginate and paginate<nrows:
|
||||||
npages, reminder = divmod(nrows, paginate)
|
npages, reminder = divmod(nrows, paginate)
|
||||||
if reminder:
|
if reminder:
|
||||||
npages += 1
|
npages += 1
|
||||||
@@ -2060,7 +2147,6 @@ class SQLFORM(FORM):
|
|||||||
page = int(request.vars.page or 1) - 1
|
page = int(request.vars.page or 1) - 1
|
||||||
except ValueError:
|
except ValueError:
|
||||||
page = 0
|
page = 0
|
||||||
limitby = (paginate * page, paginate * (page + 1))
|
|
||||||
|
|
||||||
def self_link(name, p):
|
def self_link(name, p):
|
||||||
d = dict(page=p + 1)
|
d = dict(page=p + 1)
|
||||||
@@ -2088,38 +2174,15 @@ class SQLFORM(FORM):
|
|||||||
else:
|
else:
|
||||||
limitby = None
|
limitby = None
|
||||||
|
|
||||||
try:
|
|
||||||
table_fields = [f for f in fields if f._tablename in tablenames]
|
|
||||||
rows = dbset.select(left=left, orderby=orderby,
|
|
||||||
groupby=groupby, limitby=limitby,
|
|
||||||
*table_fields)
|
|
||||||
except SyntaxError:
|
|
||||||
rows = None
|
|
||||||
error = T("Query Not Supported")
|
|
||||||
if nrows:
|
|
||||||
message = error or T('%(nrows)s records found') % dict(nrows=nrows)
|
|
||||||
console.append(DIV(message, _class='web2py_counter'))
|
|
||||||
|
|
||||||
if rows:
|
if rows:
|
||||||
htmltable = TABLE(THEAD(head))
|
htmltable = TABLE(THEAD(head))
|
||||||
tbody = TBODY()
|
tbody = TBODY()
|
||||||
numrec = 0
|
numrec = 0
|
||||||
for row in rows:
|
for row in rows:
|
||||||
if numrec % 2 == 0:
|
trcols = []
|
||||||
classtr = 'even'
|
|
||||||
else:
|
|
||||||
classtr = 'odd'
|
|
||||||
numrec += 1
|
|
||||||
id = row[field_id]
|
id = row[field_id]
|
||||||
if id:
|
|
||||||
rid = id
|
|
||||||
if callable(rid): # can this ever be callable?
|
|
||||||
rid = rid(row)
|
|
||||||
tr = TR(_id=rid, _class='%s %s' % (classtr, 'with_id'))
|
|
||||||
else:
|
|
||||||
tr = TR(_class=classtr)
|
|
||||||
if selectable:
|
if selectable:
|
||||||
tr.append(
|
trcols.append(
|
||||||
INPUT(_type="checkbox", _name="records", _value=id,
|
INPUT(_type="checkbox", _name="records", _value=id,
|
||||||
value=request.vars.records))
|
value=request.vars.records))
|
||||||
for field in fields:
|
for field in fields:
|
||||||
@@ -2157,15 +2220,21 @@ class SQLFORM(FORM):
|
|||||||
value = truncate_string(value, maxlength)
|
value = truncate_string(value, maxlength)
|
||||||
elif not isinstance(value, DIV):
|
elif not isinstance(value, DIV):
|
||||||
value = field.formatter(value)
|
value = field.formatter(value)
|
||||||
tr.append(TD(value))
|
trcols.append(TD(value))
|
||||||
row_buttons = TD(_class='row_buttons')
|
row_buttons = TD(_class='row_buttons')
|
||||||
if links and links_in_grid:
|
if links and links_in_grid:
|
||||||
|
toadd = []
|
||||||
for link in links:
|
for link in links:
|
||||||
if isinstance(link, dict):
|
if isinstance(link, dict):
|
||||||
tr.append(TD(link['body'](row)))
|
toadd.append(TD(link['body'](row)))
|
||||||
else:
|
else:
|
||||||
if link(row):
|
if link(row):
|
||||||
row_buttons.append(link(row))
|
row_buttons.append(link(row))
|
||||||
|
if links_placement in ['right', 'both']:
|
||||||
|
trcols.extend(toadd)
|
||||||
|
if links_placement in ['left', 'both']:
|
||||||
|
linsert(trcols, 0, toadd)
|
||||||
|
|
||||||
if include_buttons_column:
|
if include_buttons_column:
|
||||||
if details and (not callable(details) or details(row)):
|
if details and (not callable(details) or details(row)):
|
||||||
row_buttons.append(gridbutton(
|
row_buttons.append(gridbutton(
|
||||||
@@ -2180,7 +2249,24 @@ class SQLFORM(FORM):
|
|||||||
'buttondelete', 'Delete',
|
'buttondelete', 'Delete',
|
||||||
callback=url(args=['delete', tablename, id]),
|
callback=url(args=['delete', tablename, id]),
|
||||||
delete='tr'))
|
delete='tr'))
|
||||||
tr.append(row_buttons)
|
if buttons_placement in ['right', 'both']:
|
||||||
|
trcols.append(row_buttons)
|
||||||
|
if buttons_placement in ['left', 'both']:
|
||||||
|
trcols.insert(0, row_buttons)
|
||||||
|
if numrec % 2 == 0:
|
||||||
|
classtr = 'even'
|
||||||
|
else:
|
||||||
|
classtr = 'odd'
|
||||||
|
numrec += 1
|
||||||
|
if id:
|
||||||
|
rid = id
|
||||||
|
if callable(rid): # can this ever be callable?
|
||||||
|
rid = rid(row)
|
||||||
|
tr = TR(*trcols, **dict(
|
||||||
|
_id=rid,
|
||||||
|
_class='%s %s' % (classtr, 'with_id')))
|
||||||
|
else:
|
||||||
|
tr = TR(*trcols, **dict(_class=classtr))
|
||||||
tbody.append(tr)
|
tbody.append(tr)
|
||||||
htmltable.append(tbody)
|
htmltable.append(tbody)
|
||||||
htmltable = DIV(htmltable, _style='width:100%;overflow-x:auto')
|
htmltable = DIV(htmltable, _style='width:100%;overflow-x:auto')
|
||||||
@@ -2198,6 +2284,8 @@ class SQLFORM(FORM):
|
|||||||
if csv and nrows:
|
if csv and nrows:
|
||||||
export_links = []
|
export_links = []
|
||||||
for k, v in sorted(exportManager.items()):
|
for k, v in sorted(exportManager.items()):
|
||||||
|
if not v:
|
||||||
|
continue
|
||||||
label = v[1] if hasattr(v, "__getitem__") else k
|
label = v[1] if hasattr(v, "__getitem__") else k
|
||||||
link = url2(vars=dict(
|
link = url2(vars=dict(
|
||||||
order=request.vars.order or '',
|
order=request.vars.order or '',
|
||||||
@@ -2311,7 +2399,6 @@ class SQLFORM(FORM):
|
|||||||
name = format % record
|
name = format % record
|
||||||
except TypeError:
|
except TypeError:
|
||||||
name = id
|
name = id
|
||||||
nameLink = 'view'
|
|
||||||
breadcrumbs.append(
|
breadcrumbs.append(
|
||||||
LI(A(T(db[referee]._plural),
|
LI(A(T(db[referee]._plural),
|
||||||
_class=trap_class(),
|
_class=trap_class(),
|
||||||
@@ -2352,9 +2439,8 @@ class SQLFORM(FORM):
|
|||||||
check = {}
|
check = {}
|
||||||
id_field_name = table._id.name
|
id_field_name = table._id.name
|
||||||
for rfield in table._referenced_by:
|
for rfield in table._referenced_by:
|
||||||
if rfield.readable:
|
check[rfield.tablename] = \
|
||||||
check[rfield.tablename] = \
|
check.get(rfield.tablename, []) + [rfield.name]
|
||||||
check.get(rfield.tablename, []) + [rfield.name]
|
|
||||||
if isinstance(linked_tables, dict):
|
if isinstance(linked_tables, dict):
|
||||||
linked_tables = linked_tables.get(table._tablename, [])
|
linked_tables = linked_tables.get(table._tablename, [])
|
||||||
for tablename in sorted(check):
|
for tablename in sorted(check):
|
||||||
@@ -2740,7 +2826,6 @@ class ExporterTSV(ExportClass):
|
|||||||
writer = csv.writer(out, delimiter='\t')
|
writer = csv.writer(out, delimiter='\t')
|
||||||
import codecs
|
import codecs
|
||||||
final.write(codecs.BOM_UTF16)
|
final.write(codecs.BOM_UTF16)
|
||||||
colnames = [a.split('.') for a in self.rows.colnames]
|
|
||||||
writer.writerow(
|
writer.writerow(
|
||||||
[unicode(col).encode("utf8") for col in self.rows.colnames])
|
[unicode(col).encode("utf8") for col in self.rows.colnames])
|
||||||
data = out.getvalue().decode("utf8")
|
data = out.getvalue().decode("utf8")
|
||||||
|
|||||||
+28
-23
@@ -1828,14 +1828,15 @@ class Auth(object):
|
|||||||
created_on=request.now,
|
created_on=request.now,
|
||||||
renew=interactivelogin)
|
renew=interactivelogin)
|
||||||
service = session._cas_service
|
service = session._cas_service
|
||||||
|
query_sep = '&' if '?' in service else '?'
|
||||||
del session._cas_service
|
del session._cas_service
|
||||||
if 'warn' in request.vars and not interactivelogin:
|
if 'warn' in request.vars and not interactivelogin:
|
||||||
response.headers[
|
response.headers[
|
||||||
'refresh'] = "5;URL=%s" % service + "?ticket=" + ticket
|
'refresh'] = "5;URL=%s" % service + query_sep + "ticket=" + ticket
|
||||||
return A("Continue to %s" % service,
|
return A("Continue to %s" % service,
|
||||||
_href=service + "?ticket=" + ticket)
|
_href=service + query_sep + "ticket=" + ticket)
|
||||||
else:
|
else:
|
||||||
redirect(service + "?ticket=" + ticket)
|
redirect(service + query_sep + "ticket=" + ticket)
|
||||||
if self.is_logged_in() and not 'renew' in request.vars:
|
if self.is_logged_in() and not 'renew' in request.vars:
|
||||||
return allow_access()
|
return allow_access()
|
||||||
elif not self.is_logged_in() and 'gateway' in request.vars:
|
elif not self.is_logged_in() and 'gateway' in request.vars:
|
||||||
@@ -2065,7 +2066,8 @@ class Auth(object):
|
|||||||
# invalid login
|
# invalid login
|
||||||
session.flash = self.messages.invalid_login
|
session.flash = self.messages.invalid_login
|
||||||
redirect(
|
redirect(
|
||||||
self.url(args=request.args, vars=request.get_vars))
|
self.url(args=request.args, vars=request.get_vars),
|
||||||
|
client_side=True)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# use a central authentication server
|
# use a central authentication server
|
||||||
@@ -2081,7 +2083,7 @@ class Auth(object):
|
|||||||
else:
|
else:
|
||||||
# we need to pass through login again before going on
|
# we need to pass through login again before going on
|
||||||
next = self.url(self.settings.function, args='login')
|
next = self.url(self.settings.function, args='login')
|
||||||
redirect(cas.login_url(next))
|
redirect(cas.login_url(next), client_side=True)
|
||||||
|
|
||||||
# process authenticated users
|
# process authenticated users
|
||||||
if user:
|
if user:
|
||||||
@@ -2104,14 +2106,14 @@ class Auth(object):
|
|||||||
if next == session._auth_next:
|
if next == session._auth_next:
|
||||||
session._auth_next = None
|
session._auth_next = None
|
||||||
next = replace_id(next, form)
|
next = replace_id(next, form)
|
||||||
redirect(next)
|
redirect(next, client_side=True)
|
||||||
table_user[username].requires = old_requires
|
table_user[username].requires = old_requires
|
||||||
return form
|
return form
|
||||||
elif user:
|
elif user:
|
||||||
callback(onaccept, None)
|
callback(onaccept, None)
|
||||||
if next == session._auth_next:
|
if next == session._auth_next:
|
||||||
del session._auth_next
|
del session._auth_next
|
||||||
redirect(next)
|
redirect(next, client_side=True)
|
||||||
|
|
||||||
def logout(self, next=DEFAULT, onlogout=DEFAULT, log=DEFAULT):
|
def logout(self, next=DEFAULT, onlogout=DEFAULT, log=DEFAULT):
|
||||||
"""
|
"""
|
||||||
@@ -2162,7 +2164,7 @@ class Auth(object):
|
|||||||
response = current.response
|
response = current.response
|
||||||
session = current.session
|
session = current.session
|
||||||
if self.is_logged_in():
|
if self.is_logged_in():
|
||||||
redirect(self.settings.logged_url)
|
redirect(self.settings.logged_url, client_side=True)
|
||||||
if next is DEFAULT:
|
if next is DEFAULT:
|
||||||
next = self.next or self.settings.register_next
|
next = self.next or self.settings.register_next
|
||||||
if onvalidation is DEFAULT:
|
if onvalidation is DEFAULT:
|
||||||
@@ -2278,7 +2280,7 @@ class Auth(object):
|
|||||||
next = self.url(args=request.args)
|
next = self.url(args=request.args)
|
||||||
else:
|
else:
|
||||||
next = replace_id(next, form)
|
next = replace_id(next, form)
|
||||||
redirect(next)
|
redirect(next, client_side=True)
|
||||||
return form
|
return form
|
||||||
|
|
||||||
def is_logged_in(self):
|
def is_logged_in(self):
|
||||||
@@ -2526,7 +2528,7 @@ class Auth(object):
|
|||||||
raise Exception
|
raise Exception
|
||||||
except Exception:
|
except Exception:
|
||||||
session.flash = self.messages.invalid_reset_password
|
session.flash = self.messages.invalid_reset_password
|
||||||
redirect(next)
|
redirect(next, client_side=True)
|
||||||
passfield = self.settings.password_field
|
passfield = self.settings.password_field
|
||||||
form = SQLFORM.factory(
|
form = SQLFORM.factory(
|
||||||
Field('new_password', 'password',
|
Field('new_password', 'password',
|
||||||
@@ -2551,7 +2553,7 @@ class Auth(object):
|
|||||||
session.flash = self.messages.password_changed
|
session.flash = self.messages.password_changed
|
||||||
if self.settings.login_after_password_change:
|
if self.settings.login_after_password_change:
|
||||||
self.login_user(user)
|
self.login_user(user)
|
||||||
redirect(next)
|
redirect(next, client_side=True)
|
||||||
return form
|
return form
|
||||||
|
|
||||||
def request_reset_password(
|
def request_reset_password(
|
||||||
@@ -2609,10 +2611,10 @@ class Auth(object):
|
|||||||
user = table_user(email=form.vars.email)
|
user = table_user(email=form.vars.email)
|
||||||
if not user:
|
if not user:
|
||||||
session.flash = self.messages.invalid_email
|
session.flash = self.messages.invalid_email
|
||||||
redirect(self.url(args=request.args))
|
redirect(self.url(args=request.args), client_side=True)
|
||||||
elif user.registration_key in ('pending', 'disabled', 'blocked'):
|
elif user.registration_key in ('pending', 'disabled', 'blocked'):
|
||||||
session.flash = self.messages.registration_pending
|
session.flash = self.messages.registration_pending
|
||||||
redirect(self.url(args=request.args))
|
redirect(self.url(args=request.args), client_side=True)
|
||||||
if self.email_reset_password(user):
|
if self.email_reset_password(user):
|
||||||
session.flash = self.messages.email_sent
|
session.flash = self.messages.email_sent
|
||||||
else:
|
else:
|
||||||
@@ -2623,7 +2625,7 @@ class Auth(object):
|
|||||||
next = self.url(args=request.args)
|
next = self.url(args=request.args)
|
||||||
else:
|
else:
|
||||||
next = replace_id(next, form)
|
next = replace_id(next, form)
|
||||||
redirect(next)
|
redirect(next, client_side=True)
|
||||||
# old_requires = table_user.email.requires
|
# old_requires = table_user.email.requires
|
||||||
return form
|
return form
|
||||||
|
|
||||||
@@ -2668,7 +2670,7 @@ class Auth(object):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if not self.is_logged_in():
|
if not self.is_logged_in():
|
||||||
redirect(self.settings.login_url)
|
redirect(self.settings.login_url, client_side=True)
|
||||||
db = self.db
|
db = self.db
|
||||||
table_user = self.table_user()
|
table_user = self.table_user()
|
||||||
s = db(table_user.id == self.user.id)
|
s = db(table_user.id == self.user.id)
|
||||||
@@ -2718,7 +2720,7 @@ class Auth(object):
|
|||||||
next = self.url(args=request.args)
|
next = self.url(args=request.args)
|
||||||
else:
|
else:
|
||||||
next = replace_id(next, form)
|
next = replace_id(next, form)
|
||||||
redirect(next)
|
redirect(next, client_side=True)
|
||||||
return form
|
return form
|
||||||
|
|
||||||
def profile(
|
def profile(
|
||||||
@@ -2738,7 +2740,7 @@ class Auth(object):
|
|||||||
|
|
||||||
table_user = self.table_user()
|
table_user = self.table_user()
|
||||||
if not self.is_logged_in():
|
if not self.is_logged_in():
|
||||||
redirect(self.settings.login_url)
|
redirect(self.settings.login_url, client_side=True)
|
||||||
passfield = self.settings.password_field
|
passfield = self.settings.password_field
|
||||||
table_user[passfield].writable = False
|
table_user[passfield].writable = False
|
||||||
request = current.request
|
request = current.request
|
||||||
@@ -2774,7 +2776,7 @@ class Auth(object):
|
|||||||
next = self.url(args=request.args)
|
next = self.url(args=request.args)
|
||||||
else:
|
else:
|
||||||
next = replace_id(next, form)
|
next = replace_id(next, form)
|
||||||
redirect(next)
|
redirect(next, client_side=True)
|
||||||
return form
|
return form
|
||||||
|
|
||||||
def is_impersonating(self):
|
def is_impersonating(self):
|
||||||
@@ -3287,13 +3289,14 @@ class Auth(object):
|
|||||||
manage_permissions=False,
|
manage_permissions=False,
|
||||||
force_prefix='',
|
force_prefix='',
|
||||||
restrict_search=False,
|
restrict_search=False,
|
||||||
resolve=True):
|
resolve=True,
|
||||||
|
extra=None):
|
||||||
if not hasattr(self, '_wiki'):
|
if not hasattr(self, '_wiki'):
|
||||||
self._wiki = Wiki(self, render=render,
|
self._wiki = Wiki(self, render=render,
|
||||||
manage_permissions=manage_permissions,
|
manage_permissions=manage_permissions,
|
||||||
force_prefix=force_prefix,
|
force_prefix=force_prefix,
|
||||||
restrict_search=restrict_search,
|
restrict_search=restrict_search,
|
||||||
env=env)
|
env=env, extra=extra or {})
|
||||||
else:
|
else:
|
||||||
self._wiki.env.update(env or {})
|
self._wiki.env.update(env or {})
|
||||||
# if resolve is set to True, process request as wiki call
|
# if resolve is set to True, process request as wiki call
|
||||||
@@ -4242,7 +4245,7 @@ class Service(object):
|
|||||||
if not method in methods:
|
if not method in methods:
|
||||||
return return_error(id, 100, 'method "%s" does not exist' % method)
|
return return_error(id, 100, 'method "%s" does not exist' % method)
|
||||||
try:
|
try:
|
||||||
s = methods[method](*params)
|
s = methods[method](**params)
|
||||||
if hasattr(s, 'as_list'):
|
if hasattr(s, 'as_list'):
|
||||||
s = s.as_list()
|
s = s.as_list()
|
||||||
return return_response(id, s)
|
return return_response(id, s)
|
||||||
@@ -4667,7 +4670,8 @@ class Wiki(object):
|
|||||||
rows_page = 25
|
rows_page = 25
|
||||||
|
|
||||||
def markmin_render(self, page):
|
def markmin_render(self, page):
|
||||||
html = MARKMIN(page.body, url=True, environment=self.env,
|
html = MARKMIN(page.body, extra=self.extra,
|
||||||
|
url=True, environment=self.env,
|
||||||
autolinks=lambda link: expand_one(link, {})).xml()
|
autolinks=lambda link: expand_one(link, {})).xml()
|
||||||
html += DIV(_class='w2p_wiki_tags',
|
html += DIV(_class='w2p_wiki_tags',
|
||||||
*[A(t.strip(), _href=URL(args='_search', vars=dict(q=t)))
|
*[A(t.strip(), _href=URL(args='_search', vars=dict(q=t)))
|
||||||
@@ -4696,7 +4700,7 @@ class Wiki(object):
|
|||||||
|
|
||||||
def __init__(self, auth, env=None, render='markmin',
|
def __init__(self, auth, env=None, render='markmin',
|
||||||
manage_permissions=False, force_prefix='',
|
manage_permissions=False, force_prefix='',
|
||||||
restrict_search=False):
|
restrict_search=False, extra=None):
|
||||||
self.env = env or {}
|
self.env = env or {}
|
||||||
self.env['component'] = Wiki.component
|
self.env['component'] = Wiki.component
|
||||||
if render == 'markmin':
|
if render == 'markmin':
|
||||||
@@ -4712,6 +4716,7 @@ class Wiki(object):
|
|||||||
self.host = current.request.env.http_host
|
self.host = current.request.env.http_host
|
||||||
perms = self.manage_permissions = manage_permissions
|
perms = self.manage_permissions = manage_permissions
|
||||||
self.restrict_search = restrict_search
|
self.restrict_search = restrict_search
|
||||||
|
self.extra = self.extra or {}
|
||||||
db = auth.db
|
db = auth.db
|
||||||
table_definitions = [
|
table_definitions = [
|
||||||
('wiki_page', {
|
('wiki_page', {
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ def try_start_browser(url):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
url = url.replace('0.0.0.0','127.0.0.1')
|
||||||
webbrowser.open(url)
|
webbrowser.open(url)
|
||||||
except:
|
except:
|
||||||
print 'warning: unable to detect your browser'
|
print 'warning: unable to detect your browser'
|
||||||
|
|||||||
Reference in new issue
Block a user