From d9ff342ed01c87c92fc682bd12ccfe17bbf5c77d Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sat, 18 Aug 2012 16:21:52 -0500 Subject: [PATCH] reverted change that broke primary key check in appadmin --- VERSION | 2 +- gluon/dal.py | 24 +++++++++++++----------- gluon/main.py | 1 + gluon/sqlhtml.py | 9 +++++---- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/VERSION b/VERSION index 78d4ad8e..9b37dbd4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.00.0 (2012-08-18 10:11:20) dev +Version 2.00.0 (2012-08-18 16:21:48) dev diff --git a/gluon/dal.py b/gluon/dal.py index f0efa887..8a7333b9 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -664,15 +664,15 @@ class BaseAdapter(ConnectionPool): constraint_name = self.constraint_name(tablename, field.name) if not '.' in referenced \ and referenced != tablename \ - and table._primarykey: + and hasattr(table,'_primarykey'): ftype = self.types['integer'] else: - if table._primarykey: + if hasattr(table,'_primarykey'): rtablename,rfieldname = referenced.split('.') rtable = table._db[rtablename] rfield = rtable[rfieldname] # must be PK reference or unique - if rfieldname in rtable._primarykey or rfield.unique: + if rfieldname in hasattr(rtable,'_primarykey') or rfield.unique: ftype = self.types[rfield.type[:9]] % \ dict(length=rfield.length) # multicolumn primary key reference? @@ -783,7 +783,7 @@ class BaseAdapter(ConnectionPool): foreign_key = ', '.join(pkeys), on_delete_action = field.ondelete) - if table._primarykey: + if hasattr(table,'_primarykey'): query = "CREATE TABLE %s(\n %s,\n %s) %s" % \ (tablename, fields, self.PRIMARY_KEY(', '.join(table._primarykey)),other) @@ -1053,7 +1053,7 @@ class BaseAdapter(ConnectionPool): if isinstance(e,self.integrity_error_class()): return None raise e - if table._primarykey: + if hasattr(table,'_primarykey'): return dict([(k[0].name, k[1]) for k in fields \ if k[0].name in table._primarykey]) id = self.lastrowid(table) @@ -1449,7 +1449,7 @@ class BaseAdapter(ConnectionPool): sql_o += ' ORDER BY %s' % self.expand(orderby) if limitby: if not orderby and tablenames: - sql_o += ' ORDER BY %s' % ', '.join(['%s.%s'%(t,x) for t in tablenames for x in (self.db[t]._primarykey or [self.db[t]._id.name])]) + sql_o += ' ORDER BY %s' % ', '.join(['%s.%s'%(t,x) for t in tablenames for x in (hasattr(self.db[t],'_primarykey') and self.db[t]._primarykey or [self.db[t]._id.name])]) # oracle does not support limitby sql = self.select_limitby(sql_s, sql_f, sql_t, sql_w, sql_o, limitby) if for_update and self.can_select_for_update is True: @@ -3583,7 +3583,7 @@ class IngresAdapter(BaseAdapter): # post create table auto inc code (if needed) # modify table to btree for performance.... # Older Ingres releases could use rule/trigger like Oracle above. - if table._primarykey: + if hasattr(table,'_primarykey'): modify_tbl_sql = 'modify %s to btree unique on %s' % \ (table._tablename, ', '.join(["'%s'" % x for x in table.primarykey])) @@ -7199,7 +7199,9 @@ class Table(dict): 'singular',tablename.replace('_',' ').capitalize()) self._plural = args.get( 'plural',pluralize(self._singular.lower()).capitalize()) - self._primarykey = args.get('primarykey', None) + # horrible but for backard compatibility of appamdin: + if 'primarykey' in args and args['primarykey']: + self._primarykey = args.get('primarykey', None) self._before_insert = [] self._before_update = [lambda self,fs:self.delete_uploaded_files(fs)] @@ -7209,7 +7211,7 @@ class Table(dict): self._after_delete = [] fieldnames,newfields=set(),[] - if self._primarykey: + if hasattr(self,'_primarykey'): if not isinstance(self._primarykey,list): raise SyntaxError, \ "primarykey must be a list of fields from table '%s'" \ @@ -7285,7 +7287,7 @@ class Table(dict): field.requires = sqlhtml_validators(field) self.ALL = SQLALL(self) - if self._primarykey: + if hasattr(self,'_primarykey'): for k in self._primarykey: if k not in self.fields: raise SyntaxError, \ @@ -7352,7 +7354,7 @@ class Table(dict): rtable = self._db[rtablename] if len(refs)==2: rfieldname = refs[1] - if not rtable._primarykey: + if not hasattr(rtable,'_primarykey'): raise SyntaxError,\ 'keyed tables can only reference other keyed tables (for now)' if rfieldname not in rtable.fields: diff --git a/gluon/main.py b/gluon/main.py index f163e50f..6b4d4b20 100644 --- a/gluon/main.py +++ b/gluon/main.py @@ -297,6 +297,7 @@ def parse_get_post_vars(request, environ): except TypeError: keys = [] for key in keys: + if key is None: continue # not sure why cgi.FieldStorage returns None key dpk = dpost[key] # if en element is not a file replace it with its value else leave it alone if isinstance(dpk, list): diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 7f8924d1..9a9c94a1 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -842,7 +842,7 @@ class SQLFORM(FORM): nbsp = XML(' ') # Firefox2 does not display fields with blanks FORM.__init__(self, *[], **attributes) ofields = fields - keyed = table._primarykey + keyed = hasattr(table,'_primarykey') # for backward compatibility # if no fields are provided, build it from the provided table # will only use writable or readable fields, unless forced to ignore @@ -1132,7 +1132,7 @@ class SQLFORM(FORM): if request_vars.__class__.__name__ == 'Request': request_vars = request_vars.post_vars - keyed = self.table._primarykey + keyed = hasattr(self.table,'_primarykey') # implement logic to detect whether record exist but has been modified # server side @@ -2432,12 +2432,13 @@ class SQLTABLE(TABLE): href = '%s/%s/%s' % (linkto, ref, r_old) if ref.find('.') >= 0: tref,fref = ref.split('.') - if sqlrows.db[tref]._primarykey: + if hasattr(sqlrows.db[tref],'_primarykey'): href = '%s/%s?%s' % (linkto, tref, urllib.urlencode({fref:r})) r = A(represent(field,r,record), _href=str(href)) elif field.represent: r = represent(field,r,record) - elif linkto and fieldname in field._table._primarykey: + elif linkto and hasattr(field._table,'_primarykey')\ + and fieldname in field._table._primarykey: # have to test this with multi-key tables key = urllib.urlencode(dict( [ \ ((tablename in record \