From 7b4fac7a7f99b8bf14a754f4224d2153d4e9c740 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 08:35:39 -0500 Subject: [PATCH 01/29] allow re-definition of tables --- VERSION | 2 +- gluon/dal.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index a3303341..90196dfe 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-03 12:32:01) dev +Version 2.0.9 (2012-10-04 08:35:24) dev diff --git a/gluon/dal.py b/gluon/dal.py index b98394cc..235b2361 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -185,7 +185,6 @@ SELECT_ARGS = set( ('orderby', 'groupby', 'limitby','required', 'cache', 'left', 'distinct', 'having', 'join','for_update', 'processor','cacheable')) - ogetattr = object.__getattribute__ osetattr = object.__setattr__ exists = os.path.exists @@ -7031,11 +7030,12 @@ def index(): ): if not isinstance(tablename,str): raise SyntaxError, "missing table name" + elif hasattr(self,tablename) or tablename in self.tables: + pass + # raise SyntaxError, 'table may be already defined: %s' % tablename elif tablename.startswith('_') or hasattr(self,tablename) or \ REGEX_PYTHON_KEYWORDS.match(tablename): raise SyntaxError, 'invalid table name: %s' % tablename - elif tablename in self.tables: - raise SyntaxError, 'table already defined: %s' % tablename elif self.check_reserved: self.check_reserved_keyword(tablename) else: @@ -7048,7 +7048,7 @@ def index(): table = None else: table = self.lazy_define_table(tablename,*fields,**args) - self.tables.append(tablename) + if not tablename in self.tables: self.tables.append(tablename) return table def lazy_define_table( From 54a1005af3a979e564b84ae14590c49e967ebd41 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 08:44:26 -0500 Subject: [PATCH 02/29] fixed problem with __new__ deprecated --- VERSION | 2 +- gluon/dal.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 90196dfe..2c6f6816 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 08:35:24) dev +Version 2.0.9 (2012-10-04 08:44:15) dev diff --git a/gluon/dal.py b/gluon/dal.py index 235b2361..7f71544c 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -6583,7 +6583,7 @@ class DAL(object): def __new__(cls, uri='sqlite://dummy.db', *args, **kwargs): if uri==None and not 'singleton_code' in kwargs: # this deal with the special case of Dummy DAL for SQLFORM.factory - return super(DAL, cls).__new__(cls, uri, *args, **kwargs) + return super(DAL, cls).__new__(cls) if not hasattr(THREAD_LOCAL,'db_instances'): THREAD_LOCAL.db_instances = {} if 'singleton_code' in kwargs: From 4f4a0318aafa68b13d5bf8758e97421f1ac623ec Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 10:44:35 -0500 Subject: [PATCH 03/29] fixed wiki for missing body --- VERSION | 2 +- gluon/tools.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 2c6f6816..e00188f4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 08:44:15) dev +Version 2.0.9 (2012-10-04 10:44:23) dev diff --git a/gluon/tools.py b/gluon/tools.py index 34cfdd3d..6e410446 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -4703,14 +4703,14 @@ class Wiki(object): def first_paragraph(self,page): if not self.can_read(page): - mm = page.body.replace('\r','') + mm = (page.body or '').replace('\r','') ps = [p for p in mm.split('\n\n') \ if not p.startswith('#') and p.strip()] if ps: return ps[0] return '' def fix_hostname(self,body): - return body.replace('://HOSTNAME','://%s' % self.host) + return (body or '').replace('://HOSTNAME','://%s' % self.host) def read(self,slug): if slug in '_cloud': From c1d14a35eea7dc12353b067315bdc24e61c6402a Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 11:53:04 -0500 Subject: [PATCH 04/29] fixed preblem with db singledon serialization in tickets --- VERSION | 2 +- gluon/dal.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index e00188f4..75dbec0f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 10:44:23) dev +Version 2.0.9 (2012-10-04 11:52:53) dev diff --git a/gluon/dal.py b/gluon/dal.py index 7f71544c..bd67b1f5 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -241,6 +241,7 @@ REGEX_SQUARE_BRACKETS = re.compile('^.+\[.+\]$') REGEX_STORE_PATTERN = re.compile('\.(?P\w{1,5})$') REGEX_QUOTES = re.compile("'[^']*'") REGEX_ALPHANUMERIC = re.compile('^[0-9a-zA-Z]\w*$') +REGEX_PASSWORD = re.compile('\://([^:@]*)\:') # list of drivers will be built on the fly # and lists only what is available @@ -430,6 +431,9 @@ def pluralize(singular, rules=PLURALIZE_RULES): plural = re_search.search(singular) and re_sub.sub(replace, singular) if plural: return plural +def hide_password(uri): + return REGEX_PASSWORD.sub('://******:',uri) + def OR(a,b): return a|b @@ -7125,7 +7129,10 @@ def index(): __delitem__ = object.__delattr__ def __repr__(self): - return '' % self._uri + if hasattr(self,'_uri'): + return '' % hide_password(str(self._uri)) + else: + return '' % self._singleton_code def smart_query(self,fields,text): return Set(self, smart_query(fields,text)) From f501da74b76c646eecae0d57c4df28b865133b25 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 15:06:58 -0500 Subject: [PATCH 05/29] fixed setup, thanks Mike --- VERSION | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 75dbec0f..03e7cffc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 11:52:53) dev +Version 2.0.9 (2012-10-04 15:06:45) dev diff --git a/setup.py b/setup.py index f87f315c..37e06275 100644 --- a/setup.py +++ b/setup.py @@ -56,7 +56,7 @@ def start(): 'gluon/contrib/markdown', 'gluon/contrib/markmin', 'gluon/contrib/memcache', - 'gluon/contrib/pyfpdf', + 'gluon/contrib/fpdf', 'gluon/contrib/pymysql', 'gluon/contrib/pyrtf', 'gluon/contrib/pysimplesoap', From dc51abe54c123b34d49969fabaa9441e6a4d5c7c Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 15:12:52 -0500 Subject: [PATCH 06/29] Auth(secure=True), thanks Yarin and Niphlod --- VERSION | 2 +- gluon/main.py | 7 +++++-- gluon/tools.py | 5 ++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 03e7cffc..aea45ed4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 15:06:45) dev +Version 2.0.9 (2012-10-04 15:12:44) dev diff --git a/gluon/main.py b/gluon/main.py index 459ccf89..0b68753d 100644 --- a/gluon/main.py +++ b/gluon/main.py @@ -123,6 +123,8 @@ except: load() +HTTPS_SCHEMES = set(('https','HTTPS')) + def get_client(env): """ guess the client address from the environment variables @@ -445,8 +447,9 @@ def wsgibase(environ, responder): ajax = x_req_with == 'xmlhttprequest', cid = env.http_web2py_component_element, is_local = env.remote_addr in local_hosts, - is_https = env.wsgi_url_scheme \ - in ['https', 'HTTPS'] or env.https=='on') + is_https = env.wsgi_url_scheme in HTTPS_SCHEMES \ + or request.env.http_x_forwarded_proto in HTTPS_SCHEMES \ + or env.https=='on') request.uuid = request.compute_uuid() # requires client request.url = environ['PATH_INFO'] diff --git a/gluon/tools.py b/gluon/tools.py index 6e410446..b21d81c0 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -1050,7 +1050,7 @@ class Auth(object): def __init__(self, environment=None, db=None, mailer=True, hmac_key=None, controller='default', function='user', - cas_provider=None, signature=True): + cas_provider=None, signature=True, secure=False): """ auth=Auth(db) @@ -1070,6 +1070,9 @@ class Auth(object): session = current.session auth = session.auth self.user_groups = auth and auth.user_groups or {} + if secure and not request.is_https: + session.secure() + redirect(URL(args=request.args,vars=request.vars,scheme='http')) if auth and auth.last_visit and auth.last_visit + \ datetime.timedelta(days=0, seconds=auth.expiration) > request.now: self.user = auth.user From f0c84b52308f83e1792e0cc561f639d7f2fcf7a3 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 20:10:55 -0500 Subject: [PATCH 07/29] scheduler non-writable field, thanks Niphlod --- VERSION | 2 +- gluon/scheduler.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index aea45ed4..68ec7bfc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 15:12:44) dev +Version 2.0.9 (2012-10-04 20:10:46) dev diff --git a/gluon/scheduler.py b/gluon/scheduler.py index a395743c..41fa79c1 100644 --- a/gluon/scheduler.py +++ b/gluon/scheduler.py @@ -443,7 +443,7 @@ class Scheduler(MetaScheduler): Field('application_name',requires=IS_NOT_EMPTY(), default=None,writable=False), Field('task_name',default=None), - Field('group_name',default='main',writable=False), + Field('group_name',default='main'), Field('status',requires=IS_IN_SET(TASK_STATUS), default=QUEUED,writable=False), Field('function_name', From 28f914463b4ca0ca9c25d8d5f2f512cdcdb8bde3 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 20:17:12 -0500 Subject: [PATCH 08/29] removed depredation working, thanks Niphlod --- VERSION | 2 +- gluon/dal.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 68ec7bfc..c98d9502 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 20:10:46) dev +Version 2.0.9 (2012-10-04 20:17:03) dev diff --git a/gluon/dal.py b/gluon/dal.py index bd67b1f5..ecfbdbef 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -6599,7 +6599,7 @@ class DAL(object): if args or kwargs: raise RuntimeError, 'Cannot duplicate a Singleton' except KeyError: - db = super(DAL, cls).__new__(cls, uri, *args, **kwargs) + db = super(DAL, cls).__new__(cls) THREAD_LOCAL.db_instances[singleton_code] = db db._singleton_code = singleton_code return db From 3f6fa941cb49dfdf6a75cad93138fb3941450472 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 20:36:30 -0500 Subject: [PATCH 09/29] fixed issue 1067 --- VERSION | 2 +- gluon/template.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index c98d9502..4badc583 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 20:17:03) dev +Version 2.0.9 (2012-10-04 20:36:17) dev diff --git a/gluon/template.py b/gluon/template.py index 3d6442c0..179b8396 100644 --- a/gluon/template.py +++ b/gluon/template.py @@ -416,7 +416,7 @@ class TemplateParser(object): # Allow Views to include other views dynamically context = self.context if current and not "response" in context: - context["response"] = current.response + context["response"] = getattr(current,'response',None) # Get the filename; filename looks like ``"template.html"``. # We need to eval to remove the quotes and get the string type. From a23a2c52c230e45f3a1a35d2f25ef4c0ebecbfbb Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 20:39:00 -0500 Subject: [PATCH 10/29] fixed url_in(request, environ)[1]['PATH_INFO'] --- VERSION | 2 +- gluon/rewrite.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 4badc583..48760a89 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 20:36:17) dev +Version 2.0.9 (2012-10-04 20:38:49) dev diff --git a/gluon/rewrite.py b/gluon/rewrite.py index f23f4afe..cf0b7f09 100644 --- a/gluon/rewrite.py +++ b/gluon/rewrite.py @@ -231,7 +231,7 @@ def try_rewrite_on_error(http_response, request, environ, ticket=None): path_info = '/' + path_info.lstrip('/') # add leading '/' if missing environ['PATH_INFO'] = path_info error_handling_path = \ - url_in(request, environ)[1]['PATH_INFO'] + url_in(request, environ)[2]['PATH_INFO'] # Avoid infinite loop. if error_handling_path != error_raising_path: # wsgibase will be called recursively with the routes_onerror path. From 20deb56e33bc77100ee46f2125f52b7c35074404 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 21:45:25 -0500 Subject: [PATCH 11/29] minor indentation change --- VERSION | 2 +- gluon/sqlhtml.py | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/VERSION b/VERSION index 48760a89..c90faa99 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 20:38:49) dev +Version 2.0.9 (2012-10-04 21:45:11) dev diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 59cb6f6a..b97c4837 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -1825,16 +1825,19 @@ class SQLFORM(FORM): table = db[request.args[-2]] record = table(request.args[-1]) or redirect(URL('error')) sqlformargs.update(editargs) - update_form = SQLFORM(table, record, upload=upload, ignore_rw=ignore_rw, - formstyle=formstyle, deletable=deletable, - _class='web2py_form', - submit_button=T('Submit'), - delete_label=T('Check to delete'), - **sqlformargs) - update_form.process(formname=formname, - onvalidation=onvalidation, - onsuccess=onupdate, - next=referrer) + update_form = SQLFORM( + table, + record, upload=upload, ignore_rw=ignore_rw, + formstyle=formstyle, deletable=deletable, + _class='web2py_form', + submit_button=T('Submit'), + delete_label=T('Check to delete'), + **sqlformargs) + update_form.process( + formname=formname, + onvalidation=onvalidation, + onsuccess=onupdate, + next=referrer) res = DIV(buttons(view=details, record=record), update_form, formfooter, _class=_class) res.create_form = create_form From 7b6e5c52704c54663b5c34b7303d708e92924638 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 4 Oct 2012 21:52:04 -0500 Subject: [PATCH 12/29] fixed issue 990 --- VERSION | 2 +- app.example.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/VERSION b/VERSION index c90faa99..61521047 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 21:45:11) dev +Version 2.0.9 (2012-10-04 21:51:53) dev diff --git a/app.example.yaml b/app.example.yaml index d058361b..96e25b3c 100644 --- a/app.example.yaml +++ b/app.example.yaml @@ -80,7 +80,6 @@ skip_files: | builtins: - remote_api: on -# - datastore_admin: on - appstats: on - admin_redirect: on - deferred: on From 6a97bfe51775ad4eecf75d22d5bad1a69eff3c35 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Fri, 5 Oct 2012 07:18:35 -0500 Subject: [PATCH 13/29] Auth use request.requires_https, thanks Yarin --- VERSION | 2 +- gluon/globals.py | 2 +- gluon/tools.py | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 61521047..7ee0d384 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-04 21:51:53) dev +Version 2.0.9 (2012-10-05 07:18:29) dev diff --git a/gluon/globals.py b/gluon/globals.py index 8bf69150..10a1e9ee 100644 --- a/gluon/globals.py +++ b/gluon/globals.py @@ -128,7 +128,7 @@ class Request(Storage): and secure the session. """ if not global_settings.cronjob and not self.is_https: - session.forget() + current.session.forget() redirect(URL(scheme='https', args=self.args, vars=self.vars)) current.session.secure() diff --git a/gluon/tools.py b/gluon/tools.py index b21d81c0..dc2591c4 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -1070,9 +1070,8 @@ class Auth(object): session = current.session auth = session.auth self.user_groups = auth and auth.user_groups or {} - if secure and not request.is_https: - session.secure() - redirect(URL(args=request.args,vars=request.vars,scheme='http')) + if secure: + request.requires_https() if auth and auth.last_visit and auth.last_visit + \ datetime.timedelta(days=0, seconds=auth.expiration) > request.now: self.user = auth.user From 570538042e56057245d5e8778ed9c2a2b47a951e Mon Sep 17 00:00:00 2001 From: mdipierro Date: Fri, 5 Oct 2012 07:25:21 -0500 Subject: [PATCH 14/29] fixed IMAP reconnect --- VERSION | 2 +- gluon/dal.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 7ee0d384..3fb7004b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-05 07:18:29) dev +Version 2.0.9 (2012-10-05 07:25:17) dev diff --git a/gluon/dal.py b/gluon/dal.py index ecfbdbef..b8ad25d8 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -5525,7 +5525,7 @@ class IMAPAdapter(NoSQLAdapter): self.connector = connector if do_connect: self.reconnect() - def reconnect(self, f, cursor=True): + def reconnect(self, f=None, cursor=True): """ IMAP4 Pool connection method From f16c3a394f6a4594f3c4f7f7622fbc8f5de743d5 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Fri, 5 Oct 2012 09:01:51 -0500 Subject: [PATCH 15/29] lazy tables re-appeared in appadmin --- VERSION | 2 +- applications/admin/controllers/appadmin.py | 1 - applications/admin/views/appadmin.html | 6 +++--- applications/examples/controllers/appadmin.py | 1 - applications/examples/views/appadmin.html | 6 +++--- applications/welcome/controllers/appadmin.py | 1 - applications/welcome/views/appadmin.html | 6 +++--- gluon/dal.py | 3 ++- 8 files changed, 12 insertions(+), 14 deletions(-) diff --git a/VERSION b/VERSION index 3fb7004b..ef7830dd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-05 07:25:17) dev +Version 2.0.9 (2012-10-05 09:01:45) dev diff --git a/applications/admin/controllers/appadmin.py b/applications/admin/controllers/appadmin.py index b37afc70..c25fed29 100644 --- a/applications/admin/controllers/appadmin.py +++ b/applications/admin/controllers/appadmin.py @@ -113,7 +113,6 @@ def query_by_table_type(tablename,db,request=request): # ## list all databases and tables # ########################################################### - def index(): return dict(databases=databases) diff --git a/applications/admin/views/appadmin.html b/applications/admin/views/appadmin.html index 6a933679..f966b79c 100644 --- a/applications/admin/views/appadmin.html +++ b/applications/admin/views/appadmin.html @@ -27,7 +27,7 @@ {{pass}} {{else:}} {{qry=''}} - {{pass}} + {{pass}} {{pass}} @@ -37,9 +37,9 @@ {{=A(str(T('New Record')),_href=URL('insert',args=[db,table]),_class="btn")}} - {{pass}} - {{pass}} + {{pass}} + {{elif request.function=='select':}}

