The problem is that unicity must be computed but it needs triggename. You are not passing triggername when you do the update_rector and web2y does not do what to do. web2py wants you to be explicit:
row=db.alarms(2) row.update_record(message='rz',triggerName=row.triggerName) On Feb 3, 4:40 am, "Joseph.Piron" <[email protected]> wrote: > Hi guys, I'm currently facing a strange thing :) > > I make use of datatables (jquery datatables.net) and jeditable to > update values in my db. If the user clicks on a value, he changes it > and sends it, thus, only the value of this field. > > On the server part, i then do a > db.alarms[request.vars.id].update_record(field=value). > > Unfortunately, i have to have a unicity condition for this table, and > thus, with the previous statement, i get an error. > > Here's some code to help understand.. > > db.define_table('alarms', > Field('triggerName', type = 'string', label = T('Trigger Name'), > required = True, notnull = True), > Field('triggerValue', type = 'integer', label = T('Trigger > Value'), required = True, notnull = True), > Field('message', type = 'string', label = T('Message'), required = > True, notnull = True), > Field('alarmScope', type = 'string', label = T('Alarm Scope'), > required = True, notnull = True), > Field('unicity', type = 'string', compute = lambda x: > x.triggerName + str(x.triggerValue), unique = True), > format = '%(triggerName)s - %(triggerValue)s', > migrate = settings.migrate) > > db.alarms.triggerValue.requires = > IS_NOT_IN_DB(db(db.alarms.triggerName == request.vars.triggerName), > 'alarms.triggerValue') > > If i want to update one of the fields, I have absolutely to also > update (even if the don't change) triggerName and triggerValue (fields > for unicity condition), and thus I need some test dependent on which > field is updated.. > > Here's an exemple: > > In [15]: db.alarms[2].update_record(message='rz') > --------------------------------------------------------------------------- > KeyError Traceback (most recent call > last) > > /Users/joseph/Documents/workspace/web2py/<ipython console> in > <module>() > > /Users/joseph/Documents/workspace/web2py/gluon/dal.pyc in <lambda>(_, > **a) > 1245 if field_type == 'id': > 1246 id = colset[field.name] > -> 1247 colset.update_record = lambda _ = (colset, > table, id), **a: update_record(_, a) > 1248 colset.delete_record = lambda t = table, i > = id: t._db(t._id==i).delete() > 1249 for (referee_table, referee_name) in \ > > /Users/joseph/Documents/workspace/web2py/gluon/dal.pyc in > update_record(pack, a) > 4433 c = dict([(k,v) for (k,v) in b.items() \ > 4434 if k in table.fields and not k=='id']) > -> 4435 table._db(table._id==id).update(**c) > 4436 for (k, v) in c.items(): > 4437 colset[k] = v > > /Users/joseph/Documents/workspace/web2py/gluon/dal.pyc in update(self, > **update_fields) > 4392 def update(self, **update_fields): > 4393 tablename = self.db._adapter.get_table(self.query) > -> 4394 fields = > self.db[tablename]._listify(update_fields,update=True) > 4395 self.delete_uploaded_files(update_fields) > 4396 return > self.db._adapter.update(tablename,self.query,fields) > > /Users/joseph/Documents/workspace/web2py/gluon/dal.pyc in > _listify(self, fields, update) > 3748 new_fields.append((ofield,ofield.update)) > 3749 elif ofield.compute: > -> 3750 > new_fields.append((ofield,ofield.compute(Row(fields)))) > 3751 elif not update and ofield.required: > 3752 raise SyntaxError,'Table: missing required > field: %s' % name > > /Users/joseph/Documents/workspace/web2py/applications/hmiwebsite/ > models/model_alarms.py in <lambda>(x) > 7 Field('message', type = 'string', label = T('Message'), > required = True, notnull = True), > 8 Field('alarmScope', type = 'string', label = T('Alarm > Scope'), required = True, notnull = True), > ----> 9 Field('unicity', type = 'string', compute = lambda x: > x.triggerName + str(x.triggerValue), unique = True), > 10 format = '%(triggerName)s - %(triggerValue)s', > 11 migrate = settings.migrate) > > /Users/joseph/Documents/workspace/web2py/gluon/dal.pyc in > __getattr__(self, key) > 3061 > 3062 def __getattr__(self, key): > -> 3063 return dict.__getitem__(self,key) > 3064 > 3065 def __setattr__(self, key, value): > > KeyError: 'triggerName' > > Could anyone help me out of this one ? :)

