Browse Source

Merge branch 'ajustes_migracao'

pull/1751/merge
Marcio Mazza 7 years ago
parent
commit
45b3e7ea32
  1. 17
      sapl/comissoes/legacy.yaml
  2. 17
      sapl/legacy/management/commands/migracao_25_31.py
  3. 1177
      sapl/legacy/migracao.py
  4. 1174
      sapl/legacy/migracao_dados.py
  5. 2
      sapl/legacy/migracao_documentos.py
  6. 34
      sapl/legacy/migracao_usuarios.py
  7. 5
      sapl/legacy/scripts/migra_dbs.sh
  8. 22
      sapl/legacy/scripts/migra_um_db.sh
  9. 2
      sapl/legacy/scripts/scrap_original_forms.py
  10. 2
      sapl/legacy/scripts/study.py
  11. 6
      sapl/legacy/scripts/utils.py
  12. 5
      sapl/legacy/test_migracao_dados.py
  13. 2
      sapl/legacy/test_renames.py
  14. 20
      sapl/materia/migrations/0026_auto_20180302_1411.py
  15. 4
      sapl/materia/models.py
  16. 3
      sapl/parlamentares/models.py

17
sapl/comissoes/legacy.yaml

@ -43,20 +43,3 @@ Participacao (ComposicaoComissao):
observacao: obs_composicao observacao: obs_composicao
parlamentar: cod_parlamentar parlamentar: cod_parlamentar
titular: ind_titular titular: ind_titular
Reuniao:
periodo: periodo_reuniao
comissao: cod_comissao
numero: num_comissao
nome: nom_reuniao
tema: tem_reuniao
data: dat_reuniao
hora_inicio: hora_inicio_reuniao
hora_fim: hora_fim_reuniao
local_reuniao: local
observacao: obs_reuniao
ulr_audio: audio_reuniao
url_video: video_reuniao
upload_pauta: pauta_reuniao
upload_ata: ata_reuniao
upload_anexo: anexo_reuniao

17
sapl/legacy/management/commands/migracao_25_31.py

@ -1,7 +1,7 @@
from django.core import management from django.core import management
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from sapl.legacy.migracao import migrar from sapl.legacy.migracao import migrar, migrar_dados
class Command(BaseCommand): class Command(BaseCommand):
@ -10,13 +10,24 @@ class Command(BaseCommand):
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument( parser.add_argument(
'-f', '--force',
action='store_true', action='store_true',
default=False, default=False,
dest='force', dest='force',
help='Não interativa: pula confirmação de exclusão dos dados', help='Não interativa: pula confirmação de exclusão dos dados',
) )
parser.add_argument(
'--dados',
action='store_true',
default=False,
dest='dados',
help='migra somente dados',
)
def handle(self, *args, **options): def handle(self, *args, **options):
management.call_command('migrate') management.call_command('migrate')
migrar(interativo=not options['force']) somente_dados, interativo = options['dados'], not options['force']
if somente_dados:
migrar_dados(interativo=interativo)
else:
migrar(interativo=interativo)

1177
sapl/legacy/migracao.py

File diff suppressed because it is too large

1174
sapl/legacy/migracao_dados.py

File diff suppressed because it is too large

2
sapl/legacy/migracao_documentos.py

@ -6,7 +6,7 @@ from glob import glob
import yaml import yaml
from sapl.base.models import CasaLegislativa from sapl.base.models import CasaLegislativa
from sapl.legacy.migracao import exec_legado, warn from sapl.legacy.migracao_dados import exec_legado, warn
from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa, from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa,
Proposicao) Proposicao)
from sapl.norma.models import NormaJuridica from sapl.norma.models import NormaJuridica

34
sapl/legacy/migracao_usuarios.py

