def test_foreign_key_or_column(self): """Tests the utils.foreign_key_or_column function""" con = DbTestCase.connection user = con.table('user') article = con.table('article') self.assertEqual( user.column('id'), utils.foreign_key_or_column(user, 'id') ) self.assertEqual( article.foreign_key('user_id'), utils.foreign_key_or_column(article, 'user_id') ) self.assertEqual( None, utils.foreign_key_or_column(article, 'foo') )
def back_references(row, table, aliases): foreign_keys = table.foreign_keys() refs = [] for key in sorted(foreign_keys, key=lambda k: foreign_keys[k].a.table.name): fk = foreign_keys[key] if fk.b.table.name == table.name: autocomplete = fk.a.table.autocomplete( fk.a.name, row["{0}_{1}".format(aliases.get(fk.b.table.name, fk.b.table.name), fk.b.name)], OPTION_URI_MULTIPLE_ROWS_FORMAT, ) logger.debug("table.name=%s, fk=%s, autocomplete=%s", table.name, fk, autocomplete) refs.append( Value(fk.a, str(foreign_key_or_column(fk.a.table, fk.a.name)), autocomplete, False, KIND_FOREIGN_VALUE) ) return refs
def forward_references(row, table, keys, aliases): foreign_keys = table.foreign_keys() alias = aliases.get(table.name, table.name) refs = [] for key in keys: k = key.replace("{0}_".format(alias), "", 1) if key in foreign_keys: # Key is a foreign key column fk = foreign_keys[key] autocomplete = fk.b.table.autocomplete(fk.b.name, row[tostring(key)]) elif table.column(k).primary_key: # Key is a simple column, but primary key autocomplete = table.autocomplete(k, row[tostring(key)], OPTION_URI_SINGLE_ROW_FORMAT) else: # Key is a simple column autocomplete = table.autocomplete(k, row[tostring(key)], OPTION_URI_MULTIPLE_ROWS_FORMAT) f = foreign_key_or_column(table, k) kind = KIND_VALUE if f.__class__.__name__ == "ForeignKey": kind = KIND_FOREIGN_KEY refs.append(Value(row[tostring(key)], str(f), autocomplete, True, kind)) return refs