class CreateDB: def __init__(self, db, cAppl=None, createDataBase=False, info=False): self.db = db self.cAppl = cAppl self.createDataBase = createDataBase self.info = info self.aplicacao = Aplicacao(self.db, self.cAppl) self.applId = self.aplicacao.getApplId() self.modeloDb = self.aplicacao.getModeloDb() self.entidades = Entidades(self.db, cAppl=self.cAppl) self.colunas = Colunas(db, cAppl=self.cAppl) self.colunasEntidades = ColunasEntidades(self.db, self.cAppl) self.ColEntRef = ColunasEntidadesReferenciadas(self.db) self.primaryKeys = PrimaryKeys(self.db) self.foreignKeys = ForeignKeys(self.db) self.OrigemColunasAplicacao = OrigemColunasAplicacao(self.db) self.regrasColunas = RegrasColunas(self.db) self.mensagens = Mensagens(self.db, cAppl=self.cAppl) self.parametros = self.db.parametros self.parms = self.db(self.parametros).select()[0] self.checkListPrototipo = self.db.checkListPrototipo self.database = Database(db, cAppl=self.cAppl) self.databaseCreated = False App = os.path.join('\\\\', '127.0.0.1', 'c$', 'web2py', 'applications', self.applId) self.dbApp = os.path.join(App, 'models', 'db.py') self.settings = os.path.join(App, 'models', 'settings_local.db') self.databases = os.path.join(App, 'databases') Template = os.path.join('\\\\', '127.0.0.1', 'c$', 'web2py', 'applications', self.parms.soag, 'Template', 'web2py', 'models') self.dbTemplate = os.path.join(Template, 'db.py') self.settingsTemplate = os.path.join(Template, 'settings_local.db') def createDB(self): try: if self.createDataBase: if modeloDB[self.modeloDb] == 'Soag': command = 'dropdb --username=postgres -w {}'.format( self.applId) try: os.system(command) except: pass command = 'createdb --username=postgres -w {}'.format( self.applId) os.system(command) else: retorno, returned = self.tryEngine() if not retorno: return retorno, returned engine = returned retorno, returned = self.metaSchema(engine) if not retorno: return retorno, returned schm = returned for tbl in [ u'controle', u'mensagens', u'auth_cas', u'auth_event', u'auth_permission', u'auth_membership', u'auth_group', u'auth_user' ]: try: table = schm.tables[tbl] table.drop(engine) except: pass settings = open(self.settings, 'w') settingsTemplate = open(self.settingsTemplate).readlines() settingsTemplate = change({'@applId': self.applId}, settingsTemplate) settings.writelines(settingsTemplate) settings.close() if self.createDataBase: try: shutil.rmtree(self.databases) except: pass os.mkdir(self.databases) self.databaseCreated = True dbApp = open(self.dbApp, 'w') dbApp.writelines(open(self.dbTemplate).readlines()) retEntidade = self.entidades.selectEntidadesBycodigoAplicacao() if not retEntidade[0]: return False, retEntidade[1] entidades = retEntidade[1] dicEntidades = {entidade.id: entidade for entidade in entidades} retColunas = self.colunas.selectColunasByCodigoAplicacao() colunas = retColunas[1] dicColunas = {col.id: col for col in colunas} gerados = 0 lisWrite = [] # Lista com a ordem de gravação das entidades dicWrite = {} # Dicionario com as linhas de gravação por entidade dicRefer = {} # Dicionario com as entidades referenciadas for entidade in entidades: lookups = '' lisAppWrite = [] lisAppWrite.append("\ndb.define_table('{}'\n".format( entidade.nomeFisico)) retColunasEntidades = self.colunasEntidades.selectColunasEntidadesResolvidasByCodigoEntidade( entidade.id) if not retColunasEntidades[0]: if retColunasEntidades[1]: return False, retColunasEntidades[2] else: return False, None gerados += 1 colunasEntidade = retColunasEntidades[1] retPrimaryKeys = self.primaryKeys.selectPrimaryKeysByCodigoEntidade( entidade.id) if not retPrimaryKeys: return [0, retPrimaryKeys[1]] primaryKeys = retPrimaryKeys dicFKs = self.foreignKeys.selectForeignKeysByCodigoEntidade( entidade.id) dicRefer[entidade.id] = list( set([ dicFKs[k][0] for k in dicFKs if dicFKs[k][0] != entidade.id ])) retColEntRef = self.ColEntRef.selectColunasEntidadesReferenciadasByCodigoEntidade( entidade.id) colEntRef = retColEntRef[1] lc = len(colunasEntidade) for n, col in enumerate(colunasEntidade): foreignKey = '' if (col.colunas.id in dicFKs and dicFKs[col.colunas.id][0] != entidade.id): foreignKey = ', {}'.format( dicEntidades[dicFKs[col.colunas.id][0]].nomeFisico) dttp = dicDataTypes[col.datatypes.descricao] if dttp == "'decimal'": dttp = ", 'decimal({},{})'".format( col.colunas.tamanhoColuna, col.colunas.decimais) elif not dttp: dttp = ", length={}".format(col.colunas.tamanhoColuna) else: dttp = ', {}'.format(dttp) if modeloDB[self.modeloDb] == 'Soag': fpar = ')\n' if n + 1 == lc else '' else: fpar = '' lisAppWrite.append("{:>24}{}'{}{}){}\n".format( ", Field('", col.colunas.columnName, foreignKey, dttp, fpar)) if modeloDB[self.modeloDb] == 'legacy': lisAppWrite.append('{:15}{}\n'.format( '', ', primarykey=[{}]'.format(', '.join([ "'" + dicColunas[c].columnName + "'" for c in primaryKeys.keys() ])))) lisAppWrite.append('{:15}{}\n'.format( '', ', migrate=False)')) lisAppWrite.append("{0:50}= db['{0}']\n\n".format( entidade.nomeFisico)) if modeloDB[self.modeloDb] == 'Soag': lisAppWrite.append('{:50}= False\n'.format( '{}.id.writable'.format(entidade.nomeFisico))) for col in colunasEntidade: entCol = '{}.{}'.format(entidade.nomeFisico, col.colunas.columnName) origem = self.origemColuna(col) ###### Label lisAppWrite.append("{:50}= '{}'\n".format( '{}.label'.format(entCol), col.colunas.label)) if (col.colunas.id in primaryKeys and primaryKeys[col.colunas.id] == 3): lisAppWrite.append('{:50}= True\n'.format( '{}.readonly'.format(entCol))) lisAppWrite.append('if widgets:\n') lisAppWrite.append(' {:46}= widgets.text\n'.format( '{}.widget'.format(entCol))) elif origem: lisAppWrite.append('{:50}= True\n'.format( '{}.readonly'.format(entCol))) lisAppWrite.append('if widgets:\n') lisAppWrite.append(' {:46}= widgets.text\n'.format( '{}.widget'.format(entCol))) else: lisAppWrite.append('{:50}= True\n'.format( '{}.writable'.format(entCol))) isindb = False requires = '{}.requires'.format(entCol) if (col.colunas.id in dicFKs and dicFKs[col.colunas.id][0] != entidade.id): isindb = True entRef = dicEntidades[dicFKs[col.colunas.id] [0]].nomeFisico entRefId = dicEntidades[dicFKs[col.colunas.id] [0]].id colName = dicColunas[dicFKs[col.colunas.id] [1]].columnName colRef = colName for cer in colEntRef: if (cer.colunasEntidadesReferenciadas. entidadeReferenciada == dicFKs[ col.colunas.id][0]): if cer.colunasEntidadesReferenciadas.consultaSaida: colRef = dicColunas[ cer.colunasEntidadesReferenciadas. codigoColuna].columnName if cer.colunasEntidadesReferenciadas.listaSaida: lookups = self.montaLookups( lookups, entidade.nomeFisico, col.colunas.columnName, entRef, dicColunas[ cer. colunasEntidadesReferenciadas. codigoColuna].columnName) break lisAppWrite.append( '{:50}= IS_IN_DB(db, {}.{}\n'.format( requires, entRef, colName)) lisAppWrite.append( "{:>52},'%({})s', zero='-- Selecione --'\n". format('', colRef)) message = self.montaMensagem( entRefId, 'E', 'E', 'C') lisAppWrite.append( "{:>52},error_message=msgGet(db,'{}'))\n". format('', message)) else: lisRegras = [] al = '[' eq = '=' retRegras = self.regrasColunas.selectRegrasColunasByColumnId( col.colunas.id) if not retRegras[0] and retRegras[1]: if self.info: return False, traceback.format_exc( sys.exc_info) else: return False, None regras = retRegras[1] if col.colunasEntidades.ehNotNull: message = self.montaMensagem(col.colunas.id, 'C', 'E', 'PR', nova=1) lisRegras.append( "{:50}{} {}IS_NOT_EMPTY(error_message=msgGet(db,'{}'))\n" .format(requires, eq, al, message)) requires = '' al = ',' eq = ' ' natureza = col.datatypes.descricao if natureza in 'DECIMAL NUMERIC' and col.colunas.decimais == 0: natureza = 'INTEGER' if dicNatureza[natureza][0]: message = self.montaMensagem( col.colunas.id, 'C', 'E', dicNatureza[natureza][1], nova=1) lisRegras.append( "{:50}{} {}{}(error_message=msgGet(db,'{}'))\n" .format(requires, eq, al, dicNatureza[natureza][0], message)) requires = '' al = ',' eq = ' ' if regras: regras = regras[0] regra = regras.regras.regra message = self.montaMensagem(col.colunas.id, 'C', 'E', regra, nova=1) lisRegras.append( tratarRegras(regra, regras, col, requires, eq, al, message)) lr = len(lisRegras) for n, l in enumerate(lisRegras): if n + 1 == lr: l = l[:-1] + ']\n' lisAppWrite.append(l) if dicWidgets[col.datatypes.descricao] and not isindb: lisAppWrite.append('if widgets:\n') lisAppWrite.append( ' {:46}= widgets.text\n'.format( '{}.widget'.format(entCol))) if lookups: lisAppWrite.append(lookups[:-1] + '}\n') dicWrite[entidade.id] = lisAppWrite while len(dicRefer) > 0: lisKeys = sorted(dicRefer.keys( )) # Lista com as keys do dicRefer para deleção dos vazios # Cada key deletada do dicRefer entra na lisWrite for k in lisKeys: if not dicRefer[k]: lisWrite.append(k) del dicRefer[k] for ent in lisWrite: for k in dicRefer.keys(): if ent in dicRefer[k]: dicRefer[k].remove(ent) for ent in lisWrite: dbApp.writelines(dicWrite[ent]) dbApp.close() clp = self.atualizaCheckListPrototipo() if not clp: return clp except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None return True, 'Entidades Geradas = ' + str(gerados) def origemColuna(self, col): origem = self.OrigemColunasAplicacao.selectOrigemColunasAplicacaoByCodigoColuna( col.colunas.id) if origem[0] and origem[1]: return True else: return False def montaMensagem(self, codigoEntCol, origemMsg, tipoMsg, regra, nova=None): retMessage = self.mensagens.getMensagem(codigoEntCol, origemMsg, tipoMsg, regra, nova) if retMessage[0]: return '{}{:04}'.format(self.applId, retMessage[1]) else: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None def montaLookups(self, lookups, entidade, coluna, entRef, colRef): if lookups: lkp = '' eqs = ' ' ach = ',' else: lkp = '{}.lookups'.format(entidade) eqs = '=' ach = '{' lookups += "{:50}{} {}'{}': ['{}', ['{}'] ,False]\n".format( lkp, eqs, ach, coluna, entRef, colRef) return lookups def atualizaCheckListPrototipo(self): try: if self.databaseCreated: self.db(self.checkListPrototipo.codigoAplicacao == self.cAppl).update(model=True, database=True) else: self.db(self.checkListPrototipo.codigoAplicacao == self.cAppl).update(model=True) except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None self.db.commit() return True, None def tryEngine(self): config = self.database.getConfig() sgdbDB = config.sgdb.sgdb userDB = config.database.userDB passDB = config.database.passDB hostDB = config.database.hostDB portDB = config.database.portDB nameDB = config.database.nameDB if sgdbDB == 'DB2': import ibm_db_sa try: engine = eval("{}.{}('{}://{}:{}@{}:{}/{}')".format( 'sqlalchemy', 'create_engine', sgdbDB, userDB, passDB, hostDB, portDB, nameDB)) except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None return True, engine def metaSchema(self, engine): try: schm = sqlalchemy.schema.MetaData(bind=engine) schm.reflect() except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None return True, schm
class CreateMenu(object): def __init__(self, db, cAppl=0, info=False): self.db = db self.cAppl = cAppl self.info = info self.aplicacao = Aplicacao(self.db, self.cAppl) self.applId = self.aplicacao.getApplId() self.entidades = Entidades(self.db, cAppl=self.cAppl) self.menu = self.db.menu self.parametros = self.db.parametros self.parms = self.db(self.parametros).select()[0] self.checkListPrototipo = self.db.checkListPrototipo self.menuApp = os.path.join( "\\\\", "127.0.0.1", "c$", "web2py", "applications", self.applId, "models", "menu2.py" ) self.Template = os.path.join( "\\\\", "127.0.0.1", "c$", "web2py", "applications", self.parms.soag, "Template", "web2py", "templates", "menu2.py", ) def createMenu(self): retEntidade = self.entidades.selectEntidadesBycodigoAplicacao() if not retEntidade[0]: return [0, "Ocorreu um erro na chamada de selectEntidadesBycodigoAplicacao.", retEntidade[1]] entidades = retEntidade[1] dicEnt = {e.id: e.nomeFisico for e in entidades} try: query = self.db(self.menu.codigoAplicacao == self.cAppl).select(orderby=self.menu.id) dicParent = {q.id: q.descricao for q in query if q.url == 0} lmenu = "" for q in query: if q.parent == 1: lmenu += "{:4}response.dtree.menu('{}')\n\n".format("", q.descricao) elif q.url == 0: lmenu += "{:4}response.dtree.menu('{}', parent='{}')\n\n".format( "", q.descricao, dicParent[q.parent] ) else: lmenu += "{:4}response.dtree.aplicacao('{}', '{}',\n".format("", dicParent[q.parent], q.descricao) url = "".join(Capitalize(dicEnt[q.url].replace("_", " ")).split()) lmenu += "{:{}}URL(request.application, '{}', 'index'))\n\n".format("", 42 - len(url), url) template = open(self.Template).read() menu = open(self.menuApp, "w") menu.write(change({"@menus\n": lmenu}, template)) menu.close() except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None return self.atualizaCheckListPrototipo() def atualizaCheckListPrototipo(self): try: self.db(self.checkListPrototipo.codigoAplicacao == self.cAppl).update(menus=True) except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None self.db.commit() return True, None
class CreateMenu(object): def __init__(self, db, cAppl=0, info=False): self.db = db self.cAppl = cAppl self.info = info self.aplicacao = Aplicacao(self.db, self.cAppl) self.applId = self.aplicacao.getApplId() self.entidades = Entidades(self.db, cAppl=self.cAppl) self.menu = self.db.menu self.parametros = self.db.parametros self.parms = self.db(self.parametros).select()[0] self.checkListPrototipo = self.db.checkListPrototipo self.menuApp = os.path.join('\\\\', '127.0.0.1', 'c$', 'web2py', 'applications', self.applId, 'models', 'menu2.py') self.Template = os.path.join('\\\\', '127.0.0.1', 'c$', 'web2py', 'applications', self.parms.soag, 'Template', 'web2py', 'templates', 'menu2.py') def createMenu(self): retEntidade = self.entidades.selectEntidadesBycodigoAplicacao() if not retEntidade[0]: return [ 0, 'Ocorreu um erro na chamada de selectEntidadesBycodigoAplicacao.', retEntidade[1] ] entidades = retEntidade[1] dicEnt = {e.id: e.nomeFisico for e in entidades} try: query = self.db(self.menu.codigoAplicacao == self.cAppl).select( orderby=self.menu.id) dicParent = {q.id: q.descricao for q in query if q.url == 0} lmenu = '' for q in query: if q.parent == 1: lmenu += "{:4}response.dtree.menu('{}')\n\n".format( '', q.descricao) elif q.url == 0: lmenu += "{:4}response.dtree.menu('{}', parent='{}')\n\n".format( '', q.descricao, dicParent[q.parent]) else: lmenu += "{:4}response.dtree.aplicacao('{}', '{}',\n".format( '', dicParent[q.parent], q.descricao) url = ''.join( Capitalize(dicEnt[q.url].replace('_', ' ')).split()) lmenu += "{:{}}URL(request.application, '{}', 'index'))\n\n".format( '', 42 - len(url), url) template = open(self.Template).read() menu = open(self.menuApp, 'w') menu.write(change({'@menus\n': lmenu}, template)) menu.close() except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None return self.atualizaCheckListPrototipo() def atualizaCheckListPrototipo(self): try: self.db( self.checkListPrototipo.codigoAplicacao == self.cAppl).update( menus=True) except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None self.db.commit() return True, None
class CreateDB: def __init__(self, db, cAppl=None, createDataBase=False, info=False): self.db = db self.cAppl = cAppl self.createDataBase = createDataBase self.info = info self.aplicacao = Aplicacao(self.db, self.cAppl) self.applId = self.aplicacao.getApplId() self.modeloDb = self.aplicacao.getModeloDb() self.entidades = Entidades(self.db, cAppl=self.cAppl) self.colunas = Colunas(db, cAppl=self.cAppl) self.colunasEntidades = ColunasEntidades(self.db, self.cAppl) self.ColEntRef = ColunasEntidadesReferenciadas(self.db) self.primaryKeys = PrimaryKeys(self.db) self.foreignKeys = ForeignKeys(self.db) self.OrigemColunasAplicacao = OrigemColunasAplicacao(self.db) self.regrasColunas = RegrasColunas(self.db) self.mensagens = Mensagens(self.db, cAppl=self.cAppl) self.parametros = self.db.parametros self.parms = self.db(self.parametros).select()[0] self.checkListPrototipo = self.db.checkListPrototipo self.database = Database(db, cAppl=self.cAppl) self.databaseCreated = False App = os.path.join("\\\\", "127.0.0.1", "c$", "web2py", "applications", self.applId) self.dbApp = os.path.join(App, "models", "db.py") self.settings = os.path.join(App, "models", "settings_local.db") self.databases = os.path.join(App, "databases") Template = os.path.join( "\\\\", "127.0.0.1", "c$", "web2py", "applications", self.parms.soag, "Template", "web2py", "models" ) self.dbTemplate = os.path.join(Template, "db.py") self.settingsTemplate = os.path.join(Template, "settings_local.db") def createDB(self): try: if self.createDataBase: if modeloDB[self.modeloDb] == "Soag": command = "dropdb --username=postgres -w {}".format(self.applId) try: os.system(command) except: pass command = "createdb --username=postgres -w {}".format(self.applId) os.system(command) else: retorno, returned = self.tryEngine() if not retorno: return retorno, returned engine = returned retorno, returned = self.metaSchema(engine) if not retorno: return retorno, returned schm = returned for tbl in [ u"controle", u"mensagens", u"auth_cas", u"auth_event", u"auth_permission", u"auth_membership", u"auth_group", u"auth_user", ]: try: table = schm.tables[tbl] table.drop(engine) except: pass settings = open(self.settings, "w") settingsTemplate = open(self.settingsTemplate).readlines() settingsTemplate = change({"@applId": self.applId}, settingsTemplate) settings.writelines(settingsTemplate) settings.close() if self.createDataBase: try: shutil.rmtree(self.databases) except: pass os.mkdir(self.databases) self.databaseCreated = True dbApp = open(self.dbApp, "w") dbApp.writelines(open(self.dbTemplate).readlines()) retEntidade = self.entidades.selectEntidadesBycodigoAplicacao() if not retEntidade[0]: return False, retEntidade[1] entidades = retEntidade[1] dicEntidades = {entidade.id: entidade for entidade in entidades} retColunas = self.colunas.selectColunasByCodigoAplicacao() colunas = retColunas[1] dicColunas = {col.id: col for col in colunas} gerados = 0 lisWrite = [] # Lista com a ordem de gravação das entidades dicWrite = {} # Dicionario com as linhas de gravação por entidade dicRefer = {} # Dicionario com as entidades referenciadas for entidade in entidades: lookups = "" lisAppWrite = [] lisAppWrite.append("\ndb.define_table('{}'\n".format(entidade.nomeFisico)) retColunasEntidades = self.colunasEntidades.selectColunasEntidadesResolvidasByCodigoEntidade( entidade.id ) if not retColunasEntidades[0]: if retColunasEntidades[1]: return False, retColunasEntidades[2] else: return False, None gerados += 1 colunasEntidade = retColunasEntidades[1] retPrimaryKeys = self.primaryKeys.selectPrimaryKeysByCodigoEntidade(entidade.id) if not retPrimaryKeys: return [0, retPrimaryKeys[1]] primaryKeys = retPrimaryKeys dicFKs = self.foreignKeys.selectForeignKeysByCodigoEntidade(entidade.id) dicRefer[entidade.id] = list(set([dicFKs[k][0] for k in dicFKs if dicFKs[k][0] != entidade.id])) retColEntRef = self.ColEntRef.selectColunasEntidadesReferenciadasByCodigoEntidade(entidade.id) colEntRef = retColEntRef[1] lc = len(colunasEntidade) for n, col in enumerate(colunasEntidade): foreignKey = "" if col.colunas.id in dicFKs and dicFKs[col.colunas.id][0] != entidade.id: foreignKey = ", {}".format(dicEntidades[dicFKs[col.colunas.id][0]].nomeFisico) dttp = dicDataTypes[col.datatypes.descricao] if dttp == "'decimal'": dttp = ", 'decimal({},{})'".format(col.colunas.tamanhoColuna, col.colunas.decimais) elif not dttp: dttp = ", length={}".format(col.colunas.tamanhoColuna) else: dttp = ", {}".format(dttp) if modeloDB[self.modeloDb] == "Soag": fpar = ")\n" if n + 1 == lc else "" else: fpar = "" lisAppWrite.append( "{:>24}{}'{}{}){}\n".format(", Field('", col.colunas.columnName, foreignKey, dttp, fpar) ) if modeloDB[self.modeloDb] == "legacy": lisAppWrite.append( "{:15}{}\n".format( "", ", primarykey=[{}]".format( ", ".join(["'" + dicColunas[c].columnName + "'" for c in primaryKeys.keys()]) ), ) ) lisAppWrite.append("{:15}{}\n".format("", ", migrate=False)")) lisAppWrite.append("{0:50}= db['{0}']\n\n".format(entidade.nomeFisico)) if modeloDB[self.modeloDb] == "Soag": lisAppWrite.append("{:50}= False\n".format("{}.id.writable".format(entidade.nomeFisico))) for col in colunasEntidade: entCol = "{}.{}".format(entidade.nomeFisico, col.colunas.columnName) origem = self.origemColuna(col) ###### Label lisAppWrite.append("{:50}= '{}'\n".format("{}.label".format(entCol), col.colunas.label)) if col.colunas.id in primaryKeys and primaryKeys[col.colunas.id] == 3: lisAppWrite.append("{:50}= True\n".format("{}.readonly".format(entCol))) lisAppWrite.append("if widgets:\n") lisAppWrite.append(" {:46}= widgets.text\n".format("{}.widget".format(entCol))) elif origem: lisAppWrite.append("{:50}= True\n".format("{}.readonly".format(entCol))) lisAppWrite.append("if widgets:\n") lisAppWrite.append(" {:46}= widgets.text\n".format("{}.widget".format(entCol))) else: lisAppWrite.append("{:50}= True\n".format("{}.writable".format(entCol))) isindb = False requires = "{}.requires".format(entCol) if col.colunas.id in dicFKs and dicFKs[col.colunas.id][0] != entidade.id: isindb = True entRef = dicEntidades[dicFKs[col.colunas.id][0]].nomeFisico entRefId = dicEntidades[dicFKs[col.colunas.id][0]].id colName = dicColunas[dicFKs[col.colunas.id][1]].columnName colRef = colName for cer in colEntRef: if cer.colunasEntidadesReferenciadas.entidadeReferenciada == dicFKs[col.colunas.id][0]: if cer.colunasEntidadesReferenciadas.consultaSaida: colRef = dicColunas[cer.colunasEntidadesReferenciadas.codigoColuna].columnName if cer.colunasEntidadesReferenciadas.listaSaida: lookups = self.montaLookups( lookups, entidade.nomeFisico, col.colunas.columnName, entRef, dicColunas[cer.colunasEntidadesReferenciadas.codigoColuna].columnName, ) break lisAppWrite.append("{:50}= IS_IN_DB(db, {}.{}\n".format(requires, entRef, colName)) lisAppWrite.append("{:>52},'%({})s', zero='-- Selecione --'\n".format("", colRef)) message = self.montaMensagem(entRefId, "E", "E", "C") lisAppWrite.append("{:>52},error_message=msgGet(db,'{}'))\n".format("", message)) else: lisRegras = [] al = "[" eq = "=" retRegras = self.regrasColunas.selectRegrasColunasByColumnId(col.colunas.id) if not retRegras[0] and retRegras[1]: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None regras = retRegras[1] if col.colunasEntidades.ehNotNull: message = self.montaMensagem(col.colunas.id, "C", "E", "PR", nova=1) lisRegras.append( "{:50}{} {}IS_NOT_EMPTY(error_message=msgGet(db,'{}'))\n".format( requires, eq, al, message ) ) requires = "" al = "," eq = " " natureza = col.datatypes.descricao if natureza in "DECIMAL NUMERIC" and col.colunas.decimais == 0: natureza = "INTEGER" if dicNatureza[natureza][0]: message = self.montaMensagem(col.colunas.id, "C", "E", dicNatureza[natureza][1], nova=1) lisRegras.append( "{:50}{} {}{}(error_message=msgGet(db,'{}'))\n".format( requires, eq, al, dicNatureza[natureza][0], message ) ) requires = "" al = "," eq = " " if regras: regras = regras[0] regra = regras.regras.regra message = self.montaMensagem(col.colunas.id, "C", "E", regra, nova=1) lisRegras.append(tratarRegras(regra, regras, col, requires, eq, al, message)) lr = len(lisRegras) for n, l in enumerate(lisRegras): if n + 1 == lr: l = l[:-1] + "]\n" lisAppWrite.append(l) if dicWidgets[col.datatypes.descricao] and not isindb: lisAppWrite.append("if widgets:\n") lisAppWrite.append(" {:46}= widgets.text\n".format("{}.widget".format(entCol))) if lookups: lisAppWrite.append(lookups[:-1] + "}\n") dicWrite[entidade.id] = lisAppWrite while len(dicRefer) > 0: lisKeys = sorted(dicRefer.keys()) # Lista com as keys do dicRefer para deleção dos vazios # Cada key deletada do dicRefer entra na lisWrite for k in lisKeys: if not dicRefer[k]: lisWrite.append(k) del dicRefer[k] for ent in lisWrite: for k in dicRefer.keys(): if ent in dicRefer[k]: dicRefer[k].remove(ent) for ent in lisWrite: dbApp.writelines(dicWrite[ent]) dbApp.close() clp = self.atualizaCheckListPrototipo() if not clp: return clp except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None return True, "Entidades Geradas = " + str(gerados) def origemColuna(self, col): origem = self.OrigemColunasAplicacao.selectOrigemColunasAplicacaoByCodigoColuna(col.colunas.id) if origem[0] and origem[1]: return True else: return False def montaMensagem(self, codigoEntCol, origemMsg, tipoMsg, regra, nova=None): retMessage = self.mensagens.getMensagem(codigoEntCol, origemMsg, tipoMsg, regra, nova) if retMessage[0]: return "{}{:04}".format(self.applId, retMessage[1]) else: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None def montaLookups(self, lookups, entidade, coluna, entRef, colRef): if lookups: lkp = "" eqs = " " ach = "," else: lkp = "{}.lookups".format(entidade) eqs = "=" ach = "{" lookups += "{:50}{} {}'{}': ['{}', ['{}'] ,False]\n".format(lkp, eqs, ach, coluna, entRef, colRef) return lookups def atualizaCheckListPrototipo(self): try: if self.databaseCreated: self.db(self.checkListPrototipo.codigoAplicacao == self.cAppl).update(model=True, database=True) else: self.db(self.checkListPrototipo.codigoAplicacao == self.cAppl).update(model=True) except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None self.db.commit() return True, None def tryEngine(self): config = self.database.getConfig() sgdbDB = config.sgdb.sgdb userDB = config.database.userDB passDB = config.database.passDB hostDB = config.database.hostDB portDB = config.database.portDB nameDB = config.database.nameDB if sgdbDB == "DB2": import ibm_db_sa try: engine = eval( "{}.{}('{}://{}:{}@{}:{}/{}')".format( "sqlalchemy", "create_engine", sgdbDB, userDB, passDB, hostDB, portDB, nameDB ) ) except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None return True, engine def metaSchema(self, engine): try: schm = sqlalchemy.schema.MetaData(bind=engine) schm.reflect() except: if self.info: return False, traceback.format_exc(sys.exc_info) else: return False, None return True, schm