@ -7,7 +7,7 @@ from sapl.settings import MEDIA_ROOT
PERFIL_LEGADO_PARA_NOVO = {legado: Group.objects.get(name=novo) PERFIL_LEGADO_PARA_NOVO = {legado: Group.objects.get(name=novo)
for legado, novo in [ for legado, novo in [
('Autor', 'Autor'), ('Autor', 'Autor'),
('Operador', 'Operador Geral'), ('Operador', 'Operador Geral'),
('Operador Comissao', 'Operador de Comissões'), ('Operador Comissao', 'Operador de Comissões'),
('Operador Materia', 'Operador de Matéria'), ('Operador Materia', 'Operador de Matéria'),
('Operador Modulo Administrativo', 'Operador Administrativo'), ('Operador Modulo Administrativo', 'Operador Administrativo'),
@ -44,7 +44,7 @@ def decode_nome(nome):
return nome return nome
def migra_usuarios(): def migrar_usuarios():
""" """
o arquivo media/usuarios.yaml e importa os usuários nele listados, o arquivo media/usuarios.yaml e importa os usuários nele listados,
com senhas e perfis. com senhas e perfis.
@ -82,16 +82,36 @@ def migra_usuarios():
set(dados['roles']) - IGNORADOS) set(dados['roles']) - IGNORADOS)
for nome, dados in usuarios.items()] for nome, dados in usuarios.items()]
admins = []
for nome, senha, perfis in usuarios: for nome, senha, perfis in usuarios:
usuario = User.objects.get_or_create(username=nome)[0] usuario = User.objects.get_or_create(username=nome)[0]
usuario.password = zope_encoded_password_to_django(senha) usuario.password = zope_encoded_password_to_django(senha)
for perfil in perfis: for perfil in perfis:
if perfil in ADMINISTRADORES: if perfil in ADMINISTRADORES:
# Manager # todos os administradores ganham perfil "Operador Geral"
usuario.is_staff = True usuario.groups.add(PERFIL_LEGADO_PARA_NOVO['Operador'])
usuario.save() admins.append(usuario)
else: else:
usuario.groups.add(PERFIL_LEGADO_PARA_NOVO[perfil]) usuario.groups.add(PERFIL_LEGADO_PARA_NOVO[perfil])
# apaga arquivo (importante pois contém senhas) usuario.save()
ARQUIVO_USUARIOS.remove()
# restringe e configura administradores
if len(admins) > 2:
admins = (
# ususários com admin no nome
[u for u in admins if 'admin' in u.username]
# senão, o usuário saploper, apenas
or [u for u in admins if 'saploper' == u.username]
# senão, simplesmente até os dois primeiros da lista
or admins[:2]
)
for admin in admins:
admin.is_superuser = True
admin.save()
print('Usuários migrados com sucesso.') print('Usuários migrados com sucesso.')
print('#' * 100)
print('Uusários administradores:')
for admin in admins:
print(admin.username)
print('#' * 100)

5
sapl/legacy/scripts/migra_dbs.sh

