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().

Reply via email to