merge branch master

This commit is contained in:
Helmut Merz 2012-11-09 09:48:26 +01:00
commit 7ed73e28b5
6 changed files with 69 additions and 7 deletions

View file

@ -69,7 +69,7 @@ from loops.resource import Resource
from loops.security.common import canAccessObject, canListObject, canWriteObject from loops.security.common import canAccessObject, canListObject, canWriteObject
from loops.type import ITypeConcept from loops.type import ITypeConcept
from loops import util from loops import util
from loops.util import _ from loops.util import _, saveRequest
from loops import version from loops import version
from loops.versioning.interfaces import IVersionable from loops.versioning.interfaces import IVersionable
@ -145,6 +145,7 @@ class BaseView(GenericView, I18NView):
raise Unauthorized(str(self.contextInfo)) raise Unauthorized(str(self.contextInfo))
except ForbiddenAttribute: # ignore when testing except ForbiddenAttribute: # ignore when testing
pass pass
saveRequest(request)
def checkPermissions(self): def checkPermissions(self):
return canAccessObject(self.context) return canAccessObject(self.context)

View file

@ -41,6 +41,10 @@ book_template = ViewPageTemplateFile('view_macros.pt')
class Base(object): class Base(object):
@Lazy
def book_macros(self):
return book_template.macros
@Lazy @Lazy
def isPartOfPredicate(self): def isPartOfPredicate(self):
return self.conceptManager['ispartof'] return self.conceptManager['ispartof']
@ -50,6 +54,29 @@ class Base(object):
for p in self.context.getParents([self.isPartOfPredicate]): for p in self.context.getParents([self.isPartOfPredicate]):
return self.nodeView.getViewForTarget(p) return self.nodeView.getViewForTarget(p)
@Lazy
def neighbours(self):
pred = succ = None
parent = self.breadcrumbsParent
if parent is not None:
myself = None
children = list(parent.context.getChildren([self.isPartOfPredicate]))
for idx, c in enumerate(children):
if c == self.context:
if idx > 0:
pred = self.nodeView.getViewForTarget(children[idx-1])
if idx < len(children) - 1:
succ = self.nodeView.getViewForTarget(children[idx+1])
return pred, succ
@Lazy
def predecessor(self):
return self.neighbours[0]
@Lazy
def successor(self):
return self.neighbours[1]
@Lazy @Lazy
def tabview(self): def tabview(self):
if self.editable: if self.editable:
@ -73,6 +100,10 @@ class SectionView(Base, ConceptView):
def documentTypeType(self): def documentTypeType(self):
return self.conceptManager['documenttype'] return self.conceptManager['documenttype']
@Lazy
def showNavigation(self):
return self.typeOptions.show_navigation
@Lazy @Lazy
def sectionType(self): def sectionType(self):
return self.conceptManager['section'] return self.conceptManager['section']

View file

@ -13,6 +13,24 @@
<metal:section define-macro="section"> <metal:section define-macro="section">
<metal:navigation define-macro="navigation"
tal:condition="item/showNavigation">
<div tal:define="parent nocall:item/breadcrumbsParent;
pred nocall:item/predecessor;
succ nocall:item/successor">
<a tal:condition="nocall:pred"
tal:attributes="href pred/targetUrl;
title pred/title">
<img src="/@@/cybertools.icons/arrow_left.png" /></a>
<a tal:attributes="href parent/targetUrl;
title parent/title">
<img src="/@@/cybertools.icons/arrow_up.png" /></a>
<a tal:condition="nocall:succ"
tal:attributes="href succ/targetUrl;
title succ/title">
<img src="/@@/cybertools.icons/arrow_right.png" /></a>
</div>
</metal:navigation>
<metal:info use-macro="view/concept_macros/concepttitle" /> <metal:info use-macro="view/concept_macros/concepttitle" />
<div tal:repeat="related item/textResources"> <div tal:repeat="related item/textResources">
<div class="span-4"> <div class="span-4">
@ -57,6 +75,9 @@
</div> </div>
</div> </div>
</div> </div>
<br style="clear: both" />
<metal:navigation use-macro="item/book_macros/navigation" />
<br />
</metal:section> </metal:section>

View file

@ -78,15 +78,16 @@ class OfficeFile(ExternalFileAdapter):
@Lazy @Lazy
def docPropertyDom(self): def docPropertyDom(self):
fn = self.docFilename fn = self.docFilename
dummy = dict(core=[], custom=[])
root, ext = os.path.splitext(fn) root, ext = os.path.splitext(fn)
if not ext.lower() in self.fileExtensions: if not ext.lower() in self.fileExtensions:
return [] return dummy
try: try:
zf = ZipFile(fn, 'r') zf = ZipFile(fn, 'r')
except IOError, e: except IOError, e:
from logging import getLogger from logging import getLogger
self.logger.warn(e) self.logger.warn(e)
return [] return dummy
if self.corePropFileName not in zf.namelist(): if self.corePropFileName not in zf.namelist():
self.logger.warn('Core properties not found in file %s.' % self.logger.warn('Core properties not found in file %s.' %
self.externalAddress) self.externalAddress)

View file

@ -61,7 +61,7 @@ actions.register('editTopic', 'portlet', DialogAction,
actions.register('createQualification', 'portlet', DialogAction, actions.register('createQualification', 'portlet', DialogAction,
title=_(u'Create Qualification Record...'), title=_(u'Create Qualification Record...'),
description=_(u'Create a work item for this person.'), description=_(u'Create a qualification record for this person.'),
viewName='create_qualification.html', viewName='create_qualification.html',
dialogName='createQualification', dialogName='createQualification',
prerequisites=['registerDojoDateWidget', 'registerDojoNumberWidget', prerequisites=['registerDojoDateWidget', 'registerDojoNumberWidget',

14
util.py
View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de # Copyright (c) 2012 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -18,8 +18,6 @@
""" """
Utility functions. Utility functions.
$Id$
""" """
import os import os
@ -28,6 +26,7 @@ from zope.interface import directlyProvides, directlyProvidedBy
from zope.intid.interfaces import IIntIds from zope.intid.interfaces import IIntIds
from zope.i18nmessageid import MessageFactory from zope.i18nmessageid import MessageFactory
from zope.schema import vocabulary from zope.schema import vocabulary
from zope import thread
import cybertools import cybertools
from loops.browser.util import html_quote from loops.browser.util import html_quote
@ -134,3 +133,12 @@ def getLogDirectory(request=None):
return os.path.join(os.path.dirname(varDir), 'log') return os.path.join(os.path.dirname(varDir), 'log')
# store thread-local stuff
local_data = thread.local()
def saveRequest(request):
local_data.request = request
def getRequest():
return local_data.request