[Checkins] SVN: grok/trunk/grokblog/s Extend grok blog so it actually does something. bin/buildout needs

Martijn Faassen faassen at infrae.com
Fri Nov 10 17:36:21 EST 2006


Log message for revision 71106:
  Extend grok blog so it actually does something. bin/buildout needs
  to run again as it now needs docutils as we now got ReST support.
  
  For extra features, try the year, month and day views:
  
  grokblog/2006
  grokblog/2006/11
  grokblog/2006/11/10
  

Changed:
  U   grok/trunk/grokblog/setup.py
  U   grok/trunk/grokblog/src/grokblog/blog.py
  A   grok/trunk/grokblog/src/grokblog/blog_templates/
  A   grok/trunk/grokblog/src/grokblog/blog_templates/addentry.pt
  A   grok/trunk/grokblog/src/grokblog/blog_templates/blogindex.pt
  A   grok/trunk/grokblog/src/grokblog/blog_templates/dateindex.pt
  A   grok/trunk/grokblog/src/grokblog/blog_templates/entryedit.pt
  A   grok/trunk/grokblog/src/grokblog/blog_templates/entryindex.pt
  A   grok/trunk/grokblog/src/grokblog/blog_templates/entryitem.pt

-=-
Modified: grok/trunk/grokblog/setup.py
===================================================================
--- grok/trunk/grokblog/setup.py	2006-11-10 19:49:08 UTC (rev 71105)
+++ grok/trunk/grokblog/setup.py	2006-11-10 22:36:20 UTC (rev 71106)
@@ -15,6 +15,9 @@
     zip_safe=False,
     license='ZPL',
 
-    install_requires=['setuptools',
-                     ],
+    install_requires=[
+        'grok',
+        'docutils',
+        'setuptools',
+        ],
 )

Modified: grok/trunk/grokblog/src/grokblog/blog.py
===================================================================
--- grok/trunk/grokblog/src/grokblog/blog.py	2006-11-10 19:49:08 UTC (rev 71105)
+++ grok/trunk/grokblog/src/grokblog/blog.py	2006-11-10 22:36:20 UTC (rev 71106)
@@ -1,4 +1,6 @@
+import random
 from datetime import datetime, timedelta
+from docutils.core import publish_parts
 import grok
 
 from zope import interface, schema
@@ -14,25 +16,27 @@
         except ValueError:
             return None
         return Year(year)
-    
+
 class Entries(grok.Container):
     pass
 
 class IEntry(interface.Interface):
+    published = schema.Datetime(title=u'Published')
     title = schema.TextLine(title=u'Title')
-    published = schema.Datetime(title=u'Published')
-    
+    body = schema.Text(title=u'Body')
+
 class Entry(grok.Model):
     interface.implements(IEntry)
 
-    def __init__(self, title):
+    def __init__(self, title, body):
         self.title = title
         self.published = datetime.now()
+        self.body = body
 
 class Year(grok.Model):
     def __init__(self, year):
         self.year = year
-        
+
     def traverse(self, name):
         try:
             month = int(name)
@@ -42,11 +46,21 @@
             return None
         return Month(self.year, month)
 
+class YearIndex(grok.View):
+    grok.name('index')
+    grok.context(Year)
+    grok.template('dateindex')
+
+    def entries(self):
+        from_ = datetime(self.context.year, 1, 1)
+        until = datetime(self.context.year + 1, 1, 1)
+        return entriesInDateRange(from_, until)
+
 class Month(grok.Model):
     def __init__(self, year, month):
         self.year = year
         self.month = month
-        
+
     def traverse(self, name):
         try:
             day = int(name)
@@ -55,6 +69,23 @@
         # XXX should check whether day is acceptable
         return Day(self.year, self.month, day)
 
+class MonthIndex(grok.View):
+    grok.name('index')
+    grok.context(Month)
+    grok.template('dateindex')
+
+    def entries(self):
+        from_ = datetime(self.context.year,
+                         self.context.month,
+                         1)
+        month = self.context.month + 1
+        year = self.context.year
+        if month > 12:
+            month = 1
+            year += 1
+        until = datetime(year, month, 1)
+        return entriesInDateRange(from_, until)
+
 class Day(grok.Model):
     def __init__(self, year, month, day):
         self.year = year
