move 'parts' logic to ConceptView class so that parts can be used in standard (non-Lobo) views

This commit is contained in:
Helmut Merz 2012-11-22 09:16:49 +01:00
parent ae1ef58276
commit a2cc1ee9a3
4 changed files with 46 additions and 37 deletions

View file

@ -131,6 +131,7 @@ class BaseView(GenericView, I18NView):
actions = {} actions = {}
portlet_actions = [] portlet_actions = []
parts = ()
icon = None icon = None
modeName = 'view' modeName = 'view'
isToplevel = False isToplevel = False

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
@ -200,16 +200,22 @@ class BaseRelationView(BaseView):
class ConceptView(BaseView): class ConceptView(BaseView):
template = concept_macros template = concept_macros
templateName = 'concept.standard'
macroName = 'conceptdata'
partPrefix = 'part_'
defaultParts = ('title', 'fields',
'children', 'resources', 'workitems', 'comments',)
def childViewFactory(self, *args, **kw): def childViewFactory(self, *args, **kw):
return ConceptRelationView(*args, **kw) return ConceptRelationView(*args, **kw)
@Lazy @Lazy
def macro(self): def macros(self):
return self.template.macros['conceptdata'] return self.controller.getTemplateMacros(self.templateName, self.template)
#def __init__(self, context, request): @property
# super(ConceptView, self).__init__(context, request) def macro(self):
return self.macros[self.macroName]
def setupController(self): def setupController(self):
cont = self.controller cont = self.controller
@ -222,6 +228,24 @@ class ConceptView(BaseView):
subMacro=concept_macros.macros['parents'], subMacro=concept_macros.macros['parents'],
priority=20, info=self) priority=20, info=self)
def getParts(self):
parts = (self.params.get('parts') or []) # deprecated!
if not parts:
parts = (self.options('parts') or self.typeOptions('parts') or
self.defaultParts)
return self.getPartViews(parts)
def getPartViews(self, parts):
result = []
for p in parts:
viewName = self.partPrefix + p
view = component.queryMultiAdapter((self.adapted, self.request),
name=viewName)
if view is not None:
view.parent = self
result.append(view)
return result
@Lazy @Lazy
def adapted(self): def adapted(self):
return adapted(self.context, self.languageInfo) return adapted(self.context, self.languageInfo)

View file

@ -1,6 +1,13 @@
<html i18n:domain="loops"> <html i18n:domain="loops">
<metal:data define-macro="conceptinfo">
<tal:part repeat="part item/parts">
<metal:part use-macro="part/renderer" />
</tal:part>
</metal:data>
<metal:data define-macro="conceptdata"> <metal:data define-macro="conceptdata">
<div tal:attributes="class string:content-$level;"> <div tal:attributes="class string:content-$level;">
<metal:block use-macro="view/concept_macros/concepttitle" /> <metal:block use-macro="view/concept_macros/concepttitle" />

View file

@ -41,18 +41,12 @@ class Base(BaseConceptView):
templateName = 'lobo.standard' templateName = 'lobo.standard'
macroName = None macroName = None
@Lazy #@Lazy
def macros(self): # better implementation in BaseView:
return self.controller.getTemplateMacros(self.templateName, self.template) # splits comma-separated list of values automatically
#def params(self):
@property # ann = self.request.annotations.get('loops.view', {})
def macro(self): # return parse_qs(ann.get('params') or '')
return self.macros[self.macroName]
@Lazy
def params(self):
ann = self.request.annotations.get('loops.view', {})
return parse_qs(ann.get('params') or '')
class ConceptView(BaseConceptView): class ConceptView(BaseConceptView):
@ -152,25 +146,8 @@ class ConceptView(BaseConceptView):
class Layout(Base, ConceptView): class Layout(Base, ConceptView):
macroName = 'layout' macroName = 'layout'
partPrefix = 'lobo_'
def getParts(self): defaultParts = ('h1', 'g3',)
parts = (self.params.get('parts') or [''])[0].split(',') # obsolete
if not parts or not parts[0]:
parts = (self.options('parts') or
self.typeOptions('parts') or
['h1', 'g3'])
return self.getPartViews(parts)
def getPartViews(self, parts):
result = []
for p in parts:
viewName = 'lobo_' + p
view = component.queryMultiAdapter((self.adapted, self.request),
name=viewName)
if view is not None:
view.parent = self
result.append(view)
return result
class BasePart(Base): class BasePart(Base):
@ -192,7 +169,7 @@ class BasePart(Base):
return preds return preds
def getChildren(self): def getChildren(self):
subtypeNames = (self.params.get('subtypes') or [''])[0].split(',') subtypeNames = (self.params.get('subtypes') or [])
subtypes = [self.conceptManager[st] for st in subtypeNames if st] subtypes = [self.conceptManager[st] for st in subtypeNames if st]
result = [] result = []
childRels = self.context.getChildRelations(self.childPredicates) childRels = self.context.getChildRelations(self.childPredicates)