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

4
sapl/legacy/scripts/fix_tables.sql

@ -1,5 +1,5 @@
-- 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
DROP PROCEDURE IF EXISTS verifica_campos_proposicao;
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
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
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
CALL verifica_campos_proposicao;
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
DATABASE_NAME=$1 ./manage.py migrate --settings sapl.legacy_migration_settings
DATABASE_NAME=$1 ./manage.py shell_plus --settings sapl.legacy_migration_settings

Loading…
Cancel
Save