[Checkins] SVN: Sandbox/cklinger/example/trunk/src/example/ More examples
Christian Klinger
cklinger at novareto.de
Thu Feb 5 10:42:53 EST 2009
Log message for revision 96136:
More examples
Changed:
U Sandbox/cklinger/example/trunk/src/example/app.py
U Sandbox/cklinger/example/trunk/src/example/app_templates/index.pt
U Sandbox/cklinger/example/trunk/src/example/message/forms.py
A Sandbox/cklinger/example/trunk/src/example/message/otherlayout.pt
A Sandbox/cklinger/example/trunk/src/example/questionnaire/
A Sandbox/cklinger/example/trunk/src/example/questionnaire/__init__.py
A Sandbox/cklinger/example/trunk/src/example/questionnaire/formatter.py
A Sandbox/cklinger/example/trunk/src/example/questionnaire/forms.py
A Sandbox/cklinger/example/trunk/src/example/questionnaire/forms_templates/
A Sandbox/cklinger/example/trunk/src/example/questionnaire/forms_templates/questionnaireresults.pt
A Sandbox/cklinger/example/trunk/src/example/questionnaire/interfaces.py
A Sandbox/cklinger/example/trunk/src/example/questionnaire/questionnaire.py
A Sandbox/cklinger/example/trunk/src/example/questionnaire/table_sorted_header.pt
-=-
Modified: Sandbox/cklinger/example/trunk/src/example/app.py
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/app.py 2009-02-05 15:35:12 UTC (rev 96135)
+++ Sandbox/cklinger/example/trunk/src/example/app.py 2009-02-05 15:42:52 UTC (rev 96136)
@@ -32,8 +32,10 @@
class Start(megrok.pagelet.Pagelet):
""" This is a simple Pagelet which is renderd in the Layout Template"""
grok.context(Example)
- grok.layer(MySkin)
+# grok.layer(MySkin)
def render(self):
return "<p> This is the render method of the <b> Start </b> class </p>"
-
+
+
+
Modified: Sandbox/cklinger/example/trunk/src/example/app_templates/index.pt
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/app_templates/index.pt 2009-02-05 15:35:12 UTC (rev 96135)
+++ Sandbox/cklinger/example/trunk/src/example/app_templates/index.pt 2009-02-05 15:42:52 UTC (rev 96136)
@@ -7,5 +7,13 @@
<p>Your Grok application is up and running.
Edit <code>example/app_templates/index.pt</code> to change
this page.</p>
+
+ <ul>
+ <li> <a href="start"> A simple Pagelet with a layout </a> </li>
+ <li> <a href="helloworldaddform"> A simple megrok.z3cform example with a layout </a> </li>
+ <li> <a href="questionnaireaddform"> A other form with a differnt layout </a> </li>
+ </ul>
+
+
</body>
</html>
Modified: Sandbox/cklinger/example/trunk/src/example/message/forms.py
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/message/forms.py 2009-02-05 15:35:12 UTC (rev 96135)
+++ Sandbox/cklinger/example/trunk/src/example/message/forms.py 2009-02-05 15:42:52 UTC (rev 96136)
@@ -8,12 +8,11 @@
from megrok.z3cform import AddForm, EditForm, DisplayForm
from example.app import MySkin
from example.app import Example
+from zope.interface import Interface
+import megrok.pagelet
grok.layer(MySkin)
-DefaultDate = widget.ComputedWidgetAttribute(
- lambda adapter: datetime.date.today(),
- field=interfaces.IHelloWorld['when'], view=IAddForm)
class HelloWorldAddForm(AddForm):
""" A sample add form."""
@@ -53,3 +52,7 @@
grok.name('index')
fields = field.Fields(interfaces.IHelloWorld)
+
+class NewLayout(megrok.pagelet.LayoutView):
+ grok.context(message.HelloWorld)
+ megrok.pagelet.template('otherlayout.pt')
Added: Sandbox/cklinger/example/trunk/src/example/message/otherlayout.pt
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/message/otherlayout.pt (rev 0)
+++ Sandbox/cklinger/example/trunk/src/example/message/otherlayout.pt 2009-02-05 15:42:52 UTC (rev 96136)
@@ -0,0 +1,33 @@
+<!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>EXAMPLE</title>
+ <style type="text/css">
+ <!--
+ * {
+ margin: 0;
+ padding: 0;
+ }
+ body {
+ padding: 1em;
+ }
+ #content{
+ border: 5px solid #999;
+ padding: 1em;
+ background: #aaa;
+ }
+ -->
+ </style>
+ </head>
+ <body>
+ <h1>EXAMPLE</h1>
+
+ <!-- Die Magie findet in der naechsten Zeile statt! -->
+ <div id="content"
+ tal:content="structure view/render">Page Content</div>
+
+ <i>Example Tutorial Application</i>
+ </body>
+</html>
+
Added: Sandbox/cklinger/example/trunk/src/example/questionnaire/__init__.py
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/questionnaire/__init__.py (rev 0)
+++ Sandbox/cklinger/example/trunk/src/example/questionnaire/__init__.py 2009-02-05 15:42:52 UTC (rev 96136)
@@ -0,0 +1 @@
+# Make me a package
Added: Sandbox/cklinger/example/trunk/src/example/questionnaire/formatter.py
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/questionnaire/formatter.py (rev 0)
+++ Sandbox/cklinger/example/trunk/src/example/questionnaire/formatter.py 2009-02-05 15:42:52 UTC (rev 96136)
@@ -0,0 +1,113 @@
+from xml.sax.saxutils import quoteattr
+from zope.app.pagetemplate import ViewPageTemplateFile
+from zope.session.interfaces import ISession
+from zc.table import table, column, interfaces
+
+
+class ListFormatter(table.SortingFormatterMixin, table.AlternatingRowFormatter):
+ """Provides a width for each column."""
+
+ sortedHeaderTemplate = ViewPageTemplateFile('table_sorted_header.pt')
+
+ sortKey = 'formdemo.table.sort-on'
+ widths = None
+ columnCSS = None
+
+ def __init__(self, *args, **kw):
+ # Figure out sorting situation
+ kw['ignore_request'] = True
+ request = args[1]
+ prefix = kw.get('prefix')
+ session = ISession(request)[self.sortKey]
+ if 'sort-on' in request:
+ name = request['sort-on']
+ if prefix and name.startswith(prefix):
+ name = name[len(prefix):]
+ oldName, oldReverse = session.get(prefix, (None, None))
+ if oldName == name:
+ session[prefix] = (name, not oldReverse)
+ else:
+ session[prefix] = (name, False)
+ # Now get the sort-on data from the session
+ if prefix in session:
+ kw['sort_on'] = [session[prefix]]
+
+ super(ListFormatter, self).__init__(*args, **kw)
+ self.columnCSS = {}
+
+ self.sortOn = (None, None)
+ if 'sort_on' in kw:
+ for name, reverse in kw['sort_on']:
+ self.columnCSS[name] = 'sorted-on'
+ self.sortOn = kw['sort_on'][0]
+
+ def getHeader(self, column):
+ contents = column.renderHeader(self)
+ if (interfaces.ISortableColumn.providedBy(column)):
+ contents = self._wrapInSortUI(contents, column)
+ return contents
+
+ def _wrapInSortUI(self, header, column):
+ name = column.name
+ if self.prefix:
+ name = self.prefix + name
+ isSortedOn = self.sortOn[0] == column.name
+ isAscending = self.sortOn[0] == column.name and not self.sortOn[1]
+ isDecending = self.sortOn[0] == column.name and self.sortOn[1]
+ return self.sortedHeaderTemplate(
+ header=header, name=name, isSortedOn=isSortedOn,
+ isAscending=isAscending, isDecending=isDecending)
+
+ def renderContents(self):
+ """Avoid to render empty table (tr) rows."""
+ rows = self.renderRows()
+ if not rows:
+ return ' <thead%s>\n%s </thead>\n' % (
+ self._getCSSClass('thead'), self.renderHeaderRow())
+ else:
+ return ' <thead%s>\n%s </thead>\n <tbody>\n%s </tbody>\n' % (
+ self._getCSSClass('thead'), self.renderHeaderRow(),
+ rows)
+
+ def renderHeader(self, column):
+ width = ''
+ if self.widths:
+ idx = list(self.visible_columns).index(column)
+ width = ' width="%i"' %self.widths[idx]
+ klass = self.cssClasses.get('tr', '')
+ if column.name in self.columnCSS:
+ klass += klass and ' ' or '' + self.columnCSS[column.name]
+ return ' <th%s class=%s>\n %s\n </th>\n' % (
+ width, quoteattr(klass), self.getHeader(column))
+
+
+ def renderCell(self, item, column):
+ klass = self.cssClasses.get('tr', '')
+ if column.name in self.columnCSS:
+ klass += klass and ' ' or '' + self.columnCSS[column.name]
+ return ' <td class=%s>\n %s\n </td>\n' % (
+ quoteattr(klass), self.getCell(item, column))
+
+ def renderExtra(self):
+ """Avoid use of resourcelibrary in original class."""
+ return ''
+
+
+class SelectedItemFormatter(ListFormatter):
+
+ selectedItem = None
+
+ def renderRow(self, item):
+ self.row += 1
+ klass = self.cssClasses.get('tr', '')
+ if klass:
+ klass += ' '
+ if item == self.selectedItem:
+ klass += 'selected'
+ else:
+ klass += self.row_classes[self.row % 2]
+
+ return ' <tr class=%s>\n%s </tr>\n' % (
+ quoteattr(klass), self.renderCells(item))
+
+
Added: Sandbox/cklinger/example/trunk/src/example/questionnaire/forms.py
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/questionnaire/forms.py (rev 0)
+++ Sandbox/cklinger/example/trunk/src/example/questionnaire/forms.py 2009-02-05 15:42:52 UTC (rev 96136)
@@ -0,0 +1,125 @@
+import grok
+import zope.interface
+from z3c.form import button, field, form, group, widget
+import interfaces
+import questionnaire
+import megrok.z3cform
+from example.app import Example, MySkin
+
+
+##table
+from zc.table import column
+from zope.traversing.browser import absoluteURL
+import formatter
+
+grok.layer(MySkin)
+
+class IQuestionnaireGroup(zope.interface.Interface):
+ """Questionnaire Group"""
+
+class IQuestionnairePage(zope.interface.Interface):
+ """Questionnaire Page"""
+
+
+class DevelopmentExperienceGroup(group.Group):
+ zope.interface.implements(IQuestionnaireGroup)
+ label = u'Development Experience'
+ fields = field.Fields(interfaces.IQuestionnaire).select(
+ 'zope2', 'plone', 'zope3', 'five')
+
+
+class ContributorExperienceGroup(group.Group):
+ zope.interface.implements(IQuestionnaireGroup)
+ label = u'Contributor Experience'
+ fields = field.Fields(interfaces.IQuestionnaire).select(
+ 'contributor', 'years', 'zopeId')
+
+
+
+class QuestionnaireAddForm( group.GroupForm, megrok.z3cform.AddForm ):
+ #grok.name('quadd')
+ grok.context(Example)
+ zope.interface.implements(IQuestionnairePage)
+
+ label = u'Zope Developer Questionnaire'
+ fields = field.Fields(interfaces.IQuestionnaire).select('name', 'age')
+ groups = (DevelopmentExperienceGroup, ContributorExperienceGroup)
+
+ def create(self, data):
+ return questionnaire.Questionnaire(**data)
+
+ def add(self, object):
+ count = 0
+ while 'questionnaire-%i' %count in self.context:
+ count += 1;
+ self._name = 'questionnaire-%i' %count
+ self.context[self._name] = object
+ return object
+
+ def nextURL(self):
+ url = absoluteURL(self.context, self.request)
+ return url + '/quResults'
+
+
+class DataColumn(column.SortingColumn):
+
+ def __init__(self, field):
+ super(DataColumn, self).__init__(field.title, field.__name__)
+
+ def renderCell(self, item, formatter):
+ return item.widgets[self.name].render()
+
+ def getSortKey(self, item, formatter):
+ return item.widgets[self.name].value
+
+
+class QuestionnaireRow(form.DisplayForm):
+ fields = field.Fields(interfaces.IQuestionnaire)
+
+
+
+class QuestionnaireResults(megrok.pagelet.Pagelet):
+ grok.context(Example)
+ grok.name('quResults')
+ zope.interface.implements(IQuestionnairePage)
+
+ rowFields = field.Fields(interfaces.IQuestionnaire)
+
+ def getContent(self):
+ return [obj for obj in self.context.values()
+ if interfaces.IQuestionnaire.providedBy(obj)]
+
+ def update(self):
+ super(QuestionnaireResults, self).update()
+
+ rows = []
+ for questionnaire in self.getContent():
+ row = QuestionnaireRow(questionnaire, self.request)
+ row.update()
+ rows.append(row)
+
+ columns = [DataColumn(field.field)
+ for field in self.rowFields.values()]
+
+ self.table = formatter.ListFormatter(
+ self.context, self.request, rows,
+ prefix = 'formdemo.questionnaire.', columns=columns,
+ sort_on=[('name', False)])
+ self.table.widths = (160, 45, 65, 55, 65, 50, 70, 55, 100)
+ for col in ('age', 'zope2', 'plone', 'zope3', 'five',
+ 'contributor', 'years', 'zopeId'):
+ self.table.columnCSS[col] = 'right'
+ self.table.sortKey = 'formdemo.questionnaire.sort-on'
+
+
+# def render(self):
+# return """
+# <h1>Zope Developer Questionnaire Results</h1>
+#
+# <div tal:replace="structure view/table" />
+# <span tal:content="view"/> FUCKing heLL
+# <div class="actions">
+# <a href="questionnaireaddform">[Fill out Questionnaire]</a>
+# </div>
+# """
+
Added: Sandbox/cklinger/example/trunk/src/example/questionnaire/forms_templates/questionnaireresults.pt
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/questionnaire/forms_templates/questionnaireresults.pt (rev 0)
+++ Sandbox/cklinger/example/trunk/src/example/questionnaire/forms_templates/questionnaireresults.pt 2009-02-05 15:42:52 UTC (rev 96136)
@@ -0,0 +1,8 @@
+<h1>Zope Developer Questionnaire Results</h1>
+
+<div tal:replace="structure view/table" />
+
+<div class="actions">
+ <a href="addQuestionnaire.html">[Fill out Questionnaire]</a>
+ </div>
+
Added: Sandbox/cklinger/example/trunk/src/example/questionnaire/interfaces.py
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/questionnaire/interfaces.py (rev 0)
+++ Sandbox/cklinger/example/trunk/src/example/questionnaire/interfaces.py 2009-02-05 15:42:52 UTC (rev 96136)
@@ -0,0 +1,52 @@
+import zope.interface
+import zope.schema
+
+class IQuestionnaire(zope.interface.Interface):
+ """A questionaire about Zope users."""
+
+ name = zope.schema.TextLine(
+ title=u'Name',
+ description=u'Name of the person.',
+ required=True)
+
+ age = zope.schema.Int(
+ title=u'Age',
+ description=u'The age of the person.',
+ required=True)
+
+ zope2 = zope.schema.Bool(
+ title=u'Zope 2',
+ description=u'Have you ever developed with Zope 2?',
+ required=True)
+
+ plone = zope.schema.Bool(
+ title=u'Plone',
+ description=u'Have you ever developed with Plone?',
+ required=True)
+
+ zope3 = zope.schema.Bool(
+ title=u'Zope 3',
+ description=u'Have you ever developed with Zope 3?',
+ required=True)
+
+ five = zope.schema.Bool(
+ title=u'Five',
+ description=u'Have you ever developed with Five?',
+ required=True)
+
+ contributor = zope.schema.Bool(
+ title=u'Contrib.',
+ description=u'Are you a Zope contributor?',
+ required=True)
+
+ years = zope.schema.Int(
+ title=u'Years',
+ description=u'How many years have you contributed?',
+ default=0,
+ required=False)
+
+ zopeId = zope.schema.TextLine(
+ title=u'Zope Id',
+ description=u'What is your Zope Id?',
+ required=False)
+
Added: Sandbox/cklinger/example/trunk/src/example/questionnaire/questionnaire.py
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/questionnaire/questionnaire.py (rev 0)
+++ Sandbox/cklinger/example/trunk/src/example/questionnaire/questionnaire.py 2009-02-05 15:42:52 UTC (rev 96136)
@@ -0,0 +1,24 @@
+import grok
+import persistent
+import zope.interface
+from zope.location import location
+from zope.schema.fieldproperty import FieldProperty
+import interfaces
+
+class Questionnaire(grok.Model):
+ zope.interface.implements(interfaces.IQuestionnaire)
+
+ name = FieldProperty(interfaces.IQuestionnaire['name'])
+ age = FieldProperty(interfaces.IQuestionnaire['age'])
+ zope2 = FieldProperty(interfaces.IQuestionnaire['zope2'])
+ plone = FieldProperty(interfaces.IQuestionnaire['plone'])
+ zope3 = FieldProperty(interfaces.IQuestionnaire['zope3'])
+ five = FieldProperty(interfaces.IQuestionnaire['five'])
+ contributor = FieldProperty(interfaces.IQuestionnaire['contributor'])
+ years = FieldProperty(interfaces.IQuestionnaire['years'])
+ zopeId = FieldProperty(interfaces.IQuestionnaire['zopeId'])
+
+ def __init__(self, **kw):
+ for name, value in kw.items():
+ setattr(self, name, value)
+
Added: Sandbox/cklinger/example/trunk/src/example/questionnaire/table_sorted_header.pt
===================================================================
--- Sandbox/cklinger/example/trunk/src/example/questionnaire/table_sorted_header.pt (rev 0)
+++ Sandbox/cklinger/example/trunk/src/example/questionnaire/table_sorted_header.pt 2009-02-05 15:42:52 UTC (rev 96136)
@@ -0,0 +1,19 @@
+<html tal:omit-tag="">
+ <a href=""
+ tal:attributes="href string:${request/URL}?sort-on=${options/name}"
+ tal:content="options/header" />
+ <span tal:condition="options/isSortedOn">
+
+ </span>
+<!-- <img src="" width="7" height="4" style="vertical-align: middle"
+ alt="sort ascending"
+ tal:condition="options/isAscending"
+ tal:attributes="src
+ context/++resource++SpreadsheetImages/ascending.gif" />
+ <img src="" width="7" height="4" style="vertical-align: middle"
+ alt="sort ascending"
+ tal:condition="options/isDecending"
+ tal:attributes="src
+ context/++resource++SpreadsheetImages/decending.gif" />-->
+</html>
+
More information about the Checkins
mailing list