From 1b5ee6cf22ac0325d34161eaa89d3431e0b5b72c Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Fri, 11 Aug 2017 11:01:42 -0300 Subject: [PATCH 01/24] =?UTF-8?q?Inicia=20simplifica=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migration.py | 179 +++++++++++++++------------------------ sapl/materia/models.py | 7 +- 2 files changed, 73 insertions(+), 113 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index fcf2f0837..b0599bcce 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -12,7 +12,7 @@ from django.contrib.auth.models import Group from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.db import OperationalError, ProgrammingError, connections, models -from django.db.models import CharField, Max, ProtectedError, TextField, Count +from django.db.models import CharField, Count, Max, ProtectedError, TextField from django.db.models.base import ModelBase from django.db.models.signals import post_delete, post_save from model_mommy import mommy @@ -26,11 +26,11 @@ from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, Tramitacao) -from sapl.norma.models import (AssuntoNorma, NormaJuridica, - TipoVinculoNormaJuridica, NormaRelacionada) -from sapl.parlamentares.models import (Legislatura,Mandato, Parlamentar, +from sapl.norma.models import (AssuntoNorma, NormaJuridica, NormaRelacionada, + TipoVinculoNormaJuridica) +from sapl.parlamentares.models import (Legislatura, Mandato, Parlamentar, TipoAfastamento) -from sapl.protocoloadm.models import (DocumentoAdministrativo,Protocolo, +from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, StatusTramitacaoAdministrativo) from sapl.sessao.models import ExpedienteMateria, OrdemDia, RegistroVotacao from sapl.settings import PROJECT_DIR @@ -119,63 +119,22 @@ def erro(msg): print('ERRO: ' + msg) +class ForeignKeyFaltando(ObjectDoesNotExist): + 'Uma FK aponta para um registro inexistente' + pass + + def get_fk_related(field, value, label=None): - if value is None and field.null is False: - value = 0 - if value is not None: + if value is None: + return value + else: try: - value = field.related_model.objects.get(id=value) - except ObjectDoesNotExist: - msg = 'FK [%s] não encontrada para valor %s ' \ - '(em %s %s)' % ( - field.name, value, - field.model.__name__, label or '---') - if value == 0: - if not field.null: - fields_dict = get_fields_dict(field.related_model) - # Cria stub ao final da tabela para evitar erros - pk = get_last_value(field.related_model) - with reversion.create_revision(): - reversion.set_comment('Stub criado pela migração') - value = mommy.make( - field.related_model, **fields_dict, - pk=(pk + 1 or 1)) - descricao = 'stub criado para campos não nuláveis!' - save_relation(value, [field.name], msg, descricao, - eh_stub=True) - warn(msg + ' => ' + descricao) - else: - value = None - else: - if field.model._meta.label == 'sessao.RegistroVotacao' and \ - field.name == 'ordem': - return value - # Caso TipoProposicao não exista, um objeto será criado então - # com content_type=13 (ProblemaMigracao) - if field.related_model.__name__ == 'TipoProposicao': - tipo = TipoProposicao.objects.filter(descricao='Erro') - if not tipo: - with reversion.create_revision(): - reversion.set_comment( - 'TipoProposicao "Erro" criado') - ct = ContentType.objects.get(pk=13) - value = TipoProposicao.objects.create( - id=value, descricao='Erro', content_type=ct) - ultimo_valor = get_last_value(type(value)) - alter_sequence(type(value), ultimo_valor+1) - else: - value = tipo[0] - else: - with reversion.create_revision(): - reversion.set_comment('Stub criado pela migração') - value = make_stub(field.related_model, value) - descricao = 'stub criado para entrada orfã!' - warn(msg + ' => ' + descricao) - save_relation(value, [field.name], msg, descricao, - eh_stub=True) - else: - assert value - return value + return field.related_model.objects.get(id=value) + except ObjectDoesNotExist as ex: + msg = 'FK [%s] não encontrada para o valor %s (em %s %s)' % ( + field.name, value, field.model.__name__, label or '---') + warn(msg) + raise ForeignKeyFaltando(msg) def get_field(model, fieldname): @@ -252,7 +211,7 @@ def problema_duplicatas(model, lista_duplicatas, argumentos): string_pks = "" problema = "%s de PK %s não é único." % (model.__name__, obj.pk) args_dict = {k: obj.__dict__[k] - for k in set(argumentos) & set(obj.__dict__.keys())} + for k in set(argumentos) & set(obj.__dict__.keys())} for dup in model.objects.filter(**args_dict): pks.append(dup.pk) string_pks = "(" + ", ".join(map(str, pks)) + ")" @@ -321,6 +280,7 @@ def recria_constraints(): (problema[0], problema[1])) +# TODO o que é isso? #################################################### def obj_desnecessario(obj): relacoes = [ f for f in obj._meta.get_fields() @@ -335,7 +295,7 @@ def obj_desnecessario(obj): def get_last_value(model): last_value = model.objects.all().aggregate(Max('pk')) - return last_value['pk__max'] if last_value['pk__max'] else 0 + return last_value['pk__max'] or 0 def alter_sequence(model, id): @@ -360,11 +320,11 @@ def save_relation(obj, nome_campo='', problema='', descricao='', link.save() +# TODO NECESSÁRIO AINDA??????????? def make_stub(model, id): fields_dict = get_fields_dict(model) new = mommy.prepare(model, **fields_dict, pk=id) save_with_id(new, id) - return new @@ -407,7 +367,7 @@ def fill_vinculo_norma_juridica(): 'Julgada parcialmente inconstitucional')] lista_objs = [TipoVinculoNormaJuridica( sigla=item[0], descricao_ativa=item[1], descricao_passiva=item[2]) - for item in lista] + for item in lista] TipoVinculoNormaJuridica.objects.bulk_create(lista_objs) @@ -452,8 +412,6 @@ class DataMigrator: for field in new._meta.fields: old_field_name = renames.get(field.name) field_type = field.get_internal_type() - msg = ("O valor do campo %s (%s) da model %s era inválido" % - (field.name, field_type, field.model.__name__)) if old_field_name: old_value = getattr(old, old_field_name) if isinstance(field, models.ForeignKey): @@ -466,38 +424,36 @@ class DataMigrator: value = get_fk_related(field, old_value, label) else: value = getattr(old, old_field_name) + # TODO rever esse DateField após as mudança para datas com + # timezone if field_type == 'DateField' and \ not field.null and value is None: + # TODO REVER ISSO descricao = 'A data 1111-11-11 foi colocada no lugar' problema = 'O valor da data era nulo ou inválido' - warn(msg + - ' => ' + descricao) + warn("O valor do campo %s (%s) do model %s " + "era inválido => %s" % ( + field.name, field_type, + field.model.__name__, descricao)) value = date(1111, 11, 11) self.data_mudada['obj'] = new self.data_mudada['descricao'] = descricao self.data_mudada['problema'] = problema self.data_mudada.setdefault('nome_campo', []).\ append(field.name) - if field_type == 'CharField' or field_type == 'TextField': - if value is None or value == 'None': - value = '' - setattr(new, field.name, value) - elif field.model.__name__ == 'TipoAutor' and \ - field.name == 'content_type': - - model = normalize(new.descricao.lower()).replace(' ', '') - content_types = field.related_model.objects.filter( - model=model).exclude(app_label='legacy') - assert len(content_types) <= 1 - - value = content_types[0] if content_types else None + if field_type in ['CharField', 'TextField'] \ + and value in [None, 'None']: + if value == 'None': + # TODO quero saber como é que pode ser 'None' !!!! + import ipdb + ipdb.set_trace() + value = '' setattr(new, field.name, value) def migrate(self, obj=appconfs, interativo=True): # warning: model/app migration order is of utmost importance exec_sql_file(PROJECT_DIR.child( 'sapl', 'legacy', 'scripts', 'fix_tables.sql'), 'legacy') - self.to_delete = [] # excluindo database antigo. if interativo: @@ -593,8 +549,17 @@ class DataMigrator: # convert old records to new ones for old in old_records: + if getattr(old, 'ind_excluido', False): + # não migramos registros marcados como excluídos + continue new = model() - self.populate_renamed_fields(new, old) + try: + self.populate_renamed_fields(new, old) + except ForeignKeyFaltando: + # tentamos preencher uma FK e o ojeto relacionado não existe + # então este é um objeo órfão: simplesmente ignoramos + continue + if ajuste_antes_salvar: ajuste_antes_salvar(new, old) save(new, old) @@ -605,26 +570,10 @@ class DataMigrator: save_relation(**self.data_mudada) self.data_mudada.clear() reversion.set_comment('Ajuste de data pela migração') - if getattr(old, 'ind_excluido', False): - self.to_delete.append(new) # necessário para ajustar sequence da tabela para o ultimo valor de id ultimo_valor = get_last_value(model) - alter_sequence(model, ultimo_valor+1) - - 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 + alter_sequence(model, ultimo_valor + 1) def delete_stubs(self): excluidos = 0 @@ -665,15 +614,15 @@ def adjust_documentoadministrativo(new, old): except Exception: try: protocolo = Protocolo.objects.get(numero=new.numero_protocolo, - ano=new.ano+1) + ano=new.ano + 1) new.protocolo = protocolo except Exception: protocolo = mommy.make(Protocolo, numero=new.numero_protocolo, ano=new.ano) with reversion.create_revision(): problema = 'Protocolo Vinculado [numero_protocolo=%s, '\ - 'ano=%s] não existe' % (new.numero_protocolo, - new.ano) + 'ano=%s] não existe' % (new.numero_protocolo, + new.ano) descricao = 'O protocolo inexistente foi criado' warn(problema + ' => ' + descricao) save_relation(obj=protocolo, problema=problema, @@ -751,7 +700,7 @@ def adjust_proposicao_antes_salvar(new, old): def adjust_proposicao_depois_salvar(new, old): if not hasattr(old.dat_envio, 'year') or old.dat_envio.year == 1800: msg = "O valor do campo data_envio (DateField) da model Proposicao"\ - " era inválido" + " era inválido" descricao = 'A data 1111-11-11 foi colocada no lugar' problema = 'O valor da data era nulo ou inválido' warn(msg + ' => ' + descricao) @@ -816,7 +765,6 @@ def adjust_tipoafastamento(new, old): new.indicador = 'A' - def adjust_tipoproposicao(new, old): if old.ind_mat_ou_doc == 'M': new.tipo_conteudo_related = TipoMateriaLegislativa.objects.get( @@ -844,6 +792,14 @@ def adjust_tramitacao(new, old): new.turno = 'U' +def adjust_tipo_autor(new, old): + model_apontado = normalize(new.descricao.lower()).replace(' ', '') + content_types = ContentType.objects.filter( + model=model_apontado).exclude(app_label='legacy') + assert len(content_types) <= 1 + new.content_type = content_types[0] if content_types else None + + def adjust_normajuridica_antes_salvar(new, old): # Ajusta choice de esfera_federacao # O 'S' vem de 'Selecionar'. Na versão antiga do SAPL, quando uma opção do @@ -870,7 +826,7 @@ def adjust_autor(new, old): except Exception: with reversion.create_revision(): msg = 'Um parlamentar relacionado de PK [%s] não existia' \ - % old.cod_parlamentar + % old.cod_parlamentar reversion.set_comment('Stub criado pela migração') value = make_stub(Parlamentar, old.cod_parlamentar) descricao = 'stub criado para entrada orfã!' @@ -909,6 +865,7 @@ def adjust_comissao(new, old): AJUSTE_ANTES_SALVAR = { Autor: adjust_autor, + TipoAutor: adjust_tipo_autor, AcompanhamentoMateria: adjust_acompanhamentomateria, Comissao: adjust_comissao, DocumentoAdministrativo: adjust_documentoadministrativo, @@ -939,15 +896,15 @@ AJUSTE_DEPOIS_SALVAR = { # CHECKS #################################################################### -def get_ind_excluido(obj): - legacy_model = legacy_app.get_model(type(obj).__name__) - return getattr(legacy_model.objects.get( - **{legacy_model._meta.pk.name: obj.id}), 'ind_excluido', False) +def get_ind_excluido(new): + legacy_model = legacy_app.get_model(type(new).__name__) + old = legacy_model.objects.get(**{legacy_model._meta.pk.name: new.id}) + return getattr(old, 'ind_excluido', False) def check_app_no_ind_excluido(app): for model in app.models.values(): - assert not any(get_ind_excluido(obj) for obj in model.objects.all()) + assert not any(get_ind_excluido(new) for new in model.objects.all()) print('OK!') # MOMMY MAKE WITH LOG ###################################################### diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 36d375068..1408bd445 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -1,5 +1,6 @@ from datetime import datetime +import reversion from django.contrib.auth.models import Group from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.models import ContentType @@ -8,7 +9,6 @@ from django.db import models from django.utils import formats from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -import reversion from sapl.base.models import Autor from sapl.comissoes.models import Comissao @@ -19,7 +19,6 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey, SaplGenericRelation, restringe_tipos_de_arquivo_txt, texto_upload_path) - EM_TRAMITACAO = [(1, 'Sim'), (0, 'Não')] @@ -620,6 +619,10 @@ class Proposicao(models.Model): blank=True, on_delete=models.PROTECT) tipo = models.ForeignKey(TipoProposicao, on_delete=models.PROTECT, + # TODO PÓS MIGRACAO INICIAL (vide #1381) + # não nulo quando todas as + # bases tiverem sido corrigidas + null=True, verbose_name=_('Tipo')) # XXX data_envio was not null, but actual data said otherwise!!! From ecd366ee85e4d59a94ab187cbf1d8052869a1dde Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 15 Aug 2017 11:26:05 -0300 Subject: [PATCH 02/24] =?UTF-8?q?Retirado=20c=C3=B3digo=20de=20debug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migration.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index b0599bcce..6075dccee 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -18,7 +18,8 @@ from django.db.models.signals import post_delete, post_save from model_mommy import mommy from model_mommy.mommy import foreign_key_required, make -from sapl.base.models import Argumento, Autor, Constraint, ProblemaMigracao +from sapl.base.models import (Argumento, Autor, Constraint, ProblemaMigracao, + TipoAutor) from sapl.comissoes.models import Comissao, Composicao, Participacao from sapl.legacy.models import Protocolo as ProtocoloLegado from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, @@ -441,12 +442,8 @@ class DataMigrator: self.data_mudada['problema'] = problema self.data_mudada.setdefault('nome_campo', []).\ append(field.name) - if field_type in ['CharField', 'TextField'] \ - and value in [None, 'None']: - if value == 'None': - # TODO quero saber como é que pode ser 'None' !!!! - import ipdb - ipdb.set_trace() + if (field_type in ['CharField', 'TextField'] + and value in [None, 'None']): value = '' setattr(new, field.name, value) From c26cb3b5fb32b5caee285bdac161854c9a088840 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 15 Aug 2017 12:33:33 -0300 Subject: [PATCH 03/24] Ignora autor c ref a parlamentar ou comissao faltante --- sapl/legacy/migration.py | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 6075dccee..7c1311362 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -552,16 +552,16 @@ class DataMigrator: new = model() try: self.populate_renamed_fields(new, old) + if ajuste_antes_salvar: + ajuste_antes_salvar(new, old) + save(new, old) except ForeignKeyFaltando: # tentamos preencher uma FK e o ojeto relacionado não existe # então este é um objeo órfão: simplesmente ignoramos continue - - if ajuste_antes_salvar: - ajuste_antes_salvar(new, old) - save(new, old) if ajuste_depois_salvar: ajuste_depois_salvar(new, old) + if self.data_mudada: with reversion.create_revision(): save_relation(**self.data_mudada) @@ -820,32 +820,32 @@ def adjust_autor(new, old): if old.cod_parlamentar: try: new.autor_related = Parlamentar.objects.get(pk=old.cod_parlamentar) - except Exception: - with reversion.create_revision(): - msg = 'Um parlamentar relacionado de PK [%s] não existia' \ - % old.cod_parlamentar - reversion.set_comment('Stub criado pela migração') - value = make_stub(Parlamentar, old.cod_parlamentar) - descricao = 'stub criado para entrada orfã!' - warn(msg + ' => ' + descricao) - save_relation(value, [], msg, descricao, - eh_stub=True) - new.autor_related = value - new.nome = new.autor_related.nome_parlamentar + except ObjectDoesNotExist: + # ignoramos o autor órfão + raise ForeignKeyFaltando('Parlamentar inexiste para autor') + else: + new.nome = new.autor_related.nome_parlamentar elif old.cod_comissao: - new.autor_related = Comissao.objects.get(pk=old.cod_comissao) - new.nome = new.autor_related.nome + try: + new.autor_related = Comissao.objects.get(pk=old.cod_comissao) + except ObjectDoesNotExist: + # ignoramos o autor órfão + raise ForeignKeyFaltando('Comissao inexiste para autor') + else: + new.nome = new.autor_related.nome if old.col_username: - if not get_user_model().objects.filter( - username=old.col_username).exists(): - user = get_user_model()(username=old.col_username) + user_model = get_user_model() + if not user_model.objects.filter(username=old.col_username).exists(): + # cria um novo ususaŕio para o autor + user = user_model(username=old.col_username) user.set_password(12345) with reversion.create_revision(): user.save() - reversion.set_comment('Objeto criado pela migração') - + reversion.set_comment( + 'Usuário criado pela migração para o autor {}'.format( + old.cod_autor)) grupo_autor = Group.objects.get(name="Autor") user.groups.add(grupo_autor) From be55fc450ca0b1025e49f559f084e825f4e42464 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Tue, 15 Aug 2017 15:49:18 -0300 Subject: [PATCH 04/24] adicionar order_by para evitar erro no distinct Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 7c1311362..47c2c934b 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -256,7 +256,7 @@ def recria_constraints(): args_string = '' args_string += "(" + ', '.join(map(str, args)) + ")" - distintos = model.objects.distinct(*args) + distintos = model.objects.order_by(*args).distinct(*args) todos = model.objects.all() if hasattr(model, "content_type"): distintos = distintos.exclude(content_type_id=None, From b4a527ccf9831501bd62b82af00caee3c6e35b4a Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Tue, 15 Aug 2017 15:50:12 -0300 Subject: [PATCH 05/24] Muda campo status para poder aceitar valores nulos Signed-off-by: Luciano Almeida --- .../migrations/0012_auto_20170815_1238.py | 26 +++++++++++++++++++ sapl/materia/models.py | 4 +++ 2 files changed, 30 insertions(+) create mode 100644 sapl/materia/migrations/0012_auto_20170815_1238.py diff --git a/sapl/materia/migrations/0012_auto_20170815_1238.py b/sapl/materia/migrations/0012_auto_20170815_1238.py new file mode 100644 index 000000000..5f62c1670 --- /dev/null +++ b/sapl/materia/migrations/0012_auto_20170815_1238.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.12 on 2017-08-15 12:38 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0011_auto_20170808_1034'), + ] + + operations = [ + migrations.AlterField( + model_name='proposicao', + name='tipo', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.TipoProposicao', verbose_name='Tipo'), + ), + migrations.AlterField( + model_name='tramitacao', + name='status', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.StatusTramitacao', verbose_name='Status'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 1408bd445..c1cabfe18 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -846,6 +846,10 @@ class Tramitacao(models.Model): ) status = models.ForeignKey(StatusTramitacao, on_delete=models.PROTECT, + # TODO PÓS MIGRACAO INICIAL (vide #1381) + # não nulo quando todas as + # bases tiverem sido corrigidas + null=True, verbose_name=_('Status')) materia = models.ForeignKey(MateriaLegislativa, on_delete=models.PROTECT) data_tramitacao = models.DateField(verbose_name=_('Data Tramitação')) From a6dc54f84cf78f47d82a083991955f13c928b8c9 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 15 Aug 2017 15:27:00 -0300 Subject: [PATCH 06/24] =?UTF-8?q?Reformata=20arquivo=20de=20sqls=20pr?= =?UTF-8?q?=C3=A9-migra=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migration.py | 10 ++- sapl/legacy/scripts/fix_tables.sql | 109 +++++++++++++++++++++++++++-- 2 files changed, 106 insertions(+), 13 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 47c2c934b..ec6188ebd 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -143,12 +143,10 @@ def get_field(model, fieldname): def exec_sql_file(path, db='default'): - cursor = connections[db].cursor() - for line in open(path): - try: - cursor.execute(line) - except (OperationalError, ProgrammingError) as e: - print("Args: '%s'" % (str(e.args))) + with open(path) as arq: + sql = arq.read() + with connections[db].cursor() as cursor: + cursor.execute(sql) def exec_sql(sql, db='default'): diff --git a/sapl/legacy/scripts/fix_tables.sql b/sapl/legacy/scripts/fix_tables.sql index 1f8cdb63b..3d239e1ae 100644 --- a/sapl/legacy/scripts/fix_tables.sql +++ b/sapl/legacy/scripts/fix_tables.sql @@ -1,5 +1,6 @@ -- Apaga as restrições somente para essa sessão -SELECT REPLACE(@@sql_mode,'STRICT_TRANS_TABLES,','ALLOW_INVALID_DATES'); +SELECT replace(@@sql_mode,'STRICT_TRANS_TABLES,','ALLOW_INVALID_DATES'); + -- Exclui procedures caso já existam DROP PROCEDURE IF EXISTS verifica_campos_proposicao; DROP PROCEDURE IF EXISTS verifica_campos_tipo_materia_legislativa; @@ -7,18 +8,111 @@ DROP PROCEDURE IF EXISTS verifica_campos_sessao_plenaria_presenca; DROP PROCEDURE IF EXISTS cria_lexml_registro_provedor_e_publicador; DROP PROCEDURE IF EXISTS cria_tipo_situacao_militar; DROP PROCEDURE IF EXISTS muda_vinculo_norma_juridica_ind_excluido; + -- Procedure para criar campo num_proposicao em proposicao -CREATE PROCEDURE verifica_campos_proposicao() BEGIN IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='proposicao' AND column_name='num_proposicao') THEN UPDATE proposicao SET dat_envio = '1800-01-01' WHERE CAST(dat_envio AS CHAR(20)) = '0000-00-00 00:00:00'; ALTER TABLE proposicao ADD COLUMN num_proposicao INT(11) NULL after txt_justif_devolucao; END IF; END; +CREATE PROCEDURE verifica_campos_proposicao() BEGIN IF NOT EXISTS + (SELECT * + FROM information_schema.columns + WHERE table_schema=database() + AND TABLE_NAME='proposicao' + AND COLUMN_NAME='num_proposicao') THEN +UPDATE proposicao +SET dat_envio = '1800-01-01' +WHERE cast(dat_envio AS char(20)) = '0000-00-00 00:00:00'; + ALTER TABLE proposicao ADD COLUMN num_proposicao int(11) NULL AFTER txt_justif_devolucao; +END IF; END; + -- Procedure para criar campo iind_num_automatica em tipo_materia_legislativa -CREATE PROCEDURE verifica_campos_tipo_materia_legislativa() BEGIN IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='tipo_materia_legislativa' AND column_name='ind_num_automatica') THEN ALTER TABLE tipo_materia_legislativa ADD COLUMN ind_num_automatica BOOLEAN NULL DEFAULT FALSE after des_tipo_materia; END IF; IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='tipo_materia_legislativa' AND column_name='quorum_minimo_votacao') THEN ALTER TABLE tipo_materia_legislativa ADD COLUMN quorum_minimo_votacao INT(11) NULL after ind_num_automatica; END IF; END; +CREATE PROCEDURE verifica_campos_tipo_materia_legislativa() +BEGIN IF NOT EXISTS + (SELECT * + FROM information_schema.columns + WHERE table_schema=database() + AND TABLE_NAME='tipo_materia_legislativa' + AND COLUMN_NAME='ind_num_automatica') THEN +ALTER TABLE tipo_materia_legislativa ADD COLUMN ind_num_automatica BOOLEAN NULL DEFAULT FALSE AFTER des_tipo_materia; +END IF; +IF NOT EXISTS + (SELECT * + FROM information_schema.columns + WHERE table_schema=database() + AND TABLE_NAME='tipo_materia_legislativa' + AND COLUMN_NAME='quorum_minimo_votacao') THEN +ALTER TABLE tipo_materia_legislativa ADD COLUMN quorum_minimo_votacao int(11) NULL AFTER ind_num_automatica; +END IF; END; + -- 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 -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; +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; + -- Procedure para criar tabela tipo_situacao_militar -CREATE PROCEDURE cria_tipo_situacao_militar() BEGIN IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='tipo_situacao_militar') THEN CREATE TABLE tipo_situacao_militar (tip_situacao_militar INT AUTO_INCREMENT NOT NULL, des_tipo_situacao VARCHAR(50), ind_excluido INT, PRIMARY KEY (tip_situacao_militar)); END IF; END; +CREATE PROCEDURE cria_tipo_situacao_militar() BEGIN IF NOT EXISTS + (SELECT * + FROM information_schema.columns + WHERE table_schema=database() + AND TABLE_NAME='tipo_situacao_militar') THEN +CREATE TABLE tipo_situacao_militar ( + tip_situacao_militar INT auto_increment NOT NULL, + des_tipo_situacao varchar(50), + ind_excluido INT, PRIMARY KEY (tip_situacao_militar)); +END IF; END; + -- Procedure para mudar valor do campo ind_excluido da tabela vinculo_norma_juridica de 0 para string vazia '' -CREATE PROCEDURE muda_vinculo_norma_juridica_ind_excluido() BEGIN UPDATE vinculo_norma_juridica SET ind_excluido = '' WHERE trim(ind_excluido) = '0'; END; +CREATE PROCEDURE muda_vinculo_norma_juridica_ind_excluido() BEGIN +UPDATE vinculo_norma_juridica +SET ind_excluido = '' +WHERE trim(ind_excluido) = '0'; +END; + -- Executa as procedures criadas acima CALL verifica_campos_proposicao; CALL verifica_campos_tipo_materia_legislativa; @@ -26,3 +120,4 @@ CALL verifica_campos_sessao_plenaria_presenca; CALL cria_lexml_registro_provedor_e_publicador; CALL cria_tipo_situacao_militar; CALL muda_vinculo_norma_juridica_ind_excluido; + From 2381da463763b182bd7458f730215bd6da4b901d Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 15 Aug 2017 15:29:25 -0300 Subject: [PATCH 07/24] =?UTF-8?q?Corrige=20parlamentar=20zero=20em=20unida?= =?UTF-8?q?de=20de=20tramita=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (script pré-migração) --- sapl/legacy/scripts/fix_tables.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/legacy/scripts/fix_tables.sql b/sapl/legacy/scripts/fix_tables.sql index 3d239e1ae..27cb39c1b 100644 --- a/sapl/legacy/scripts/fix_tables.sql +++ b/sapl/legacy/scripts/fix_tables.sql @@ -121,3 +121,5 @@ CALL cria_lexml_registro_provedor_e_publicador; CALL cria_tipo_situacao_militar; CALL muda_vinculo_norma_juridica_ind_excluido; +-- Corrige cod_parlamentar zero em unidade de tramitação +update unidade_tramitacao set cod_parlamentar = NULL where cod_parlamentar = 0; From 08da4924b0ce853a8f940e90e078b68209fabd53 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 15 Aug 2017 15:31:04 -0300 Subject: [PATCH 08/24] Ignora assuntos inexistentes em Norma --- sapl/legacy/migration.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index ec6188ebd..34c8ddc09 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -807,11 +807,15 @@ def adjust_normajuridica_antes_salvar(new, old): def adjust_normajuridica_depois_salvar(new, old): # Ajusta relação M2M - lista_pks_assunto = old.cod_assunto.split(',') - # list(filter(..)) usado para retirar strings vazias da lista - for pk_assunto in list(filter(None, lista_pks_assunto)): - new.assuntos.add(AssuntoNorma.objects.get(pk=pk_assunto)) + # lista de pks separadas por vírgulas (ignorando strings vazias) + lista_pks_assunto = [int(pk) for pk in old.cod_assunto.split(',') if pk] + + for pk_assunto in lista_pks_assunto: + try: + new.assuntos.add(AssuntoNorma.objects.get(pk=pk_assunto)) + except ObjectDoesNotExist: + pass # ignora assuntos inexistentes def adjust_autor(new, old): From 5b92aae76321c8477425353a742549a875794b5c Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 15 Aug 2017 16:32:41 -0300 Subject: [PATCH 09/24] =?UTF-8?q?Ignora=20docs=20administrativos=20orf?= =?UTF-8?q?=C3=A3os=20de=20protocolo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migration.py | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 34c8ddc09..05ea4a03c 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -602,27 +602,22 @@ def adjust_acompanhamentomateria(new, old): def adjust_documentoadministrativo(new, old): if new.numero_protocolo: - try: - protocolo = Protocolo.objects.get(numero=new.numero_protocolo, - ano=new.ano) - new.protocolo = protocolo - except Exception: - try: - protocolo = Protocolo.objects.get(numero=new.numero_protocolo, - ano=new.ano + 1) - new.protocolo = protocolo - except Exception: - protocolo = mommy.make(Protocolo, numero=new.numero_protocolo, - ano=new.ano) - with reversion.create_revision(): - problema = 'Protocolo Vinculado [numero_protocolo=%s, '\ - 'ano=%s] não existe' % (new.numero_protocolo, - new.ano) - descricao = 'O protocolo inexistente foi criado' - warn(problema + ' => ' + descricao) - save_relation(obj=protocolo, problema=problema, - descricao=descricao, eh_stub=True) - reversion.set_comment('Protocolo não existia.') + protocolo = Protocolo.objects.filter( + numero=new.numero_protocolo, ano=new.ano) + if not protocolo: + protocolo = Protocolo.objects.filter( + numero=new.numero_protocolo, ano=new.ano + 1) + print('PROTOCOLO ENCONTRADO APENAS PARA O ANO SEGUINTE!!!!! ' + 'DocumentoAdministrativo: {}, numero_protocolo: {}, ' + 'ano doc adm: {}'.format( + old.cod_documento, new.numero_protocolo, new.ano)) + if not protocolo: + raise ForeignKeyFaltando( + 'Protocolo {} faltando ' + '(referenciado no documento administrativo {}'.format( + new.numero_protocolo, old.cod_documento)) + assert len(protocolo) == 1 + new.protocolo = protocolo[0] def adjust_mandato(new, old): From 703162388d97ec2b040d1089af1b72cd0add2ca0 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Tue, 15 Aug 2017 17:00:09 -0300 Subject: [PATCH 10/24] Muda valores de cod_parlamentar=0 em unidade_tramitacao Signed-off-by: Luciano Almeida --- sapl/legacy/scripts/fix_tables.sql | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sapl/legacy/scripts/fix_tables.sql b/sapl/legacy/scripts/fix_tables.sql index 27cb39c1b..a8862a721 100644 --- a/sapl/legacy/scripts/fix_tables.sql +++ b/sapl/legacy/scripts/fix_tables.sql @@ -8,6 +8,7 @@ DROP PROCEDURE IF EXISTS verifica_campos_sessao_plenaria_presenca; DROP PROCEDURE IF EXISTS cria_lexml_registro_provedor_e_publicador; DROP PROCEDURE IF EXISTS cria_tipo_situacao_militar; DROP PROCEDURE IF EXISTS muda_vinculo_norma_juridica_ind_excluido; +DROP PROCEDURE IF EXISTS muda_unidade_tramitacao_cod_parlamentar; -- Procedure para criar campo num_proposicao em proposicao CREATE PROCEDURE verifica_campos_proposicao() BEGIN IF NOT EXISTS @@ -113,6 +114,13 @@ SET ind_excluido = '' WHERE trim(ind_excluido) = '0'; END; +-- Procedure para mudar valor do campo cod_parlamentar da tabela unidade_tramitacao de 0 para string vazia NULL +CREATE PROCEDURE muda_unidade_tramitacao_cod_parlamentar() BEGIN +UPDATE unidade_tramitacao +SET cod_parlamentar = NULL +WHERE cod_parlamentar = 0; +END; + -- Executa as procedures criadas acima CALL verifica_campos_proposicao; CALL verifica_campos_tipo_materia_legislativa; @@ -120,6 +128,7 @@ CALL verifica_campos_sessao_plenaria_presenca; CALL cria_lexml_registro_provedor_e_publicador; CALL cria_tipo_situacao_militar; CALL muda_vinculo_norma_juridica_ind_excluido; +CALL muda_unidade_tramitacao_cod_parlamentar; -- Corrige cod_parlamentar zero em unidade de tramitação update unidade_tramitacao set cod_parlamentar = NULL where cod_parlamentar = 0; From 8aaae3f8da6bc9180bb2105ab24b4c4a5be1a5eb Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Wed, 16 Aug 2017 12:02:54 -0300 Subject: [PATCH 11/24] Atualiza unidade_tramitacao_destino para aceitar valores nulos Signed-off-by: Luciano Almeida --- .../migrations/0013_auto_20170816_1136.py | 21 +++++++++++++++++++ sapl/materia/models.py | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 sapl/materia/migrations/0013_auto_20170816_1136.py diff --git a/sapl/materia/migrations/0013_auto_20170816_1136.py b/sapl/materia/migrations/0013_auto_20170816_1136.py new file mode 100644 index 000000000..e6804e8e1 --- /dev/null +++ b/sapl/materia/migrations/0013_auto_20170816_1136.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.12 on 2017-08-16 11:36 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0012_auto_20170815_1238'), + ] + + operations = [ + migrations.AlterField( + model_name='tramitacao', + name='unidade_tramitacao_destino', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tramitacoes_destino', to='materia.UnidadeTramitacao', verbose_name='Unidade Destino'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index c1cabfe18..193b182da 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -862,6 +862,10 @@ class Tramitacao(models.Model): blank=True, null=True, verbose_name=_('Data Encaminhamento')) unidade_tramitacao_destino = models.ForeignKey( UnidadeTramitacao, + # TODO PÓS MIGRACAO INICIAL (vide #1381) + # não nulo quando todas as + # bases tiverem sido corrigidas + null=True, related_name='tramitacoes_destino', on_delete=models.PROTECT, verbose_name=_('Unidade Destino')) From 3a136412b7a7b35d14aeefa261418710b8b59bad Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 16 Aug 2017 11:57:11 -0300 Subject: [PATCH 12/24] Organize imports --- sapl/legacy/migration.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 05ea4a03c..6e24eb987 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -11,19 +11,16 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from django.db import OperationalError, ProgrammingError, connections, models -from django.db.models import CharField, Count, Max, ProtectedError, TextField +from django.db import ProgrammingError, connections, models +from django.db.models import CharField, Count, Max, TextField from django.db.models.base import ModelBase -from django.db.models.signals import post_delete, post_save from model_mommy import mommy from model_mommy.mommy import foreign_key_required, make from sapl.base.models import (Argumento, Autor, Constraint, ProblemaMigracao, TipoAutor) from sapl.comissoes.models import Comissao, Composicao, Participacao -from sapl.legacy.models import Protocolo as ProtocoloLegado -from sapl.materia.models import (AcompanhamentoMateria, DocumentoAcessorio, - MateriaLegislativa, Proposicao, +from sapl.materia.models import (AcompanhamentoMateria, Proposicao, StatusTramitacao, TipoDocumento, TipoMateriaLegislativa, TipoProposicao, Tramitacao) From 0445988802f4977c09c1fd1c54ffbf519fc8a73f Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Wed, 16 Aug 2017 12:27:14 -0300 Subject: [PATCH 13/24] =?UTF-8?q?Limpa=20c=C3=B3digo=20de=20exclus=C3=A3o?= =?UTF-8?q?=20de=20ind=5Fexcluido=20n=C3=A3o=20mais=20usada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 6e24eb987..e8d837ddf 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -467,19 +467,6 @@ class DataMigrator: info('Começando migração: %s...' % obj) self._do_migrate(obj) - # Itera várias vezes na lista excluindo o que for possível - info('Deletando models com ind_excluido...') - 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('Excluindo possíveis duplicações em RegistroVotacao...') excluir_registrovotacao_duplicados() From 54ef9b7fc1afae319aa3314f3b5bed790f493ffb Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Wed, 16 Aug 2017 13:09:44 -0300 Subject: [PATCH 14/24] =?UTF-8?q?Atualiza=20sql=20para=20campos=20situa?= =?UTF-8?q?=C3=A7=C3=A3o=20militar=20e=20nivel=20de=20instru=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luciano Almeida --- sapl/legacy/scripts/fix_tables.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/legacy/scripts/fix_tables.sql b/sapl/legacy/scripts/fix_tables.sql index a8862a721..3fa095e78 100644 --- a/sapl/legacy/scripts/fix_tables.sql +++ b/sapl/legacy/scripts/fix_tables.sql @@ -132,3 +132,5 @@ CALL muda_unidade_tramitacao_cod_parlamentar; -- Corrige cod_parlamentar zero em unidade de tramitação update unidade_tramitacao set cod_parlamentar = NULL where cod_parlamentar = 0; +update parlamentar set cod_nivel_instrucao = NULL where cod_nivel_instrucao = 0; +update parlamentar set tip_situacao_militar = NULL where tip_situacao_militar = 0; From defc00a7dd12b8a41e3a8972607a9dbc914cc8bc Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Thu, 17 Aug 2017 13:56:18 -0300 Subject: [PATCH 15/24] Corrige tabelas de mandato e relatoria Signed-off-by: Luciano Almeida --- sapl/legacy/scripts/fix_tables.sql | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sapl/legacy/scripts/fix_tables.sql b/sapl/legacy/scripts/fix_tables.sql index 3fa095e78..ba1a34efc 100644 --- a/sapl/legacy/scripts/fix_tables.sql +++ b/sapl/legacy/scripts/fix_tables.sql @@ -132,5 +132,13 @@ CALL muda_unidade_tramitacao_cod_parlamentar; -- Corrige cod_parlamentar zero em unidade de tramitação update unidade_tramitacao set cod_parlamentar = NULL where cod_parlamentar = 0; + +-- Corrige cod_nivel_instrucao e tip_situacao_militar zero em parlamentar update parlamentar set cod_nivel_instrucao = NULL where cod_nivel_instrucao = 0; update parlamentar set tip_situacao_militar = NULL where tip_situacao_militar = 0; + +-- Corrige tip_afastamento zero em mandato +update mandato set tip_afastamento = NULL where tip_afastamento = 0; + +-- Corrige tip_fim_relatoria zero em relatoria +update relatoria set tip_fim_relatoria = NULL where tip_fim_relatoria = 0; From 57063e81dffd98b9ecf1be156badcc7fd26353a4 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Tue, 22 Aug 2017 13:51:19 -0300 Subject: [PATCH 16/24] Arruma problema com MateriaAssunto Signed-off-by: Luciano Almeida --- sapl/legacy/migration.py | 2 +- sapl/legacy/scripts/fix_tables.sql | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index e8d837ddf..06fe7e800 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -123,7 +123,7 @@ class ForeignKeyFaltando(ObjectDoesNotExist): def get_fk_related(field, value, label=None): - if value is None: + if value is None and field.null: return value else: try: diff --git a/sapl/legacy/scripts/fix_tables.sql b/sapl/legacy/scripts/fix_tables.sql index ba1a34efc..d8a71bca4 100644 --- a/sapl/legacy/scripts/fix_tables.sql +++ b/sapl/legacy/scripts/fix_tables.sql @@ -130,15 +130,15 @@ CALL cria_tipo_situacao_militar; CALL muda_vinculo_norma_juridica_ind_excluido; CALL muda_unidade_tramitacao_cod_parlamentar; --- Corrige cod_parlamentar zero em unidade de tramitação +-- Corrige cod_parlamentar igual a zero em unidade de tramitação update unidade_tramitacao set cod_parlamentar = NULL where cod_parlamentar = 0; -- Corrige cod_nivel_instrucao e tip_situacao_militar zero em parlamentar update parlamentar set cod_nivel_instrucao = NULL where cod_nivel_instrucao = 0; update parlamentar set tip_situacao_militar = NULL where tip_situacao_militar = 0; --- Corrige tip_afastamento zero em mandato +-- Corrige tip_afastamento igual a zero em mandato update mandato set tip_afastamento = NULL where tip_afastamento = 0; --- Corrige tip_fim_relatoria zero em relatoria +-- Corrige tip_fim_relatoria igual a zero em relatoria update relatoria set tip_fim_relatoria = NULL where tip_fim_relatoria = 0; From d9006c85bee4aef138be15864b497d363205e339 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 4 Sep 2017 16:59:10 -0300 Subject: [PATCH 17/24] Pin mysqlclient version --- requirements/migration-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/migration-requirements.txt b/requirements/migration-requirements.txt index 25d226602..d5793dad8 100644 --- a/requirements/migration-requirements.txt +++ b/requirements/migration-requirements.txt @@ -1,2 +1,2 @@ -r dev-requirements.txt -mysqlclient +mysqlclient==1.3.12 From 0fc1b94d743f8b2e89ecbec309717d465bce52e4 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 4 Sep 2017 17:24:38 -0300 Subject: [PATCH 18/24] =?UTF-8?q?Verifica=20se=20norma.cod=5Fassunto=20?= =?UTF-8?q?=C3=A9=20nulo=20antes=20de=20ajustar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migration.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 06fe7e800..d7744418a 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -787,6 +787,9 @@ def adjust_normajuridica_antes_salvar(new, old): def adjust_normajuridica_depois_salvar(new, old): # Ajusta relação M2M + if not old.cod_assunto: # it can be null or empty + return + # lista de pks separadas por vírgulas (ignorando strings vazias) lista_pks_assunto = [int(pk) for pk in old.cod_assunto.split(',') if pk] From 41c26979e1c40c11cc5a440821d751c387047467 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 5 Sep 2017 11:16:20 -0300 Subject: [PATCH 19/24] =?UTF-8?q?Ajusta=20depois=20de=20salvar=20apenas=20?= =?UTF-8?q?se=20n=C3=A3o=20ignorado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migration.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index d7744418a..733f4c3d4 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -536,19 +536,20 @@ class DataMigrator: self.populate_renamed_fields(new, old) if ajuste_antes_salvar: ajuste_antes_salvar(new, old) - save(new, old) except ForeignKeyFaltando: # tentamos preencher uma FK e o ojeto relacionado não existe # então este é um objeo órfão: simplesmente ignoramos continue - if ajuste_depois_salvar: - ajuste_depois_salvar(new, old) - - if self.data_mudada: - with reversion.create_revision(): - save_relation(**self.data_mudada) - self.data_mudada.clear() - reversion.set_comment('Ajuste de data pela migração') + else: + save(new, old) + if ajuste_depois_salvar: + ajuste_depois_salvar(new, old) + + if self.data_mudada: + with reversion.create_revision(): + save_relation(**self.data_mudada) + self.data_mudada.clear() + reversion.set_comment('Ajuste de data pela migração') # necessário para ajustar sequence da tabela para o ultimo valor de id ultimo_valor = get_last_value(model) From ac03224316619049a56848f1cf79831a92d9f3a8 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Wed, 6 Sep 2017 10:36:53 -0300 Subject: [PATCH 20/24] Melhora desempenho da migracao --- sapl/legacy/migration.py | 125 +++++++++++++++++++++------------------ 1 file changed, 69 insertions(+), 56 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 733f4c3d4..634d9aaf3 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -1,5 +1,6 @@ import re from datetime import date +from functools import lru_cache from subprocess import PIPE, call import pkg_resources @@ -11,7 +12,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from django.db import ProgrammingError, connections, models +from django.db import ProgrammingError, connections, models, transaction from django.db.models import CharField, Count, Max, TextField from django.db.models.base import ModelBase from model_mommy import mommy @@ -122,17 +123,24 @@ class ForeignKeyFaltando(ObjectDoesNotExist): pass +@lru_cache() +def _get_all_ids_from_model(model): + # esta função para uso apenas em get_fk_related + return set(model.objects.values_list('id', flat=True)) + + def get_fk_related(field, value, label=None): if value is None and field.null: + return None + + # if field.related_model.objects.filter(id=value).exists(): + if value in _get_all_ids_from_model(field.related_model): return value else: - try: - return field.related_model.objects.get(id=value) - except ObjectDoesNotExist as ex: - msg = 'FK [%s] não encontrada para o valor %s (em %s %s)' % ( - field.name, value, field.model.__name__, label or '---') - warn(msg) - raise ForeignKeyFaltando(msg) + msg = 'FK [%s] não encontrada para o valor %s (em %s %s)' % ( + field.name, value, field.model.__name__, label or '---') + warn(msg) + raise ForeignKeyFaltando(msg) def get_field(model, fieldname): @@ -410,37 +418,39 @@ class DataMigrator: field_type = field.get_internal_type() if old_field_name: old_value = getattr(old, old_field_name) - if isinstance(field, models.ForeignKey): - old_type = type(old) # not necessarily a model - if hasattr(old_type, '_meta') and \ - old_type._meta.pk.name != 'id': + + if field_type == 'ForeignKey': + # not necessarily a model + if hasattr(old, '_meta') and old._meta.pk.name != 'id': label = old.pk else: label = '-- SEM PK --' + fk_field_name = '{}_id'.format(field.name) value = get_fk_related(field, old_value, label) + setattr(new, fk_field_name, value) else: value = getattr(old, old_field_name) - # TODO rever esse DateField após as mudança para datas com - # timezone - if field_type == 'DateField' and \ - not field.null and value is None: - # TODO REVER ISSO - descricao = 'A data 1111-11-11 foi colocada no lugar' - problema = 'O valor da data era nulo ou inválido' - warn("O valor do campo %s (%s) do model %s " - "era inválido => %s" % ( - field.name, field_type, - field.model.__name__, descricao)) - value = date(1111, 11, 11) - self.data_mudada['obj'] = new - self.data_mudada['descricao'] = descricao - self.data_mudada['problema'] = problema - self.data_mudada.setdefault('nome_campo', []).\ - append(field.name) - if (field_type in ['CharField', 'TextField'] - and value in [None, 'None']): - value = '' - setattr(new, field.name, value) + # TODO rever esse DateField após as mudança para datas com + # timezone + if field_type == 'DateField' and \ + not field.null and value is None: + # TODO REVER ISSO + descricao = 'A data 1111-11-11 foi colocada no lugar' + problema = 'O valor da data era nulo ou inválido' + warn("O valor do campo %s (%s) do model %s " + "era inválido => %s" % ( + field.name, field_type, + field.model.__name__, descricao)) + value = date(1111, 11, 11) + self.data_mudada['obj'] = new + self.data_mudada['descricao'] = descricao + self.data_mudada['problema'] = problema + self.data_mudada.setdefault('nome_campo', []).\ + append(field.name) + if (field_type in ['CharField', 'TextField'] + and value in [None, 'None']): + value = '' + setattr(new, field.name, value) def migrate(self, obj=appconfs, interativo=True): # warning: model/app migration order is of utmost importance @@ -527,29 +537,32 @@ class DataMigrator: ajuste_depois_salvar = AJUSTE_DEPOIS_SALVAR.get(model) # convert old records to new ones - for old in old_records: - if getattr(old, 'ind_excluido', False): - # não migramos registros marcados como excluídos - continue - new = model() - try: - self.populate_renamed_fields(new, old) - if ajuste_antes_salvar: - ajuste_antes_salvar(new, old) - except ForeignKeyFaltando: - # tentamos preencher uma FK e o ojeto relacionado não existe - # então este é um objeo órfão: simplesmente ignoramos - continue - else: - save(new, old) - if ajuste_depois_salvar: - ajuste_depois_salvar(new, old) + with transaction.atomic(): + for old in old_records: + if getattr(old, 'ind_excluido', False): + # não migramos registros marcados como excluídos + continue + new = model() + try: + self.populate_renamed_fields(new, old) + if ajuste_antes_salvar: + ajuste_antes_salvar(new, old) + except ForeignKeyFaltando: + # tentamos preencher uma FK e o ojeto relacionado + # não existe + # então este é um objeo órfão: simplesmente ignoramos + continue + else: + save(new, old) + if ajuste_depois_salvar: + ajuste_depois_salvar(new, old) - if self.data_mudada: - with reversion.create_revision(): - save_relation(**self.data_mudada) - self.data_mudada.clear() - reversion.set_comment('Ajuste de data pela migração') + if self.data_mudada: + with reversion.create_revision(): + save_relation(**self.data_mudada) + self.data_mudada.clear() + reversion.set_comment( + 'Ajuste de data pela migração') # necessário para ajustar sequence da tabela para o ultimo valor de id ultimo_valor = get_last_value(model) @@ -650,7 +663,7 @@ def adjust_parlamentar(new, old): def adjust_participacao(new, old): composicao = Composicao() - composicao.comissao, composicao.periodo = [ + composicao.comissao_id, composicao.periodo_id = [ get_fk_related(Composicao._meta.get_field(name), value) for name, value in (('comissao', old.cod_comissao), ('periodo', old.cod_periodo_comp))] From 231700f823c2187394a5d4a702111ccdd9a2754b Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Sat, 9 Sep 2017 08:16:16 -0300 Subject: [PATCH 21/24] Remove delete e recria constraints --- sapl/legacy/migration.py | 104 +-------------------------------------- 1 file changed, 2 insertions(+), 102 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 634d9aaf3..87412394c 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -12,14 +12,13 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from django.db import ProgrammingError, connections, models, transaction +from django.db import connections, transaction from django.db.models import CharField, Count, Max, TextField from django.db.models.base import ModelBase from model_mommy import mommy from model_mommy.mommy import foreign_key_required, make -from sapl.base.models import (Argumento, Autor, Constraint, ProblemaMigracao, - TipoAutor) +from sapl.base.models import Autor, ProblemaMigracao, TipoAutor from sapl.comissoes.models import Comissao, Composicao, Participacao from sapl.materia.models import (AcompanhamentoMateria, Proposicao, StatusTramitacao, TipoDocumento, @@ -170,44 +169,6 @@ def iter_sql_records(sql, db): record.__dict__.update(zip(fieldnames, row)) yield record -# Todos os models têm no máximo uma constraint unique together -# Isso é necessário para que o método delete_constraints funcione corretamente -assert all(len(model._meta.unique_together) <= 1 - for app in appconfs - for model in app.models.values()) - - -def delete_constraints(model): - # pega nome da unique constraint dado o nome da tabela - table = model._meta.db_table - cursor = exec_sql("SELECT conname FROM pg_constraint WHERE conrelid = " - "(SELECT oid FROM pg_class WHERE relname LIKE " - "'%s') and contype = 'u';" % (table)) - result = () - result = cursor.fetchall() - # se existir um resultado, unique constraint será deletado - for r in result: - if r[0].endswith('key'): - words_list = r[0].split('_') - constraint = Constraint.objects.create( - nome_tabela=table, nome_constraint=r[0], - nome_model=model.__name__, tipo_constraint='one_to_one') - for w in words_list: - Argumento.objects.create(constraint=constraint, argumento=w) - else: - if model._meta.unique_together: - args_list = model._meta.unique_together[0] - constraint = Constraint.objects.create( - nome_tabela=table, nome_constraint=r[0], - nome_model=model.__name__, - tipo_constraint='unique_together') - for a in args_list: - Argumento.objects.create(constraint=constraint, - argumento=a) - warn('Excluindo unique constraint de nome %s' % r[0]) - exec_sql("ALTER TABLE %s DROP CONSTRAINT %s;" % - (table, r[0])) - def problema_duplicatas(model, lista_duplicatas, argumentos): for obj in lista_duplicatas: @@ -228,62 +189,6 @@ def problema_duplicatas(model, lista_duplicatas, argumentos): reversion.set_comment('%s não é único.' % model.__name__) -def recria_constraints(): - constraints = Constraint.objects.all() - for con in constraints: - if con.tipo_constraint == 'one_to_one': - nome_tabela = con.nome_tabela - nome_constraint = con.nome_constraint - args = [a.argumento for a in con.argumento_set.all()] - args_string = '' - args_string = "(" + "_".join(map(str, args[2:-1])) + ")" - model = ContentType.objects.filter( - model=con.nome_model.lower())[0].model_class() - try: - exec_sql("ALTER TABLE %s ADD CONSTRAINT %s UNIQUE %s;" % - (nome_tabela, nome_constraint, args_string)) - except ProgrammingError: - info('A constraint %s já foi recriada!' % nome_constraint) - if con.tipo_constraint == 'unique_together': - nome_tabela = con.nome_tabela - nome_constraint = con.nome_constraint - # Pegando explicitamente o primeiro valor do filter, - # pois pode ser que haja mais de uma ocorrência - model = ContentType.objects.filter( - model=con.nome_model.lower())[0].model_class() - args = [a.argumento for a in con.argumento_set.all()] - for i in range(len(args)): - if isinstance(model._meta.get_field(args[i]), - models.ForeignKey): - args[i] = args[i] + '_id' - args_string = '' - args_string += "(" + ', '.join(map(str, args)) + ")" - - distintos = model.objects.order_by(*args).distinct(*args) - todos = model.objects.all() - if hasattr(model, "content_type"): - distintos = distintos.exclude(content_type_id=None, - object_id=None) - todos = todos.exclude(content_type_id=None, object_id=None) - - lista_duplicatas = list(set(todos).difference(set(distintos))) - if lista_duplicatas: - problema_duplicatas(model, lista_duplicatas, args) - else: - try: - exec_sql("ALTER TABLE %s ADD CONSTRAINT %s UNIQUE %s;" % - (nome_tabela, nome_constraint, args_string)) - except ProgrammingError: - info('A constraint %s já foi recriada!' % nome_constraint) - except Exception as err: - problema = re.findall('\(.*?\)', err.args[0]) - erro('A constraint [%s] da tabela [%s] não pode ser" \ - recriada' % (nome_constraint, nome_tabela)) - erro('Os dados %s = %s estão duplicados. ' - 'Arrume antes de recriar as constraints!' % - (problema[0], problema[1])) - - # TODO o que é isso? #################################################### def obj_desnecessario(obj): relacoes = [ @@ -484,9 +389,6 @@ class DataMigrator: while self.delete_stubs(): pass - info('Recriando constraints...') - recria_constraints() - def _do_migrate(self, obj): if isinstance(obj, AppConfig): models_to_migrate = (model for model in obj.models.values() @@ -514,8 +416,6 @@ class DataMigrator: legacy_model = legacy_app.get_model(legacy_model_name) legacy_pk_name = legacy_model._meta.pk.name - delete_constraints(model) - # setup migration strategy for tables with or without a pk if legacy_pk_name == 'id': # There is no pk in the legacy table From 3a393771fd656400f617a71563a549b03c6ef622 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 11 Sep 2017 08:36:45 -0300 Subject: [PATCH 22/24] =?UTF-8?q?Retira=20c=C3=B3digo=20desnecess=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy/migration.py | 103 +-------------------------------------- 1 file changed, 1 insertion(+), 102 deletions(-) diff --git a/sapl/legacy/migration.py b/sapl/legacy/migration.py index 87412394c..d45b9ee75 100644 --- a/sapl/legacy/migration.py +++ b/sapl/legacy/migration.py @@ -13,10 +13,8 @@ from django.contrib.auth.models import Group from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.db import connections, transaction -from django.db.models import CharField, Count, Max, TextField +from django.db.models import Count, Max from django.db.models.base import ModelBase -from model_mommy import mommy -from model_mommy.mommy import foreign_key_required, make from sapl.base.models import Autor, ProblemaMigracao, TipoAutor from sapl.comissoes.models import Comissao, Composicao, Participacao @@ -113,10 +111,6 @@ def warn(msg): print('CUIDADO! ' + msg) -def erro(msg): - print('ERRO: ' + msg) - - class ForeignKeyFaltando(ObjectDoesNotExist): 'Uma FK aponta para um registro inexistente' pass @@ -142,10 +136,6 @@ def get_fk_related(field, value, label=None): raise ForeignKeyFaltando(msg) -def get_field(model, fieldname): - return model._meta.get_field(fieldname) - - def exec_sql_file(path, db='default'): with open(path) as arq: sql = arq.read() @@ -170,38 +160,6 @@ def iter_sql_records(sql, db): yield record -def problema_duplicatas(model, lista_duplicatas, argumentos): - for obj in lista_duplicatas: - pks = [] - string_pks = "" - problema = "%s de PK %s não é único." % (model.__name__, obj.pk) - args_dict = {k: obj.__dict__[k] - for k in set(argumentos) & set(obj.__dict__.keys())} - for dup in model.objects.filter(**args_dict): - pks.append(dup.pk) - string_pks = "(" + ", ".join(map(str, pks)) + ")" - descricao = "As entradas de PK %s são idênticas, mas " \ - "apenas uma deve existir" % string_pks - with reversion.create_revision(): - warn(problema + ' => ' + descricao) - save_relation(obj=obj, problema=problema, - descricao=descricao, eh_stub=False, critico=True) - reversion.set_comment('%s não é único.' % model.__name__) - - -# TODO o que é isso? #################################################### -def obj_desnecessario(obj): - relacoes = [ - f for f in obj._meta.get_fields() - if (f.one_to_many or f.one_to_one) and f.auto_created] - sem_referencia = not any(rr.related_model.objects.filter( - **{rr.field.name: obj}).exists() for rr in relacoes) - if type(obj).__name__ == 'Parlamentar' and sem_referencia and \ - obj.autor.all(): - sem_referencia = False - return sem_referencia - - def get_last_value(model): last_value = model.objects.all().aggregate(Max('pk')) return last_value['pk__max'] or 0 @@ -229,24 +187,6 @@ def save_relation(obj, nome_campo='', problema='', descricao='', link.save() -# TODO NECESSÁRIO AINDA??????????? -def make_stub(model, id): - fields_dict = get_fields_dict(model) - new = mommy.prepare(model, **fields_dict, pk=id) - save_with_id(new, id) - return new - - -def get_fields_dict(model): - all_fields = model._meta.get_fields() - fields_dict = {} - fields_dict = {f.name: '????????????'[:f.max_length] - for f in all_fields - if isinstance(f, (CharField, TextField)) and - not f.choices and not f.blank} - return fields_dict - - def fill_vinculo_norma_juridica(): lista = [('A', 'Altera o(a)', 'Alterado(a) pelo(a)'), @@ -385,10 +325,6 @@ class DataMigrator: info('Excluindo possíveis duplicações em RegistroVotacao...') excluir_registrovotacao_duplicados() - info('Deletando stubs desnecessários...') - while self.delete_stubs(): - pass - def _do_migrate(self, obj): if isinstance(obj, AppConfig): models_to_migrate = (model for model in obj.models.values() @@ -468,24 +404,6 @@ class DataMigrator: ultimo_valor = get_last_value(model) alter_sequence(model, ultimo_valor + 1) - def delete_stubs(self): - excluidos = 0 - for obj in ProblemaMigracao.objects.all(): - if obj.content_object and obj.eh_stub: - original = obj.content_type.get_all_objects_for_this_type( - id=obj.object_id) - if obj_desnecessario(original[0]): - qtd_exclusoes, *_ = original.delete() - assert qtd_exclusoes == 1 - qtd_exclusoes, *_ = obj.delete() - assert qtd_exclusoes == 1 - excluidos = excluidos + 1 - elif not obj.content_object and not obj.eh_stub: - qtd_exclusoes, *_ = obj.delete() - assert qtd_exclusoes == 1 - excluidos = excluidos + 1 - return excluidos - def migrate(obj=appconfs, interativo=True): dm = DataMigrator() @@ -547,7 +465,6 @@ def adjust_ordemdia_depois_salvar(new, old): save_relation(obj=new, problema=problema, descricao=descricao, eh_stub=False) reversion.set_comment('OrdemDia sem número da ordem.') - pass def adjust_parlamentar(new, old): @@ -801,21 +718,3 @@ def check_app_no_ind_excluido(app): for model in app.models.values(): assert not any(get_ind_excluido(new) for new in model.objects.all()) print('OK!') - -# MOMMY MAKE WITH LOG ###################################################### - - -def make_with_log(model, _quantity=None, make_m2m=False, **attrs): - last_value = get_last_value(model) - alter_sequence(model, last_value + 1) - fields_dict = get_fields_dict(model) - stub = make(model, _quantity, make_m2m, **fields_dict) - problema = 'Um stub foi necessário durante a criação de um outro stub' - descricao = 'Essa entrada é necessária para um dos stubs criados' - ' anteriormente' - warn(problema) - save_relation(obj=stub, problema=problema, - descricao=descricao, eh_stub=True) - return stub - -make_with_log.required = foreign_key_required From da4c12a392d939c086b5401e7279ad832822695b Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Mon, 11 Sep 2017 10:26:05 -0300 Subject: [PATCH 23/24] =?UTF-8?q?Desliga=20indexa=C3=A7=C3=A3o=20fulltext?= =?UTF-8?q?=20em=20tempo=20real=20na=20migra=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/legacy_migration_settings.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sapl/legacy_migration_settings.py b/sapl/legacy_migration_settings.py index b9d2cefc2..2501a44dc 100644 --- a/sapl/legacy_migration_settings.py +++ b/sapl/legacy_migration_settings.py @@ -28,3 +28,6 @@ DEBUG = True MOMMY_CUSTOM_FIELDS_GEN = { 'django.db.models.ForeignKey': 'sapl.legacy.migration.make_with_log' } + +# delisga indexação fulltext em tempo real +HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.BaseSignalProcessor' From 101184e746e749aebf27ffc88015f696b1394049 Mon Sep 17 00:00:00 2001 From: Luciano Almeida Date: Mon, 11 Sep 2017 10:46:23 -0300 Subject: [PATCH 24/24] =?UTF-8?q?Retira=20resqu=C3=ADcios=20de=20recria?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20constraints?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luciano Almeida --- sapl/legacy/management/commands/recria_constraints.py | 4 +--- sapl/legacy/scripts/migra_um_db.sh | 6 ------ 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/sapl/legacy/management/commands/recria_constraints.py b/sapl/legacy/management/commands/recria_constraints.py index 9e999e5f6..d1d8d606d 100644 --- a/sapl/legacy/management/commands/recria_constraints.py +++ b/sapl/legacy/management/commands/recria_constraints.py @@ -1,7 +1,5 @@ from django.core.management.base import BaseCommand -from sapl.legacy.migration import recria_constraints - class Command(BaseCommand): @@ -9,4 +7,4 @@ class Command(BaseCommand): 'migração de dados') def handle(self, *args, **options): - recria_constraints() + pass diff --git a/sapl/legacy/scripts/migra_um_db.sh b/sapl/legacy/scripts/migra_um_db.sh index f55dfb53a..26240d8d4 100755 --- a/sapl/legacy/scripts/migra_um_db.sh +++ b/sapl/legacy/scripts/migra_um_db.sh @@ -23,9 +23,3 @@ echo "--- MIGRACAO DE DADOS ---" | tee -a $LOG echo >> $LOG DATABASE_NAME=$1 ./manage.py migracao_25_31 -f --settings sapl.legacy_migration_settings |& tee -a $LOG echo >> $LOG - - -echo "--- RECRIANDO CONSTRAINTS ---" | tee -a $LOG -echo >> $LOG -DATABASE_NAME=$1 ./manage.py recria_constraints --settings sapl.legacy_migration_settings |& tee -a $LOG -echo >> $LOG