From a340de8c1eb9898e41b409a80a8ab4b0897e2283 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Tue, 23 Jul 2013 08:41:53 -0500 Subject: [PATCH 01/10] better solution 1602, thanks Alan --- VERSION | 2 +- gluon/dal.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 1e9bc0d6..28446fd5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.23.02.04.35 +Version 2.6.0-development+timestamp.2013.07.23.08.39.39 diff --git a/gluon/dal.py b/gluon/dal.py index bccd14aa..eb4cf079 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -679,6 +679,11 @@ class BaseAdapter(ConnectionPool): 'big-reference': 'BIGINT REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', } + def isOperationalError(self,exception): + if not hasattr(self.driver, "OperationalError"): + return None + return isinstance(exception, self.driver.OperationalError) + def id_query(self, table): return table._id != None @@ -4324,7 +4329,9 @@ class DatabaseStoredFile: try: if db.executesql(query): return True - except Exception: + except Exception, e: + if not db._adapter.isOperationalError(e): + raise # no web2py_filesystem found? tb = traceback.format_exc() LOGGER.error("Could not retrieve %s\n%s" % (filename, tb)) From 182b385734a62374c5f2ae30c07fdbbd84de8d7f Mon Sep 17 00:00:00 2001 From: mdipierro Date: Tue, 23 Jul 2013 11:09:14 -0500 Subject: [PATCH 02/10] better next validation, thanks Andre Kablu --- VERSION | 2 +- gluon/tools.py | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 28446fd5..40d80c03 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.23.08.39.39 +Version 2.6.0-development+timestamp.2013.07.23.11.07.29 diff --git a/gluon/tools.py b/gluon/tools.py index dced42c2..545e359d 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -2048,10 +2048,15 @@ class Auth(object): if next is DEFAULT: # important for security next = self.settings.login_next - if self.next: - host = self.next.split('//',1)[-1].split('/')[0] - if host in self.settings.cas_domains: - next = self.next + user_next = self.next + if user_next: + external = user_next.split('://') + if external[0].lower() in ['http', 'https', 'ftp']: + host_next = user_next.split('//', 1)[-1].split('/')[0] + if host_next in self.settings.cas_domains: + next = user_next + else: + next = user_next if onvalidation is DEFAULT: onvalidation = self.settings.login_onvalidation if onaccept is DEFAULT: From 8b7a638e9f69f06c21f4d119a585ba3a8bb1a8d0 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 25 Jul 2013 05:04:35 -0500 Subject: [PATCH 03/10] appadmin_manage_without_https, thanks Anthony --- VERSION | 2 +- applications/admin/controllers/appadmin.py | 3 ++- applications/examples/controllers/appadmin.py | 3 ++- applications/welcome/controllers/appadmin.py | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 40d80c03..b9239b7d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.23.11.07.29 +Version 2.6.0-development+timestamp.2013.07.25.05.03.42 diff --git a/applications/admin/controllers/appadmin.py b/applications/admin/controllers/appadmin.py index 32f515f0..2dc4a8de 100644 --- a/applications/admin/controllers/appadmin.py +++ b/applications/admin/controllers/appadmin.py @@ -32,7 +32,8 @@ except: if request.env.http_x_forwarded_for or request.is_https: session.secure() -elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"): +elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1") and \ + (request.function != 'manage'): raise HTTP(200, T('appadmin is disabled because insecure channel')) if request.function == 'manage': diff --git a/applications/examples/controllers/appadmin.py b/applications/examples/controllers/appadmin.py index 32f515f0..2dc4a8de 100644 --- a/applications/examples/controllers/appadmin.py +++ b/applications/examples/controllers/appadmin.py @@ -32,7 +32,8 @@ except: if request.env.http_x_forwarded_for or request.is_https: session.secure() -elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"): +elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1") and \ + (request.function != 'manage'): raise HTTP(200, T('appadmin is disabled because insecure channel')) if request.function == 'manage': diff --git a/applications/welcome/controllers/appadmin.py b/applications/welcome/controllers/appadmin.py index 32f515f0..2dc4a8de 100644 --- a/applications/welcome/controllers/appadmin.py +++ b/applications/welcome/controllers/appadmin.py @@ -32,7 +32,8 @@ except: if request.env.http_x_forwarded_for or request.is_https: session.secure() -elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1"): +elif (remote_addr not in hosts) and (remote_addr != "127.0.0.1") and \ + (request.function != 'manage'): raise HTTP(200, T('appadmin is disabled because insecure channel')) if request.function == 'manage': From ccdbb9a5880b5e11f60ff9acd45b35391665205e Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 25 Jul 2013 05:12:29 -0500 Subject: [PATCH 04/10] fixed issue 1605:mongodb select fails with long limitby, thanks Alan --- VERSION | 2 +- gluon/dal.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index b9239b7d..5621a1b3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.25.05.03.42 +Version 2.6.0-development+timestamp.2013.07.25.05.11.38 diff --git a/gluon/dal.py b/gluon/dal.py index eb4cf079..5a0f84d9 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -5464,7 +5464,7 @@ class MongoDBAdapter(NoSQLAdapter): else: mongosort_list.append((f, 1)) if limitby: - limitby_skip, limitby_limit = limitby + limitby_skip, limitby_limit = limitby[0], int(limitby[1]) else: limitby_skip = limitby_limit = 0 From 61f552266135ce9ae9573ffe44972ab66770e56e Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 25 Jul 2013 05:14:54 -0500 Subject: [PATCH 05/10] fixed issue 1604:After web2py Upgrade, int status codes are no longer respected, thanks cfhowes --- VERSION | 2 +- gluon/http.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5621a1b3..795c9f19 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.25.05.11.38 +Version 2.6.0-development+timestamp.2013.07.25.05.14.06 diff --git a/gluon/http.py b/gluon/http.py index dda977b5..6f1b2e1e 100644 --- a/gluon/http.py +++ b/gluon/http.py @@ -27,6 +27,7 @@ defined_status = { 307: 'TEMPORARY REDIRECT', 400: 'BAD REQUEST', 401: 'UNAUTHORIZED', + 402: 'PAYMENT REQUIRED', 403: 'FORBIDDEN', 404: 'NOT FOUND', 405: 'METHOD NOT ALLOWED', @@ -79,6 +80,8 @@ class HTTP(Exception): headers = self.headers if status in defined_status: status = '%d %s' % (status, defined_status[status]) + elif isinstance(status, int): + status = '%d UNKNOWN ERROR' % status else: status = str(status) if not regex_status.match(status): From b63e8994e4d9a13e967734ffa07e1a2a4923d331 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 25 Jul 2013 08:14:16 -0500 Subject: [PATCH 06/10] upgraded analytics.min.js, thanks Paolo --- VERSION | 2 +- applications/welcome/static/js/analytics.min.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 795c9f19..c583da0d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.25.05.14.06 +Version 2.6.0-development+timestamp.2013.07.25.08.13.15 diff --git a/applications/welcome/static/js/analytics.min.js b/applications/welcome/static/js/analytics.min.js index c6af396f..e8d27047 100644 --- a/applications/welcome/static/js/analytics.min.js +++ b/applications/welcome/static/js/analytics.min.js @@ -1,4 +1,3 @@ -// Analytics.js 0.2.2 -// (c) 2012 Segment.io Inc. -// Analytics.js may be freely distributed under the MIT license. -(function(){var e={userId:null,date:new Date,loaded:!1,initialized:!1,initializableProviders:{},providers:[],addProvider:function(e,t){this.initializableProviders[e]=t},initialize:function(e){this.providers=[],this.userId=null;for(var t in e){var n=this.initializableProviders[t],r=e[t];if(!n)throw new Error('Could not find a provider named "'+t+'"');n.initialize(r),this.providers.push(n)}this.initialized=!0;var i=this.utils.getUrlParameter(window.location.search,"ajs_uid");i&&this.identify(i);var s=this.utils.getUrlParameter(window.location.search,"ajs_event");s&&this.track(s)},identify:function(e,t){if(!this.initialized)return;this.utils.isObject(e)&&(t=e,e=null),e!==null?this.userId=e:e=this.userId;for(var n=0,r;r=this.providers[n];n++){if(!r.identify)continue;r.identify(e,this.utils.clone(t))}},track:function(e,t){if(!this.initialized)return;for(var n=0,r;r=this.providers[n];n++){if(!r.track)continue;r.track(e,this.utils.clone(t))}},pageview:function(){if(!this.initialized)return;for(var e=0,t;t=this.providers[e];e++){if(!t.pageview)continue;t.pageview()}},utils:{getSeconds:function(e){return Math.floor(new Date(e)/1e3)},clone:function(e){if(!e)return;var t={};for(var n in e)t[n]=e[n];return t},extend:function(e){var t=Array.prototype.slice.call(arguments,1);for(var n=0,r;r=t[n];n++)for(var i in r)e[i]=r[i];return e},alias:function(e,t){for(var n in t){var r=t[n];e[n]!==undefined&&(e[r]=e[n],delete e[n])}},isObject:function(e){return e===Object(e)},isString:function(e){return Object.prototype.toString.call(e)==="[object String]"},isFunction:function(e){return Object.prototype.toString.call(e)==="[object Function]"},isNumber:function(e){return Object.prototype.toString.call(e)==="[object Number]"},isEmail:function(e){return/.+\@.+\..+/.test(e)},resolveSettings:function(e,t){if(!this.isString(e)&&!this.isObject(e))throw new Error("Could not resolve settings.");if(!t)throw new Error("You must provide an api key field name.");if(this.isString(e)){var n=e;e={},e[t]=n}return e},getUrlParameter:function(e,t){var n=e.replace("?","").split("&");for(var r=0;r<",s,' onload="var d=',y,";d.getElementsByTagName('head')[0].",a,"(d.",f,"('script')).",h,"='",r,"//",u.l,"'",'"',">"].join("")}var s="body",o=n[s];if(!o)return setTimeout(p,100);u.P(1);var a="appendChild",f="createElement",h="src",v=n[f]("div"),m=v[a](n[f](i)),g=n[f]("iframe"),y="document",b="domain",w;v.style.display="none",o.insertBefore(v,o.firstChild).id=i,g.frameBorder="0",g.id=i+"-loader",/MSIE[ ]+6/.test(navigator.userAgent)&&(g.src="javascript:false"),g.allowTransparency="true",m[a](g);try{g.contentWindow[y].open()}catch(E){e[b]=n[b],w="javascript:var d="+y+".open();d.domain='"+n.domain+"';",g[h]=w+"void(0);"}try{var S=g.contentWindow[y];S.write(t()),S.close()}catch(x){g[h]=w+'d.write("'+t().replace(/"/g,String.fromCharCode(92)+'"')+'");d.close();'}u.P(2)};p()};o()}({loader:"static.olark.com/jsclient/loader0.js",name:"olark",methods:["configure","extend","declare","identify"]}),window.olark.identify(this.settings.siteId)},identify:function(e,t){var n=e;t&&t.email&&(n=t.email),t&&t.name&&(n=t.name),t&&t.name&&t.email&&(n+=" ("+t.email+")");if(!n)return;window.olark("api.chat.updateVisitorNickname",{snippet:n})},track:function(e,t){if(!this.settings.track)return;window.olark("api.chat.sendNotificationToOperator",{body:'visitor triggered "'+e+'"'})},pageview:function(){if(!this.settings.pageview)return;window.olark("api.chat.sendNotificationToOperator",{body:"looking at "+window.location.href})}}); \ No newline at end of file +!function(){function require(path,parent,orig){var resolved=require.resolve(path);if(null==resolved){orig=orig||path;parent=parent||"root";var err=new Error('Failed to require "'+orig+'" from "'+parent+'"');err.path=orig;err.parent=parent;err.require=true;throw err}var module=require.modules[resolved];if(!module.exports){module.exports={};module.client=module.component=true;module.call(this,module.exports,require.relative(resolved),module)}return module.exports}require.modules={};require.aliases={};require.resolve=function(path){if(path.charAt(0)==="/")path=path.slice(1);var paths=[path,path+".js",path+".json",path+"/index.js",path+"/index.json"];for(var i=0;idocument.w=window');storageContainer.close();storageOwner=storageContainer.w.frames[0].document;storage=storageOwner.createElement("div")}catch(e){storage=doc.createElement("div");storageOwner=doc.body}function withIEStorage(storeFunction){return function(){var args=Array.prototype.slice.call(arguments,0);args.unshift(storage);storageOwner.appendChild(storage);storage.addBehavior("#default#userData");storage.load(localStorageName);var result=storeFunction.apply(store,args);storageOwner.removeChild(storage);return result}}var forbiddenCharsRegex=new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]","g");function ieKeyFix(key){return key.replace(forbiddenCharsRegex,"___")}store.set=withIEStorage(function(storage,key,val){key=ieKeyFix(key);if(val===undefined){return store.remove(key)}storage.setAttribute(key,store.serialize(val));storage.save(localStorageName);return val});store.get=withIEStorage(function(storage,key){key=ieKeyFix(key);return store.deserialize(storage.getAttribute(key))});store.remove=withIEStorage(function(storage,key){key=ieKeyFix(key);storage.removeAttribute(key);storage.save(localStorageName)});store.clear=withIEStorage(function(storage){var attributes=storage.XMLDocument.documentElement.attributes;storage.load(localStorageName);for(var i=0,attr;attr=attributes[i];i++){storage.removeAttribute(attr.name)}storage.save(localStorageName)});store.getAll=withIEStorage(function(storage){var attributes=storage.XMLDocument.documentElement.attributes;var ret={};for(var i=0,attr;attr=attributes[i];++i){var key=ieKeyFix(attr.name);ret[attr.name]=store.deserialize(storage.getAttribute(key))}return ret})}try{store.set(namespace,namespace);if(store.get(namespace)!=namespace){store.disabled=true}store.remove(namespace)}catch(e){store.disabled=true}store.enabled=!store.disabled;module.exports=store});require.register("segmentio-top-domain/index.js",function(exports,require,module){var url=require("url");module.exports=function(urlStr){var host=url.parse(urlStr).hostname,topLevel=host.match(/[a-z0-9][a-z0-9\-]*[a-z0-9]\.[a-z\.]{2,6}$/i);return topLevel?topLevel[0]:host}});require.register("timoxley-next-tick/index.js",function(exports,require,module){"use strict";if(typeof setImmediate=="function"){module.exports=function(f){setImmediate(f)}}else if(typeof process!="undefined"&&typeof process.nextTick=="function"){module.exports=process.nextTick}else if(typeof window=="undefined"||window.ActiveXObject||!window.postMessage){module.exports=function(f){setTimeout(f)}}else{var q=[];window.addEventListener("message",function(){var i=0;while(i<",i," onl"+'oad="var d=',g,";d.getElementsByTagName('head')[0].",j,"(d.",h,"('script')).",k,"='",l,"//",a.l,"'",'"',">"].join("")}var i="body",m=d[i];if(!m){return setTimeout(ld,100)}a.P(1);var j="appendChild",h="createElement",k="src",n=d[h]("div"),v=n[j](d[h](z)),b=d[h]("iframe"),g="document",e="domain",o;n.style.display="none";m.insertBefore(n,m.firstChild).id=z;b.frameBorder="0";b.id=z+"-loader";if(/MSIE[ ]+6/.test(navigator.userAgent)){b.src="javascript:false"}b.allowTransparency="true";v[j](b);try{b.contentWindow[g].open()}catch(w){c[e]=d[e];o="javascript:var d="+g+".open();d.domain='"+d.domain+"';";b[k]=o+"void(0);"}try{var t=b.contentWindow[g];t.write(p());t.close()}catch(x){b[k]=o+'d.write("'+p().replace(/"/g,String.fromCharCode(92)+'"')+'");d.close();'}a.P(2)};ld()};nt()}({loader:"static.olark.com/jsclient/loader0.js",name:"olark",methods:["configure","extend","declare","identify"]});window.olark.identify(options.siteId);var self=this;window.olark("api.box.onExpand",function(){self.chatting=true});window.olark("api.box.onShrink",function(){self.chatting=false});ready()},identify:function(userId,traits){if(!this.options.identify)return;var email=traits.email,name=traits.name||traits.firstName,phone=traits.phone,nickname=name||email||userId;if(name&&email)nickname+=" ("+email+")";window.olark("api.visitor.updateCustomFields",traits);if(email)window.olark("api.visitor.updateEmailAddress",{emailAddress:email});if(name)window.olark("api.visitor.updateFullName",{fullName:name});if(phone)window.olark("api.visitor.updatePhoneNumber",{phoneNumber:phone});if(nickname)window.olark("api.chat.updateVisitorNickname",{snippet:nickname})},track:function(event,properties){if(!this.options.track||!this.chatting)return;window.olark("api.chat.sendNotificationToOperator",{body:'visitor triggered "'+event+'"'})},pageview:function(url){if(!this.options.pageview||!this.chatting)return;window.olark("api.chat.sendNotificationToOperator",{body:"looking at "+window.location.href})}})});require.register("analytics/src/providers/optimizely.js",function(exports,require,module){var each=require("each"),nextTick=require("next-tick"),Provider=require("../provider");module.exports=Provider.extend({name:"Optimizely",defaults:{variations:true},initialize:function(options,ready,analytics){window.optimizely=window.optimizely||[];if(options.variations){var self=this;nextTick(function(){self.replay()})}ready()},track:function(event,properties){if(properties&&properties.revenue)properties.revenue=properties.revenue*100;window.optimizely.push(["trackEvent",event,properties])},replay:function(){var data=window.optimizely.data;if(!data)return;var experiments=data.experiments,variationNamesMap=data.state.variationNamesMap;var traits={};each(variationNamesMap,function(experimentId,variation){traits["Experiment: "+experiments[experimentId].name]=variation});this.analytics.identify(traits)}})});require.register("analytics/src/providers/perfect-audience.js",function(exports,require,module){var Provider=require("../provider"),load=require("load-script");module.exports=Provider.extend({name:"Perfect Audience",key:"siteId",defaults:{siteId:null},initialize:function(options,ready){window._pa||(window._pa={});load("//tag.perfectaudience.com/serve/"+options.siteId+".js",ready)},track:function(event,properties){window._pa.track(event,properties)}})});require.register("analytics/src/providers/pingdom.js",function(exports,require,module){var date=require("load-date"),Provider=require("../provider"),load=require("load-script");module.exports=Provider.extend({name:"Pingdom",key:"id",defaults:{id:null},initialize:function(options,ready){window._prum=[["id",options.id],["mark","firstbyte",date.getTime()]];load("//rum-static.pingdom.net/prum.min.js",ready)}})});require.register("analytics/src/providers/preact.js",function(exports,require,module){var Provider=require("../provider"),isEmail=require("is-email"),load=require("load-script");module.exports=Provider.extend({name:"Preact",key:"projectCode",defaults:{projectCode:null},initialize:function(options,ready){var _lnq=window._lnq=window._lnq||[];_lnq.push(["_setCode",options.projectCode]);load("//d2bbvl6dq48fa6.cloudfront.net/js/ln-2.4.min.js");ready()},identify:function(userId,traits){if(!userId)return;if(traits.created){traits.created_at=Math.floor(traits.created/1e3);delete traits.created +}window._lnq.push(["_setPersonData",{name:traits.name,email:traits.email,uid:userId,properties:traits}])},group:function(groupId,properties){if(!groupId)return;properties.id=groupId;window._lnq.push(["_setAccount",properties])},track:function(event,properties){properties||(properties={});var special={name:event};if(properties.revenue){special.revenue=properties.revenue*100;delete properties.revenue}if(properties.note){special.note=properties.note;delete properties.note}window._lnq.push(["_logEvent",special,properties])}})});require.register("analytics/src/providers/qualaroo.js",function(exports,require,module){var Provider=require("../provider"),isEmail=require("is-email"),load=require("load-script");module.exports=Provider.extend({name:"Qualaroo",defaults:{customerId:null,siteToken:null,track:false},initialize:function(options,ready){window._kiq=window._kiq||[];load("//s3.amazonaws.com/ki.js/"+options.customerId+"/"+options.siteToken+".js");ready()},identify:function(userId,traits){var identity=traits.email||userId;if(identity)window._kiq.push(["identify",identity]);if(traits)window._kiq.push(["set",traits])},track:function(event,properties){if(!this.options.track)return;var traits={};traits["Triggered: "+event]=true;this.identify(null,traits)}})});require.register("analytics/src/providers/quantcast.js",function(exports,require,module){var Provider=require("../provider"),load=require("load-script");module.exports=Provider.extend({name:"Quantcast",key:"pCode",defaults:{pCode:null},initialize:function(options,ready){window._qevents=window._qevents||[];window._qevents.push({qacct:options.pCode});load({http:"http://edge.quantserve.com/quant.js",https:"https://secure.quantserve.com/quant.js"},ready)}})});require.register("analytics/src/providers/sentry.js",function(exports,require,module){var Provider=require("../provider"),load=require("load-script");module.exports=Provider.extend({name:"Sentry",key:"config",defaults:{config:null},initialize:function(options,ready){load("//d3nslu0hdya83q.cloudfront.net/dist/1.0/raven.min.js",function(){window.Raven.config(options.config).install();ready()})},identify:function(userId,traits){traits.id=userId;window.Raven.setUser(traits)},log:function(error,properties){window.Raven.captureException(error,properties)}})});require.register("analytics/src/providers/snapengage.js",function(exports,require,module){var Provider=require("../provider"),isEmail=require("is-email"),load=require("load-script");module.exports=Provider.extend({name:"SnapEngage",key:"apiKey",defaults:{apiKey:null},initialize:function(options,ready){load("//commondatastorage.googleapis.com/code.snapengage.com/js/"+options.apiKey+".js",ready)},identify:function(userId,traits,options){if(!traits.email)return;window.SnapABug.setUserEmail(traits.email)}})});require.register("analytics/src/providers/usercycle.js",function(exports,require,module){var Provider=require("../provider"),load=require("load-script"),user=require("../user");module.exports=Provider.extend({name:"USERcycle",key:"key",defaults:{key:null},initialize:function(options,ready){window._uc=window._uc||[];window._uc.push(["_key",options.key]);load("//api.usercycle.com/javascripts/track.js");ready()},identify:function(userId,traits){if(userId)window._uc.push(["uid",userId]);window._uc.push(["action","came_back",traits])},track:function(event,properties){window._uc.push(["action",event,properties])}})});require.register("analytics/src/providers/userfox.js",function(exports,require,module){var Provider=require("../provider"),extend=require("extend"),load=require("load-script"),isEmail=require("is-email");module.exports=Provider.extend({name:"userfox",key:"clientId",defaults:{clientId:null},initialize:function(options,ready){window._ufq=window._ufq||[];load("//d2y71mjhnajxcg.cloudfront.net/js/userfox-stable.js");ready()},identify:function(userId,traits){if(!traits.email)return;window._ufq.push(["init",{clientId:this.options.clientId,email:traits.email}]);if(traits.created){traits.signup_date=(traits.created.getTime()/1e3).toString();delete traits.created;window._ufq.push(["track",traits])}}})});require.register("analytics/src/providers/uservoice.js",function(exports,require,module){var Provider=require("../provider"),load=require("load-script"),alias=require("alias"),clone=require("clone");module.exports=Provider.extend({name:"UserVoice",defaults:{widgetId:null,forumId:null,showTab:true,mode:"full",primaryColor:"#cc6d00",linkColor:"#007dbf",defaultMode:"support",tabLabel:"Feedback & Support",tabColor:"#cc6d00",tabPosition:"middle-right",tabInverted:false},initialize:function(options,ready){window.UserVoice=window.UserVoice||[];load("//widget.uservoice.com/"+options.widgetId+".js",ready);var optionsClone=clone(options);alias(optionsClone,{forumId:"forum_id",primaryColor:"primary_color",linkColor:"link_color",defaultMode:"default_mode",tabLabel:"tab_label",tabColor:"tab_color",tabPosition:"tab_position",tabInverted:"tab_inverted"});window.showClassicWidget=function(showWhat){window.UserVoice.push([showWhat||"showLightbox","classic_widget",optionsClone])};if(options.showTab){window.showClassicWidget("showTab")}},identify:function(userId,traits){traits.id=userId;window.UserVoice.push(["setCustomFields",traits])}})});require.register("analytics/src/providers/vero.js",function(exports,require,module){var Provider=require("../provider"),isEmail=require("is-email"),load=require("load-script");module.exports=Provider.extend({name:"Vero",key:"apiKey",defaults:{apiKey:null},initialize:function(options,ready){window._veroq=window._veroq||[];window._veroq.push(["init",{api_key:options.apiKey}]);load("//d3qxef4rp70elm.cloudfront.net/m.js");ready()},identify:function(userId,traits){if(!userId||!traits.email)return;traits.id=userId;window._veroq.push(["user",traits])},track:function(event,properties){window._veroq.push(["track",event,properties])}})});require.register("analytics/src/providers/visual-website-optimizer.js",function(exports,require,module){var each=require("each"),inherit=require("inherit"),nextTick=require("next-tick"),Provider=require("../provider");module.exports=VWO;function VWO(){Provider.apply(this,arguments)}inherit(VWO,Provider);VWO.prototype.name="Visual Website Optimizer";VWO.prototype.defaults={replay:true};VWO.prototype.initialize=function(options,ready){if(options.replay)this.replay();ready()};VWO.prototype.replay=function(){var analytics=this.analytics;nextTick(function(){experiments(function(err,traits){if(traits)analytics.identify(traits)})})};function experiments(callback){enqueue(function(){var data={};var ids=window._vwo_exp_ids;if(!ids)return callback();each(ids,function(id){var name=variation(id);if(name)data["Experiment: "+id]=name});callback(null,data)})}function enqueue(fn){window._vis_opt_queue||(window._vis_opt_queue=[]);window._vis_opt_queue.push(fn)}function variation(id){var experiments=window._vwo_exp;if(!experiments)return null;var experiment=experiments[id];var variationId=experiment.combination_chosen;return variationId?experiment.comb_n[variationId]:null}});require.register("analytics/src/providers/woopra.js",function(exports,require,module){var Provider=require("../provider"),each=require("each"),extend=require("extend"),isEmail=require("is-email"),load=require("load-script"),type=require("type"),user=require("../user");module.exports=Provider.extend({name:"Woopra",key:"domain",defaults:{domain:null},initialize:function(options,ready){var self=this;window.woopraReady=function(tracker){tracker.setDomain(self.options.domain);tracker.setIdleTimeout(3e5);var userId=user.id(),traits=user.traits();addTraits(userId,traits,tracker);tracker.track();ready();return false};load("//static.woopra.com/js/woopra.js")},identify:function(userId,traits){if(!window.woopraTracker)return;addTraits(userId,traits,window.woopraTracker)},track:function(event,properties){if(!window.woopraTracker)return;properties||(properties={});properties.name=event;window.woopraTracker.pushEvent(properties)}});function addTraits(userId,traits,tracker){if(userId)traits.id=userId;each(traits,function(key,value){if("string"===type(value))tracker.addVisitorProperty(key,value)})}});require.alias("avetisk-defaults/index.js","analytics/deps/defaults/index.js");require.alias("avetisk-defaults/index.js","defaults/index.js");require.alias("component-clone/index.js","analytics/deps/clone/index.js");require.alias("component-clone/index.js","clone/index.js");require.alias("component-type/index.js","component-clone/deps/type/index.js");require.alias("component-cookie/index.js","analytics/deps/cookie/index.js");require.alias("component-cookie/index.js","cookie/index.js");require.alias("component-each/index.js","analytics/deps/each/index.js");require.alias("component-each/index.js","each/index.js");require.alias("component-type/index.js","component-each/deps/type/index.js");require.alias("component-event/index.js","analytics/deps/event/index.js");require.alias("component-event/index.js","event/index.js");require.alias("component-inherit/index.js","analytics/deps/inherit/index.js");require.alias("component-inherit/index.js","inherit/index.js");require.alias("component-object/index.js","analytics/deps/object/index.js");require.alias("component-object/index.js","object/index.js");require.alias("component-querystring/index.js","analytics/deps/querystring/index.js");require.alias("component-querystring/index.js","querystring/index.js");require.alias("component-trim/index.js","component-querystring/deps/trim/index.js");require.alias("component-type/index.js","analytics/deps/type/index.js");require.alias("component-type/index.js","type/index.js");require.alias("component-url/index.js","analytics/deps/url/index.js");require.alias("component-url/index.js","url/index.js");require.alias("segmentio-after/index.js","analytics/deps/after/index.js");require.alias("segmentio-after/index.js","after/index.js");require.alias("segmentio-alias/index.js","analytics/deps/alias/index.js");require.alias("segmentio-alias/index.js","alias/index.js");require.alias("segmentio-bind-all/index.js","analytics/deps/bind-all/index.js");require.alias("segmentio-bind-all/index.js","analytics/deps/bind-all/index.js");require.alias("segmentio-bind-all/index.js","bind-all/index.js");require.alias("component-bind/index.js","segmentio-bind-all/deps/bind/index.js");require.alias("component-type/index.js","segmentio-bind-all/deps/type/index.js");require.alias("segmentio-bind-all/index.js","segmentio-bind-all/index.js");require.alias("segmentio-canonical/index.js","analytics/deps/canonical/index.js");require.alias("segmentio-canonical/index.js","canonical/index.js");require.alias("segmentio-extend/index.js","analytics/deps/extend/index.js");require.alias("segmentio-extend/index.js","extend/index.js");require.alias("segmentio-is-email/index.js","analytics/deps/is-email/index.js");require.alias("segmentio-is-email/index.js","is-email/index.js");require.alias("segmentio-is-meta/index.js","analytics/deps/is-meta/index.js");require.alias("segmentio-is-meta/index.js","is-meta/index.js");require.alias("segmentio-json/index.js","analytics/deps/json/index.js");require.alias("segmentio-json/index.js","json/index.js");require.alias("component-json-fallback/index.js","segmentio-json/deps/json-fallback/index.js");require.alias("segmentio-load-date/index.js","analytics/deps/load-date/index.js");require.alias("segmentio-load-date/index.js","load-date/index.js");require.alias("segmentio-load-script/index.js","analytics/deps/load-script/index.js");require.alias("segmentio-load-script/index.js","load-script/index.js");require.alias("component-type/index.js","segmentio-load-script/deps/type/index.js");require.alias("segmentio-new-date/index.js","analytics/deps/new-date/index.js");require.alias("segmentio-new-date/index.js","new-date/index.js");require.alias("segmentio-type/index.js","segmentio-new-date/deps/type/index.js");require.alias("segmentio-on-body/index.js","analytics/deps/on-body/index.js");require.alias("segmentio-on-body/index.js","on-body/index.js");require.alias("component-each/index.js","segmentio-on-body/deps/each/index.js");require.alias("component-type/index.js","component-each/deps/type/index.js");require.alias("segmentio-store.js/store.js","analytics/deps/store/store.js");require.alias("segmentio-store.js/store.js","analytics/deps/store/index.js");require.alias("segmentio-store.js/store.js","store/index.js");require.alias("segmentio-json/index.js","segmentio-store.js/deps/json/index.js");require.alias("component-json-fallback/index.js","segmentio-json/deps/json-fallback/index.js");require.alias("segmentio-store.js/store.js","segmentio-store.js/index.js");require.alias("segmentio-top-domain/index.js","analytics/deps/top-domain/index.js");require.alias("segmentio-top-domain/index.js","analytics/deps/top-domain/index.js");require.alias("segmentio-top-domain/index.js","top-domain/index.js");require.alias("component-url/index.js","segmentio-top-domain/deps/url/index.js");require.alias("segmentio-top-domain/index.js","segmentio-top-domain/index.js");require.alias("timoxley-next-tick/index.js","analytics/deps/next-tick/index.js");require.alias("timoxley-next-tick/index.js","next-tick/index.js");require.alias("yields-prevent/index.js","analytics/deps/prevent/index.js");require.alias("yields-prevent/index.js","prevent/index.js");require.alias("analytics/src/index.js","analytics/index.js");if(typeof exports=="object"){module.exports=require("analytics")}else if(typeof define=="function"&&define.amd){define(function(){return require("analytics")})}else{this["analytics"]=require("analytics")}}(); \ No newline at end of file From 6aa0ff50b282aae5c1b66059b237aa56bd81a00c Mon Sep 17 00:00:00 2001 From: mdipierro Date: Fri, 26 Jul 2013 03:03:49 -0500 Subject: [PATCH 07/10] fixed bug in sqlform.grid --- VERSION | 2 +- gluon/sqlhtml.py | 23 +++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/VERSION b/VERSION index c583da0d..26115f44 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.25.08.13.15 +Version 2.6.0-development+timestamp.2013.07.26.03.03.00 diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 52fd42a6..c0fd11d2 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -2621,25 +2621,24 @@ class SQLFORM(FORM): if isinstance(linked_tables, dict): for tbl in linked_tables.keys(): tb = db[tbl] + if isinstance(linked_tables[tbl], list) and len(linked_tables[tbl])==1: + linked_tables[tbl] = linked_tables[tbl][0] if isinstance(linked_tables[tbl], list): - if len(linked_tables[tbl]) > 1: - t = T('%s(%s)' %(tbl, fld)) - else: - t = T(tb._plural) - for fld in linked_tables[tbl]: - if fld not in db[tbl].fields: - raise ValueError('Field %s not in table' %fld) - args0 = tbl + '.' + fld - links.append( - lambda row, t=t, nargs=nargs, args0=args0: + for fld in linked_tables[tbl]: + if fld not in db[tbl].fields: + raise ValueError('Field %s not in table' %fld) + args0 = tbl + '.' + fld + t = T('%s(%s)' %(tbl, fld)) + links.append( + lambda row, t=t, nargs=nargs, args0=args0: A(SPAN(t), _class=trap_class(), _href=url( - args=[args0, row[id_field_name]]))) + args=[args0, row[id_field_name]]))) else: - t = T(tb._plural) fld = linked_tables[tbl] if fld not in db[tbl].fields: raise ValueError('Field %s not in table' %fld) args0 = tbl + '.' + fld + t = T(tb._plural) links.append( lambda row, t=t, nargs=nargs, args0=args0: A(SPAN(t), _class=trap_class(), _href=url( From 215cefd1e049c37ea7f1fd6a5837510a830a5a24 Mon Sep 17 00:00:00 2001 From: mpranjic Date: Fri, 26 Jul 2013 10:35:36 +0200 Subject: [PATCH 08/10] fixed auth_event logging --- gluon/tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gluon/tools.py b/gluon/tools.py index 545e359d..94a814dc 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -893,6 +893,7 @@ class Auth(object): on_failed_authentication=lambda x: redirect(x), formstyle="table3cols", label_separator=": ", + logging_enabled = True, allow_delete_accounts=False, password_field='password', table_user_name='auth_user', @@ -969,7 +970,6 @@ class Auth(object): new_password='New password', old_password='Old password', group_description='Group uniquely assigned to user %(id)s', - logging_enabled = True, register_log='User %(id)s Registered', login_log='User %(id)s Logged-in', login_failed_log=None, @@ -1750,7 +1750,7 @@ class Auth(object): user_id = None # user unknown vars = vars or {} # log messages should not be translated - if type(descrption).__name__ == 'lazyT': + if type(description).__name__ == 'lazyT': description = description.m self.table_event().insert( description=str(description % vars), From 6faacfbf36c75f8d8ec83482a4600b6dd6e0d1e3 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Fri, 26 Jul 2013 15:56:03 -0500 Subject: [PATCH 09/10] fixed issue 1607:NamedTemporaryFile broke GAE, thanks Alan --- VERSION | 2 +- gluon/main.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 26115f44..76aae619 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.26.03.03.00 +Version 2.6.0-development+timestamp.2013.07.26.15.55.14 diff --git a/gluon/main.py b/gluon/main.py index 1fa2a027..b3c37fbb 100644 --- a/gluon/main.py +++ b/gluon/main.py @@ -172,7 +172,10 @@ def copystream_progress(request, chunk_size=10 ** 5): size = int(env.content_length) except ValueError: raise HTTP(400, "Invalid Content-Length header") - dest = tempfile.NamedTemporaryFile() + try: # Android requires this + dest = tempfile.NamedTemporaryFile() + except NotImplementedError: # and GAE this + dest = tempfile.TemporaryFile() if not 'X-Progress-ID' in request.vars: copystream(source, dest, size, chunk_size) return dest From 30a570538b96335131dd8ce6bfcc81e518afcfae Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sat, 27 Jul 2013 06:47:25 -0500 Subject: [PATCH 10/10] fixed linked tables again --- VERSION | 2 +- gluon/sqlhtml.py | 52 ++++++++++++++++++++---------------------------- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/VERSION b/VERSION index 76aae619..e0fb217f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.26.15.55.14 +Version 2.6.0-development+timestamp.2013.07.27.06.46.34 diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index c0fd11d2..f92b8acb 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -2618,38 +2618,30 @@ class SQLFORM(FORM): for rfield in table._referenced_by: check[rfield.tablename] = \ check.get(rfield.tablename, []) + [rfield.name] + if linked_tables is None: + linked_tables = db.tables() if isinstance(linked_tables, dict): - for tbl in linked_tables.keys(): - tb = db[tbl] - if isinstance(linked_tables[tbl], list) and len(linked_tables[tbl])==1: - linked_tables[tbl] = linked_tables[tbl][0] - if isinstance(linked_tables[tbl], list): - for fld in linked_tables[tbl]: - if fld not in db[tbl].fields: - raise ValueError('Field %s not in table' %fld) - args0 = tbl + '.' + fld - t = T('%s(%s)' %(tbl, fld)) - links.append( - lambda row, t=t, nargs=nargs, args0=args0: - A(SPAN(t), _class=trap_class(), _href=url( - args=[args0, row[id_field_name]]))) + linked_tables = linked_tables.get(table._tablename,[]) + if linked_tables: + for item in linked_tables: + tb = None + if isinstance(item,Table) and item._tablename in check: + tablename = item._tablename + linked_fieldnames = check[tablename] + td = item + elif isinstance(item,str) and item in check: + tablename = item + linked_fieldnames = check[item] + tb = db[item] + elif isinstance(item,Field) and item.name in check.get(item._tablename,[]): + tablename = item._tablename + linked_fieldnames = [item.name] + tb = item.table else: - fld = linked_tables[tbl] - if fld not in db[tbl].fields: - raise ValueError('Field %s not in table' %fld) - args0 = tbl + '.' + fld - t = T(tb._plural) - links.append( - lambda row, t=t, nargs=nargs, args0=args0: - A(SPAN(t), _class=trap_class(), _href=url( - args=[args0, row[id_field_name]]))) - else: - for tablename in sorted(check): - linked_fieldnames = check[tablename] - tb = db[tablename] - multiple_links = len(linked_fieldnames) > 1 - for fieldname in linked_fieldnames: - if linked_tables is None or tablename in linked_tables: + linked_fieldnames = [] + if tb: + multiple_links = len(linked_fieldnames) > 1 + for fieldname in linked_fieldnames: t = T(tb._plural) if not multiple_links else \ T(tb._plural + '(' + fieldname + ')') args0 = tablename + '.' + fieldname