get preview (of final) version working
This requires a pile of monkeypatching of collective.documentviewer, this is done and documented in the monkey.py file.
This commit is contained in:
parent
901b928b31
commit
e6e42150fd
|
@ -7,3 +7,8 @@ _ = MessageFactory('pfwbged.tabellio')
|
|||
|
||||
def initialize(context):
|
||||
"""Initializer called when used as a Zope 2 product."""
|
||||
pass
|
||||
|
||||
|
||||
from .monkey import patchDocumentViewer
|
||||
patchDocumentViewer()
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
import datetime
|
||||
import os
|
||||
import psycopg2.extras
|
||||
import urllib2
|
||||
import urlparse
|
||||
|
||||
from Acquisition import aq_chain
|
||||
from plone import api
|
||||
|
@ -11,6 +14,7 @@ from AccessControl.Permissions import access_contents_information
|
|||
from zope import schema
|
||||
from plone.dexterity.content import Container, Item
|
||||
from plone.supermodel import model
|
||||
from plone.namedfile.file import NamedBlobFile
|
||||
|
||||
from collective.dms.basecontent.dmsdocument import IDmsDocument, DmsDocument
|
||||
from collective.dms.basecontent.dmsfile import DmsFile
|
||||
|
@ -180,6 +184,54 @@ class IDocument(IDmsDocument):
|
|||
noannexe = schema.TextLine(title=_('Appendix Number'), required=False)
|
||||
|
||||
|
||||
|
||||
class RemoteFile(NamedBlobFile):
|
||||
_v_filename = None
|
||||
|
||||
def __init__(self, url):
|
||||
self.url = url
|
||||
self._file_data = None
|
||||
|
||||
@property
|
||||
def filename(self):
|
||||
return os.path.basename(urlparse.urlparse(self.url).path)
|
||||
|
||||
@property
|
||||
def contentType(self):
|
||||
return 'application/pdf'
|
||||
|
||||
@property
|
||||
def data(self):
|
||||
if self._file_data:
|
||||
return self._file_data
|
||||
self._file_data = urllib2.urlopen(self.url).read()
|
||||
return self._file_data
|
||||
|
||||
@property
|
||||
def _blob(self):
|
||||
# compatibility with collective.documentviewer
|
||||
from ZODB.blob import Blob
|
||||
blob = Blob()
|
||||
f = blob.open('w')
|
||||
f.write(self.data)
|
||||
f.close()
|
||||
return blob
|
||||
|
||||
def getSize(self):
|
||||
return len(self.data)
|
||||
|
||||
|
||||
class TabellioDmsFile(DmsFile):
|
||||
|
||||
@property
|
||||
def file(self):
|
||||
if self.base_id.startswith('pdf-') or self.base_id.startswith('legi-') or \
|
||||
self.base_id.startswith('doc-'):
|
||||
# get it from Tabellio
|
||||
return None
|
||||
return RemoteFile('http://archive.pfwb.be/' + self.base_id)
|
||||
|
||||
|
||||
class Document(DmsDocument):
|
||||
implements(IDocument)
|
||||
_v_portal_type = 'pfwbged.tabellio.document'
|
||||
|
@ -197,7 +249,7 @@ class Document(DmsDocument):
|
|||
raise KeyError()
|
||||
obj = cls()
|
||||
obj.portal_type = cls._v_portal_type
|
||||
obj.id = row.id
|
||||
obj.id = str(row.id)
|
||||
obj.title = row.intit
|
||||
obj.doctype = typenames.MAPPING.get(row.type, row.type)
|
||||
obj.no = row.no
|
||||
|
@ -215,13 +267,15 @@ class Document(DmsDocument):
|
|||
|
||||
def __getitem__(self, id):
|
||||
if id.startswith('version-'):
|
||||
t = DmsFile()
|
||||
t.id = id.split('-', 1)[1]
|
||||
t.title = t.id
|
||||
t.file = None
|
||||
t.UID = lambda: 'tabellio-' + t.id
|
||||
t = TabellioDmsFile()
|
||||
t.id = str(id)
|
||||
t.base_id = id.split('-', 1)[1]
|
||||
t.title = t.base_id
|
||||
uid = str(''.join(reversed(id)) + '-tabellio')
|
||||
t.UID = lambda: uid
|
||||
t.portal_type = 'dmsmainfile'
|
||||
return aq_chain(t.__of__(self))[0]
|
||||
t = aq_chain(t.__of__(self))[0]
|
||||
return t
|
||||
return super(Document, self).__getitem__(id)
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
from Acquisition import aq_parent
|
||||
|
||||
from persistent.dict import PersistentDict
|
||||
from DateTime import DateTime
|
||||
from zope.annotation.interfaces import IAnnotations
|
||||
|
||||
import collective.documentviewer.convert
|
||||
import collective.documentviewer.settings
|
||||
import collective.documentviewer.views
|
||||
from Products.Five.browser.resource import DirectoryResource
|
||||
|
||||
import plone.namedfile.utils
|
||||
|
||||
from . import documents
|
||||
|
||||
# Monkeypatching of various collective.documentviewer parts
|
||||
|
||||
class PDFFiles(collective.documentviewer.views.PDFFiles):
|
||||
# don't check permissions for tabellio thumbnails; this would otherwise
|
||||
# require the objects to have a stable UID and to be registered in the
|
||||
# catalog.
|
||||
def publishTraverse(self, request, name):
|
||||
if name.endswith('-noisrev-tabellio'):
|
||||
fi = DirectoryResource.publishTraverse(self, request, name)
|
||||
return fi
|
||||
return super(PDFFiles, self).publishTraverse(request, name)
|
||||
|
||||
|
||||
orig_init = collective.documentviewer.settings.Base.__init__
|
||||
def base_init(self, context):
|
||||
# for our transient files we cannot store documentviewer information in
|
||||
# the object annotations so we have to create them under varying names
|
||||
# in the DocumentsFolder object.
|
||||
if isinstance(context, documents.TabellioDmsFile):
|
||||
self.context = context
|
||||
tabellio_folder = aq_parent(aq_parent(context))
|
||||
annotations = IAnnotations(tabellio_folder)
|
||||
# store metadata in top tabellio folder
|
||||
self._metadata = annotations.get('collective.documentviewer-%s' % context.id, None)
|
||||
if self._metadata is None:
|
||||
self._metadata = PersistentDict()
|
||||
self._metadata['last_updated'] = DateTime('1901/01/01').ISO8601()
|
||||
self.storage_version = collective.documentviewer.settings.STORAGE_VERSION
|
||||
annotations['collective.documentviewer-%s' % context.id] = self._metadata
|
||||
else:
|
||||
orig_init(self, context)
|
||||
|
||||
|
||||
def patchDocumentViewer():
|
||||
collective.documentviewer.views.PDFFiles = PDFFiles
|
||||
collective.documentviewer.settings.Base.__init__ = base_init
|
||||
collective.documentviewer.convert.Converter.isIndexationEnabled = lambda x: True
|
||||
|
||||
# avoid streaming files as the blob hack breaks this
|
||||
plone.namedfile.utils.filestream_iterator = None
|
Reference in New Issue