一个小型的zope 3包(它也可以与zope 2.10+和zope5一起使用),允许您将评分附加到内容。

contentratings的Python项目详细描述


这个包提供了一个基础设施,用于向zope
内容添加评级。它支持每个内容对象的多个分类分级
,并包括用于显示这些分级的视图。对于plone ratings
支持,请参见"plone.contentratings"。




详细文档
*****************


====

content ratings
==

这是一个由zope 3驱动的简单python包,它允许用户
(包括未验证ed用户)评价内容。它提供了一组
接口、适配器和视图,允许将分级应用于
任何可登录对象。


依赖项:

-btrees
-持久
-zope.annotations
-zope.app.content
-zope.app.testing
-zope.component
-zope.componentvocabulary
-zope.container
-zope.interface
-zope.lifecycleevent
-zope.location
-zope.schema
-zope.tales

所有这些包都包含在zope 2.12+和plone 4.0+中。这个
包是用PLONE4.0-4.3测试的。





在包或产品中使用内容分级
==========br/>

d开始对zope使用它的地方。它可以作为python cheeseshop(pypi)中的一个egg安装。

ed您必须将其标记为
*可注释*。这是因为分级存储包含在内容对象的
注释中。标准的方法是在产品的configure.zcml中添加以下内容:


<;content class=".content.myContentClass">;
<;实现
interface="zope.annotation.interface s.iatTributeAnnotable"
/>;
<;/content>;



评级类别
=====