@ -2,8 +2,13 @@
# rodar esse script na raiz do projeto # rodar esse script na raiz do projeto
if [ $# -ge 1 ]; then if [ $# -ge 1 ]; then
# mysql com senha
parallel -eta --verbose -j+0 ./sapl/legacy/scripts/migra_um_db.sh :::: <(mysql -u $1 -p$2 -e 'show databases;' | grep '^sapl_') ::: $1 ::: $2 parallel -eta --verbose -j+0 ./sapl/legacy/scripts/migra_um_db.sh :::: <(mysql -u $1 -p$2 -e 'show databases;' | grep '^sapl_') ::: $1 ::: $2
elif [ $# -ge 0 ]; then
# mysql sem senha
parallel -eta --verbose -j+0 ./sapl/legacy/scripts/migra_um_db.sh :::: <(mysql -u $1 -e 'show databases;' | grep '^sapl_') ::: $1
else else
echo "USO:" echo "USO:"
echo " $0 <usuário mysql> [senha mysql]" echo " $0 <usuário mysql> [senha mysql]"

22
sapl/legacy/scripts/migra_um_db.sh

@ -4,13 +4,15 @@
if [ $# -ge 2 ]; then if [ $# -ge 2 ]; then
# proteje pasta com dumps de alterações acidentais # proteje pasta com dumps de alterações acidentais
chmod -R -w ~/sapl_dumps # chmod -R -w ~/migracao_sapl/sapl_dumps
DIR_MIGRACAO=~/migracao_sapl
DATE=$(date +%Y-%m-%d) DATE=$(date +%Y-%m-%d)
DIR=~/${DATE}_logs_migracao DIR_LOGS=$DIR_MIGRACAO/logs/$DATE
mkdir -p $DIR mkdir -p $DIR_LOGS
LOG="$DIR/$1.migracao.log" LOG="$DIR_LOGS/$1.migracao.log"
rm -f $LOG rm -f $LOG
echo "########################################" | tee -a $LOG echo "########################################" | tee -a $LOG
@ -20,12 +22,12 @@ if [ $# -ge 2 ]; then
if [ $3 ]; then if [ $3 ]; then
# se há senha do mysql # se há senha do mysql
mysql -u $2 -p "$3" -N -s -e "DROP DATABASE IF EXISTS $1; CREATE DATABASE $1;" mysql -u$2 -p"$3" -N -s -e "DROP DATABASE IF EXISTS $1; CREATE DATABASE $1;"
mysql -u $2 -p "$3" < ~/sapl_dumps/$1.sql mysql -u$2 -p"$3" < $DIR_MIGRACAO/dumps_mysql/$1.sql
else else
# se não há senha do mysql # se não há senha do mysql
mysql -u $2 -N -s -e "DROP DATABASE IF EXISTS $1; CREATE DATABASE $1;" mysql -u$2 -N -s -e "DROP DATABASE IF EXISTS $1; CREATE DATABASE $1;"
mysql -u $2 < ~/sapl_dumps/$1.sql mysql -u$2 < $DIR_MIGRACAO/dumps_mysql/$1.sql
fi; fi;
echo "O banco legado foi restaurado" |& tee -a $LOG echo "O banco legado foi restaurado" |& tee -a $LOG
echo >> $LOG echo >> $LOG
@ -35,9 +37,9 @@ if [ $# -ge 2 ]; then
DATABASE_NAME=$1 ./manage.py migrate --settings sapl.legacy_migration_settings DATABASE_NAME=$1 ./manage.py migrate --settings sapl.legacy_migration_settings
echo >> $LOG echo >> $LOG
echo "--- MIGRACAO DE DADOS ---" | tee -a $LOG echo "--- MIGRACAO ---" | tee -a $LOG
echo >> $LOG echo >> $LOG
DATABASE_NAME=$1 ./manage.py migracao_25_31 -f --settings sapl.legacy_migration_settings |& tee -a $LOG DATABASE_NAME=$1 ./manage.py migracao_25_31 --force --settings sapl.legacy_migration_settings 2>&1 | tee -a $LOG
echo >> $LOG echo >> $LOG
else else
echo "USO:" echo "USO:"

2
sapl/legacy/scripts/scrap_original_forms.py

@ -10,7 +10,7 @@ from bs4.element import NavigableString, Tag
from django.apps.config import AppConfig from django.apps.config import AppConfig
from sapl.crispy_layout_mixin import heads_and_tails from sapl.crispy_layout_mixin import heads_and_tails
from sapl.legacy.migracao import appconfs, get_renames from sapl.legacy.migracao_dados import appconfs, get_renames
from sapl.legacy.scripts.utils import getsourcelines from sapl.legacy.scripts.utils import getsourcelines
from sapl.utils import listify from sapl.utils import listify

2
sapl/legacy/scripts/study.py

@ -1,6 +1,6 @@
from django.apps import apps from django.apps import apps
from sapl.legacy.migracao import legacy_app from sapl.legacy.migracao_dados import legacy_app
for model in apps.get_app_config('legacy').get_models(): for model in apps.get_app_config('legacy').get_models():
if 'ind_excluido' in [f.name for f in model._meta.fields]: if 'ind_excluido' in [f.name for f in model._meta.fields]:

6
sapl/legacy/scripts/utils.py

@ -1,7 +1,7 @@
import inspect import inspect
from sapl.base.models import Autor from sapl.base.models import Autor
from sapl.legacy.migracao import appconfs from sapl.legacy.migracao_dados import appconfs
def getsourcelines(model): def getsourcelines(model):
@ -9,10 +9,10 @@ def getsourcelines(model):
for line in inspect.getsourcelines(model)[0]] for line in inspect.getsourcelines(model)[0]]
def get_models_com_referencia_a_autor(): def get_models_com_referencia_a(apontado):
def tem_referencia_a_autor(model): def tem_referencia_a_autor(model):
return any(getattr(field, 'related_model', None) == Autor return any(getattr(field, 'related_model', None) == apontado
for field in model._meta.get_fields()) for field in model._meta.get_fields())
return [model for app in appconfs for model in app.models.values() return [model for app in appconfs for model in app.models.values()

5
sapl/legacy/test_migration.py → sapl/legacy/test_migracao_dados.py

@ -1,7 +1,8 @@
from random import shuffle from random import shuffle
from .migracao import (_formatar_lista_para_sql, get_autorias_sem_repeticoes, from .migracao_dados import (_formatar_lista_para_sql,
get_reapontamento_de_autores_repetidos) get_autorias_sem_repeticoes,
get_reapontamento_de_autores_repetidos)
def test_unifica_autores_repetidos_no_legado(): def test_unifica_autores_repetidos_no_legado():

2
sapl/legacy/test_renames.py

@ -3,7 +3,7 @@ import sapl.materia
import sapl.norma import sapl.norma
import sapl.sessao import sapl.sessao
from .migracao import appconfs, get_renames, legacy_app from .migracao_dados import appconfs, get_renames, legacy_app
RENAMING_IGNORED_MODELS = [ RENAMING_IGNORED_MODELS = [
sapl.comissoes.models.Composicao, sapl.comissoes.models.Composicao,

20
sapl/materia/migrations/0026_auto_20180302_1411.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.13 on 2018-03-02 17:11
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('materia', '0025_auto_20180221_1649'),
]
operations = [
migrations.AlterField(
model_name='numeracao',
name='data_materia',
field=models.DateField(null=True, verbose_name='Data'),
),
]

4
sapl/materia/models.py

@ -515,7 +515,7 @@ class Numeracao(models.Model):
verbose_name=_('Número')) verbose_name=_('Número'))
ano_materia = models.PositiveSmallIntegerField(verbose_name=_('Ano'), ano_materia = models.PositiveSmallIntegerField(verbose_name=_('Ano'),
choices=RANGE_ANOS) choices=RANGE_ANOS)
data_materia = models.DateField(verbose_name=_('Data')) data_materia = models.DateField(verbose_name=_('Data'), null=True)
class Meta: class Meta:
verbose_name = _('Numeração') verbose_name = _('Numeração')
@ -529,7 +529,7 @@ class Numeracao(models.Model):
def __str__(self): def __str__(self):
return _('%(numero)s/%(ano)s') % { return _('%(numero)s/%(ano)s') % {
'numero': self.numero_materia, 'numero': self.numero_materia,
'ano': self.data_materia.year} 'ano': self.ano_materia}
@reversion.register() @reversion.register()

3
sapl/parlamentares/models.py

@ -261,12 +261,9 @@ class Parlamentar(models.Model):
verbose_name=_('Ativo na Casa?')) verbose_name=_('Ativo na Casa?'))
biografia = models.TextField( biografia = models.TextField(
blank=True, verbose_name=_('Biografia')) blank=True, verbose_name=_('Biografia'))
# XXX Esse atribuito foi colocado aqui para não atrapalhar a migração
fotografia = ImageCropField( fotografia = ImageCropField(
verbose_name=_('Fotografia'), upload_to=foto_upload_path, verbose_name=_('Fotografia'), upload_to=foto_upload_path,
validators=[restringe_tipos_de_arquivo_img], null=True, blank=True) validators=[restringe_tipos_de_arquivo_img], null=True, blank=True)
cropping = ImageRatioField( cropping = ImageRatioField(
'fotografia', '128x128', verbose_name=_('Avatar'), size_warning=True, 'fotografia', '128x128', verbose_name=_('Avatar'), size_warning=True,
help_text=_('A configuração do Avatar ' help_text=_('A configuração do Avatar '

Loading…
Cancel
Save