{{=XML(str(T("Database %s select"))%A(request.args[0],_href=URL('index'))) }} diff --git a/applications/examples/controllers/appadmin.py b/applications/examples/controllers/appadmin.py index b37afc70..c25fed29 100644 --- a/applications/examples/controllers/appadmin.py +++ b/applications/examples/controllers/appadmin.py @@ -113,7 +113,6 @@ def query_by_table_type(tablename,db,request=request): # ## list all databases and tables # ########################################################### - def index(): return dict(databases=databases) diff --git a/applications/examples/views/appadmin.html b/applications/examples/views/appadmin.html index 6a933679..f966b79c 100644 --- a/applications/examples/views/appadmin.html +++ b/applications/examples/views/appadmin.html @@ -27,7 +27,7 @@ {{pass}} {{else:}} {{qry=''}} - {{pass}} + {{pass}} {{pass}} @@ -37,9 +37,9 @@ {{=A(str(T('New Record')),_href=URL('insert',args=[db,table]),_class="btn")}} - {{pass}} - {{pass}} + {{pass}} + {{elif request.function=='select':}}

{{=XML(str(T("Database %s select"))%A(request.args[0],_href=URL('index'))) }} diff --git a/applications/welcome/controllers/appadmin.py b/applications/welcome/controllers/appadmin.py index b37afc70..c25fed29 100644 --- a/applications/welcome/controllers/appadmin.py +++ b/applications/welcome/controllers/appadmin.py @@ -113,7 +113,6 @@ def query_by_table_type(tablename,db,request=request): # ## list all databases and tables # ########################################################### - def index(): return dict(databases=databases) diff --git a/applications/welcome/views/appadmin.html b/applications/welcome/views/appadmin.html index 6a933679..f966b79c 100644 --- a/applications/welcome/views/appadmin.html +++ b/applications/welcome/views/appadmin.html @@ -27,7 +27,7 @@ {{pass}} {{else:}} {{qry=''}} - {{pass}} + {{pass}} {{pass}} @@ -37,9 +37,9 @@ {{=A(str(T('New Record')),_href=URL('insert',args=[db,table]),_class="btn")}} - {{pass}} - {{pass}} + {{pass}} + {{elif request.function=='select':}}