此软件包提供了定义"评级
类别"的基础结构。"rating category"是一个实现
"iratingcategory"接口的对象,它指定一个"title"、"description"(用于
用户界面)、"view\u name"(如何在
用户界面中呈现和管理分级)、"tales"表达式,这些表达式决定何时可以查看或设置分级(`read\expr`and"write-expr"、一个"order"(用于ui),最后是一个"storage"(创建要存储在注释中的评级api的持久化
实现的工厂)。除了"title"之外,所有这些属性都是可选的,并提供了合理的默认值。任何对象都可以有多个分级类别
应用于每个对象,并用唯一的"名称"注册。




它们分别为标记接口"iuserratable"和"ieditorratable"注册。用于
确定何时应用的tales表达式设计用于处理zope 2 cmf应用程序中包含的对象(主要是为了与使用直接权限
检查的旧版本的"contentratings"向后兼容)。除非他们希望允许所有用户设置并阅读评分,否则其他应用程序将需要使用自定义条件定义类别。


让我们演示如何使用这些类别。我们需要
创建一些内容,并使用标记界面将其标记为:来自zope.container.sample import samplecontainer

>;>;content=samplecontainer()
>;>;来自contentratings.interfaces import iuserratable
>;>;来自zop.Iface import alsoprovides
>;>alsoprovides(content,iuserratable)

>;>>改编。标题
用户评分
>;>>浮动(改编。平均值)
0.0
>;>评分=改编。评分(7.0)
>;>浮动(改编。平均值)
7.0
>;>改编。评分数
1
>;rating=adapted.rate(8.0,"me")
>;>float(adapted.averagerating)
7.5
>;>adapted.numberofratings
2

er
实现:从contentratings导入ieditorratable,ieditorialrating
>>>>>>>接口;也提供(content,ieditorratable)
>>>改编=ieditorialrating(content)
>>改编。标题
u"编辑分级"
>;>>自适应。评级为无

>;>>自适应。评级=6.0
>;>浮动(自适应。评级)
6.0
>;>自适应。评级=8.0
>;>浮动(自适应。评级)
8.0

有关
ieditorialrating api如何工作的详细信息。

让我们现在删除这些标记,以便我们可以检查来自zope的自定义
类别:

>;>>;。接口导入nolongerprovides
>;>>;nolongerprovides(content,iuserratable)
>;>nolongerprovidedes(content,ieditorratable)
>;>iuserratable(content)回溯(最近一次调用最后一次):

类型错误:("无法适应",…)
>;>ieditorialrating(content)回溯(最近一次调用last):

类型错误:("无法适应",…)

让我们先看看zcml方法。要使其正常工作,我们需要启用zcml指令:从zope.configuration导入xmlconfig


>;>;导入contentratings
>;>;context=xmlconfig.file('meta.zcml',contentratings)

上面的自动设置。

现在,我们使用
`contentratings:category`指令::

>;>context=xmlconfig.string("
…<;配置
…xmlns:contentratings="http://namespaces.plone.org/contentratings">;
…<;内容分级:类别
…for="zope.container.sample.samplecontainer"
…title="我的评分类别"
…/>;
…<;/configure>;"",context=context)




这里我们使用了所有类别的默认值。作为
结果,我们注册了一个类别,该类别使用默认的zodb
存储和"iuserrating"api,不限制谁可以获得
和设置分级。我们可以很容易地验证这一点,因为类别是提供由
(默认)存储提供的分级接口的简单适配器:


>;>from contentratings.interfaces import iuserrating
>;>from zope.container.sample import samplecontainer
>>gt;content=samplecontainer()
>;>adapted=iuserrating(content)
>;>iuserrating.providedby(adapted)
true
>;>adapted.context是content
true
>;>;adapted.title
u'my rating category'


注意,由于在配置中未提供名称,
适配器已注册为默认(未命名)适配器。
类别的名称是适配器注册时使用的名称,它存储在类别的名称属性中::

>;>;adapted.name
'

=xmlconfig.string(""
…<;配置
…xmlns:contentratings="http://namespaces.plone.org/contentratings">;
…<;内容分级:类别
…for="zope.container.sample.samplecontainer"
…title="我的其他评分类别"
…name="other"
…/>;
…<;/configure>;"",context=context)
>;>;来自zope.component import getadapter
>;>;adapted=getadapter(content,iuserting,name=u'other')
>;>;adapted.title
u'my other rating category'
>;>;adapted.name
u'other'

如果我们希望以编程方式完成相同的任务,我们可以
直接实例化工厂并将其注册为adpater:

>>>;来自contentratings.category import ratingscategoryfactory
>;category=ratingscategoryfactory(title=u'anot她的标题,"name=u‘another’"
>;>>来自zope。component import provideadapter
>;>provideadapter(category,adapts=(samplecontainer,),provides=i锯齿,
…name=u'another')
>;>;adapted=getadapter(content,iuserting,name=u'another')
>;>;adapted.title
u'another title
>;>;adapted.name
u'another'

这涉及到一些冗余,因为
存储提供的接口必须显式声明,并且必须
提供两次类别名称。否则它们是等价的。


请注意,类别是适配器,对于不同的接口/类,适配器只能在同一名称下注册。通常,对于给定的名称,将选择为最特定接口注册的适配器。


自我,但"分级管理器"::

>;>;改编的"doctest":+ellipsis
<;contentratings.category.ratingcategoryadapter…>;
>;>;来自contentratings.interfaces import iratingmanager
>;>;iratingmanager.provided by(改编的)
true

分级管理器提供存储的api,以及类别的许多属性。它通过检查为类别指定的表达式来保护对
存储的直接访问。
管理器作为类别和
上下文上的多适配器实现,但通常不应直接检索它。
类别适配器负责检索它。经理负责在
内容对象上设置特定于类别的存储。

>;<;contentratings.category.ratingscategoryfactory…>;
>;<;zope…container.sample.samplecontainer…>;
>;>adapted.storage\doctest:+省略号
<;contentratings.storage.userratingstorage…>;
>;>isinstance(adapted.storage,adapted.category.storage)
true

负责安全检查和
填充故事表达式上下文,很可能
应用程序希望替换此组件(本地或特定内容)使用子类提供特定于应用程序的
安全性。

它们在
分级管理器上查找,并可以访问
管理器提供的"iratingmanager"api,as
以及受保护的分级存储api(例如iuserrating)。


`browser/basic.py`(`basicuserratingview`和
`basiceditorialratingview`)中提供了分级视图的可恢复基类。这些视图使用命名词汇表来验证输入,并使用iratingmanager api来确定哪些人可以对内容进行评分,哪些人不能对内容进行评分。软件包配置默认提供几个分级视图:


分级视图(默认):使用1-5个大(25px)星的分级
小(10px)星的分级
使用1-5个小(10px)星的分级
使用3个小(10px)星的分级

这些都是使用css高度自定义的。它们都注册了i锯齿。此外,还有一个"rating\u view"被注册为ieditorialrating



视图负责查找评分词汇表和验证用户输入以及呈现用户界面。
安全性由视图使用的"分级管理器"强制执行,但是
如果视图
想要覆盖表达式检查(例如,向用户显示自己的
分级,但他们看不到其他分级),则该视图可以直接从分级管理器转到存储。创建新视图
(例如非星号评级)非常简单。


提供了一个实用程序,用于以通用方式高效地确定可重用会话
键。这可用于防止匿名用户重复投票
。如果需要,实现自己的
匿名会话跟踪机制的应用程序可以在本地覆盖此实用程序


aggregator视图
---------

还有一些视图可以找到正在查看的内容对象上可用的所有分级类别,并按顺序呈现它们。这些
用于viewlet、portlet、宏或类似的对象。用户评分的
聚合器视图称为"用户评分",编辑评分的
视图称为"编辑评分"。



包括两个存储工厂实现,
它们都使用zodb来存储分级:一个实现
"iuserrating"接口,另一个实现"ieditorialrating"接口。前者用于任何
将由多个用户评级(或投票)的内容。后者存储内容的
单个"编辑"评级,主要存在于
向后兼容性。


可以使用
zcml指令的"存储"属性或评级类别工厂的"存储"参数指定自定义Sotrage工厂(可能从包含的
实现中的一个子类)。r/>
存储不仅是可替换的,它们还可以完全实现用于管理评级的自定义api。尽管这方面的需求可能有限,但您可以创建一个自定义存储api,方法是创建一个用于管理评级的
接口,并让该接口提供
`iratingtype`。有关更多信息,请参见"tests/"中的存储文档。




Why a new rating package
=====




首先,除了tratings,只有在原型内容的plone下才有用。` content ratings最初是一个非常简单的软件包,目的是让开发人员能够方便地为他们的产品和应用程序添加评级。
然而,似乎有很多需求需要最终用户的产品来为现有的内容对象添加评级。

rt表示单个内容对象上的多个分级,这似乎是一种常见的需要。它还(连同'lovely.rating')将
评分系统从视图中分离出来,这种方式对于希望允许用户自定义
评分的产品来说可能是不可取的。要更改这些包以支持这些用例,需要对其进行完全重写。因此,我重写了这些评分包中最简单的
(也是最熟悉的)来支持这些
用例,并且还创建了一个新的包来为plone最终用户集成这个新的
功能(参见'plone.contentratings')。

todo
====

*提供视图定制示例
*使视图与zope 3 auth一起工作引诱
*将kss视图从plone.contentratings导入contentratings(它目前依赖于一些plone kss命令)将kss视图从plone.contentratings导入contentratings(它
>目前依赖于一些plone kss命令)




credits
=





******alec-miltchell**<;apm13@columbia.edu>;




>>
=>












<>(感觉如果您做出了重大贡献,可以在上面自由添加您的名字)


基于操作的分级产品,这是
此实现的起点。

**kai diefenbach**《iqpp.plone.rating》一书的作者,其他图标和用户界面想法都是从该书中窃取的。


*一些图标来自**mark james'**《Silk icon set 1.3》`\br/>
*星级是基于"css star rating redux"通过"iqpp.plone".评级`

…_`使用zope 3开发web组件:http://www.worldfooky.com/
。_`丝绸图标集1.3`:http://www.famfamfam.com/lab/icons/silk/
。_` css星级评定红人榜`:http://komododomedia.com/blog/index.php/2007/01/01/20/css星级评定红人榜/




changlog
===



<1.2.1(2017-03-15)
=
=








<1.1(2013-09-20)



















<*更新以支持Zope2.13an从4.0到4.3,清除
依赖项。



>1.0-最终(2011-08-21)
——


*模板标记修复变色龙兼容性。


*添加了巴斯克语和加泰罗尼亚语翻译。

1.0-rc3(2011-05-12)
——


*优化平均/计数计算
评级的数量。提高最新分级查找的性能。

*修复plone 4.1


1.0-rc2(2010-11-28)
----


*不要在仅查看分级视图中使用css id,这样具有
分级的列表仍然可以具有有效的html。


<1.0-rc1(2010-08-31)
-

*添加对仅查看的支持Y分级视图。

*删除V属性缓存。

*PLONE 4/ZOPE 2.12兼容性(仍适用于PLONE 3.3.4/ZOPE 2.10.11):
*权限。py:不依赖于产品。*从AccessControl导入ApplicationDefaultPermissions。权限
*修复测试:
*traverser.py,自述文件。txt:samplecontainer类可能来自zope.*和zope.app.*
*utils.py:date后面可以跟分号
*browser/basic.py:add publishtraVerse方法到BasicDitorialRatingView,
以防止错误的遍历。
*events.py和interfaces.py:子类iobjectRatedEvent从iobjectEvent
(而不是iobjectModifiedEvent)防止权限错误。

*添加了此文件

0.2(2009-05-11)
----

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
创建一个bash别名来编译任何文件。当前目录中的java程序   java JSoup逐个标记解析HTML   java Jdk更新121 URLClassloader更改   为什么使用Instant将1582之前的Java日期转换为LocalDate会给出不同的日期?   java JPA有没有一种方法可以从<table>groupby<field>   批处理文件Java关于运行时的混淆。memory()与Windows的物理内存使用历史记录图   Neo4j 2.1.7,用于使用Neo4j的Java API进行社交网络分析   java文件。太慢了!   java解析Joptionpane中的多个int   导入我可以删除任何隐式导入的Java库吗?   java如何使用数组在内部存储不同的数据类型   java通过curl命令发送POST请求   java使所有数组元素相等的最小递增操作数   java FocusPanel事件仅在边缘上?