mirror of https://github.com/interlegis/sapl.git
Marcio Mazza
7 years ago
3 changed files with 155 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||
Data*.fs* |
|||
sapl_documentos |
@ -0,0 +1,151 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
# IMPORTANTE: |
|||
# Esse script precisa rodar em python 2 |
|||
# e depende apenas do descrito no arquivo requiments.txt |
|||
|
|||
import os.path |
|||
from collections import defaultdict |
|||
from functools import partial |
|||
|
|||
import ZODB.DB |
|||
import ZODB.FileStorage |
|||
from ZODB.broken import Broken |
|||
|
|||
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', |
|||
'image/gif': '.gif', |
|||
'text/html': '.html', |
|||
'text/rtf': '.rtf', |
|||
'text/x-python': '.py', |
|||
'text/plain': '.txt', |
|||
'SDE-Document': 'xml', |
|||
|
|||
# TODO rever... |
|||
'text/richtext': '.rtf', |
|||
|
|||
# sem extensao |
|||
'application/octet-stream': '', # binario |
|||
'inode/x-empty': '', # vazio |
|||
'text/x-unknown-content-type': '', |
|||
} |
|||
|
|||
|
|||
def br(obj): |
|||
if isinstance(obj, Broken): |
|||
return obj.__Broken_state__ |
|||
else: |
|||
return obj |
|||
|
|||
|
|||
def dump_file(doc, path): |
|||
name = doc['__name__'] |
|||
extension = EXTENSOES[doc['content_type']] |
|||
fullname = os.path.join(path, name + extension) |
|||
print(fullname) |
|||
|
|||
pdata = br(doc['data']) |
|||
if isinstance(pdata, str): |
|||
# Retrocedemos se pdata ja eh uma str (necessario em Images) |
|||
pdata = doc |
|||
|
|||
with open(fullname, 'w') as arq: |
|||
while pdata: |
|||
arq.write(pdata['data']) |
|||
pdata = br(pdata.get('next', None)) |
|||
return name |
|||
|
|||
|
|||
nao_identificados = defaultdict(list) |
|||
|
|||
|
|||
def enumerate_folder(folder): |
|||
# folder vazio nao tem _objects |
|||
for entry in folder.get('_objects', []): |
|||
id, meta_type = entry['id'], entry['meta_type'] |
|||
obj = br(folder[id]) |
|||
yield id, obj, meta_type |
|||
|
|||
|
|||
def enumerate_btree(folder): |
|||
tree = folder['_tree'] |
|||
for id, obj in tree.iteritems(): |
|||
obj, meta_type = br(obj), type(obj).__name__ |
|||
yield id, obj, meta_type |
|||
|
|||
|
|||
def dump_folder(folder, path='', enum=enumerate_folder): |
|||
name = folder['id'] |
|||
path = os.path.join(path, name) |
|||
if not os.path.exists(path): |
|||
os.makedirs(path) |
|||
for id, obj, meta_type in enum(folder): |
|||
dump = DUMP_FUNCTIONS.get(meta_type, '?') |
|||
if dump == '?': |
|||
nao_identificados[meta_type].append(path + '/' + id) |
|||
elif dump: |
|||
id_interno = dump(obj, path) |
|||
assert id == id_interno |
|||
return name |
|||
|
|||
|
|||
DUMP_FUNCTIONS = { |
|||
'File': dump_file, |
|||
'Image': dump_file, |
|||
'Folder': partial(dump_folder, enum=enumerate_folder), |
|||
'BTreeFolder2': partial(dump_folder, enum=enumerate_btree), |
|||
|
|||
# explicitamente ignorados |
|||
'ZCatalog': None, |
|||
'Dumper': None, |
|||
} |
|||
|
|||
|
|||
def get_app(data_fs_path): |
|||
storage = ZODB.FileStorage.FileStorage(data_fs_path) |
|||
db = ZODB.DB(storage) |
|||
connection = db.open() |
|||
root = connection.root() |
|||
app = br(root['Application']) |
|||
|
|||
def close_db(): |
|||
db.close() |
|||
|
|||
return app, close_db |
|||
|
|||
|
|||
def find_sapl(app): |
|||
[id] = [e['id'] for e in app['_objects'] |
|||
if e['id'].startswith('cm_') |
|||
and e['meta_type'] == 'Folder'] |
|||
cm_zzz = br(app[id]) |
|||
sapl = br(cm_zzz['sapl']) |
|||
return sapl |
|||
|
|||
|
|||
def dump_sapl(data_fs_path): |
|||
app, close_db = get_app(data_fs_path) |
|||
try: |
|||
sapl = find_sapl(app) |
|||
docs = br(sapl['sapl_documentos']) |
|||
|
|||
nao_identificados.clear() |
|||
dump_folder(docs) |
|||
if nao_identificados: |
|||
print('#' * 80) |
|||
print('#' * 80) |
|||
print(u'FORAM ENCONTRADOS ARQUIVOS DE FORMATO NÃO IDENTIFICADO!!!') |
|||
print(u'REFAÇA A EXPORTAÇÃO\n') |
|||
print(nao_identificados) |
|||
print('#' * 80) |
|||
print('#' * 80) |
|||
finally: |
|||
close_db() |
@ -0,0 +1,2 @@ |
|||
# ZODB version 3.7.4 |
|||
git+git://github.com/zopefoundation/ZODB.git@d6f3c3ce5e6df1060de7a3#egg=ZODB3 |
Loading…
Reference in new issue