set up basic/generic view stuff in in 'view' package; move z2-independent stuff to 'view' package

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3790 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2010-03-28 16:31:53 +00:00
parent 17c35c9c61
commit 44fb2e3142
17 changed files with 363 additions and 74 deletions

13
view/browser/generic.pt Normal file
View file

@ -0,0 +1,13 @@
<tal:show condition="view/update">
<html metal:use-macro="view/mainMacro">
<body>
<div metal:fill-slot="content">
<metal:content use-macro="view/contentMacro" />
</div>
</body>
</html>
</tal:show>

View file

@ -0,0 +1,16 @@
"""
$Id$
"""
#from zope.publisher.interfaces.browser import IBrowserRequest
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
from zope.app.rotterdam import Rotterdam
#class liquid(IBrowserRequest):
# """The `liquid` layer."""
class Liquid(Rotterdam):
""" The Liquid skin """

View file

@ -0,0 +1,32 @@
/*
$Id$
based on http://www.tjkdesign.com/articles/liquid/4.asp
*/
body {
min-width:640px;
margin: 0;
padding: 0;
font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;
font-size: 13px;
background-color: white;
color: #000040;
}
#global,#menu,#sub-section,#footer {
overflow: hidden;
display: inline-block;
}
#content {
display: inline-block;
}
#global,#footer {width:100%}
#menu,#content,#sub-section {float:left}
#menu {width:20%}
#content {width:62%}
#sub-section {width:17%}
#footer {clear:left; float:left}

View file

@ -0,0 +1,57 @@
<tal:block i18n:domain="loops">
<div class="body"
metal:define-macro="body"
tal:define="controller nocall:view/controller;
resourceBase controller/resourceBase;">
<div id="global" metal:define-macro="global">
<div class="top" metal:define-slot="top">
<a href="#" name="top" metal:define-slot="logo"
tal:attributes="href string:${request/URL/1}"><img class="logo"
src="logo.gif" border="0" alt="Home"
tal:attributes="src string:${resourceBase}logo.gif" /></a>
<div metal:define-slot="top-actions">
<tal:action repeat="macro controller/macros/top_actions">
<metal:action use-macro="macro" />
</tal:action>
</div>
</div>
</div>
<div id="menu" metal:define-macro="menu">
<tal:portlet repeat="macro controller/macros/portlet_left">
<metal:portlet use-macro="macro" />
</tal:portlet>
</div>
<div id="content" metal:define-macro="content">
<div metal:define-slot="actions"></div>
<div metal:define-slot="message"></div>
<metal:content define-slot="content">
<tal:content define="item nocall:view/item;
level level|python: 1;
macro item/macro;"
condition="macro">
<metal:block use-macro="macro" />
</tal:content>
</metal:content>
</div>
<div id="sub-section"
xtal:condition="view/isAuthenticated">
<tal:portlet repeat="macro controller/macros/portlet_right">
<metal:portlet use-macro="macro" />
</tal:portlet>
</div>
<div id="footer" class="footer" metal:define-macro="footer">
<metal:footer define-slot="footer">
Powered by <b><a href="http://www.python.org">Python</a></b> &middot;
<b><a href="http://wiki.zope.org/zope3">Zope 3</a></b> &middot;
<b><a href="http://loops.cy55.de">
loops</a></b>.
</metal:footer>
</div>
</div>
</tal:block>

View file

@ -0,0 +1,9 @@
<!-- $Id$ -->
<configure
xmlns:zope="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser">
<browser:resource name="base.css" file="base.css" />
</configure>

View file

@ -0,0 +1,7 @@
/*
$Id$
Copy this to your custom skin directory and add custom settings.
*/

View file

@ -0,0 +1,22 @@
/*
$Id$
*/
.body {
margin: 4em;
}
.top, #header, #menu, #sub-section, #footer, .object-actions, .button {
display: none;
}
#content {
width: 100%;
color: #000077;
}
h1, h2, h3, h4, h5 {
color: #005599;
}

View file

@ -0,0 +1,17 @@
/*
$Id$
*/
body {
font-size: 11px;
}
.top, #header, #menu, #sub-section, #footer, .object-actions, .button {
display: none;
}
#content {
width: 100%;
color: Black;
}

View file

@ -0,0 +1,61 @@
<metal:main define-macro="main"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title tal:content="view/head_title|context/title|default">
Powered by Zope 3
</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css"
tal:attributes="href view/resources/base.css" />
</head>
<body>
<div class="body">
<div id="global">
<div class="top" metal:define-slot="top">
<a href="#" name="top" metal:define-slot="logo"
tal:attributes="href view/homeURL"><img class="logo"
src="logo.gif" border="0" alt="Home"
tal:attributes="src string:${view/resource_prefix}logo.gif" /></a>
<div metal:define-slot="top-actions">
<tal:action repeat="macro view/actions/top">
<metal:action use-macro="macro" />
</tal:action>
</div>
</div>
</div>
<div id="menu">
<tal:portlet repeat="macro view/actions/portlet_left">
<metal:portlet use-macro="macro" />
</tal:portlet>
</div>
<div id="content">
<div metal:define-slot="actions"></div>
<div metal:define-slot="message"></div>
<div>
<metal:content define-slot="content">Content</metal:content>
</div>
</div>
<div id="sub-section">
<tal:portlet repeat="macro view/actions/portlet_right">
<metal:portlet use-macro="macro" />
</tal:portlet>
</div>
<div id="footer" class="footer">
<metal:footer define-slot="footer">
Powered by <b><a href="http://www.python.org">Python</a></b> &middot;
<b><a href="http://wiki.zope.org/zope3">Zope</a></b>.
</metal:footer>
</div>
</div>
</body>
</html>
</metal:main>
<metal:content define-macro="content">
Dummy Content
</metal:content>

