diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 2e514942b..1d2d38dcc 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -5,6 +5,7 @@ import re import magic from sapl.base.models import CasaLegislativa +from sapl.legacy.migration import warn from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa, Proposicao) from sapl.norma.models import NormaJuridica @@ -21,6 +22,7 @@ EXTENSOES = { 'application/vnd.oasis.opendocument.text': '.odt', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx', # noqa 'application/xml': '.xml', + 'text/xml': '.xml', 'application/zip': '.zip', 'image/jpeg': '.jpeg', 'image/png': '.png', @@ -90,11 +92,11 @@ DOCS = { ], } -DOCS = {tipo: [(campo, - os.path.join('sapl_documentos', origem), - os.path.join('sapl', destino)) - for campo, origem, destino in campos] - for tipo, campos in DOCS.items()} +DOCS = {model: [(campo, + os.path.join('sapl_documentos', origem), + os.path.join('sapl', destino)) + for campo, origem, destino in campos] + for model, campos in DOCS.items()} def em_media(caminho): @@ -125,10 +127,14 @@ def migrar_docs_logo(): # a pasta props_sapl deve conter apenas o origem e metadatas! # Edit: Aparentemente há diretório que contém properties ao invés de # metadata. O assert foi modificado para essa situação. - assert set(os.listdir(em_media(props_sapl))) < { + sobrando = set(os.listdir(em_media(props_sapl))) - { 'logo_casa.gif', '.metadata', 'logo_casa.gif.metadata', '.properties', 'logo_casa.gif.properties', '.objects'} + if sobrando: + warn('Os seguintes arquivos da pasta props_sapl foram ignorados: ' + + ', '.join(sobrando)) + mover_documento(origem, destino) casa = get_casa_legislativa() casa.logotipo = destino @@ -152,9 +158,9 @@ def get_extensao(caminho): )) from e -def migrar_docs_por_ids(tipo): - for campo, base_origem, base_destino in DOCS[tipo]: - print('#### Migrando {} de {} ####'.format(campo, tipo.__name__)) +def migrar_docs_por_ids(model): + for campo, base_origem, base_destino in DOCS[model]: + print('#### Migrando {} de {} ####'.format(campo, model.__name__)) dir_origem, nome_origem = os.path.split(em_media(base_origem)) pat = re.compile('^{}$'.format(nome_origem.format('(\d+)'))) @@ -168,11 +174,15 @@ def migrar_docs_por_ids(tipo): match = pat.match(arq) if match: # associa documento ao objeto + origem = os.path.join(dir_origem, match.group(0)) + id = match.group(1) try: - origem = os.path.join(dir_origem, match.group(0)) - id = match.group(1) - obj = tipo.objects.get(pk=id) - + obj = model.objects.get(pk=id) + except model.DoesNotExist: + msg = ' {} (pk={}) não encontrado para documento em [{}]' + print(msg.format( + model.__name__, id, origem)) + else: extensao = get_extensao(origem) if hasattr(obj, "ano"): destino = base_destino.format(id, extensao, obj.ano) @@ -185,19 +195,19 @@ def migrar_docs_por_ids(tipo): setattr(obj, campo, destino) obj.save() - except tipo.DoesNotExist: - msg = ' {} (pk={}) não encontrado para documento em [{}]' - print(msg.format( - tipo.__name__, id, destino)) def migrar_documentos(): # aqui supomos que uma pasta chamada sapl_documentos está em MEDIA_ROOT # com o conteúdo da pasta de mesmo nome do zope - # Os arquivos da pasta serão movidos para a nova estrutura e a pasta será + # Os arquivos da pasta serão MOVIDOS para a nova estrutura e a pasta será # apagada + # + # Isto significa que para rodar novamente esta função é preciso + # restaurar a pasta sapl_documentos ao estado inicial + migrar_docs_logo() - for tipo in [ + for model in [ Parlamentar, MateriaLegislativa, DocumentoAcessorio, @@ -207,7 +217,7 @@ def migrar_documentos(): DocumentoAdministrativo, DocumentoAcessorioAdministrativo, ]: - migrar_docs_por_ids(tipo) + migrar_docs_por_ids(model) sobrando = [os.path.join(dir, file) for (dir, _, files) in os.walk(em_media('sapl_documentos'))