Browse Source

Merge pull request #978 from interlegis/977-excluir-objetos-protegidos

fix #977 - Corrige problema da exclusão de objetos protegidos
pull/991/head
Luciano Henrique Nunes de Almeida 8 years ago
committed by GitHub
parent
commit
095e335eb7
  1. 72
      sapl/legacy/migration.py
  2. 4
      sapl/legacy/scripts/fix_tables.sql

72
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
@ -246,15 +246,13 @@ def recreate_constraints():
unique_constraints.clear() unique_constraints.clear()
def stub_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]
] sem_referencia = not any(rr.related_model.objects.filter(
desnecessario = not any( **{rr.field.name: obj}).exists() for rr in relacoes)
rr.related_model.objects.filter(**{rr.field.name: obj}).exists() return sem_referencia
for rr in lista_fields)
return desnecessario
def get_last_value(model): def get_last_value(model):
@ -415,25 +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
try: # Salva o que não pôde ser excluido da lista no problema da migração
obj.delete() for obj in self.to_delete:
self.to_delete.remove(obj) msg = 'A entrada de PK %s da model %s não pode ser ' \
except ProtectedError: 'excluida' % (obj.pk, obj._meta.model_name)
msg = 'A entrada de PK %s da model %s não pode ser ' \ descricao = 'Um ou mais objetos protegidos '
'excluida' % (obj.pk, obj._meta.model_name) warn(msg + ' => ' + descricao)
descricao = 'Um ou mais objetos protegidos ' save_relation(obj=obj, problema=msg,
warn(msg + ' => ' + descricao) descricao=descricao, eh_stub=False)
save_relation(obj=obj, problema=msg,
descricao=descricao, eh_stub=False)
info('Deletando stubs desnecessários...') info('Deletando stubs desnecessários...')
while self.delete_stubs(): while self.delete_stubs():
@ -468,13 +464,6 @@ class DataMigrator:
legacy_model = legacy_app.get_model(legacy_model_name) legacy_model = legacy_app.get_model(legacy_model_name)
legacy_pk_name = legacy_model._meta.pk.name legacy_pk_name = legacy_model._meta.pk.name
# Clear all model entries
# They may have been created in a previous migration attempt
try:
model.objects.all().delete()
except ProtectedError:
Proposicao.objects.all().delete()
model.objects.all().delete()
delete_constraints(model) delete_constraints(model)
# setup migration strategy for tables with or without a pk # setup migration strategy for tables with or without a pk
@ -514,13 +503,27 @@ 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():
if obj.content_object and obj.eh_stub: if obj.content_object and obj.eh_stub:
original = obj.content_type.get_all_objects_for_this_type( original = obj.content_type.get_all_objects_for_this_type(
id=obj.object_id) id=obj.object_id)
if stub_desnecessario(original[0]): if obj_desnecessario(original[0]):
qtd_exclusoes, *_ = original.delete() qtd_exclusoes, *_ = original.delete()
assert qtd_exclusoes == 1 assert qtd_exclusoes == 1
qtd_exclusoes, *_ = obj.delete() qtd_exclusoes, *_ = obj.delete()
@ -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;

Loading…
Cancel
Save