@@ -64,59 +95,109 @@
 class DayIndex(grok.View):
     grok.name('index')
     grok.context(Day)
-    
-    def render(self):
+    grok.template('dateindex')
+
+    def entries(self):
         from_ = datetime(self.context.year,
                          self.context.month,
                          self.context.day)
         until = from_ + timedelta(days=1)
-        entries = entriesInDateRange(from_, until)
-        return "Entries: %s" % ' '.join([entry.__name__ for entry in entries])
+        return entriesInDateRange(from_, until)
 
 def entriesInDateRange(from_, until):
     entries = grok.getSite()['entries']
+    result = []
     for entry in entries.values():
         if from_ <= entry.published <= until:
-            yield entry
-       
+            result.append(entry)
+    return sorted(
+        result, key=lambda entry: entry.published, reverse=True
+        )
+
+def lastEntries(amount):
+    entries = grok.getSite()['entries'].values()
+    return sorted(
+        entries, key=lambda entry: entry.published, reverse=True
+        )[:amount]
+
 class BlogIndex(grok.View):
     grok.context(Blog)
     grok.name('index')
 
-blogindex = grok.PageTemplate('''\
-<html>
-<body>
-<form tal:attributes="action python:view.url('add_entry')" method="POST">
-id: <input type="text" name="id" value="" /><br />
-title: <input type="text" name="title" value="" /><br />
-<input type="submit" value="Add Entry" />
-</form>
-</body>
-</html>
-''')
+    def entries(self):
+        return lastEntries(10)
 
+    def renderEntry(self, entry):
+        return renderRest(entry.body)
+
 class AddEntry(grok.View):
     grok.context(Blog)
-    grok.name('add_entry')
+    grok.name('add')
 
-    def render(self):
+    def before(self):
         id = self.request.form.get('id')
+        if not id:
+            return
         title = self.request.form.get('title', '')
-        if id:
-            self.context['entries'][id] = Entry(title)
+        body = self.request.form.get('body', '')
+        self.context['entries'][id] = Entry(title, body)
         self.redirect(self.url(self.context))
-        
+
 class EntriesIndex(grok.View):
     grok.context(Entries)
     grok.name('index')
 
     def render(self):
         return "Entries: %s" % ' '.join(self.context.keys())
-    
+
+rest_settings = {'file_insertion_enabled': False}
+
+def renderRest(source):
+    return publish_parts(
+        source, writer_name='html', settings_overrides=rest_settings
+        )['html_body']
+
 class EntryIndex(grok.View):
     grok.context(IEntry)
     grok.name('index')
 
+    def before(self):
+        self.body = renderRest(self.context.body)
+
+class EntryEdit(grok.View):
+    grok.context(IEntry)
+    grok.name('edit')
+
+    def before(self):
+        title = self.request.form.get('title', '')
+        if not title:
+            return
+        body = self.request.form.get('body', '')
+        self.context.title = title
+        self.context.body = body
+        self.redirect(self.url(self.context))
+
+class EntryBody(grok.View):
+    grok.context(IEntry)
+    grok.name('body')
+
     def render(self):
-        return "Title: %s" % self.context.title
-    
+        return renderRest(self.context.body)
+
+class EntryItem(grok.View):
+    grok.context(IEntry)
+    grok.name('item')
+
+class EntryRandomDate(grok.View):
+    grok.context(IEntry)
+    grok.name('random_date')
+
+    def render(self):
+        self.context.published = datetime(
+            2006,
+            11,
+            random.randrange(1, 29),
+            random.randrange(0, 24),
+            random.randrange(0, 60),
+            )
+        return str(self.context.published)

Added: grok/trunk/grokblog/src/grokblog/blog_templates/addentry.pt
===================================================================
--- grok/trunk/grokblog/src/grokblog/blog_templates/addentry.pt	2006-11-10 19:49:08 UTC (rev 71105)
+++ grok/trunk/grokblog/src/grokblog/blog_templates/addentry.pt	2006-11-10 22:36:20 UTC (rev 71106)
@@ -0,0 +1,15 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+  <head>
+    <title>add entry</title>
+  </head>
+  <body>
+    <h1>add entry</h1>
+    <form tal:attributes="action python:view.url()" method="POST">
+      id: <input type="text" name="id" value="" /><br />
+      title: <input type="text" name="title" value="" /><br />
+      body: <textarea name="body"></textarea><br />
+      <input type="submit" value="Add Entry" />
+    </form>
+  </body>
+</html>

