Browse Source

Arruma loop infinto na proteção contra exclusão.

Signed-off-by: Luciano Almeida <lucianoalmeida@interlegis.leg.br>
pull/978/head
Luciano Almeida 8 years ago
parent
commit
a0042b1700
  1. 66
      sapl/legacy/migration.py
  2. 4
      sapl/legacy/scripts/fix_tables.sql
  3. 1
      sapl/legacy/scripts/shell_para_migracao.sh

66
sapl/legacy/migration.py

@ -26,7 +26,7 @@ from sapl.norma.models import (AssuntoNorma, NormaJuridica,
TipoVinculoNormaJuridica) TipoVinculoNormaJuridica)
from sapl.parlamentares.models import Parlamentar from sapl.parlamentares.models import Parlamentar
from sapl.protocoloadm.models import Protocolo, StatusTramitacaoAdministrativo from sapl.protocoloadm.models import Protocolo, StatusTramitacaoAdministrativo
from sapl.sessao.models import ExpedienteMateria, OrdemDia, SessaoPlenaria from sapl.sessao.models import ExpedienteMateria, OrdemDia
from sapl.settings import PROJECT_DIR from sapl.settings import PROJECT_DIR
from sapl.utils import normalize from sapl.utils import normalize
@ -247,12 +247,12 @@ def recreate_constraints():
def obj_desnecessario(obj): def obj_desnecessario(obj):
lista_fields = [ relacoes = [
f for f in obj._meta.get_fields() f for f in obj._meta.get_fields()
if (f.one_to_many or f.one_to_one) and f.auto_created] if (f.one_to_many or f.one_to_one) and f.auto_created]
desnecessario = not any(rr.related_model.objects.filter( sem_referencia = not any(rr.related_model.objects.filter(
**{rr.field.name: obj}).exists() for rr in lista_fields) **{rr.field.name: obj}).exists() for rr in relacoes)
return desnecessario return sem_referencia
def get_last_value(model): def get_last_value(model):
@ -413,34 +413,23 @@ class DataMigrator:
return 0 return 0
info('Excluindo entradas antigas do banco.') info('Excluindo entradas antigas do banco.')
call([PROJECT_DIR.child('manage.py'), 'flush', call([PROJECT_DIR.child('manage.py'), 'flush',
'--settings=sapl.settings', '--database=default', '--no-input'], '--database=default', '--no-input'], stdout=PIPE)
stdout=PIPE)
info('Começando migração: %s...' % obj) info('Começando migração: %s...' % obj)
self._do_migrate(obj) self._do_migrate(obj)
# exclude logically deleted in legacy base
# Itera várias vezes na lista excluindo o que for possível
info('Deletando models com ind_excluido...') info('Deletando models com ind_excluido...')
while self.to_delete: while self.delete_ind_excluido():
for obj in self.to_delete: pass
if obj_desnecessario(obj): # Salva o que não pôde ser excluido da lista no problema da migração
try: for obj in self.to_delete:
obj.delete() msg = 'A entrada de PK %s da model %s não pode ser ' \
self.to_delete.remove(obj) 'excluida' % (obj.pk, obj._meta.model_name)
except ProtectedError: descricao = 'Um ou mais objetos protegidos '
msg = 'A entrada de PK %s da model %s não pode ser ' \ warn(msg + ' => ' + descricao)
'excluida' % (obj.pk, obj._meta.model_name) save_relation(obj=obj, problema=msg,
descricao = 'Um ou mais objetos protegidos ' descricao=descricao, eh_stub=False)
warn(msg + ' => ' + descricao)
save_relation(obj=obj, problema=msg,
descricao=descricao, eh_stub=False)
else:
msg = 'A entrada de PK %s da model %s não pode ser ' \
'excluida' % (obj.pk, obj._meta.model_name)
descricao = 'Outros objetos dependem dessa entrada'
warn(msg + ' => ' + descricao)
save_relation(obj=obj, problema=msg,
descricao=descricao, eh_stub=False)
self.to_delete.remove(obj)
info('Deletando stubs desnecessários...') info('Deletando stubs desnecessários...')
while self.delete_stubs(): while self.delete_stubs():
@ -514,6 +503,20 @@ class DataMigrator:
if getattr(old, 'ind_excluido', False): if getattr(old, 'ind_excluido', False):
self.to_delete.append(new) self.to_delete.append(new)
def delete_ind_excluido(self):
excluidos = 0
for obj in self.to_delete:
if obj_desnecessario(obj):
try:
obj.delete()
except ProtectedError:
pass
else:
self.to_delete.remove(obj)
excluidos += 1
return excluidos
def delete_stubs(self): def delete_stubs(self):
excluidos = 0 excluidos = 0
for obj in ProblemaMigracao.objects.all(): for obj in ProblemaMigracao.objects.all():
@ -589,10 +592,6 @@ def adjust_protocolo(new, old):
new.numero = p['numero__max'] + 1 new.numero = p['numero__max'] + 1
def adjust_sessaoplenaria(new, old):
assert not old.tip_expediente
def adjust_tipoproposicao(new, old): def adjust_tipoproposicao(new, old):
if old.ind_mat_ou_doc == 'M': if old.ind_mat_ou_doc == 'M':
new.tipo_conteudo_related = TipoMateriaLegislativa.objects.get( new.tipo_conteudo_related = TipoMateriaLegislativa.objects.get(
@ -689,7 +688,6 @@ AJUSTE_ANTES_SALVAR = {
Parlamentar: adjust_parlamentar, Parlamentar: adjust_parlamentar,
Participacao: adjust_participacao, Participacao: adjust_participacao,
Protocolo: adjust_protocolo, Protocolo: adjust_protocolo,
SessaoPlenaria: adjust_sessaoplenaria,
TipoProposicao: adjust_tipoproposicao, TipoProposicao: adjust_tipoproposicao,
StatusTramitacao: adjust_statustramitacao, StatusTramitacao: adjust_statustramitacao,
StatusTramitacaoAdministrativo: adjust_statustramitacaoadm, StatusTramitacaoAdministrativo: adjust_statustramitacaoadm,

4
sapl/legacy/scripts/fix_tables.sql

@ -1,5 +1,5 @@
-- Apaga as restrições somente para essa sessão -- Apaga as restrições somente para essa sessão
SET SESSION sql_mode = ''; SELECT REPLACE(@@sql_mode,'STRICT_TRANS_TABLES,','');
-- Exclui procedures caso já existam -- Exclui procedures caso já existam
DROP PROCEDURE IF EXISTS verifica_campos_proposicao; DROP PROCEDURE IF EXISTS verifica_campos_proposicao;
DROP PROCEDURE IF EXISTS verifica_campos_sessao_plenaria_presenca; DROP PROCEDURE IF EXISTS verifica_campos_sessao_plenaria_presenca;
@ -9,7 +9,7 @@ CREATE PROCEDURE verifica_campos_proposicao() BEGIN IF NOT EXISTS (SELECT * FROM
-- Procedure para criar campos cod_presenca_sessao (sendo a nova PK da tabela) e dat_sessao em sessao_plenaria_presenca -- Procedure para criar campos cod_presenca_sessao (sendo a nova PK da tabela) e dat_sessao em sessao_plenaria_presenca
CREATE PROCEDURE verifica_campos_sessao_plenaria_presenca() BEGIN IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='sessao_plenaria_presenca' AND column_name='cod_presenca_sessao') THEN ALTER TABLE sessao_plenaria_presenca DROP PRIMARY KEY, ADD cod_presenca_sessao INT AUTO_INCREMENT PRIMARY KEY FIRST; END IF; IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='sessao_plenaria_presenca' AND column_name='dat_sessao') THEN ALTER TABLE sessao_plenaria_presenca ADD COLUMN dat_sessao DATE NULL after cod_parlamentar; END IF; END; CREATE PROCEDURE verifica_campos_sessao_plenaria_presenca() BEGIN IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='sessao_plenaria_presenca' AND column_name='cod_presenca_sessao') THEN ALTER TABLE sessao_plenaria_presenca DROP PRIMARY KEY, ADD cod_presenca_sessao INT AUTO_INCREMENT PRIMARY KEY FIRST; END IF; IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='sessao_plenaria_presenca' AND column_name='dat_sessao') THEN ALTER TABLE sessao_plenaria_presenca ADD COLUMN dat_sessao DATE NULL after cod_parlamentar; END IF; END;
-- Procedure para criar tabela lexml_registro_provedor e lexml_registro_publicador -- Procedure para criar tabela lexml_registro_provedor e lexml_registro_publicador
CREATE PROCEDURE cria_lexml_registro_provedor_e_publicador() BEGIN CREATE TABLE IF NOT EXISTS lexml_registro_publicador (cod_publicador INT AUTO_INCREMENT NOT NULL, id_publicador INT, nom_publicador VARCHAR(255), adm_email VARCHAR(50), sigla VARCHAR(255), nom_responsavel VARCHAR(255), tipo VARCHAR(50), id_responsavel INT, PRIMARY KEY (cod_publicador)); CREATE TABLE IF NOT EXISTS lexml_registro_provedor (cod_provedor INT AUTO_INCREMENT NOT NULL, id_provedor INT, nom_provedor VARCHAR(255), sgl_provedor VARCHAR(15), adm_email VARCHAR(50), nom_responsavel VARCHAR(255), tipo VARCHAR(50), id_responsavel INT, xml_provedor LONGTEXT, PRIMARY KEY (cod_provedor)); END; CREATE PROCEDURE cria_lexml_registro_provedor_e_publicador() BEGIN IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='lexml_registro_publicador') THEN CREATE TABLE lexml_registro_publicador (cod_publicador INT AUTO_INCREMENT NOT NULL, id_publicador INT, nom_publicador VARCHAR(255), adm_email VARCHAR(50), sigla VARCHAR(255), nom_responsavel VARCHAR(255), tipo VARCHAR(50), id_responsavel INT, PRIMARY KEY (cod_publicador)); END IF; IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='lexml_registro_provedor') THEN CREATE TABLE lexml_registro_provedor (cod_provedor INT AUTO_INCREMENT NOT NULL, id_provedor INT, nom_provedor VARCHAR(255), sgl_provedor VARCHAR(15), adm_email VARCHAR(50), nom_responsavel VARCHAR(255), tipo VARCHAR(50), id_responsavel INT, xml_provedor LONGTEXT, PRIMARY KEY (cod_provedor)); END IF; END;
-- Executa as procedures criadas acima -- Executa as procedures criadas acima
CALL verifica_campos_proposicao; CALL verifica_campos_proposicao;
CALL verifica_campos_sessao_plenaria_presenca; CALL verifica_campos_sessao_plenaria_presenca;

1
sapl/legacy/scripts/shell_para_migracao.sh

@ -5,5 +5,4 @@
# Rode esse script a partir da raiz do projeto # Rode esse script a partir da raiz do projeto
DATABASE_NAME=$1 ./manage.py migrate --settings sapl.legacy_migration_settings
DATABASE_NAME=$1 ./manage.py shell_plus --settings sapl.legacy_migration_settings DATABASE_NAME=$1 ./manage.py shell_plus --settings sapl.legacy_migration_settings

Loading…
Cancel
Save