[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