Browse Source

Merge branch 'migracao' into 3.1.x

pull/1924/head
Marcio Mazza 7 years ago
parent
commit
1304e4f51f
  1. 4
      sapl/base/urls.py
  2. 54
      sapl/legacy/migracao.py
  3. 12
      sapl/legacy/migracao_dados.py
  4. 25
      sapl/legacy/scripts/exporta_zope/exporta_zope.py

4
sapl/base/urls.py

@ -123,11 +123,11 @@ urlpatterns = [
url(r'^sistema/search/', SaplSearchView(), name='haystack_search'), url(r'^sistema/search/', SaplSearchView(), name='haystack_search'),
# Folhas XSLT e extras referenciadas por documentos migrados do sapl 2.5 # Folhas XSLT e extras referenciadas por documentos migrados do sapl 2.5
url(r'^sapl/XSLT/HTML/(?P<path>.*)$', RedirectView.as_view( url(r'^(sapl/)?XSLT/HTML/(?P<path>.*)$', RedirectView.as_view(
url=os.path.join(MEDIA_URL, 'sapl/public/XSLT/HTML/%(path)s'), url=os.path.join(MEDIA_URL, 'sapl/public/XSLT/HTML/%(path)s'),
permanent=False)), permanent=False)),
# url do logotipo usada em documentos migrados do sapl 2.5 # url do logotipo usada em documentos migrados do sapl 2.5
url(r'^sapl/sapl_documentos/props_sapl/logo_casa', url(r'^(sapl/)?sapl_documentos/props_sapl/logo_casa',
LogotipoView.as_view(), name='logotipo'), LogotipoView.as_view(), name='logotipo'),

54
sapl/legacy/migracao.py

@ -1,4 +1,8 @@
import subprocess import subprocess
from getpass import getpass
import requests
from unipath import Path
from sapl.legacy.migracao_dados import (REPO, TAG_MARCO, gravar_marco, info, from sapl.legacy.migracao_dados import (REPO, TAG_MARCO, gravar_marco, info,
migrar_dados) migrar_dados)
@ -6,6 +10,7 @@ from sapl.legacy.migracao_documentos import migrar_documentos
from sapl.legacy.migracao_usuarios import migrar_usuarios from sapl.legacy.migracao_usuarios import migrar_usuarios
from sapl.legacy.scripts.exporta_zope.variaveis_comuns import TAG_ZOPE from sapl.legacy.scripts.exporta_zope.variaveis_comuns import TAG_ZOPE
from sapl.legacy_migration_settings import DIR_REPO, NOME_BANCO_LEGADO from sapl.legacy_migration_settings import DIR_REPO, NOME_BANCO_LEGADO
from sapl.materia.models import Proposicao
def adornar_msg(msg): def adornar_msg(msg):
@ -23,23 +28,48 @@ def migrar(interativo=False):
migrar_usuarios(REPO.working_dir) migrar_usuarios(REPO.working_dir)
migrar_documentos(REPO) migrar_documentos(REPO)
gravar_marco() gravar_marco()
gerar_pacote()
def gerar_pacote():
# backup do banco def compactar_media():
print('Gerando backup do banco... ', end='', flush=True)
arq_backup = DIR_REPO.child('{}.backup'.format(NOME_BANCO_LEGADO))
backup_cmd = '''
pg_dump --host localhost --port 5432 --username postgres --no-password
--format custom --blobs --verbose --file {} {}'''.format(
arq_backup, NOME_BANCO_LEGADO)
subprocess.check_output(backup_cmd.split(), stderr=subprocess.DEVNULL)
print('SUCESSO')
# tar de media/sapl # tar de media/sapl
print('Criando tar de media... ', end='', flush=True) print('Criando tar de media... ', end='', flush=True)
arq_tar = DIR_REPO.child('{}.media.tar'.format(NOME_BANCO_LEGADO)) arq_tar = DIR_REPO.child('{}.media.tar'.format(NOME_BANCO_LEGADO))
arq_tar.remove()
subprocess.check_output(['tar', 'cfh', arq_tar, '-C', DIR_REPO, 'sapl']) subprocess.check_output(['tar', 'cfh', arq_tar, '-C', DIR_REPO, 'sapl'])
print('SUCESSO') print('SUCESSO')
PROPOSICAO_UPLOAD_TO = Proposicao._meta.get_field('texto_original').upload_to
def salva_conteudo_do_sde(proposicao, conteudo):
caminho_relativo = PROPOSICAO_UPLOAD_TO(
proposicao, 'proposicao_sde_{}.xml'.format(proposicao.pk))
caminho_absoluto = Path(REPO.working_dir, caminho_relativo)
caminho_absoluto.parent.mkdir(parents=True)
with open(caminho_absoluto, 'wb') as arq:
arq.write(conteudo)
proposicao.texto_original = caminho_relativo
proposicao.save()
def scrap_sde(url, usuario, senha=None):
if not senha:
senha = getpass()
# login
session = requests.session()
res = session.post('{}?retry=1'.format(url),
{'__ac_name': usuario, '__ac_password': senha})
assert res.status_code == 200
url_proposicao = '{}/sapl_documentos/proposicao/{}/renderXML?xsl=__default__' # noqa
total = Proposicao.objects.count()
for num, proposicao in enumerate(Proposicao.objects.all()):
pk = proposicao.pk
res = session.get(url_proposicao.format(url, pk))
print("pk: {} status: {} (progresso: {:.2%})".format(
pk, res.status_code, num / total))
if res.status_code == 200:
salva_conteudo_do_sde(proposicao, res.content)

12
sapl/legacy/migracao_dados.py

@ -1,6 +1,7 @@
import datetime import datetime
import os import os
import re import re
import subprocess
import traceback import traceback
from collections import OrderedDict, defaultdict, namedtuple from collections import OrderedDict, defaultdict, namedtuple
from datetime import date from datetime import date
@ -1333,6 +1334,17 @@ def gravar_marco():
with open(nome_arq, 'w') as arq: with open(nome_arq, 'w') as arq:
pyaml.dump(data, arq) pyaml.dump(data, arq)
# backup do banco
print('Gerando backup do banco... ', end='', flush=True)
arq_backup = DIR_REPO.child('{}.backup'.format(NOME_BANCO_LEGADO))
arq_backup.remove()
backup_cmd = '''
pg_dump --host localhost --port 5432 --username postgres --no-password
--format custom --blobs --verbose --file {} {}'''.format(
arq_backup, NOME_BANCO_LEGADO)
subprocess.check_output(backup_cmd.split(), stderr=subprocess.DEVNULL)
print('SUCESSO')
# salva mudanças # salva mudanças
REPO.git.add([dir_dados.name]) REPO.git.add([dir_dados.name])
if 'master' not in REPO.heads or REPO.index.diff('HEAD'): if 'master' not in REPO.heads or REPO.index.diff('HEAD'):

25
sapl/legacy/scripts/exporta_zope/exporta_zope.py

@ -78,20 +78,21 @@ def br(obj):
def guess_extension(fullname, buffer): def guess_extension(fullname, buffer):
mime = magic.from_buffer(buffer, mime=True) mime = magic.from_buffer(buffer, mime=True)
try: extensao = EXTENSOES.get(mime)
return EXTENSOES[mime] if extensao is not None:
except KeyError as e: return extensao
else:
possibilidades = '\n'.join( possibilidades = '\n'.join(
[" '{}': '{}',".format(mime, ext) [" '{}': '{}',".format(mime, ext)
for ext in mimetypes.guess_all_extensions(mime)]) for ext in mimetypes.guess_all_extensions(mime)])
msg = '''Extensão não conhecida para o arquivo: {} print('''Extensão não conhecida para o arquivo: {}
e mimetype: {} e mimetype: {}
Algumas possibilidades são: Algumas possibilidades são:
{} {}
Atualize o código do dicionário EXTENSOES! Atualize o código do dicionário EXTENSOES!
'''.format(fullname, mime, possibilidades) '''.format(fullname, mime, possibilidades)
print(msg) )
raise Exception(msg, e) return '.DESCONHECIDO.{}'.format(mime.replace('/', '__'))
def get_conteudo_file(doc): def get_conteudo_file(doc):
@ -154,7 +155,11 @@ def enumerate_btree(folder):
obj, meta_type = br(obj), type(obj).__name__ obj, meta_type = br(obj), type(obj).__name__
yield id, obj, meta_type yield id, obj, meta_type
# verificação de consistência # verificação de consistência
assert contagem_esperada == contagem_real if contagem_esperada != contagem_real:
print('ATENÇÃO: contagens diferentes na btree: '
'{} esperada: {} real: {}'.format(folder,
contagem_esperada,
contagem_real))
nao_identificados = defaultdict(list) nao_identificados = defaultdict(list)
@ -333,7 +338,9 @@ def build_salvar(repo):
def salvar(fullname, conteudo): def salvar(fullname, conteudo):
sha = hashlib.sha256() sha = hashlib.sha256()
sha.update(conteudo) sha.update(conteudo)
if sha.hexdigest() not in hashes: if sha.hexdigest() in hashes:
print('- hash encontrado - {}'.format(fullname))
else:
fullname = ajusta_extensao(fullname, conteudo) fullname = ajusta_extensao(fullname, conteudo)
if os.path.exists(fullname): if os.path.exists(fullname):
# destrava arquivo pré-existente (o conteúdo mudou) # destrava arquivo pré-existente (o conteúdo mudou)
@ -355,7 +362,7 @@ def dump_sapl(sigla):
destino.mkdir(parents=True) destino.mkdir(parents=True)
repo = git.Repo.init(destino) repo = git.Repo.init(destino)
if TAG_ZOPE in repo.tags: if TAG_ZOPE in repo.tags:
info('A exportação de documentos já está feita.') print('A exportação de documentos já está feita -- abortando')
return return
repo_execute(repo, 'git annex init') repo_execute(repo, 'git annex init')

Loading…
Cancel
Save