mirror of https://github.com/interlegis/sapl.git
LeandroRoberto
7 years ago
1 changed files with 212 additions and 0 deletions
@ -0,0 +1,212 @@ |
|||||
|
import mimetypes |
||||
|
import os |
||||
|
import re |
||||
|
|
||||
|
from django.core.files.base import File |
||||
|
from django.core.files.temp import NamedTemporaryFile |
||||
|
import magic |
||||
|
import urllib3 |
||||
|
|
||||
|
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 |
||||
|
from sapl.parlamentares.models import Parlamentar |
||||
|
from sapl.protocoloadm.models import (DocumentoAcessorioAdministrativo, |
||||
|
DocumentoAdministrativo) |
||||
|
from sapl.sessao.models import SessaoPlenaria |
||||
|
from sapl.settings import MEDIA_ROOT |
||||
|
|
||||
|
|
||||
|
# MIGRAÇÃO DE DOCUMENTOS ################################################### |
||||
|
EXTENSOES = { |
||||
|
'application/msword': '.doc', |
||||
|
'application/pdf': '.pdf', |
||||
|
'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', |
||||
|
'text/html': '.html', |
||||
|
'image/gif': '.gif', |
||||
|
'text/rtf': '.rtf', |
||||
|
'text/x-python': '.py', |
||||
|
'text/plain': '.ksh', |
||||
|
'text/plain': '.c', |
||||
|
'text/plain': '.h', |
||||
|
'text/plain': '.txt', |
||||
|
'text/plain': '.bat', |
||||
|
'text/plain': '.pl', |
||||
|
'text/plain': '.asc', |
||||
|
'text/plain': '.text', |
||||
|
'text/plain': '.pot', |
||||
|
'text/plain': '.brf', |
||||
|
'text/plain': '.srt', |
||||
|
'image/tiff': '.tiff', |
||||
|
|
||||
|
# sem extensao |
||||
|
'application/octet-stream': '', # binário |
||||
|
'inode/x-empty': '', # vazio |
||||
|
} |
||||
|
|
||||
|
DOCS = { |
||||
|
CasaLegislativa: [( |
||||
|
'logotipo', |
||||
|
'props_sapl/logo_casa.gif', |
||||
|
'casa/logotipo/logo_casa.gif')], |
||||
|
Parlamentar: [( |
||||
|
'fotografia', |
||||
|
'parlamentar/fotos/{}_foto_parlamentar', |
||||
|
'public/parlamentar/{0}/{0}_foto_parlamentar{1}')], |
||||
|
MateriaLegislativa: [( |
||||
|
'texto_original', |
||||
|
'materia/{}_texto_integral', |
||||
|
'public/materialegislativa/{2}/{0}/{0}_texto_integral{1}')], |
||||
|
DocumentoAcessorio: [( |
||||
|
'arquivo', |
||||
|
'materia/{}', |
||||
|
'public/documentoacessorio/{2}/{0}/{0}{1}')], |
||||
|
NormaJuridica: [( |
||||
|
'texto_integral', |
||||
|
'norma_juridica/{}_texto_integral', |
||||
|
'public/normajuridica/{2}/{0}/{0}_texto_integral{1}')], |
||||
|
SessaoPlenaria: [ |
||||
|
('upload_ata', |
||||
|
'ata_sessao/{}_ata_sessao', |
||||
|
'public/sessaoplenaria/{0}/ata/{0}_ata_sessao{1}'), |
||||
|
('upload_anexo', |
||||
|
'anexo_sessao/{}_texto_anexado', |
||||
|
'public/sessaoplenaria/{0}/anexo/{0}_texto_anexado{1}') |
||||
|
], |
||||
|
Proposicao: [( |
||||
|
'texto_original', |
||||
|
'proposicao/{}', |
||||
|
'private/proposicao/{0}/{0}{1}')], |
||||
|
DocumentoAdministrativo: [( |
||||
|
'texto_integral', |
||||
|
'administrativo/{}_texto_integral', |
||||
|
'private/documentoadministrativo/{0}/{0}_texto_integral{1}') |
||||
|
], |
||||
|
DocumentoAcessorioAdministrativo: [( |
||||
|
'arquivo', |
||||
|
'administrativo/{}', |
||||
|
'private/documentoacessorioadministrativo/{0}/' |
||||
|
'{0}_acessorio_administrativo{1}') |
||||
|
], |
||||
|
} |
||||
|
|
||||
|
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): |
||||
|
return os.path.join(MEDIA_ROOT, caminho) |
||||
|
|
||||
|
|
||||
|
def mover_documento(origem, destino): |
||||
|
origem, destino = [em_media(c) if not os.path.isabs(c) else c |
||||
|
for c in (origem, destino)] |
||||
|
os.makedirs(os.path.dirname(destino), exist_ok=True) |
||||
|
os.rename(origem, destino) |
||||
|
|
||||
|
|
||||
|
def get_casa_legislativa(): |
||||
|
casa = CasaLegislativa.objects.first() |
||||
|
if not casa: |
||||
|
casa = CasaLegislativa.objects.create(**{k: 'PREENCHER...' for k in [ |
||||
|
'codigo', 'nome', 'sigla', 'endereco', 'cep', 'municipio', 'uf', |
||||
|
]}) |
||||
|
return casa |
||||
|
|
||||
|
|
||||
|
def migrar_docs_logo(): |
||||
|
print('#### Migrando logotipo da casa ####') |
||||
|
[(_, origem, destino)] = DOCS[CasaLegislativa] |
||||
|
props_sapl = os.path.dirname(origem) |
||||
|
|
||||
|
# 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. |
||||
|
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 |
||||
|
casa.save() |
||||
|
|
||||
|
|
||||
|
def get_extensao(mime): |
||||
|
try: |
||||
|
return EXTENSOES[mime] |
||||
|
except KeyError as e: |
||||
|
raise Exception('\n'.join([ |
||||
|
'mimetype:', |
||||
|
mime, |
||||
|
' Algumas possibilidades são:', ] + |
||||
|
[" '{}': '{}',".format(mime, ext) |
||||
|
for ext in mimetypes.guess_all_extensions(mime)] + |
||||
|
['Atualize o código do dicionário EXTENSOES!'] |
||||
|
)) from e |
||||
|
|
||||
|
|
||||
|
http = urllib3.PoolManager() |
||||
|
|
||||
|
|
||||
|
def migrar_docs_por_ids(model): |
||||
|
for campo, base_origem, base_destino in DOCS[model]: |
||||
|
print('#### Migrando {} de {} ####'.format(campo, model.__name__)) |
||||
|
|
||||
|
registros = model.objects.all() |
||||
|
|
||||
|
for item in registros: |
||||
|
|
||||
|
campo_file = getattr(item, campo) |
||||
|
campo_file.delete() |
||||
|
|
||||
|
url = ('http://187.6.249.156:8480/sapl/%s' |
||||
|
) % base_origem.format(item.pk) |
||||
|
|
||||
|
request = http.request('GET', url) |
||||
|
|
||||
|
try: |
||||
|
data = request.data.decode('utf-8') |
||||
|
except: |
||||
|
temp = NamedTemporaryFile(delete=True) |
||||
|
temp.write(request.data) |
||||
|
temp.flush() |
||||
|
|
||||
|
ct = request.getheaders()['Content-Type'] |
||||
|
print (ct, campo, item) |
||||
|
|
||||
|
name_file = '%s%s' % (campo, get_extensao(ct)) |
||||
|
|
||||
|
campo_file.save(name_file, File(temp), save=True) |
||||
|
|
||||
|
|
||||
|
def migrar_documentos(): |
||||
|
for model in [ |
||||
|
Parlamentar, |
||||
|
MateriaLegislativa, |
||||
|
DocumentoAcessorio, |
||||
|
NormaJuridica, |
||||
|
DocumentoAdministrativo, |
||||
|
DocumentoAcessorioAdministrativo, |
||||
|
]: |
||||
|
migrar_docs_por_ids(model) |
||||
|
|
||||
|
|
||||
|
# %run 'sapl/legacy/migracao_documentos_via_request.py' |
||||
|
if __name__ == '__main__': |
||||
|
migrar_documentos() |
Loading…
Reference in new issue