RecordUpdater, RecordDeleted and compute on update

This commit is contained in:
mdipierro
2012-08-28 10:32:01 -05:00
parent 12fa8710a2
commit cfa93bd5de
3 changed files with 32 additions and 23 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.00.1 (2012-08-28 10:02:16) rc4 Version 2.00.1 (2012-08-28 10:31:57) rc4
@@ -7,6 +7,7 @@
'%s %%{shop[0]}': '%s %%{shop[0]}', '%s %%{shop[0]}': '%s %%{shop[0]}',
'%s %%{shop}': '%s %%{shop}', '%s %%{shop}': '%s %%{shop}',
'@markmin\x01**Hello World**': '**Hello World**', '@markmin\x01**Hello World**': '**Hello World**',
'enter an integer between %(min)g and %(max)g': 'enter an integer between %(min)g and %(max)g',
'Hello World': 'Hello World', 'Hello World': 'Hello World',
'Hello World ## comment': 'Hello World ', 'Hello World ## comment': 'Hello World ',
'Hello World## comment': 'Hello World', 'Hello World## comment': 'Hello World',
+30 -22
View File
@@ -1835,12 +1835,8 @@ class BaseAdapter(ConnectionPool):
colset.gae_item = value colset.gae_item = value
else: else:
id = value id = value
colset.update_record = ( colset.update_record = RecordUpdater(colset,table,id)
lambda _ = (colset, table, id), **a: colset.delete_record = RecordDeleter(table,id)
update_record(_, a))
colset.delete_record = (
lambda t = table, i = id:
t._db(t._id==i).delete())
for (referee_table, referee_name) \ for (referee_table, referee_name) \
in table._referenced_by: in table._referenced_by:
s = db[referee_table][referee_name] s = db[referee_table][referee_name]
@@ -7611,15 +7607,15 @@ class Table(object):
# check all fields that should be in the self table # check all fields that should be in the self table
for ofield in self: for ofield in self:
name = ofield.name name = ofield.name
# if field is supposed to be computed, compute it! if not name in new_fields:
if ofield.compute: # if field is supposed to be computed, compute it!
try: if ofield.compute:
new_fields[name] = (ofield,ofield.compute(Row(fields))) try:
except KeyError: new_fields[name] = (ofield,ofield.compute(Row(fields)))
pass except (KeyError, AttributeError):
# if field is required, check its default value pass
elif not name in new_fields: # if field is required, check its default value
if not update and not ofield.default is None: elif not update and not ofield.default is None:
new_fields[name] = (ofield,ofield.default) new_fields[name] = (ofield,ofield.default)
elif update and not ofield.update is None: elif update and not ofield.update is None:
new_fields[name] = (ofield,ofield.update) new_fields[name] = (ofield,ofield.update)
@@ -8653,13 +8649,25 @@ class Set(object):
os.unlink(oldpath) os.unlink(oldpath)
return False return False
def update_record(pack, a=None): class RecordUpdater(object):
(colset, table, id) = pack def __init__(self, colset, table, id):
b = a or dict(colset) self.colset, self.table, self.id = colset, table, id
c = dict([(k,v) for (k,v) in b.iteritems() if k in table.fields and table[k].type!='id'])
table._db(table._id==id,ignore_common_filters=True).update(**c) def __call__(self, **fields):
for (k, v) in c.iteritems(): colset, table, id = self.colset, self.table, self.id
colset[k] = v newfields = fields or dict(colset)
for fieldname in newfields.keys():
if not fieldname in table.fields or table[fieldname].type=='id':
del newfields[fieldname]
table._db(table._id==id,ignore_common_filters=True).update(**newfields)
colset.update(newfields)
class RecordDeleter(object):
def __init__(self, table, id):
self.table, self.id = table,id
def __call__(self):
return self.table._db(self.table._id==self.id).delete()
class VirtualCommand(object): class VirtualCommand(object):
def __init__(self,method,row): def __init__(self,method,row):