Merge branch 'master' into bbmaster

This commit is contained in:
Helmut Merz 2011-12-28 08:36:54 +01:00
commit cebc045348
10 changed files with 129 additions and 14 deletions

View file

@ -137,7 +137,7 @@ class BaseRelationView(BaseView):
return self.getData()
def getData(self):
return self.instance.applyTemplate()
return self.instance.applyTemplate(context=self.context, request=self.request)
@Lazy
def instance(self):

View file

@ -693,6 +693,10 @@
for="loops.view.NodeTypeSourceList
zope.publisher.interfaces.browser.IBrowserRequest" />
<zope:adapter factory="loops.browser.common.SimpleTerms"
for="loops.table.DataTableSourceList
zope.publisher.interfaces.browser.IBrowserRequest" />
<zope:view factory="loops.browser.node.NodeTraverser"
for="loops.interfaces.INode"
type="zope.publisher.interfaces.http.IHTTPRequest"

View file

@ -83,7 +83,7 @@
style cell/style">
<metal:image use-macro="item/macros/image" />
<div class="legend">
<b tal:content="cell/title" />
<a tal:attributes="href cell/targetUrl"><b tal:content="cell/title" /></a>
<span tal:condition="cell/img/showInfo|nothing">
<a tal:define="url string:${cell/img/url}/meta_info.html"
tal:attributes="href url;

View file

@ -38,6 +38,7 @@ from zope.traversing.api import getName, getParent
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.xedit.browser import ExternalEditorView, fromUnicode
from loops.browser.action import DialogAction, TargetAction
@ -51,6 +52,7 @@ from loops.interfaces import IMediaAsset as legacy_IMediaAsset
from loops.interfaces import ITypeConcept
from loops.media.interfaces import IMediaAsset
from loops.organize.stateful.browser import statefulActions
from loops.organize.util import getRolesForPrincipal
from loops.versioning.browser import version_macros
from loops.versioning.interfaces import IVersionable
from loops import util
@ -270,15 +272,38 @@ class ResourceView(BaseView):
# relations
def concepts(self):
for r in self.context.getConceptRelations():
yield ConceptRelationView(r, self.request)
def isHidden(self, pr):
hideRoles = None
options = component.queryAdapter(adapted(pr.first), IOptions)
if options is not None:
hideRoles = options('hide_for', None)
if not hideRoles:
hideRoles = IOptions(adapted(pr.first.conceptType))('hide_for', None)
if hideRoles is not None:
principal = self.request.principal
if (IUnauthenticatedPrincipal.providedBy(principal) and
'zope.Anonymous' in hideRoles):
return True
roles = getRolesForPrincipal(principal.id, self.context)
for r in roles:
if r in hideRoles:
return True
return False
#@Lazy
def conceptsForPortlet(self):
return [p for p in self.relatedConcepts() if not self.isHidden(p.relation)]
def relatedConcepts(self):
for c in self.concepts():
if c.isProtected: continue
if c.isProtected:
continue
yield c
def concepts(self):
for r in self.context.getConceptRelations():
yield ConceptRelationView(r, self.request)
def clients(self):
for node in self.context.getClients():
yield NodeView(node, self.request)

View file

@ -48,9 +48,10 @@
<metal:block define-macro="image">
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
<div metal:use-macro="views/node_macros/object_actions" />
<h1 tal:content="item/title">Title</h1><br />
<img src="#"
tal:attributes="src
<h1><a tal:omit-tag="python: level > 1"
tal:attributes="href request/URL"
tal:content="item/title">Title</a></h1><br />
<img tal:attributes="src
string:${view/url}/.${view/targetId}/view?version=this" />
<p><i tal:content="structure item/renderedDescription">Description</i></p>
<metal:fields use-macro="view/comment_macros/comments" />
@ -114,7 +115,7 @@
<metal:actions define-macro="related">
<div tal:repeat="concept macro/info/relatedConcepts">
<div tal:repeat="concept macro/info/conceptsForPortlet">
<a tal:attributes="href python: view.getUrlForTarget(concept);
title concept/relationInfo">
<span i18n:translate="" tal:content="concept/title">Concept</span>