{{=XML(str(T("Database %s select"))%A(request.args[0],_href=URL('index'))) }} diff --git a/gluon/dal.py b/gluon/dal.py index b8ad25d8..1479de68 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -7052,7 +7052,8 @@ def index(): table = None else: table = self.lazy_define_table(tablename,*fields,**args) - if not tablename in self.tables: self.tables.append(tablename) + if not tablename in self.tables: + self.tables.append(tablename) return table def lazy_define_table( From 41d234bf4808148874262336cea3b9203c9db55d Mon Sep 17 00:00:00 2001 From: mdipierro Date: Fri, 5 Oct 2012 10:24:14 -0500 Subject: [PATCH 16/29] fixed mobile admin, and improved it --- VERSION | 2 +- applications/admin/controllers/default.py | 1 - applications/admin/models/access.py | 16 +- applications/admin/models/buttons.py | 2 +- .../admin/static/js/modernizr.custom.js | 4 + .../plugin_jqmobile/jquery.mobile-1.0.min.css | 2 - .../plugin_jqmobile/jquery.mobile-1.0.min.js | 173 ------------------ .../admin/views/default.mobile/design.html | 7 +- .../admin/views/default.mobile/index.html | 2 +- .../admin/views/default.mobile/layout.html | 15 +- .../admin/views/default.mobile/site.html | 6 +- .../admin/views/plugin_jqmobile/layout.html | 12 +- 12 files changed, 42 insertions(+), 200 deletions(-) create mode 100644 applications/admin/static/js/modernizr.custom.js delete mode 100644 applications/admin/static/plugin_jqmobile/jquery.mobile-1.0.min.css delete mode 100644 applications/admin/static/plugin_jqmobile/jquery.mobile-1.0.min.js diff --git a/VERSION b/VERSION index ef7830dd..62148d32 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-05 09:01:45) dev +Version 2.0.9 (2012-10-05 10:24:10) dev diff --git a/applications/admin/controllers/default.py b/applications/admin/controllers/default.py index 6bd56b37..7b3a0621 100644 --- a/applications/admin/controllers/default.py +++ b/applications/admin/controllers/default.py @@ -3,7 +3,6 @@ EXPERIMENTAL_STUFF = True if EXPERIMENTAL_STUFF: - is_mobile = request.user_agent().is_mobile if is_mobile: response.view = response.view.replace('default/','default.mobile/') response.menu = [] diff --git a/applications/admin/models/access.py b/applications/admin/models/access.py index 22d9e03c..a058ddf9 100644 --- a/applications/admin/models/access.py +++ b/applications/admin/models/access.py @@ -123,6 +123,21 @@ if session.authorized: else: session.last_time = t0 + +if request.vars.is_mobile in ('true','false','auto'): + session.is_mobile = request.vars.is_mobile or 'auto' +if request.controller=='default' and request.function=='index': + if not request.vars.is_mobile: + session.is_mobile = 'auto' +if not session.is_mobile: + session.is_mobile = 'auto' +if session.is_mobile == 'true': + is_mobile = True +elif session.is_mobile == 'false': + is_mobile = False +else: + is_mobile = request.user_agent().is_mobile + if request.controller == "webservices": basic = request.env.http_authorization if not basic or not basic[:6].lower() == 'basic ': @@ -150,7 +165,6 @@ elif session.authorized and \ request.function == 'index': redirect(URL(request.application, 'default', 'site')) - if request.controller=='appadmin' and DEMO_MODE: session.flash = 'Appadmin disabled in demo mode' redirect(URL('default','sites')) diff --git a/applications/admin/models/buttons.py b/applications/admin/models/buttons.py index a725cd7a..594acd3e 100644 --- a/applications/admin/models/buttons.py +++ b/applications/admin/models/buttons.py @@ -8,7 +8,7 @@ def A_button(*a,**b): return A(*a,**b) def button(href, label): - if request.user_agent().is_mobile: + if is_mobile: ret = A_button(SPAN(label), _href=href) else: ret = A(SPAN(label),_class='button',_href=href) diff --git a/applications/admin/static/js/modernizr.custom.js b/applications/admin/static/js/modernizr.custom.js new file mode 100644 index 00000000..00471dec --- /dev/null +++ b/applications/admin/static/js/modernizr.custom.js @@ -0,0 +1,4 @@ +/* Modernizr 2.0.6 (Custom Build) | MIT & BSD + * Build: http://www.modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-iepp-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load + */ +;window.Modernizr=function(a,b,c){function H(){e.input=function(a){for(var b=0,c=a.length;b",a,""].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},w=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=C(e[d],"function"),C(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),x,y={}.hasOwnProperty,z;!C(y,c)&&!C(y.call,c)?z=function(a,b){return y.call(a,b)}:z=function(a,b){return b in a&&C(a.constructor.prototype[b],c)};var G=function(c,d){var f=c.join(""),g=d.length;v(f,function(c,d){var f=b.styleSheets[b.styleSheets.length-1],h=f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"",i=c.childNodes,j={};while(g--)j[i[g].id]=i[g];e.touch="ontouchstart"in a||j.touch.offsetTop===9,e.csstransforms3d=j.csstransforms3d.offsetLeft===9,e.generatedcontent=j.generatedcontent.offsetHeight>=1,e.fontface=/src/i.test(h)&&h.indexOf(d.split(" ")[0])===0},g,d)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",o.join("touch-enabled),("),i,")","{#touch{top:9px;position:absolute}}"].join(""),["@media (",o.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join(""),['#generatedcontent:after{content:"',m,'";visibility:hidden}'].join("")],["fontface","touch","csstransforms3d","generatedcontent"]);r.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},r.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},r.canvastext=function(){return!!e.canvas&&!!C(b.createElement("canvas").getContext("2d").fillText,"function")},r.webgl=function(){return!!a.WebGLRenderingContext},r.touch=function(){return e.touch},r.geolocation=function(){return!!navigator.geolocation},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){var b=!!a.openDatabase;return b},r.indexedDB=function(){for(var b=-1,c=p.length;++b7)},r.history=function(){return!!a.history&&!!history.pushState},r.draganddrop=function(){return w("dragstart")&&w("drop")},r.websockets=function(){for(var b=-1,c=p.length;++b";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var I in r)z(r,I)&&(x=I.toLowerCase(),e[x]=r[I](),u.push((e[x]?"":"no-")+x));e.input||H(),A(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b*{visibility:hidden}.ui-bar,.ui-body{position:relative;padding:.4em 15px;overflow:hidden;display:block;clear:both}.ui-bar{font-size:16px;margin:0}.ui-bar h1,.ui-bar h2,.ui-bar h3,.ui-bar h4,.ui-bar h5,.ui-bar h6{margin:0;padding:0;font-size:16px;display:inline-block}.ui-header,.ui-footer{display:block}.ui-page .ui-header,.ui-page .ui-footer{position:relative}.ui-header .ui-btn-left{position:absolute;left:10px;top:.4em}.ui-header .ui-btn-right{position:absolute;right:10px;top:.4em}.ui-header .ui-title,.ui-footer .ui-title{min-height:1.1em;text-align:center;font-size:16px;display:block;margin:.6em 90px .8em;padding:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;outline:0!important}.ui-footer .ui-title{margin:.6em 15px .8em}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:15px}.ui-page-fullscreen .ui-content{padding:0}.ui-mobile-touch-overflow.ui-page.ui-native-fixed,.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen{overflow:visible}.ui-mobile-touch-overflow.ui-native-fixed .ui-header,.ui-mobile-touch-overflow.ui-native-fixed .ui-footer{position:fixed;left:0;right:0;top:0;z-index:200}.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer{top:auto;bottom:0}.ui-mobile-touch-overflow.ui-native-fixed .ui-content{padding-top:2.5em;padding-bottom:3em;top:0;bottom:0;height:auto;position:absolute}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content{padding-top:0;padding-bottom:0}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header,.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer{opacity:.9}.ui-native-bars-hidden{display:none}.ui-icon{width:18px;height:18px}.ui-fullscreen img{max-width:100%}.ui-nojs{position:absolute;left:-9999px}.ui-hide-label label,.ui-hidden-accessible{position:absolute!important;left:-9999px;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.spin{-webkit-transform:rotate(360deg);-webkit-animation-name:spin;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@-webkit-keyframes spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms}.slide.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft}.slide.in{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromright}.slide.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright}.slide.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromleft}.slideup.out{-webkit-animation-name:dontmove;z-index:0}.slideup.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfrombottom;z-index:10}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slideup.out.reverse{-webkit-transform:translateY(100%);z-index:10;-webkit-animation-name:slideouttobottom}.slidedown.out{-webkit-animation-name:dontmove;z-index:0}.slidedown.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfromtop;z-index:10}.slidedown.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slidedown.out.reverse{-webkit-transform:translateY(-100%);z-index:10;-webkit-animation-name:slideouttotop}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(-100%)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(100%)}}@-webkit-keyframes slideinfromtop{from{-webkit-transform:translateY(-100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideinfrombottom{from{-webkit-transform:translateY(100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideouttobottom{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(100%)}}@-webkit-keyframes slideouttotop{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(-100%)}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.out{z-index:0;-webkit-animation-name:fadeout}.fade.in{opacity:1;z-index:10;-webkit-animation-name:fadein}.viewport-flip{-webkit-perspective:1000;position:absolute}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden}.flip{-webkit-animation-duration:.65s;-webkit-backface-visibility:hidden;-webkit-transform:translateX(0)}.flip.out{-webkit-transform:rotateY(-180deg) scale(.8);-webkit-animation-name:flipouttoleft}.flip.in{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromleft}.flip.out.reverse{-webkit-transform:rotateY(180deg) scale(.8);-webkit-animation-name:flipouttoright}.flip.in.reverse{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromright}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(-180deg) scale(.8)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(180deg) scale(.8)}}@-webkit-keyframes dontmove{from{opacity:1}to{opacity:1}}.pop{-webkit-transform-origin:50% 50%}.pop.in{-webkit-transform:scale(1);opacity:1;-webkit-animation-name:popin;z-index:10}.pop.in.reverse{z-index:0;-webkit-animation-name:dontmove}.pop.out.reverse{-webkit-transform:scale(.2);opacity:0;-webkit-animation-name:popout;z-index:10}@-webkit-keyframes popin{from{-webkit-transform:scale(.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.2);opacity:0}}.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d{overflow:hidden}.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left;min-height:1px}.ui-grid-solo .ui-block-a{width:100%;float:none}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:50%}.ui-grid-a .ui-block-a{clear:left}.ui-grid-b .ui-block-a,.ui-grid-b .ui-block-b,.ui-grid-b .ui-block-c{width:33.333%}.ui-grid-b .ui-block-a{clear:left}.ui-grid-c .ui-block-a,.ui-grid-c .ui-block-b,.ui-grid-c .ui-block-c,.ui-grid-c .ui-block-d{width:25%}.ui-grid-c .ui-block-a{clear:left}.ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block-d,.ui-grid-d .ui-block-e{width:20%}.ui-grid-d .ui-block-a{clear:left}.ui-header,.ui-footer,.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{position:absolute;overflow:hidden;width:100%;border-left-width:0;border-right-width:0}.ui-header-fixed,.ui-footer-fixed{z-index:1000;-webkit-transform:translateZ(0)}.ui-footer-duplicate,.ui-page-fullscreen .ui-fixed-inline{display:none}.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{opacity:.9}.ui-navbar{overflow:hidden}.ui-navbar ul,.ui-navbar-expanded ul{list-style:none;padding:0;margin:0;position:relative;display:block;border:0}.ui-navbar-collapsed ul{float:left;width:75%;margin-right:-2px}.ui-navbar-collapsed .ui-navbar-toggle{float:left;width:25%}.ui-navbar li.ui-navbar-truncate{position:absolute;left:-9999px;top:-9999px}.ui-navbar li .ui-btn,.ui-navbar .ui-navbar-toggle .ui-btn{display:block;font-size:12px;text-align:center;margin:0;border-right-width:0}.ui-navbar li .ui-btn{margin-right:-1px}.ui-navbar li .ui-btn:last-child{margin-right:0}.ui-header .ui-navbar li .ui-btn,.ui-header .ui-navbar .ui-navbar-toggle .ui-btn,.ui-footer .ui-navbar li .ui-btn,.ui-footer .ui-navbar .ui-navbar-toggle .ui-btn{border-top-width:0;border-bottom-width:0}.ui-navbar .ui-btn-inner{padding-left:2px;padding-right:2px}.ui-navbar-noicons li .ui-btn .ui-btn-inner,.ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner{padding-top:.8em;padding-bottom:.9em}.ui-navbar-expanded .ui-btn{margin:0;font-size:14px}.ui-navbar-expanded .ui-btn-inner{padding-left:5px;padding-right:5px}.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner{padding:45px 5px 15px;text-align:center}.ui-navbar-expanded .ui-btn-icon-top .ui-icon{top:15px}.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner{padding:15px 5px 45px;text-align:center}.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon{bottom:15px}.ui-navbar-expanded li .ui-btn .ui-btn-inner{min-height:2.5em}.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner{padding-top:1.8em;padding-bottom:1.9em}.ui-btn{display:block;text-align:center;cursor:pointer;position:relative;margin:.5em 5px;padding:0}.ui-header .ui-btn,.ui-footer .ui-btn,.ui-bar .ui-btn{display:inline-block;font-size:13px;margin:0}.ui-btn-inline{display:inline-block}.ui-btn-inner{padding:.6em 25px;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative;zoom:1}.ui-btn input,.ui-btn button{z-index:2}.ui-header .ui-btn-inner,.ui-footer .ui-btn-inner,.ui-bar .ui-btn-inner{padding:.4em 8px .5em}.ui-btn-icon-notext{width:24px;height:24px}.ui-btn-icon-notext .ui-btn-inner{padding:2px 1px 2px 3px}.ui-btn-text{position:relative;z-index:1}.ui-btn-icon-notext .ui-btn-text{position:absolute;left:-9999px}.ui-btn-icon-left .ui-btn-inner{padding-left:33px}.ui-header .ui-btn-icon-left .ui-btn-inner,.ui-footer .ui-btn-icon-left .ui-btn-inner,.ui-bar .ui-btn-icon-left .ui-btn-inner{padding-left:27px}.ui-btn-icon-right .ui-btn-inner{padding-right:33px}.ui-header .ui-btn-icon-right .ui-btn-inner,.ui-footer .ui-btn-icon-right .ui-btn-inner,.ui-bar .ui-btn-icon-right .ui-btn-inner{padding-right:27px}.ui-btn-icon-top .ui-btn-inner{padding-top:33px}.ui-header .ui-btn-icon-top .ui-btn-inner,.ui-footer .ui-btn-icon-top .ui-btn-inner,.ui-bar .ui-btn-icon-top .ui-btn-inner{padding-top:27px}.ui-btn-icon-bottom .ui-btn-inner{padding-bottom:33px}.ui-header .ui-btn-icon-bottom .ui-btn-inner,.ui-footer .ui-btn-icon-bottom .ui-btn-inner,.ui-bar .ui-btn-icon-bottom .ui-btn-inner{padding-bottom:27px}.ui-btn-icon-notext .ui-icon{display:block;z-index:0}.ui-btn-icon-left .ui-icon,.ui-btn-icon-right .ui-icon{position:absolute;top:50%;margin-top:-9px}.ui-btn-icon-top .ui-icon,.ui-btn-icon-bottom .ui-icon{position:absolute;left:50%;margin-left:-9px}.ui-btn-icon-left .ui-icon{left:10px}.ui-btn-icon-right .ui-icon{right:10px}.ui-btn-icon-top .ui-icon{top:10px}.ui-btn-icon-bottom .ui-icon{bottom:10px}.ui-header .ui-btn-icon-left .ui-icon,.ui-footer .ui-btn-icon-left .ui-icon,.ui-bar .ui-btn-icon-left .ui-icon{left:4px}.ui-header .ui-btn-icon-right .ui-icon,.ui-footer .ui-btn-icon-right .ui-icon,.ui-bar .ui-btn-icon-right .ui-icon{right:4px}.ui-header .ui-btn-icon-top .ui-icon,.ui-footer .ui-btn-icon-top .ui-icon,.ui-bar .ui-btn-icon-top .ui-icon{top:4px}.ui-header .ui-btn-icon-bottom .ui-icon,.ui-footer .ui-btn-icon-bottom .ui-icon,.ui-bar .ui-btn-icon-bottom .ui-icon{bottom:4px}.ui-btn-hidden{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-appearance:button;opacity:.1;cursor:pointer;background:#fff;background:rgba(255,255,255,0);filter:Alpha(Opacity=.0001);font-size:1px;border:0;line-height:999px}.ui-collapsible{margin:.5em 0}.ui-collapsible-heading{font-size:16px;display:block;margin:0 -8px;padding:0;border-width:0 0 1px 0;position:relative}.ui-collapsible-heading a{text-align:left;margin:0}.ui-collapsible-heading a .ui-btn-inner{padding-left:40px}.ui-collapsible-heading a span.ui-btn{position:absolute;left:6px;top:50%;margin:-12px 0 0 0;width:20px;height:20px;padding:1px 0 1px 2px;text-indent:-9999px}.ui-collapsible-heading a span.ui-btn .ui-btn-inner{padding:10px 0}.ui-collapsible-heading a span.ui-btn .ui-icon{left:0;margin-top:-10px}.ui-collapsible-heading-status{position:absolute;top:-9999px;left:0}.ui-collapsible-content{display:block;margin:0 -8px;padding:10px 16px;border-top:0;background-image:none;font-weight:normal}.ui-collapsible-content-collapsed{display:none}.ui-collapsible-set{margin:.5em 0}.ui-collapsible-set .ui-collapsible{margin:-1px 0 0}.ui-controlgroup,fieldset.ui-controlgroup{padding:0;margin:.5em 0 1em}.ui-bar .ui-controlgroup{margin:0 .3em}.ui-controlgroup-label{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em}.ui-controlgroup-controls{display:block;width:100%}.ui-controlgroup li{list-style:none}.ui-controlgroup-vertical .ui-btn,.ui-controlgroup-vertical .ui-checkbox,.ui-controlgroup-vertical .ui-radio{margin:0;border-bottom-width:0}.ui-controlgroup-controls label.ui-select{position:absolute;left:-9999px}.ui-controlgroup-vertical .ui-controlgroup-last{border-bottom-width:1px}.ui-controlgroup-horizontal{padding:0}.ui-controlgroup-horizontal .ui-btn,.ui-controlgroup-horizontal .ui-select{display:inline-block;margin:0 -5px 0 0}.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{float:left;margin:0 -1px 0 0}.ui-controlgroup-horizontal .ui-checkbox .ui-btn,.ui-controlgroup-horizontal .ui-radio .ui-btn,.ui-controlgroup-horizontal .ui-checkbox:last-child,.ui-controlgroup-horizontal .ui-radio:last-child{margin-right:0}.ui-controlgroup-horizontal .ui-controlgroup-last{margin-right:0}.ui-controlgroup .ui-checkbox label,.ui-controlgroup .ui-radio label{font-size:16px}@media all and (min-width:450px){.ui-field-contain .ui-controlgroup-label{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-controlgroup-controls{width:60%;display:inline-block}.ui-field-contain .ui-controlgroup .ui-select{width:100%}.ui-field-contain .ui-controlgroup-horizontal .ui-select{width:auto}}.ui-dialog{min-height:480px}.ui-dialog .ui-header,.ui-dialog .ui-content,.ui-dialog .ui-footer{max-width:500px;margin:10% auto 15px auto;width:85%;position:relative}.ui-dialog .ui-header,.ui-dialog .ui-footer{padding:0 15px;z-index:10}.ui-dialog .ui-content{padding:15px}.ui-dialog .ui-content,.ui-dialog .ui-footer{margin-top:-15px}.ui-checkbox,.ui-radio{position:relative;margin:.2em 0 .5em;z-index:1}.ui-checkbox .ui-btn,.ui-radio .ui-btn{margin:0;text-align:left;z-index:2}.ui-checkbox .ui-btn-inner,.ui-radio .ui-btn-inner{white-space:normal}.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner{padding-left:45px}.ui-checkbox .ui-btn-icon-right .ui-btn-inner,.ui-radio .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-checkbox .ui-icon,.ui-radio .ui-icon{top:1.1em}.ui-checkbox .ui-btn-icon-left .ui-icon,.ui-radio .ui-btn-icon-left .ui-icon{left:15px}.ui-checkbox .ui-btn-icon-right .ui-icon,.ui-radio .ui-btn-icon-right .ui-icon{right:15px}.ui-checkbox input,.ui-radio input{position:absolute;left:20px;top:50%;width:10px;height:10px;margin:-5px 0 0 0;outline:0!important;z-index:1}.ui-field-contain{padding:1.5em 0;margin:0;border-bottom-width:1px;overflow:visible}.ui-field-contain:first-child{border-top-width:0}@media all and (min-width:450px){.ui-field-contain{border-width:0;padding:0;margin:1em 0}}.ui-select{display:block;position:relative}.ui-select select{position:absolute;left:-9999px;top:-9999px}.ui-select .ui-btn{overflow:hidden}.ui-select .ui-btn{opacity:1}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:button;left:0;top:0;width:100%;min-height:1.5em;min-height:100%;height:3em;max-height:100%;opacity:0;-ms-filter:"alpha(opacity=0)";filter:alpha(opacity=0);z-index:2}.ui-select .ui-disabled{opacity:.3}@-moz-document url-prefix(){.ui-select .ui-btn select{opacity:.0001}}.ui-select .ui-btn select.ui-select-nativeonly{opacity:1;text-indent:0}.ui-select .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}label.ui-select{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:block;min-height:1em;overflow:hidden}.ui-select .ui-btn-text{text-overflow:ellipsis}.ui-selectmenu{position:absolute;padding:0;z-index:1100!important;width:80%;max-width:350px;padding:6px}.ui-selectmenu .ui-listview{margin:0}.ui-selectmenu .ui-btn.ui-li-divider{cursor:default}.ui-selectmenu-hidden{top:-9999px;left:-9999px}.ui-selectmenu-screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:99}.ui-screen-hidden,.ui-selectmenu-list .ui-li .ui-icon{display:none}.ui-selectmenu-list .ui-li .ui-icon{display:block}.ui-li.ui-selectmenu-placeholder{display:none}.ui-selectmenu .ui-header .ui-title{margin:.6em 46px .8em}@media all and (min-width:450px){.ui-field-contain label.ui-select{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-select{width:60%;display:inline-block}}.ui-selectmenu .ui-header h1:after{content:'.';visibility:hidden}label.ui-input-text{font-size:16px;line-height:1.4;display:block;font-weight:normal;margin:0 0 .3em}input.ui-input-text,textarea.ui-input-text{background-image:none;padding:.4em;line-height:1.4;font-size:16px;display:block;width:97%}input.ui-input-text{-webkit-appearance:none}textarea.ui-input-text{height:50px;-webkit-transition:height 200ms linear;-moz-transition:height 200ms linear;-o-transition:height 200ms linear;transition:height 200ms linear}.ui-input-search{padding:0 30px;background-image:none;position:relative}.ui-icon-searchfield:after{position:absolute;left:7px;top:50%;margin-top:-9px;content:"";width:18px;height:18px;opacity:.5}.ui-input-search input.ui-input-text{border:0;width:98%;padding:.4em 0;margin:0;display:block;background:transparent none;outline:0!important}.ui-input-search .ui-input-clear{position:absolute;right:0;top:50%;margin-top:-13px}.ui-input-search .ui-input-clear-hidden{display:none}@media all and (min-width:450px){.ui-field-contain label.ui-input-text{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain input.ui-input-text,.ui-field-contain textarea.ui-input-text,.ui-field-contain .ui-input-search{width:60%;display:inline-block}.ui-field-contain .ui-input-search{width:50%}.ui-hide-label input.ui-input-text,.ui-hide-label textarea.ui-input-text,.ui-hide-label .ui-input-search{padding:.4em;width:97%}.ui-input-search input.ui-input-text{width:98%}}.ui-listview{margin:0;counter-reset:listnumbering}.ui-content .ui-listview{margin:-15px}.ui-content .ui-listview-inset{margin:1em 0}.ui-listview,.ui-li{list-style:none;padding:0}.ui-li,.ui-li.ui-field-contain{display:block;margin:0;position:relative;overflow:visible;text-align:left;border-width:0;border-top-width:1px}.ui-li .ui-btn-text a.ui-link-inherit{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-divider,.ui-li-static{padding:.5em 15px;font-size:14px;font-weight:bold}.ui-li-divider{counter-reset:listnumbering}ol.ui-listview .ui-link-inherit:before,ol.ui-listview .ui-li-static:before,.ui-li-dec{font-size:.8em;display:inline-block;padding-right:.3em;font-weight:normal;counter-increment:listnumbering;content:counter(listnumbering) ". "}ol.ui-listview .ui-li-jsnumbering:before{content:""!important}.ui-listview-inset .ui-li{border-right-width:1px;border-left-width:1px}.ui-li:last-child,.ui-li.ui-field-contain:last-child{border-bottom-width:1px}.ui-li>.ui-btn-inner{display:block;position:relative;padding:0}.ui-li .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li{padding:.7em 15px .7em 15px;display:block}.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-thumb{min-height:60px;padding-left:100px}.ui-li-has-icon .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-icon{min-height:20px;padding-left:40px}.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-count{padding-right:45px}.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow{padding-right:30px}.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow.ui-li-has-count{padding-right:75px}.ui-li-has-count .ui-btn-text{padding-right:15px}.ui-li-heading{font-size:16px;font-weight:bold;display:block;margin:.6em 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-desc{font-size:12px;font-weight:normal;display:block;margin:-.5em 0 .6em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-thumb,.ui-listview .ui-li-icon{position:absolute;left:1px;top:0;max-height:80px;max-width:80px}.ui-listview .ui-li-icon{max-height:40px;max-width:40px;left:10px;top:.9em}.ui-li-thumb,.ui-listview .ui-li-icon,.ui-li-content{float:left;margin-right:10px}.ui-li-aside{float:right;width:50%;text-align:right;margin:.3em 0}@media all and (min-width:480px){.ui-li-aside{width:45%}}.ui-li-divider{cursor:default}.ui-li-has-alt .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-alt{padding-right:95px}.ui-li-has-count .ui-li-count{position:absolute;font-size:11px;font-weight:bold;padding:.2em .5em;top:50%;margin-top:-.9em;right:38px}.ui-li-divider .ui-li-count,.ui-li-static .ui-li-count{right:10px}.ui-li-has-alt .ui-li-count{right:55px}.ui-li-link-alt{position:absolute;width:40px;height:100%;border-width:0;border-left-width:1px;top:0;right:0;margin:0;padding:0;z-index:2}.ui-li-link-alt .ui-btn{overflow:hidden;position:absolute;right:8px;top:50%;margin:-11px 0 0 0;border-bottom-width:1px;z-index:-1}.ui-li-link-alt .ui-btn-inner{padding:0;height:100%;position:absolute;width:100%;top:0;left:0}.ui-li-link-alt .ui-btn .ui-icon{right:50%;margin-right:-9px}.ui-listview * .ui-btn-inner>.ui-btn>.ui-btn-inner{border-top:0}.ui-listview-filter{border-width:0;overflow:hidden;margin:-15px -15px 15px -15px}.ui-listview-filter .ui-input-search{margin:5px;width:auto;display:block}.ui-listview-filter-inset{margin:-15px -5px -15px -5px;background:transparent}.ui-li.ui-screen-hidden{display:none}@media only screen and (min-device-width:768px) and (max-device-width:1024px){.ui-li .ui-btn-text{overflow:visible}}label.ui-slider{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}input.ui-slider-input,.ui-field-contain input.ui-slider-input{display:inline-block;width:50px}select.ui-slider-switch{display:none}div.ui-slider{position:relative;display:inline-block;overflow:visible;height:15px;padding:0;margin:0 2% 0 20px;top:4px;width:60%}div.ui-slider-switch{width:99.8%}a.ui-slider-handle{position:absolute;z-index:10;top:50%;width:28px;height:28px;margin-top:-15px;margin-left:-15px}a.ui-slider-handle .ui-btn-inner{padding-left:0;padding-right:0}@media all and (min-width:480px){.ui-field-contain label.ui-slider{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain div.ui-slider{width:43%}}div.ui-slider-switch{height:32px;overflow:hidden;margin-left:0}div.ui-slider-inneroffset{margin-left:50%;position:absolute;top:1px;height:100%;width:50%}a.ui-slider-handle-snapping{-webkit-transition:left 70ms linear}div.ui-slider-labelbg{position:absolute;top:0;margin:0;border-width:0}div.ui-slider-switch div.ui-slider-labelbg-a{width:60%;height:100%;left:0}div.ui-slider-switch div.ui-slider-labelbg-b{width:60%;height:100%;right:0}.ui-slider-switch-a div.ui-slider-labelbg-a,.ui-slider-switch-b div.ui-slider-labelbg-b{z-index:-1}.ui-slider-switch-a div.ui-slider-labelbg-b,.ui-slider-switch-b div.ui-slider-labelbg-a{z-index:0}div.ui-slider-switch a.ui-slider-handle{z-index:20;width:101%;height:32px;margin-top:-18px;margin-left:-101%}span.ui-slider-label{width:100%;position:absolute;height:32px;font-size:16px;text-align:center;line-height:2;background:0;border-color:transparent}span.ui-slider-label-a{left:-100%;margin-right:-1px}span.ui-slider-label-b{right:-100%;margin-left:-1px} diff --git a/applications/admin/static/plugin_jqmobile/jquery.mobile-1.0.min.js b/applications/admin/static/plugin_jqmobile/jquery.mobile-1.0.min.js deleted file mode 100644 index 70e3eb3f..00000000 --- a/applications/admin/static/plugin_jqmobile/jquery.mobile-1.0.min.js +++ /dev/null @@ -1,173 +0,0 @@ -/*! jQuery Mobile v1.0 jquerymobile.com | jquery.org/license */ -(function(a,e){if(a.cleanData){var b=a.cleanData;a.cleanData=function(f){for(var c=0,h;(h=f[c])!=null;c++)a(h).triggerHandler("remove");b(f)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){a(this).triggerHandler("remove")});return d.call(a(this),b,c)})}}a.widget=function(b,c,h){var d=b.split(".")[0],e,b=b.split(".")[1];e=d+"-"+b;if(!h)h=c,c=a.Widget;a.expr[":"][e]=function(c){return!!a.data(c, -b)};a[d]=a[d]||{};a[d][b]=function(a,b){arguments.length&&this._createWidget(a,b)};c=new c;c.options=a.extend(true,{},c.options);a[d][b].prototype=a.extend(true,c,{namespace:d,widgetName:b,widgetEventPrefix:a[d][b].prototype.widgetEventPrefix||b,widgetBaseClass:e},h);a.widget.bridge(b,a[d][b])};a.widget.bridge=function(b,c){a.fn[b]=function(d){var g=typeof d==="string",i=Array.prototype.slice.call(arguments,1),k=this,d=!g&&i.length?a.extend.apply(null,[true,d].concat(i)):d;if(g&&d.charAt(0)==="_")return k; -g?this.each(function(){var c=a.data(this,b);if(!c)throw"cannot call methods on "+b+" prior to initialization; attempted to call method '"+d+"'";if(!a.isFunction(c[d]))throw"no such method '"+d+"' for "+b+" widget instance";var g=c[d].apply(c,i);if(g!==c&&g!==e)return k=g,false}):this.each(function(){var e=a.data(this,b);e?e.option(d||{})._init():a.data(this,b,new c(d,this))});return k}};a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)};a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"", -options:{disabled:false},_createWidget:function(b,c){a.data(c,this.widgetName,this);this.element=a(c);this.options=a.extend(true,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){var b={};a.metadata&&(b=a.metadata.get(element)[this.widgetName]);return b},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName); -this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(b,c){var d=b;if(arguments.length===0)return a.extend({},this.options);if(typeof b==="string"){if(c===e)return this.options[b];d={};d[b]=c}this._setOptions(d);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b;a==="disabled"&& -this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(b,c,d){var e=this.options[b],c=a.Event(c);c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase();d=d||{};if(c.originalEvent)for(var b=a.event.props.length,i;b;)i=a.event.props[--b],c[i]=c.originalEvent[i];this.element.trigger(c, -d);return!(a.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); -(function(a,e){a.widget("mobile.widget",{_createWidget:function(){a.Widget.prototype._createWidget.apply(this,arguments);this._trigger("init")},_getCreateOptions:function(){var b=this.element,d={};a.each(this.options,function(a){var c=b.jqmData(a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}));c!==e&&(d[a]=c)});return d},enhanceWithin:function(b){var d=a(b).closest(":jqmData(role='page')").data("page"),d=d&&d.keepNativeSelector()||"";a(this.options.initSelector,b).not(d)[this.widgetName]()}})})(jQuery); -(function(a){a(window);var e=a("html");a.mobile.media=function(){var b={},d=a("
"),f=a("").append(d);return function(a){if(!(a in b)){var h=document.createElement("style"),g="@media "+a+" { #jquery-mediatest { position:absolute; } }";h.type="text/css";h.styleSheet?h.styleSheet.cssText=g:h.appendChild(document.createTextNode(g));e.prepend(f).prepend(h);b[a]=d.css("position")==="absolute";f.add(h).remove()}return b[a]}}()})(jQuery); -(function(a,e){function b(a){var b=a.charAt(0).toUpperCase()+a.substr(1),a=(a+" "+c.join(b+" ")+b).split(" "),d;for(d in a)if(f[a[d]]!==e)return true}var d=a("").prependTo("html"),f=d[0].style,c=["Webkit","Moz","O"],h="palmGetResource"in window,g=window.operamini&&{}.toString.call(window.operamini)==="[object OperaMini]",i=window.blackberry;a.mobile.browser={};a.mobile.browser.ie=function(){for(var a=3,b=document.createElement("div"),c=b.all||[];b.innerHTML="<\!--[if gt IE "+ ++a+"]>
", -c[0];);return a>4?a:!a}();a.extend(a.support,{orientation:"orientation"in window&&"onorientationchange"in window,touch:"ontouchend"in document,cssTransitions:"WebKitTransitionEvent"in window,pushState:"pushState"in history&&"replaceState"in history,mediaquery:a.mobile.media("only all"),cssPseudoElement:!!b("content"),touchOverflow:!!b("overflowScrolling"),boxShadow:!!b("boxShadow")&&!i,scrollTop:("pageXOffset"in window||"scrollTop"in document.documentElement||"scrollTop"in d[0])&&!h&&!g,dynamicBaseTag:function(){var b= -location.protocol+"//"+location.host+location.pathname+"ui-dir/",c=a("head base"),f=null,e="",h;c.length?e=c.attr("href"):c=f=a("",{href:b}).appendTo("head");h=a("").prependTo(d)[0].href;c[0].href=e||location.pathname;f&&f.remove();return h.indexOf(b)===0}()});d.remove();h=function(){var a=window.navigator.userAgent;return a.indexOf("Nokia")>-1&&(a.indexOf("Symbian/3")>-1||a.indexOf("Series60/5")>-1)&&a.indexOf("AppleWebKit")>-1&&a.match(/(BrowserNG|NokiaBrowser)\/7\.[0-3]/)}(); -a.mobile.ajaxBlacklist=window.blackberry&&!window.WebKitPoint||g||h;h&&a(function(){a("head link[rel='stylesheet']").attr("rel","alternate stylesheet").attr("rel","stylesheet")});a.support.boxShadow||a("html").addClass("ui-mobile-nosupport-boxshadow")})(jQuery); -(function(a,e,b,d){function f(a){for(;a&&typeof a.originalEvent!=="undefined";)a=a.originalEvent;return a}function c(b){for(var c={},f,d;b;){f=a.data(b,n);for(d in f)if(f[d])c[d]=c.hasVirtualBinding=true;b=b.parentNode}return c}function h(){v&&(clearTimeout(v),v=0);v=setTimeout(function(){E=v=0;u.length=0;D=false;y=true},a.vmouse.resetTimerDuration)}function g(b,c,r){var e,h;if(!(h=r&&r[b])){if(r=!r)a:{for(r=c.target;r;){if((h=a.data(r,n))&&(!b||h[b]))break a;r=r.parentNode}r=null}h=r}if(h){e=c;var r= -e.type,j,g;e=a.Event(e);e.type=b;h=e.originalEvent;j=a.event.props;if(h)for(g=j.length;g;)b=j[--g],e[b]=h[b];if(r.search(/mouse(down|up)|click/)>-1&&!e.which)e.which=1;if(r.search(/^touch/)!==-1&&(b=f(h),r=b.touches,b=b.changedTouches,r=r&&r.length?r[0]:b&&b.length?b[0]:d))for(h=0,len=z.length;he||Math.abs(d.pageY- -t)>e;flags=c(b.target);w&&!r&&g("vmousecancel",b,flags);g("vmousemove",b,flags);h()}}function m(a){if(!y){y=true;var b=c(a.target),d;g("vmouseup",a,b);if(!w&&(d=g("vclick",a,b))&&d.isDefaultPrevented())d=f(a).changedTouches[0],u.push({touchID:E,x:d.clientX,y:d.clientY}),D=true;g("vmouseout",a,b);w=false;h()}}function p(b){var b=a.data(b,n),c;if(b)for(c in b)if(b[c])return true;return false}function j(){}function q(b){var c=b.substr(1);return{setup:function(){p(this)||a.data(this,n,{});a.data(this, -n)[b]=true;s[b]=(s[b]||0)+1;s[b]===1&&B.bind(c,i);a(this).bind(c,j);if(C)s.touchstart=(s.touchstart||0)+1,s.touchstart===1&&B.bind("touchstart",k).bind("touchend",m).bind("touchmove",o).bind("scroll",l)},teardown:function(){--s[b];s[b]||B.unbind(c,i);C&&(--s.touchstart,s.touchstart||B.unbind("touchstart",k).unbind("touchmove",o).unbind("touchend",m).unbind("scroll",l));var d=a(this),f=a.data(this,n);f&&(f[b]=false);d.unbind(c,j);p(this)||d.removeData(n)}}}var n="virtualMouseBindings",A="virtualTouchID", -e="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),z="clientX clientY pageX pageY screenX screenY".split(" "),s={},v=0,x=0,t=0,w=false,u=[],D=false,y=false,C="addEventListener"in b,B=a(b),r=1,E=0;a.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10,resetTimerDuration:1500};for(var F=0;Fa.event.special.swipe.scrollSupressionThreshold&& -b.preventDefault()}}var e=c.originalEvent.touches?c.originalEvent.touches[0]:c,m={time:(new Date).getTime(),coords:[e.pageX,e.pageY],origin:a(c.target)},p;d.bind(g,f).one(h,function(){d.unbind(g,f);m&&p&&p.time-m.timea.event.special.swipe.horizontalDistanceThreshold&&Math.abs(m.coords[1]-p.coords[1])p.coords[0]?"swipeleft":"swiperight"); -m=p=b})})}};(function(a,b){function c(){var a=f();a!==e&&(e=a,d.trigger("orientationchange"))}var d=a(b),f,e;a.event.special.orientationchange={setup:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;e=f();d.bind("throttledresize",c)},teardown:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;d.unbind("throttledresize",c)},add:function(a){var b=a.handler;a.handler=function(a){a.orientation=f();return b.apply(this,arguments)}}};a.event.special.orientationchange.orientation= -f=function(){var c=true,c=document.documentElement;return(c=a.support.orientation?b.orientation%180==0:c&&c.clientWidth/c.clientHeight<1.1)?"portrait":"landscape"}})(jQuery,e);(function(){a.event.special.throttledresize={setup:function(){a(this).bind("resize",b)},teardown:function(){a(this).unbind("resize",b)}};var b=function(){f=(new Date).getTime();e=f-c;e>=250?(c=f,a(this).trigger("throttledresize")):(d&&clearTimeout(d),d=setTimeout(b,250-e))},c=0,d,f,e})();a.each({scrollstop:"scrollstart",taphold:"tap", -swipeleft:"swipe",swiperight:"swipe"},function(b,c){a.event.special[b]={setup:function(){a(this).bind(c,a.noop)}}})})(jQuery,this); -(function(a,e,b){function d(a){a=a||location.href;return"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var f="hashchange",c=document,h,g=a.event.special,i=c.documentMode,k="on"+f in e&&(i===b||i>7);a.fn[f]=function(a){return a?this.bind(f,a):this.trigger(f)};a.fn[f].delay=50;g[f]=a.extend(g[f],{setup:function(){if(k)return false;a(h.start)},teardown:function(){if(k)return false;a(h.stop)}});h=function(){function h(){var b=d(),c=n(p);if(b!==p)q(p=b,c),a(e).trigger(f);else if(c!==p)location.href=location.href.replace(/#.*/, -"")+c;i=setTimeout(h,a.fn[f].delay)}var g={},i,p=d(),j=function(a){return a},q=j,n=j;g.start=function(){i||h()};g.stop=function(){i&&clearTimeout(i);i=b};a.browser.msie&&!k&&function(){var b,e;g.start=function(){if(!b)e=(e=a.fn[f].src)&&e+d(),b=a(' +

web2py plugin

for jQuery Mobile

From 668658b7c9fa5c64392ad0689f76d4a5742ccbcf Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 7 Oct 2012 01:07:49 -0500 Subject: [PATCH 18/29] zombie dal is here, should fix scheduler problems while retaining Row/Rows serialization --- VERSION | 2 +- gluon/dal.py | 76 +++++++++++++++++++++++++++++----------------------- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/VERSION b/VERSION index 80b4bad6..955078f0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-05 10:38:54) dev +Version 2.0.9 (2012-10-07 01:07:45) dev diff --git a/gluon/dal.py b/gluon/dal.py index 1479de68..f9446456 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -177,9 +177,9 @@ CALLABLETYPES = (types.LambdaType, types.FunctionType, types.MethodType, types.BuiltinMethodType) TABLE_ARGS = set( - ('migrate','primarykey','fake_migrate','format', + ('migrate','primarykey','fake_migrate','format','redefine', 'singular','plural','trigger_name','sequence_name', - 'common_filter','polymodel','table_class','on_define')) + 'common_filter','polymodel','table_class','on_define',)) SELECT_ARGS = set( ('orderby', 'groupby', 'limitby','required', 'cache', 'left', @@ -521,11 +521,11 @@ class ConnectionPool(object): @staticmethod def close_all_instances(action): """ to close cleanly databases in a multithreaded environment """ - dbs = getattr(THREAD_LOCAL,'db_instances',{}).items() - for singleton_code, db in dbs: - if hasattr(db,'_adapter'): + db_group = getattr(THREAD_LOCAL,'db_instances',{}).items() + for db_uid, db_group in dbs: + for db in db_group: db._adapter.close(action) - del THREAD_LOCAL.db_instances[singleton_code] + del THREAD_LOCAL.db_instances[db_uid] if callable(action): action(None) return @@ -6585,23 +6585,31 @@ class DAL(object): """ def __new__(cls, uri='sqlite://dummy.db', *args, **kwargs): - if uri==None and not 'singleton_code' in kwargs: - # this deal with the special case of Dummy DAL for SQLFORM.factory - return super(DAL, cls).__new__(cls) if not hasattr(THREAD_LOCAL,'db_instances'): THREAD_LOCAL.db_instances = {} - if 'singleton_code' in kwargs: - singleton_code = kwargs['singleton_code'] - del kwargs['singleton_code'] - singleton_code = hashlib.md5(repr(uri)).hexdigest() - try: - db = THREAD_LOCAL.db_instances[singleton_code] - if args or kwargs: - raise RuntimeError, 'Cannot duplicate a Singleton' - except KeyError: - db = super(DAL, cls).__new__(cls) - THREAD_LOCAL.db_instances[singleton_code] = db - db._singleton_code = singleton_code + if not hasattr(THREAD_LOCAL,'db_instances_zombie'): + THREAD_LOCAL.db_instances_zombie = {} + if uri == '': + db_uid = kwargs['db_uid'] # a zombie must have a db_uid! + if db_uid in THREAD_LOCAL.db_instances: + db_group = THREAD_LOCAL.db_instances[db_uid] + db = db_group[-1] + elif db_uid in THREAD_LOCAL.db_instances_zombie: + db = THREAD_LOCAL.db_instances_zombie[db_uid] + else: + db = super(DAL, cls).__new__(cls) + THREAD_LOCAL.db_instances_zombie[db_uid] = db + else: + db_uid = kwargs.get('db_uid',hashlib.md5(repr(uri)).hexdigest()) + if db_uid in THREAD_LOCAL.db_instances_zombie: + db = THREAD_LOCAL.db_instances_zombie[db_uid] + del THREAD_LOCAL.db_instances_zombie[db_uid] + else: + db = super(DAL, cls).__new__(cls) + db_group = THREAD_LOCAL.db_instances.get(db_uid,[]) + db_group.append(db) + THREAD_LOCAL.db_instances[db_uid] = db_group + db._db_uid = db_uid return db @staticmethod @@ -6657,7 +6665,7 @@ class DAL(object): decode_credentials=False, driver_args=None, adapter_args=None, attempts=5, auto_import=False, bigint_id=False,debug=False,lazy_tables=False, - singleton_code=None): + db_uid=None): """ Creates a new Database Abstraction Layer instance. @@ -6685,7 +6693,7 @@ class DAL(object): :attempts (defaults to 5). Number of times to attempt connecting """ - if hasattr(self,'_adapter') or uri=='': return + if uri == '' and db_uid is not None: return if not decode_credentials: credential_decoder = lambda cred: cred @@ -7035,8 +7043,8 @@ def index(): if not isinstance(tablename,str): raise SyntaxError, "missing table name" elif hasattr(self,tablename) or tablename in self.tables: - pass - # raise SyntaxError, 'table may be already defined: %s' % tablename + if not args.get('redefine',False): + raise SyntaxError, 'table already defined: %s' % tablename elif tablename.startswith('_') or hasattr(self,tablename) or \ REGEX_PYTHON_KEYWORDS.match(tablename): raise SyntaxError, 'invalid table name: %s' % tablename @@ -7133,7 +7141,7 @@ def index(): if hasattr(self,'_uri'): return '' % hide_password(str(self._uri)) else: - return '' % self._singleton_code + return '' % self._db_uid def smart_query(self,fields,text): return Set(self, smart_query(fields,text)) @@ -7152,10 +7160,12 @@ def index(): self._adapter.rollback() def close(self): - adapter = self._adapter - if self._singleton_code in THREAD_LOCAL.db_instances: - del THREAD_LOCAL.db_instances[self._singleton_code] - adapter.close() + self._adapter.close() + if self._db_uid in THREAD_LOCAL.db_instances: + db_group = THREAD_LOCAL.db_instances[self._db_uid] + db_group.remove(self) + if not db_group: + del THREAD_LOCAL.db_instances[self._db_uid] def executesql(self, query, placeholders=None, as_dict=False, fields=None, colnames=None): @@ -7284,11 +7294,11 @@ def index(): self[tablename].import_from_csv_file( ifile, id_map, null, unique, id_offset, *args, **kwargs) -def DAL_unpickler(singleton_code): - return DAL('',singleton_code=singleton_code) +def DAL_unpickler(db_uid): + return DAL('',db_uid=db_uid) def DAL_pickler(db): - return DAL_unpickler, (db._singleton_code,) + return DAL_unpickler, (db._db_uid,) copy_reg.pickle(DAL, DAL_pickler, DAL_unpickler) From e1bb2b4556352612a8f0386373d23e49f3e138c4 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 7 Oct 2012 01:10:08 -0500 Subject: [PATCH 19/29] db.define_table(...,redefine=True) --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 955078f0..8b5dbfca 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-07 01:07:45) dev +Version 2.0.9 (2012-10-07 01:10:05) dev From db9151b993a1b8eb59b5de06717d2f1ca61e5684 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 7 Oct 2012 10:11:10 -0500 Subject: [PATCH 20/29] fixed routes example, issue 1073 --- VERSION | 2 +- routes.example.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 8b5dbfca..60c53d20 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-07 01:10:05) dev +Version 2.0.9 (2012-10-07 10:11:06) dev diff --git a/routes.example.py b/routes.example.py index 3fb1f1f8..a12f7fca 100644 --- a/routes.example.py +++ b/routes.example.py @@ -35,11 +35,11 @@ BASE = '' # optonal prefix for incoming URLs routes_in = ( # do not reroute admin unless you want to disable it - (BASE+'/admin/?$anything','/admin/$anything'), + (BASE+'/admin/$anything','/admin/$anything'), # do not reroute appadmin unless you want to disable it - (BASE+'/$app/appadmin/?$anything','/$app/appadmin/$anything'), + (BASE+'/$app/appadmin/$anything','/$app/appadmin/$anything'), # do not reroute static files - (BASE+'/$app/static/?$anything','/$app/static/$anything'), + (BASE+'/$app/static/$anything','/$app/static/$anything'), # reroute favicon and robots, use exable for lack of better choice ('/favicon.ico', '/examples/static/favicon.ico'), ('/robots.txt', '/examples/static/robots.txt'), @@ -55,7 +55,7 @@ routes_in = ( routes_out = ( # do not reroute admin unless you want to disable it - ('/admin/$anything', BASE+'/admin/?$anything'), + ('/admin/$anything', BASE+'/admin/$anything'), # do not reroute appadmin unless you want to disable it ('/$app/appadmin/$anything',BASE+'/$app/appadmin/$anything'), # do not reroute static files From 952a29d5da61186c96f03884cca66e34e6e3e07a Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 7 Oct 2012 10:12:04 -0500 Subject: [PATCH 21/29] fixed routes example, issue 1073 --- VERSION | 2 +- routes.example.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 60c53d20..65ead914 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-07 10:11:06) dev +Version 2.0.9 (2012-10-07 10:12:01) dev diff --git a/routes.example.py b/routes.example.py index a12f7fca..f44d05bf 100644 --- a/routes.example.py +++ b/routes.example.py @@ -35,8 +35,10 @@ BASE = '' # optonal prefix for incoming URLs routes_in = ( # do not reroute admin unless you want to disable it + (BASE+'/admin','/admin/default/index'), (BASE+'/admin/$anything','/admin/$anything'), # do not reroute appadmin unless you want to disable it + (BASE+'/$app/appadmin','/$app/appadmin/index'), (BASE+'/$app/appadmin/$anything','/$app/appadmin/$anything'), # do not reroute static files (BASE+'/$app/static/$anything','/$app/static/$anything'), From 62be48decf4e87785b20741f574b616871cd3667 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 7 Oct 2012 10:13:20 -0500 Subject: [PATCH 22/29] fixed issue 1072 --- VERSION | 2 +- gluon/dal.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 65ead914..8199c90a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-07 10:12:01) dev +Version 2.0.9 (2012-10-07 10:13:16) dev diff --git a/gluon/dal.py b/gluon/dal.py index f9446456..676dbf22 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -521,7 +521,7 @@ class ConnectionPool(object): @staticmethod def close_all_instances(action): """ to close cleanly databases in a multithreaded environment """ - db_group = getattr(THREAD_LOCAL,'db_instances',{}).items() + dbs = getattr(THREAD_LOCAL,'db_instances',{}).items() for db_uid, db_group in dbs: for db in db_group: db._adapter.close(action) From 09f29257d2e5e7e983d4fad4fc6909cf10602225 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 7 Oct 2012 10:48:37 -0500 Subject: [PATCH 23/29] fixed issue 1074, thanks mjmare --- VERSION | 2 +- logging.example.conf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 8199c90a..a24aba7a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-07 10:13:16) dev +Version 2.0.9 (2012-10-07 10:48:33) dev diff --git a/logging.example.conf b/logging.example.conf index 892e242d..f8411e39 100644 --- a/logging.example.conf +++ b/logging.example.conf @@ -76,8 +76,8 @@ propagate=0 # welcome app handler [logger_welcome] level=WARNING -qualname=web2py.app.welcome,rotatingFileHandler -handlers=consoleHandler +qualname=web2py.app.welcome +handlers=consoleHandler,rotatingFileHandler propagate=0 # loggers for legacy getLogger calls: Rocket and markdown From 2b21678d480a83e7324c78c26f65f6fb6743dfa7 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 7 Oct 2012 13:31:02 -0500 Subject: [PATCH 24/29] clearing zombie list. Should not be necessary but what the heck --- VERSION | 2 +- gluon/dal.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index a24aba7a..daf39b00 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-07 10:48:33) dev +Version 2.0.9 (2012-10-07 13:30:56) dev diff --git a/gluon/dal.py b/gluon/dal.py index 676dbf22..a3656a9f 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -1,3 +1,4 @@ + #!/bin/env python # -*- coding: utf-8 -*- @@ -525,7 +526,8 @@ class ConnectionPool(object): for db_uid, db_group in dbs: for db in db_group: db._adapter.close(action) - del THREAD_LOCAL.db_instances[db_uid] + THREAD_LOCAL.db_instances.clear() + THREAD_LOCAL.db_instances_zombie.clear() if callable(action): action(None) return From a3ba3f662ab76c617101be41f3825b5d19455a5c Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 7 Oct 2012 22:45:38 -0500 Subject: [PATCH 25/29] 2.1.0rc1 --- CHANGELOG | 25 ++++++++++++++++++++++++- Makefile | 2 +- VERSION | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 31b821fc..8a8548d1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,27 @@ -## 2.00.1 +## 2.1.0 + +- if apps are accidentally deleted there is copy left in deposit folder +- db.table.field.epoch() counts seconds from epoch +- fixed many aith.wiki problems +- better welcome layout, thanks Paolo +- db.define_table(...,redefine=True) +- DAL, Row, and Rows object can now be pickled/unpickled, thanks to zombie DAL. +- admin uses codemirror +- support for auth.wiki(render='html') +- upgraded jQuery 1.8 +- upgraded Bootstrap 2.1 +- fixed problem with dropbox_account.py +- cache.with_prefix(cache.ram,'prefix') +- mail.send(...,sender='Mr X <%(sender)s>') +- allow entropy computation in IS_STRONG and web2py.js, thanks Jonathan and Niphlod +- renamed luon/contrib/comet_messaging.py -> gluon/contrib/websocket_messaging.py +- DAL support for SQL CASE, example: db().select(...query.case('true','false)) +- faster web2py_uuid() and request initialization logic, thanks Michele +- static asset management, thanks Niphlod +- improved mobile admin +- request.requires_https and Auth(secure=True), thanks Yarin and Niphlod + +## 2.0.1-11 ### DAL Improvements diff --git a/Makefile b/Makefile index 3193225d..dccf6874 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ update: wget -O gluon/contrib/simplejsonrpc.py http://rad2py.googlecode.com/hg/ide2py/simplejsonrpc.py echo "remember that pymysql was tweaked" src: - echo 'Version 2.0.9 ('`date +%Y-%m-%d\ %H:%M:%S`') dev' > VERSION + echo 'Version 2.1.0rc1 ('`date +%Y-%m-%d\ %H:%M:%S`') dev' > VERSION ### rm -f all junk files make clean ### clean up baisc apps diff --git a/VERSION b/VERSION index daf39b00..b34fd84c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.0.9 (2012-10-07 13:30:56) dev +Version 2.1.0rc1 (2012-10-07 22:45:34) dev From 03e3324a124ba0d7d4a0bd7b2bfad3e1e7e3d021 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Mon, 8 Oct 2012 09:15:33 -0500 Subject: [PATCH 26/29] removed rc1 --- Makefile | 2 +- VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index dccf6874..0a7acd84 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ update: wget -O gluon/contrib/simplejsonrpc.py http://rad2py.googlecode.com/hg/ide2py/simplejsonrpc.py echo "remember that pymysql was tweaked" src: - echo 'Version 2.1.0rc1 ('`date +%Y-%m-%d\ %H:%M:%S`') dev' > VERSION + echo 'Version 2.1.0 ('`date +%Y-%m-%d\ %H:%M:%S`') dev' > VERSION ### rm -f all junk files make clean ### clean up baisc apps diff --git a/VERSION b/VERSION index b34fd84c..5558fc54 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.1.0rc1 (2012-10-07 22:45:34) dev +Version 2.1.0 (2012-10-08 09:15:27) dev From 8e67c551def6edbe515bffba192af43cdeba42ce Mon Sep 17 00:00:00 2001 From: mdipierro Date: Mon, 8 Oct 2012 11:03:21 -0500 Subject: [PATCH 27/29] fixed problem with close all instances when no instances --- VERSION | 2 +- gluon/dal.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 5558fc54..3a8cf3d9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.1.0 (2012-10-08 09:15:27) dev +Version 2.1.0 (2012-10-08 11:03:17) dev diff --git a/gluon/dal.py b/gluon/dal.py index a3656a9f..b1a7f184 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -526,8 +526,8 @@ class ConnectionPool(object): for db_uid, db_group in dbs: for db in db_group: db._adapter.close(action) - THREAD_LOCAL.db_instances.clear() - THREAD_LOCAL.db_instances_zombie.clear() + getattr(THREAD_LOCAL,'db_instances',{}).clear() + getattr(THREAD_LOCAL,'db_instances_zombie',{}).clear() if callable(action): action(None) return From 1c8ef2941346bbb88be90bac903cf12f708c9cc4 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Mon, 8 Oct 2012 12:09:00 -0500 Subject: [PATCH 28/29] fixed time_expire typo in mamcache, thanks Bruno --- VERSION | 2 +- gluon/contrib/memcache/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 3a8cf3d9..2361e701 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.1.0 (2012-10-08 11:03:17) dev +Version 2.1.0 (2012-10-08 12:08:55) dev diff --git a/gluon/contrib/memcache/__init__.py b/gluon/contrib/memcache/__init__.py index 68900695..e1828023 100644 --- a/gluon/contrib/memcache/__init__.py +++ b/gluon/contrib/memcache/__init__.py @@ -29,7 +29,7 @@ class MemcacheClientObj(Client): pload=None, pid=None, default_time_expire = DEFAULT_TIME_EXPIRE): self.request=request - self.default_time_expire = time_expire + self.default_time_expire = default_time_expire if request: app = request.application else: From 562cb58342d908e9f55576b8641c7122bca63c2c Mon Sep 17 00:00:00 2001 From: mdipierro Date: Mon, 8 Oct 2012 22:09:25 -0500 Subject: [PATCH 29/29] some work on mongodb but references do not work --- VERSION | 2 +- gluon/dal.py | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/VERSION b/VERSION index 2361e701..40d833ed 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.1.0 (2012-10-08 12:08:55) dev +Version 2.1.0 (2012-10-08 22:09:18) dev diff --git a/gluon/dal.py b/gluon/dal.py index b1a7f184..5884ed8e 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -1,4 +1,3 @@ - #!/bin/env python # -*- coding: utf-8 -*- @@ -525,7 +524,8 @@ class ConnectionPool(object): dbs = getattr(THREAD_LOCAL,'db_instances',{}).items() for db_uid, db_group in dbs: for db in db_group: - db._adapter.close(action) + if hasattr(db,'_adapter'): + db._adapter.close(action) getattr(THREAD_LOCAL,'db_instances',{}).clear() getattr(THREAD_LOCAL,'db_instances_zombie',{}).clear() if callable(action): @@ -4953,7 +4953,6 @@ class MongoDBAdapter(NoSQLAdapter): # if expression.type=='id': # return {_id}" if isinstance(expression, Query): - print "in expand and this is a query" # any query using 'id':= # set name as _id (as per pymongo/mongodb primary key) # convert second arg to an objectid field @@ -5010,7 +5009,9 @@ class MongoDBAdapter(NoSQLAdapter): except ImportError: from pymongo.son import SON - for key in set(attributes.keys())-set(('limitby','orderby')): + if 'for_update' in attributes: + logging.warn('mongodb does not support for_update') + for key in set(attributes.keys())-set(('limitby','orderby','for_update')): if attributes[key]!=None: raise SyntaxError, 'invalid select attribute: %s' % key @@ -5067,7 +5068,7 @@ class MongoDBAdapter(NoSQLAdapter): except ImportError: from bson.objectid import ObjectId tablename, mongoqry_dict, mongofields_dict, \ - mongosort_list, limitby_limit, limitby_skip = \ + mongosort_list, limitby_limit, limitby_skip = \ self._select(query,fields,attributes) ctable = self.connection[tablename] if count: @@ -5083,10 +5084,11 @@ class MongoDBAdapter(NoSQLAdapter): # DEBUG: print "mongo_list_dicts=%s" % mongo_list_dicts rows = [] ### populate row in proper order - colnames = [field.name for field in fields] + colnames = [str(field) for field in fields] for k,record in enumerate(mongo_list_dicts): row=[] - for colname in colnames: + for fullcolname in colnames: + colname = fullcolname.split('.')[1] column = '_id' if colname=='id' else colname if column in record: if column == '_id' and isinstance(