[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">
+  &nbsp;
+  </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