Пример #1
0
 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()