Excellent! Thank you. Uploading your changes to trunk...
On Jan 24, 1:39 am, Ben Goosman <bgoos...@gmail.com> wrote: > I'm not sure if these are actual bug fixes or simply misinformed hacks > (please let me know), but I think they might be useful to the > community. My notes are for version 1.99.2 so the line numbers may be > a little off. Most of the changes are the result of trying to get > Oracle and multiple key tables to work. > > I added values for 'reference FK' and 'reference 'TFK' in dal.py for > the Oracle adapter. > 'reference FK': ', CONSTRAINT FK_%(constraint_name)s FOREIGN KEY (% > (field_name)s) REFERENCES %(foreign_key)s ON DELETE % > (on_delete_action)s', > 'reference TFK': ' CONSTRAINT FK_%(foreign_table)s_PK FOREIGN KEY (% > (field_name)s) REFERENCES %(foreign_table)s (%(foreign_key)s) ON > DELETE %(on_delete_action)s', > > I changed line 1046 in sqlhtml.py perhttp://tinyurl.com/7wn8sjvwhich > seems to allow the crud update page to display. > # Before > record_id = dict((k, request_vars[k]) for k in self.table._primarykey) > # After > record_id = dict((k, request_vars.get(k,None)) for k in > self.table._primarykey) > > I changed line 761 in sqlhtml.py > # Before > self.record_id = dict([(k,record[k]) for k in table._primarykey]) > # After > self.record_id = dict([(k,str(record[k])) for k in table._primarykey]) > which allows the crud update form to be submitted. The problem lied in > the update form for dataSource. Since dataSource is keyed by > source_id, SQLFORM uses source_id as the record_id for any record you > edit. Web2py performs a security check on the value of the record_id > before and after the form was submitted. If the record_id changes, > web2py complains. Since source_id is an integer, web2py saved it as an > integer into the record_id. Since source_id appears on the update > form, it is converted to a string. Since num != 'num', a security > error occurred. The temporary(?) solution is to convert every value in > the record_id to a string before form submission. > > Changed line 3071 in tools.py > # Before > if not (isinstance(table, self.db.Table) or table in self.db.tables) \ > or not str(record_id).isdigit(): > raise HTTP(404) > # After > if not (isinstance(table, self.db.Table) or table in self.db.tables): > raise HTTP(404) > This change should allow crud delete to work with keyed databases, > since line 3090 can accept a dictionary of key assignments. Thus, for > the dataSource table we can pass in dict(source_id=the_source_id) to > crud.delete().