Integrated documentviewer
This commit is contained in:
parent
9c5d2cba20
commit
4839fa2a54
1
setup.py
1
setup.py
|
@ -43,6 +43,7 @@ setup(name='collective.dms.basecontent',
|
|||
install_requires=[
|
||||
'setuptools',
|
||||
'five.grok',
|
||||
'collective.documentviewer',
|
||||
'plone.api',
|
||||
'plone.app.dexterity',
|
||||
'plone.namedfile',
|
||||
|
|
|
@ -18,12 +18,27 @@
|
|||
image="static/img/dmsdocument_icon.png"
|
||||
/>
|
||||
|
||||
<browser:page
|
||||
for="collective.dms.basecontent.dmsdocument.IDmsDocument"
|
||||
name="view"
|
||||
class="plone.dexterity.browser.view.DefaultView"
|
||||
template="templates/dmsdocument_view.pt"
|
||||
permission="zope2.View"
|
||||
/>
|
||||
<browser:page
|
||||
for="collective.dms.basecontent.dmsdocument.IDmsDocument"
|
||||
name="view"
|
||||
class=".views.DmsDocumentView"
|
||||
template="templates/dmsdocument_view.pt"
|
||||
permission="zope2.View"
|
||||
/>
|
||||
|
||||
<browser:page
|
||||
name="versionviewer"
|
||||
for="plone.app.contenttypes.interfaces.IFile"
|
||||
class=".views.VersionViewerView"
|
||||
template="templates/versionviewer.pt"
|
||||
permission="zope2.View"
|
||||
layer="collective.documentviewer.interfaces.ILayer" />
|
||||
|
||||
<browser:page
|
||||
name="dvdata"
|
||||
for="plone.app.contenttypes.interfaces.IFile"
|
||||
class=".views.JSONVersionViewerView"
|
||||
permission="zope2.View"
|
||||
layer="collective.documentviewer.interfaces.ILayer" />
|
||||
|
||||
</configure>
|
||||
|
|
|
@ -10,7 +10,8 @@ from Products.CMFCore.WorkflowCore import WorkflowException
|
|||
|
||||
from collective.dms.basecontent import _
|
||||
from collective.dms.basecontent.browser.table import (
|
||||
Column, DateColumn, PrincipalColumn, Table)
|
||||
Column, DateColumn, PrincipalColumn, TitleColumn,
|
||||
Table)
|
||||
|
||||
|
||||
grok.templatedir('templates')
|
||||
|
@ -33,7 +34,7 @@ class BaseTable(Table):
|
|||
return results
|
||||
|
||||
|
||||
class FilesTable(BaseTable):
|
||||
class VersionsTable(BaseTable):
|
||||
pass
|
||||
|
||||
|
||||
|
@ -41,38 +42,21 @@ class TasksTable(BaseTable):
|
|||
pass
|
||||
|
||||
|
||||
class TitleColumn(Column):
|
||||
class BaseTitleColumn(TitleColumn):
|
||||
grok.name('dms.title')
|
||||
grok.adapts(Interface, Interface, BaseTable)
|
||||
header = PMF("Title")
|
||||
weight = 10
|
||||
|
||||
def renderCell(self, value):
|
||||
return u"""<a href="%s">%s</a>""" % (value.getURL(),
|
||||
value.Title.decode('utf8'))
|
||||
|
||||
|
||||
class TaskTitleColumn(Column):
|
||||
grok.name('dms.title')
|
||||
grok.adapts(Interface, Interface, TasksTable)
|
||||
header = PMF("Title")
|
||||
weight = 10
|
||||
|
||||
def renderCell(self, value):
|
||||
cell = u"""<a class="task_title" href="%s">%s</a>""" % (value.getURL(),
|
||||
value.Title.decode('utf8'))
|
||||
#note = value.getObject().note
|
||||
#if note is not None:
|
||||
# tooltip_div = """<div class="tooltip pb-ajax" style="display:none">%s</div>""" % note.decode('utf8')
|
||||
# cell += '\n' + tooltip_div
|
||||
return cell
|
||||
class VersionsTitleColumn(BaseTitleColumn):
|
||||
grok.adapts(Interface, Interface, VersionsTable)
|
||||
contentClasses = 'version-link'
|
||||
|
||||
|
||||
class DirectDownloadColumn(Column):
|
||||
grok.name('dms.download')
|
||||
grok.adapts(Interface, Interface, FilesTable)
|
||||
grok.adapts(Interface, Interface, VersionsTable)
|
||||
header = u""
|
||||
weight = 100
|
||||
weight = 1
|
||||
|
||||
def renderCell(self, value):
|
||||
obj = value.getObject()
|
||||
|
@ -86,7 +70,7 @@ class DirectDownloadColumn(Column):
|
|||
|
||||
class UpdateColumn(DateColumn):
|
||||
grok.name('dms.update')
|
||||
grok.adapts(Interface, Interface, FilesTable)
|
||||
grok.adapts(Interface, Interface, VersionsTable)
|
||||
header = PMF(u"listingheader_modified")
|
||||
attribute = 'modification_date'
|
||||
weight = 40
|
||||
|
|
|
@ -4,9 +4,11 @@ from Products.CMFCore.utils import getToolByName
|
|||
from five import grok
|
||||
from z3c.table import interfaces
|
||||
from zope.cachedescriptors.property import CachedProperty
|
||||
from zope.interface import Interface
|
||||
from zope.i18nmessageid import MessageFactory
|
||||
import z3c.table.table
|
||||
|
||||
PMF = MessageFactory('plone')
|
||||
|
||||
grok.templatedir('templates')
|
||||
|
||||
|
||||
|
@ -92,3 +94,16 @@ class PrincipalColumn(Column):
|
|||
principals.append(group.getProperty('title', None) or group.getId())
|
||||
|
||||
return ', '.join(principals).decode('utf-8')
|
||||
|
||||
|
||||
class TitleColumn(Column):
|
||||
grok.baseclass()
|
||||
header = PMF("Title")
|
||||
weight = 10
|
||||
contentClasses = ''
|
||||
|
||||
def renderCell(self, value):
|
||||
return u"""<a%s href="%s">%s</a>""" % (
|
||||
self.contentClasses and ' class="%s"' % self.contentClasses or '',
|
||||
value.getURL(),
|
||||
value.Title.decode('utf8'))
|
||||
|
|
|
@ -5,11 +5,42 @@
|
|||
lang="en"
|
||||
metal:use-macro="context/main_template/macros/master"
|
||||
i18n:domain="collective.dms.mailcontent">
|
||||
|
||||
<metal:js fill-slot="javascript_head_slot">
|
||||
<!--[if (!IE)|(gte IE 8)]>
|
||||
<!-->
|
||||
<link href="/viewer/viewer-datauri.css" media="screen" rel="stylesheet" type="text/css"
|
||||
tal:attributes="href string:${view/dvstatic}/assets/viewer-datauri.css" />
|
||||
<!--<![endif]-->
|
||||
<!--[if lte IE 7]>
|
||||
<link href="/viewer/viewer.css" media="screen" rel="stylesheet" type="text/css"
|
||||
tal:attributes="href string:${view/dvstatic}/assets/viewer.css" />
|
||||
<![endif]-->
|
||||
|
||||
<script src="/dv_javascript_variables.js"
|
||||
tal:attributes="src string:${portal_url}/dv_javascript_variables.js"></script>
|
||||
<link href="/viewer/printviewer.css" media="print" rel="stylesheet" type="text/css"
|
||||
tal:attributes="href string:${view/dvstatic}/assets/printviewer.css" />
|
||||
<script src="/viewer/viewer.js"
|
||||
tal:attributes="src string:${view/dvstatic}/assets/viewer.js"></script>
|
||||
<script src="/viewer/viewer.js"
|
||||
tal:attributes="src string:${view/dvstatic}/javascripts/viewer.js"></script>
|
||||
|
||||
</metal:js>
|
||||
|
||||
<metal:css fill-slot="style_slot">
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="group.css"
|
||||
tal:attributes="href string:${context/portal_url}/++resource++dv.resources/stylesheets/viewer.css" />
|
||||
</metal:css>
|
||||
|
||||
<body>
|
||||
|
||||
<metal:main fill-slot="content-core">
|
||||
<metal:content-core define-macro="content-core">
|
||||
|
||||
<tal:belowcontent replace="structure provider:dms.abovecontent" />
|
||||
|
||||
<div id="fields" style="float:left">
|
||||
<tal:block repeat="widget view/widgets/values">
|
||||
<div class="field" tal:condition="python:widget.__name__ not in ('IBasic.title', 'IBasic.description', 'title', 'description',)">
|
||||
<label tal:content="widget/label" />
|
||||
|
@ -27,8 +58,11 @@
|
|||
<div tal:content="structure widget/render" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div style="clear:left" />
|
||||
<tal:belowcontent replace="structure provider:dms.belowcontent" />
|
||||
<div style="clear:both" />
|
||||
|
||||
</metal:content-core>
|
||||
</metal:main>
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
<div id="fieldset-versions" style="float:right; width: 50%;">
|
||||
<fieldset>
|
||||
<legend i18n:translate=""
|
||||
tal:content="viewlet/label">label</legend>
|
||||
<tal:listing define="results viewlet/table/values">
|
||||
<tal:b condition="results">
|
||||
<table tal:replace="structure viewlet/table/render" />
|
||||
<div tal:define="version python:results[0].getObject()"
|
||||
tal:replace="structure version/@@versionviewer" />
|
||||
</tal:b>
|
||||
<tal:b condition="not:results" replace="viewlet/noresult_message" />
|
||||
</tal:listing>
|
||||
</fieldset>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
$(".version-link:first").closest('tr').addClass('selected');
|
||||
$(".version-link").click(function(){
|
||||
var trigger = $(this);
|
||||
var url = trigger.attr('href') + '/@@dvdata';
|
||||
$.getJSON(url, function(data) {
|
||||
window.documentData = data;
|
||||
window.initializeDV();
|
||||
trigger.closest('table').find('tr').removeClass('selected');
|
||||
trigger.closest('tr').addClass('selected');
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</div>
|
|
@ -0,0 +1,37 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
|
||||
xmlns:tal="http://xml.zope.org/namespaces/tal"
|
||||
xmlns:metal="http://xml.zope.org/namespaces/metal"
|
||||
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
|
||||
lang="en"
|
||||
tal:omit-tag=""
|
||||
i18n:domain="collective.dms.mailcontent">
|
||||
|
||||
<metal:content-core define-macro="content-core"
|
||||
tal:define="size python:here.getObjSize(here);
|
||||
content_type here/get_content_type|here/Format;"
|
||||
i18n:domain="collective.documentviewer">
|
||||
<tal:notshow tal:condition="not: view/enabled">
|
||||
<dl id="errorMsg" tal:condition="python: view.can_modify and view.settings.successfully_converted is False">
|
||||
<dt>
|
||||
<a href="#">Show Document Viewer Conversion Error</a>
|
||||
</dt>
|
||||
<dd>
|
||||
<pre tal:content="python: view.settings.exception_msg" />
|
||||
<pre tal:content="python: view.settings.exception_traceback" />
|
||||
</dd>
|
||||
</dl>
|
||||
</tal:notshow>
|
||||
<tal:show tal:condition="view/enabled">
|
||||
<div id="DV-container">
|
||||
|
||||
<div class="DV-loadingDocument"><span i18n:translate="">Loading</span></div>
|
||||
<noscript>
|
||||
<div id="DV-noJS" style="height:500px" i18n:translate="">The Document Viewer requires that you enable Javascript.</div>
|
||||
</noscript>
|
||||
</div>
|
||||
<div id="overlay"></div>
|
||||
<script type="text/javascript" tal:content="structure view/javascript"></script>
|
||||
</tal:show>
|
||||
|
||||
</metal:content-core>
|
||||
</html>
|
|
@ -2,7 +2,7 @@ from five import grok
|
|||
|
||||
from collective.dms.basecontent.dmsdocument import IDmsDocument
|
||||
from collective.dms.basecontent import _
|
||||
from collective.dms.basecontent.browser.listing import FilesTable, TasksTable
|
||||
from collective.dms.basecontent.browser.listing import VersionsTable, TasksTable
|
||||
|
||||
from collective.dms.basecontent.browser.table import TableViewlet
|
||||
|
||||
|
@ -10,6 +10,9 @@ grok.templatedir('templates')
|
|||
grok.context(IDmsDocument)
|
||||
|
||||
|
||||
class DmsAboveContentViewletManager(grok.ViewletManager):
|
||||
grok.name('dms.abovecontent')
|
||||
|
||||
class DmsBelowContentViewletManager(grok.ViewletManager):
|
||||
grok.name('dms.belowcontent')
|
||||
|
||||
|
@ -17,17 +20,19 @@ class DmsBelowContentViewletManager(grok.ViewletManager):
|
|||
class BaseViewlet(TableViewlet):
|
||||
grok.baseclass()
|
||||
grok.viewletmanager(DmsBelowContentViewletManager)
|
||||
__table__ = FilesTable
|
||||
__table__ = VersionsTable
|
||||
|
||||
def contentFilter(self):
|
||||
return {'portal_type': self.portal_type}
|
||||
|
||||
|
||||
class FilesViewlet(BaseViewlet):
|
||||
class VersionsViewlet(BaseViewlet):
|
||||
grok.name('dms.files')
|
||||
grok.template('versionsviewlet')
|
||||
grok.viewletmanager(DmsAboveContentViewletManager)
|
||||
grok.order(10)
|
||||
portal_type = 'dmsmainfile'
|
||||
label = _(u"Version notes")
|
||||
label = _(u"Versions")
|
||||
noresult_message = _(u"There is no version note for this document.")
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
import json
|
||||
|
||||
from zope.component import getMultiAdapter
|
||||
from collective.documentviewer.views import DocumentViewerView
|
||||
from plone.dexterity.browser.view import DefaultView
|
||||
|
||||
|
||||
class VersionViewerView(DocumentViewerView):
|
||||
pass
|
||||
|
||||
|
||||
class JSONVersionViewerView(DocumentViewerView):
|
||||
def index(self):
|
||||
self.request.response.setHeader('Content-Type', 'application/json')
|
||||
return json.dumps(self.dv_data())
|
||||
|
||||
|
||||
class DmsDocumentView(DefaultView):
|
||||
def update(self):
|
||||
super(DmsDocumentView, self).update()
|
||||
self.portal_url = getMultiAdapter((self.context, self.request),
|
||||
name="plone_portal_state").portal_url()
|
||||
self.dvstatic = "%s/++resource++dv.resources" % (
|
||||
self.portal_url)
|
|
@ -13,6 +13,7 @@
|
|||
<property name="default_view">view</property>
|
||||
<property name="view_methods">
|
||||
<element value="view"/>
|
||||
<element value="documentviewer"/>
|
||||
</property>
|
||||
<property name="default_view_fallback">False</property>
|
||||
<property name="add_permission">cmf.AddPortalContent</property>
|
||||
|
|
Reference in New Issue