Integrated documentviewer

This commit is contained in:
Vincent Fretin 2013-07-01 10:41:49 +02:00
parent 9c5d2cba20
commit 4839fa2a54
10 changed files with 184 additions and 38 deletions

View File

@ -43,6 +43,7 @@ setup(name='collective.dms.basecontent',
install_requires=[
'setuptools',
'five.grok',
'collective.documentviewer',
'plone.api',
'plone.app.dexterity',
'plone.namedfile',

View File

@ -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>

View File

@ -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

View File

@ -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'))

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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.")

View File

@ -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)

View File

@ -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>