View file

@ -43,6 +43,12 @@
template="lobo/body.pt"
permission="zope.Public" />
<page name="controller"
for="zope.publisher.interfaces.browser.IBrowserView"
class="loops.browser.skin.controller.Controller"
permission="zope.Public"
layer="loops.browser.skin.Lobo" />
<resource name="loops.css" file="lobo/lobo.css"
layer="loops.browser.skin.Lobo" />
<resource name="print.css" file="lobo/print.css"

View file

@ -0,0 +1,47 @@
#-*- coding: UTF-8 -*-
#
# Copyright (c) 2011 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
#
"""
View controller for the FuFo skin.
"""
from cybertools.browser.blue.controller import Controller as BaseController
metaTagNames = ('keywords', 'description', 'google-site-verification')
class Controller(BaseController):
def __init__(self, context, request):
super(Controller, self).__init__(context, request)
self.setupMetadata()
def setupMetadata(self):
macros = self.macros
target = self.view.virtualTarget
if target is not None:
desc = target.dcDescription
if desc:
for line in desc.splitlines():
if ':' in line:
name, value = line.split(':')
if name in metaTagNames:
macros.register('meta', name, metaName=name,
metaContent=value)

View file

@ -2,7 +2,9 @@
<div tal:attributes="ondblclick python: item.openEditWindow('edit.html')">
<tal:actions condition="view/showObjectActions">
<div metal:use-macro="views/node_macros/object_actions" /></tal:actions>
<h1 tal:content="item/title">Title</h1><br />
<h1><a tal:omit-tag="python: level > 1"
tal:attributes="href request/URL"
tal:content="item/title">Title</a></h1><br />
<p tal:define="url python: view.getUrlForTarget(item)">
<a tal:omit-tag="view/isAnonymous"
tal:attributes="href string:${url}/view?version=this"><img

View file

@ -138,10 +138,12 @@ class MemberRegistration(NodeView, CreateForm):
return True
login = form.get('loginName')
regMan = IMemberRegistrationManager(self.context.getLoopsRoot())
phoneNumbers = [x.strip()
for x in (form.get('phoneNumbers') or u'').split('\n')]
result = regMan.register(login, pw,
form.get('lastName'), form.get('firstName'),
email=form.get('email'),
phoneNumbers=form.get('phoneNumbers'))
phoneNumbers=[x for x in phoneNumbers if x])
if isinstance(result, dict):
fi = formState.fieldInstances[result['fieldName']]
fi.setError(result['error'], self.formErrors)

View file

@ -21,14 +21,15 @@ Data (keyword-based) table definition and implementation.
"""
from BTrees.OOBTree import OOBTree
from zope.cachedescriptors.property import Lazy
from zope import component, schema
from zope.component import adapts
from zope.interface import implements, Interface, Attribute
from zope.cachedescriptors.property import Lazy
from zope.schema.interfaces import IContextSourceBinder, IIterableSource
from cybertools.composer.schema.factory import SchemaFactory
from cybertools.composer.schema.grid.interfaces import KeyTable
from loops.common import AdapterBase
from loops.common import AdapterBase, adapted, baseObject
from loops.interfaces import IConcept, IConceptSchema, ILoopsAdapter
from loops.type import TypeInterfaceSourceList
from loops import util
@ -101,3 +102,30 @@ class DataTableSchemaFactory(SchemaFactory):
schema.fields.remove('viewName')
return schema
class DataTableSourceBinder(object):
implements(IContextSourceBinder)
def __init__(self, tableName):
self.tableName = tableName
def __call__(self, context):
context = baseObject(context)
dt = context.getLoopsRoot().getConceptManager()[self.tableName]
return DataTableSourceList(adapted(dt))
class DataTableSourceList(object):
implements(IIterableSource)
def __init__(self, context):
self.context = context
def __iter__(self):
items = [(k, v[0]) for k, v in self.context.data.items()]
return iter(sorted(items, key=lambda x: x[1]))
def __len__(self):
return len(self.context.data)