from twisted.application import service, strports
from nevow import appserver, loaders, rend, static, url
import forms 

class NewsEditPage(forms.ResourceMixin, rend.Page):
    docFactory = loaders.xmlstr("""
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:n="http://nevow.com/ns/nevow/0.1">
    <head>
        <title>Example 1: A News Item Editor</title>
        <link rel="stylesheet" href="form_css" type="text/css" />
    </head>
    <body>
        <h1>Example 1: A News Item Editor</h1>
        <n:invisible n:render="form saveNewsItem" />
        
        <ol n:render="sequence" n:data="newsItems">
            <li n:pattern="item" n:render="mapping">
                <strong><n:slot name="title" /></strong>: <n:slot name="description" />
            </li>
        </ol>
    </body>
</html>
""")

    child_form_css = forms.defaultCSS

    def __init__(self, *args, **kwargs):
        self.store = kwargs.pop('store')
        super(NewsEditPage, self).__init__(*args, **kwargs)
    
    def saveNewsItem(self, ctx, form, newsItemData):
        self.store.append(newsItemData)
        return url.here.click('confirmation')

    def form_saveNewsItem(self, ctx):
        form = forms.Form()
        form.addField('title', forms.String(required=True))
        form.addField('description', forms.String(required=True), forms.widgetFactory(forms.TextArea))
        form.addAction(self.saveNewsItem)
        return form
        
    def data_newsItems(self, ctx, name):
        return self.store

class ConfirmationPage(rend.Page):
    docFactory = loaders.xmlstr("""
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <body>
        <h1>Your item has been saved</h1>
        <ul>
            <li><a href="./">Go back</a></li>
        </ul>
    </body>
</html>
""")

# A place to store news items. A list of dicts in this simple case.
store = [dict(title="Lorum Ipsum", description="""
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed sed enim mollis 
nulla faucibus aliquet. Praesent nec nibh. Nam eget pede. Nam tincidunt purus id 
lorem. Vestibulum lectus nisl, molestie vitae, feugiat egestas, sodales et, 
tellus. Vivamus eu libero. Nulla facilisi. Nullam nec dolor. Proin ac diam at 
neque auctor pulvinar. Maecenas eros nibh, fermentum at, eleifend at, malesuada 
eu, nunc. Sed posuere felis eu ipsum. In volutpat. Phasellus viverra. Quisque 
dignissim mattis turpis. Maecenas accumsan ipsum vel orci. Cras ac lectus. Sed 
nec nisl. Integer iaculis elit scelerisque sapien. Curabitur ac diam.
""")]

rootResource = NewsEditPage(store=store)
rootResource.putChild('confirmation', ConfirmationPage())

application = service.Application("News item editor")
strports.service("8080", appserver.NevowSite(rootResource)).setServiceParent(application)
jethro@divmod.org