Added: grok/trunk/grokblog/src/grokblog/blog_templates/blogindex.pt
===================================================================
--- grok/trunk/grokblog/src/grokblog/blog_templates/blogindex.pt	2006-11-10 19:49:08 UTC (rev 71105)
+++ grok/trunk/grokblog/src/grokblog/blog_templates/blogindex.pt	2006-11-10 22:36:20 UTC (rev 71106)
@@ -0,0 +1,14 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+  <head>
+    <title>blog title</title>
+  </head>
+  <body>
+    <h1>blog index</h1>
+    <a tal:attributes="href python:view.url('add')">Add Blog Entry</a>
+    <tal:block repeat="entry view/entries">
+      <tal:block content="structure entry/@@item"/>
+    </tal:block>
+
+  </body>
+</html>

Added: grok/trunk/grokblog/src/grokblog/blog_templates/dateindex.pt
===================================================================
--- grok/trunk/grokblog/src/grokblog/blog_templates/dateindex.pt	2006-11-10 19:49:08 UTC (rev 71105)
+++ grok/trunk/grokblog/src/grokblog/blog_templates/dateindex.pt	2006-11-10 22:36:20 UTC (rev 71106)
@@ -0,0 +1,14 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+  <head>
+    <title>blog title</title>
+  </head>
+  <body>
+    <h1>blog index</h1>
+
+    <tal:block repeat="entry view/entries">
+      <tal:block content="structure entry/@@item"/>
+    </tal:block>
+
+  </body>
+</html>

Added: grok/trunk/grokblog/src/grokblog/blog_templates/entryedit.pt
===================================================================
--- grok/trunk/grokblog/src/grokblog/blog_templates/entryedit.pt	2006-11-10 19:49:08 UTC (rev 71105)
+++ grok/trunk/grokblog/src/grokblog/blog_templates/entryedit.pt	2006-11-10 22:36:20 UTC (rev 71106)
@@ -0,0 +1,17 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+  <head>
+    <title>edit entry</title>
+  </head>
+  <body>
+    <h1>edit entry</h1>
+    <form tal:attributes="action python:view.url()" method="POST">
+      title: <input type="text" name="title"
+      tal:attributes="value context/title"
+      /><br />
+      body: <textarea name="body"
+      tal:content="context/body"/><br />
+      <input type="submit" value="Save changes..." />
+    </form>
+  </body>
+</html>

Added: grok/trunk/grokblog/src/grokblog/blog_templates/entryindex.pt
===================================================================
--- grok/trunk/grokblog/src/grokblog/blog_templates/entryindex.pt	2006-11-10 19:49:08 UTC (rev 71105)
+++ grok/trunk/grokblog/src/grokblog/blog_templates/entryindex.pt	2006-11-10 22:36:20 UTC (rev 71106)
@@ -0,0 +1,14 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+  <head>
+    <title tal:content="context/title"/>
+  </head>
+  <body>
+    <h1>
+      <tal:block content="context/title"/>
+      (<span class="published" tal:content="context/published"/>)
+    </h1>
+    <a tal:attributes="href python:view.url('edit')">edit...</a>
+    <p tal:content="structure context/@@body"/>
+  </body>
+</html>

Added: grok/trunk/grokblog/src/grokblog/blog_templates/entryitem.pt
===================================================================
--- grok/trunk/grokblog/src/grokblog/blog_templates/entryitem.pt	2006-11-10 19:49:08 UTC (rev 71105)
+++ grok/trunk/grokblog/src/grokblog/blog_templates/entryitem.pt	2006-11-10 22:36:20 UTC (rev 71106)
@@ -0,0 +1,9 @@
+<div class="entry">
+  <h2>
+    <a tal:attributes="href python:view.url(context)">
+      <tal:block content="context/title"/>
+    </a>
+    (<span class="published" tal:content="context/published"/>)
+  </h2>
+  <p tal:content="structure context/@@body"/>
+</div>
\ No newline at end of file



More information about the Checkins mailing list