From 233ece8dfdced37bd61cee593dcfbcb78da490c3 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 31 Mar 2013 11:08:12 +0200 Subject: [PATCH 1/3] section view: show children with title and description --- compound/book/view_macros.pt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compound/book/view_macros.pt b/compound/book/view_macros.pt index 0431662..576c224 100644 --- a/compound/book/view_macros.pt +++ b/compound/book/view_macros.pt @@ -1,14 +1,18 @@ - - +

+ + + + + @@ -32,6 +36,7 @@
+
- + + title related/relationInfo"> Resource Title @@ -242,11 +239,8 @@ tal:attributes="dojoType python: item.editable and 'dojo.dnd.Source' or ''"> - + + title related/relationInfo">
Resource Title
From 8300cbf59beb4a30ec5adedd2bb6a2742419dfd9 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 1 Apr 2013 10:39:30 +0200 Subject: [PATCH 3/3] provide a special topic view for books that shows informative lists of children and text resources --- browser/resource.py | 7 ++ compound/README.txt | 2 +- compound/book/base.py | 52 -------------- compound/book/browser.py | 107 +++++++-------------------- compound/book/configure.zcml | 76 +------------------- compound/book/interfaces.py | 32 --------- compound/book/loops_book_de.dmp | 7 +- compound/book/view_macros.pt | 124 +++++++++++++++++--------------- locales/de/LC_MESSAGES/loops.mo | Bin 23558 -> 23626 bytes locales/de/LC_MESSAGES/loops.po | 8 ++- 10 files changed, 115 insertions(+), 300 deletions(-) delete mode 100644 compound/book/base.py delete mode 100644 compound/book/interfaces.py diff --git a/browser/resource.py b/browser/resource.py index 015c57b..8ec1e95 100644 --- a/browser/resource.py +++ b/browser/resource.py @@ -40,6 +40,7 @@ from zope.traversing.browser import absoluteURL from cybertools.browser.action import actions from cybertools.meta.interfaces import IOptions from cybertools.typology.interfaces import IType +from cybertools.util.html import extractFirstPart from cybertools.xedit.browser import ExternalEditorView, fromUnicode from loops.browser.action import DialogAction, TargetAction from loops.browser.common import EditForm, BaseView @@ -252,6 +253,12 @@ class ResourceView(BaseView): #return util.toUnicode(wp.render(self.request)) return super(ResourceView, self).renderText(text, contentType) + def renderShortText(self): + return self.renderDescription() or self.createShortText(self.render()) + + def createShortText(self, text=None): + return extractFirstPart(text or self.render()) + def download(self): """ Force download, e.g. of a PDF file """ return self.show(True) diff --git a/compound/README.txt b/compound/README.txt index 976111f..2f1d441 100644 --- a/compound/README.txt +++ b/compound/README.txt @@ -355,7 +355,7 @@ Books, Sections, and Pages >>> importPath = os.path.join(os.path.dirname(__file__), 'book') >>> importData(loopsRoot, importPath, 'loops_book_de.dmp') - >>> from loops.compound.book.browser import PageLayout + >>> from loops.compound.book.browser import BookView, SectionView, TopicView Fin de partie diff --git a/compound/book/base.py b/compound/book/base.py deleted file mode 100644 index 80579fe..0000000 --- a/compound/book/base.py +++ /dev/null @@ -1,52 +0,0 @@ -# -# Copyright (c) 2012 Helmut Merz helmutm@cy55.de -# -# 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 -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -Implementation of book and book components -""" - -from zope.cachedescriptors.property import Lazy -from zope.interface import implements -from zope.traversing.api import getName - -from loops.compound.base import Compound -from loops.compound.book.interfaces import IPage -from loops.type import TypeInterfaceSourceList - - -TypeInterfaceSourceList.typeInterfaces += (IPage,) - - -class Page(Compound): - - implements(IPage) - - compoundPredicateNames = ['ispartof', 'standard'] - - @Lazy - def documentType(self): - return self.context.getConceptManager()['documenttype'] - - def getParts(self): - result = {} - for r in super(Page, self).getParts(): - for parent in r.getParents(): - if parent.conceptType == self.documentType: - item = result.setdefault(getName(parent), []) - item.append(r) - return result diff --git a/compound/book/browser.py b/compound/book/browser.py index d71a89a..98009c7 100644 --- a/compound/book/browser.py +++ b/compound/book/browser.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2012 Helmut Merz helmutm@cy55.de +# Copyright (c) 2013 Helmut Merz helmutm@cy55.de # # 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 @@ -45,10 +45,22 @@ class Base(object): def book_macros(self): return book_template.macros + @Lazy + def documentTypeType(self): + return self.conceptManager['documenttype'] + + @Lazy + def sectionType(self): + return self.conceptManager['section'] + @Lazy def isPartOfPredicate(self): return self.conceptManager['ispartof'] + @Lazy + def showNavigation(self): + return self.typeOptions.show_navigation + @Lazy def breadcrumbsParent(self): for p in self.context.getParents([self.isPartOfPredicate]): @@ -82,34 +94,8 @@ class Base(object): if self.editable: return 'index.html' - -class BookOverview(Base, ConceptView): - - @Lazy - def macro(self): - return book_template.macros['book'] - - -class SectionView(Base, ConceptView): - - @Lazy - def macro(self): - return book_template.macros['section'] - - @Lazy - def documentTypeType(self): - return self.conceptManager['documenttype'] - - @Lazy - def showNavigation(self): - return self.typeOptions.show_navigation - - @Lazy - def sectionType(self): - return self.conceptManager['section'] - def getResources(self): - relViews = super(SectionView, self).getResources() + relViews = super(Base, self).getResources() return relViews @Lazy @@ -144,64 +130,23 @@ class SectionView(Base, ConceptView): yield c -# layout parts - probably obsolete: +class BookView(Base, ConceptView): -class PageLayout(Base, standard.Layout): - - def getParts(self): - parts = ['headline', 'keyquestions', 'quote', 'maintext', - 'story', 'tip', 'usecase'] - return self.getPartViews(parts) + @Lazy + def macro(self): + return book_template.macros['book'] -class PagePart(object): +class SectionView(Base, ConceptView): - template = book_template - templateName = 'compound.book' - macroName = 'text' - partName = None # define in subclass - gridPattern = ['span-4'] - - def getResources(self): - result = [] - res = self.adapted.getParts().get(self.partName) or [] - for idx, r in enumerate(res): - result.append(standard.ResourceView( - r, self.request, parent=self, idx=idx)) - return result + @Lazy + def macro(self): + return book_template.macros['section'] -class Headline(PagePart, standard.Header2): +class TopicView(Base, ConceptView): - macroName = 'headline' + @Lazy + def macro(self): + return book_template.macros['topic'] - -class MainText(PagePart, standard.BasePart): - - partName = 'maintext' - - -class KeyQuestions(PagePart, standard.BasePart): - - partName = 'keyquestions' - - -class Story(PagePart, standard.BasePart): - - partName = 'story' - - -class Tip(PagePart, standard.BasePart): - - partName = 'tip' - - -class UseCase(PagePart, standard.BasePart): - - partName = 'usecase' - - -class Quote(PagePart, standard.BasePart): - - partName = 'quote' - gridPattern = ['span-2 last'] diff --git a/compound/book/configure.zcml b/compound/book/configure.zcml index 4ff408f..09a374a 100644 --- a/compound/book/configure.zcml +++ b/compound/book/configure.zcml @@ -3,18 +3,6 @@ xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="loops"> - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/compound/book/interfaces.py b/compound/book/interfaces.py deleted file mode 100644 index 3dd1e43..0000000 --- a/compound/book/interfaces.py +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright (c) 2012 Helmut Merz helmutm@cy55.de -# -# 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 -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -""" -Books, sections, pages... -""" - -from zope.interface import Interface, Attribute -from zope import interface, component, schema - -from loops.compound.interfaces import ICompound -from loops.util import _ - - -class IPage(ICompound): - - pass diff --git a/compound/book/loops_book_de.dmp b/compound/book/loops_book_de.dmp index 5185bb2..a7d846f 100644 --- a/compound/book/loops_book_de.dmp +++ b/compound/book/loops_book_de.dmp @@ -4,11 +4,11 @@ type(u'documenttype', u'Dokumentenart', options=u'qualifier:assign', # book types type(u'book', u'Buch', viewName=u'book_overview', typeInterface=u'', options=u'action.portlet:create_subtype,edit_concept') -#type(u'page', u'Seite', viewName=u'page_layout', -# typeInterface=u'loops.compound.book.interfaces.IPage', -# options=u'action.portlet:edit_concept') type(u'section', u'Kapitel', viewName=u'section_view', typeInterface=u'', options=u'action.portlet:create_subtype,edit_concept') +#type(u'topic', u'Thema', viewName=u'book_topic_view', +# typeInterface=u'loops.knowledge.interfaces.ITopic', +# options=u'action.portlet:create_topic,edit_topic') concept(u'system', u'System', u'domain') @@ -30,4 +30,3 @@ concept(u'usecase', u'Fallbeispiel', u'documenttype') # book structure child(u'book', u'section', u'issubtype', usePredicate=u'ispartof') child(u'section', u'section', u'issubtype', usePredicate=u'ispartof') -#child(u'section', u'page', u'issubtype', usePredicate=u'ispartof') diff --git a/compound/book/view_macros.pt b/compound/book/view_macros.pt index 576c224..298f67d 100644 --- a/compound/book/view_macros.pt +++ b/compound/book/view_macros.pt @@ -2,7 +2,9 @@ -
+

@@ -37,71 +39,81 @@ -
-
-
-
-
-
- - - - + +
+ +

- - - -
- -
-
- - - -
-

- + + +

Children

+ +

Text Elements

+
+
+

+ +

+ + diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index fca2a64fb4145914853b06e1784078da52c00049..c2a1970b3b85bb688dcd8ffcd2de2df37f39fd3c 100644 GIT binary patch delta 8356 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\n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -537,6 +537,9 @@ msgstr "Unterbegriffe" msgid "Resources" msgstr "Ressourcen" +msgid "Text Elements" +msgstr "Texte" + msgid "Title" msgstr "Titel" @@ -702,6 +705,9 @@ msgstr "Zugeordnete Begriffe" msgid "more..." msgstr "Mehr..." +msgid "More..." +msgstr "Mehr..." + msgid "Versioning" msgstr "Versionierung"