def fileSelected(self, controller, selection): try: print selection, type(selection) if selection: new_tables = [] selection_file_name = selection.getAbsolutePath() logging.debug(selection_file_name) controller.directory = os.path.dirname(selection.getAbsolutePath()) with open(selection_file_name) as f: d = yaml.load(f.read()) print d controller.app_name = d.get('app', os.path.splitext(os.path.basename(selection_file_name))[0]) for model in d.get('external_models', []): model['external'] = True for model in d.get('external_models', []) + d.get('models', []): table = Table(name=model.get('name'), x=model.get('x', random.randrange(int(controller.panX), int(width*controller.scaleXY + controller.panX))), y=model.get('y', random.randrange(int(controller.panY), int(height*controller.scaleXY + controller.panY))), display=model.get('display'), natural_key=model.get('natural_key'), natural_keys=model.get('natural_keys', []), ordering=model.get('ordering', []), external=model.get('external', False), view=model.get('view', False), extra=model.get('extra', False)) new_tables.append(table) print "new table:", table for field in model.get('fields'): name = field.get('name') ftype = field.get('type') flen = field.get('len') fdefault = field.get('default') pk = field.get('pk', False) related_name = field.get('related_name', None) column = Column(name=":".join(map(str, filter(lambda x: x is not None, [name, ftype, flen or fdefault]))), x=model.get('x', 0), y=model.get('y', 0), pk=pk, related_name=related_name, table=table) print name, related_name table.columns.append(column) for model in d.get('models'): ts = [t for t in new_tables if t.name == model.get('name')] assert len(ts) == 1, "Duplicate model %s" % model.get('name') from_table = ts[0] for field in model.get('fields'): if field.get('ref') and field.get('ref_field'): cs = [c for c in from_table.columns if c.name.partition(":")[0] == field.get('name')] assert len(cs) == 1 from_column = cs[0] ts = [t for t in new_tables if t.name == field.get('ref')] if len(ts) == 0: new_table = Table(name=field.get('ref'), x=random.randrange(int(controller.panX), int(width*controller.scaleXY + controller.panX)), y=random.randrange(int(controller.panX), int(width*controller.scaleXY + controller.panX)), external=True) new_tables.append(new_table) print "new external table:", table ts = [new_table] assert len(ts) == 1, repr(ts) to_table = ts[0] cs = [c for c in to_table.columns if c.name.partition(":")[0] == field.get('ref_field')] if len(cs) == 0: new_column = Column(name=field.get('ref_field'), x=0, y=0, pk=True, table=to_table) to_table.columns.append(new_column) cs = [new_column] assert len(cs) == 1 to_column = cs[0] from_column.connectors = [ForeignKey(from_column=from_column, to_column=to_column)] elif field.get('ref'): cs = [c for c in from_table.columns if c.name.partition(":")[0] == field.get('name')] if len(cs) == 1: from_column = cs[0] ts = [t for t in new_tables if t.name == field.get('ref')] if len(ts) == 0: to_column = Column(name='pk') to_table = Table(name=field.get('ref'), columns=[to_column]) to_column.table = to_table new_tables.append(to_table) from_column.connectors = [ForeignKey(from_column=from_column, to_column=to_column)] elif len(ts) == 1: to_table = ts[0] to_column = to_table.columns[0] from_column.connectors = [ForeignKey(from_column=from_column, to_column=to_column)] else: print "When connecting {0}.{1} expected one table named {2} found {3}".format(from_table.name, from_column.name, field.get('ref'), ts) else: print "When connecting {0}.{1} expected one column named {2} found {3}".format(from_table.name, field.get('name'), field.get('name'), cs) view_d = d.get('view', {}) controller.modules = d.get('modules', []) controller.api = d.get('api', None) controller.generate = d.get('generate', None) controller.panX = view_d.get('panX', 0) controller.panY = view_d.get('panY', 0) controller.scaleXY = view_d.get('scaleXY', 1) controller.tables = new_tables print "Read from {0}".format(selection) controller.changeState(ReadyState) except Exception: print traceback.format_exc()