91
view/browser/view.py Normal file
View file

@ -0,0 +1,91 @@
#
# Copyright (c) 2010 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
#
"""
Base classes for views.
$Id$
"""
import os
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from zope import component
generic_page = ViewPageTemplateFile('generic.pt')
view_macros = ViewPageTemplateFile(os.path.join('liquid', 'view_macros.pt'))
class BaseView(object):
index = generic_page
default_template = view_macros # specify in subclass
resource_prefix = '/@@/'
def __call__(self):
return self.index(self)
def update(self):
return True
def mainMacro(self):
return view_macros.macros['main']
#@rcache
def defaultMacros(self):
return self.default_template.macros
def contentMacro(self):
return self.defaultMacros()[getattr(self, 'content_renderer', 'content')]
#@rcache
def homeURL(self):
return '/'
@Lazy
def resources(self):
return {'base.css': '%sbase.css' % self.resource_prefix}
@Lazy
def actions(self):
return dict(top=[], portlet_left=[], portlet_right=[])
# generic views for use with generic persistent objects with type-based adapters
# (not used at the moment - obsolete?)
class GenericView(BaseView):
name = 'index_html'
@Lazy
def object(self):
return self.context.typeInterface(self.context)
@Lazy
def objectView(self):
return component.getMultiAdapter((self.object, self.request), name=self.name)
def __call__(self):
return self.objectView()
class GenericAddForm(GenericView):
name = 'create.html'

View file

@ -59,4 +59,9 @@
</metal:content>
<metal:portlet define-macro="navigation">
<p>Menu</p>
</metal:portlet>
</html>

View file

@ -34,6 +34,12 @@ class WikiBaseView(object):
default_template = ViewPageTemplateFile('default.pt')
@Lazy
def actions(self):
return dict(top=[],
portlet_left=[self.default_template.macros['navigation']],
portlet_right=[])
class WikiManagerView(WikiBaseView):

View file

@ -8,3 +8,13 @@ Supporting the Zope2 Environment for Zope3/ZTK-based Applications
>>> from zope.publisher.browser import TestRequest
Views
=====
>>> from zope.traversing.adapters import DefaultTraversable
>>> component.provideAdapter(DefaultTraversable, (object,))
>>> from cybertools.z2.browser.view import BaseView
>>> view = BaseView(object(), TestRequest())
>>> html = view()

View file

@ -1,14 +0,0 @@
<tal:show condition="view/update">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"
metal:use-macro="view/getMainMacro">
<body>
<div metal:fill-slot="content">
<metal:content use-macro="view/getContentMacro" />
</div>
</body>
</html>
</tal:show>

View file

@ -22,51 +22,23 @@ Base classes for views.
$Id$
"""
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from zope import component
from Products.Five import BrowserView
#from Products.Five.browser.pagetemplatefile import PageTemplateFile
from cybertools.view.browser.view import BaseView, GenericView
generic_page = ViewPageTemplateFile('generic.pt')
view_macros = ViewPageTemplateFile('view_macros.pt')
class BaseView(BrowserView, BaseView):
class BaseView(BrowserView):
index = generic_page
default_template = None # specify in subclass
def __call__(self):
return self.index(self)
def getMainMacro(self):
return view_macros.macros['main']
def getDefaultTemplate(self):
return self.default_template
def getContentMacro(self):
return self.getDefaultTemplate().macros[self.content_renderer]
resource_prefix = '/++resource++'
# generic views for use with generic persistent objects with type-based adapters
# (not used at the moment - obsolete?)
class GenericView(BaseView):
name = 'index_html'
@Lazy
def object(self):
return self.context.typeInterface(self.context)
@Lazy
def objectView(self):
return component.getMultiAdapter((self.object, self.request), name=self.name)
class GenericView(BaseView, GenericView):
def __call__(self):
return self.objectView()
return GenericView.__call__(self)
class GenericAddForm(GenericView):

View file

@ -1,24 +0,0 @@
<metal:main define-macro="main">
<html>
<head>
</head>
<body>
<div>
<h1>Top Bar</h1>
</div>
<div>
<metal:content define-slot="content">Content</metal:content>
</div>
<div>
<p>Footer</p>
</div>
</body>
</html>
</metal:main>

View file

@ -9,15 +9,24 @@ $Id$
import unittest, doctest
from zope.testing.doctestunit import DocFileSuite
try:
from Products.Five import BrowserView
ignore = False
except ImportError:
BrowserView = None
ignore = True
class Test(unittest.TestCase):
"Basic tests for the wiki package."
"Basic tests for the z2 package."
def testBasicStuff(self):
pass
def test_suite():
if ignore:
return unittest.TestSuite(())
flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
return unittest.TestSuite((
unittest.makeSuite(Test),