Plone学习6——plone training 26 Exercise
Eercise要求与提示
1,创建一个可/@@demo_content在新文件中调用的新BrowserViewdemo.py
2,该视图应在每次调用时创建5个会话
3,使用https://docs.plone.org/develop/plone.api/docs/content.html#create-content上的文档了解如何创建新的会话。
4,使用plone.api.content.transition发布的所有新一轮会谈。找到该方法的文档。
5,只有管理员才能使用该视图(该权限称为cmf.ManagePortal)。
6,调用视图后重新加载首页。
7,显示有关结果的消息(https://docs.plone.org/develop/plone.api/docs/portal.html#show-notification-message)。
8,如需额外积分,请使用图书馆请求和http://www.icndb.com/api/通过笑话填充会谈。
9,使用实用程序方法cropText从Producs.CMFPlone.browser.ploneview.Plone20个字符后裁剪标题。
官方实现
- 在browser/configure.zcml内添加以下代码
<browser:page
name="demo_content"
for="*"
class="ploneconf.site.browser.demo.DemoContent"
permission="cmf.ManagePortal"
/>
新增了一个page,name为demo_content,可以用@@demo_content访问该page,该page被访问的时候会触发ploneconf.site.browser.demo.DemoContent的__call__()方法,后面会谈到。
- 然后在browser/demo.py里添加以下内容
# -*- coding: utf-8 -*-
from Products.Five import BrowserView
from plone import api
from plone.protect.interfaces import IDisableCSRFProtection
from zope.interface import alsoProvides
import json
import logging
import requests
logger = logging.getLogger(__name__)
class DemoContent(BrowserView):
def __call__(self):
portal = api.portal.get()
self.create_talks(portal)
return self.request.response.redirect(portal.absolute_url())
def create_talks(self, container, amount=5):
"""Create some talks"""
alsoProvides(self.request, IDisableCSRFProtection)
plone_view = api.content.get_view('plone', self.context, self.request)
jokes = self.random_jokes(amount)
for data in jokes:
joke = data['joke']
talk = api.content.create(
container=container,
type='talk',
title=plone_view.cropText(joke, length=20),
description=joke,
type_of_talk='Talk',
)
api.content.transition(talk, to_state='published')
logger.info(u'Created talk {0}'.format(talk.absolute_url()))
api.portal.show_message(
u'Created {0} talks!'.format(amount), self.request)
def random_jokes(self, amount):
jokes = requests.get(
'http://api.icndb.com/jokes/random/{0}'.format(amount))
return json.loads(jokes.text)['value']
这份代码有几个点值得讲:
- 首先是__call__()方法会在page被访问时调用
- 在用api.content.create()方法创建talks时,需要传入一个container,这个来自于__call__()里的portal = api.portal.get()
- 由于是GET方法访问该page,所以需要alsoProvides(self.request, IDisableCSRFProtection)来防止跨域攻击
- api.content.transition(talk, to_state=‘published’)用这行代码可以把创建的talk的发布状态改为published
访问/Plone/@@demo_content,即可成功创建5个talk,在/Plone/talklistview页面可以看到创建好的talk的list