可插入,用于创建简单的活动流。
tgapp-activitystream的Python项目详细描述
关于活动流
ActivityStream是TurboGears2的可插入应用程序,用于创建简单的活动流。
活动流用作通知的基本层系统
目前,这个可插拔的只适用于ming可以自由提交带有sqlalchemy支持的拉取请求
安装
activitystream既可以从pypi安装,也可以从github安装:
pip install activitystream
应该只对大多数用户有效
堵塞活动流
在应用程序中config/app_cfg.py导入plug:
from tgext.pluggable import plug
然后在文件的结尾处用activitystream调用plug:
plug(base_config, 'activitystream')
操作管理器
当您要创建活动时,您应该执行如下操作:
from activitystream import ActionManager am = ActionManager() activity = am.create( actor=model.User.query.find().all()[0], verb='created', target=model.Post.query.find().all()[0], recipients=model.User.query.find().all()[1:3], )
然后您可能需要将活动通知给收件人。 这取决于你选择如何发送它们。
字段说明
- actor:创建活动的人的引用
- verb:描述操作本身的字符串,例如“created”或“updated”
- action\u obj:引用…我不知道
- target:对活动主题的引用
- timestamp:创建活动的日期时间
- description:带有活动说明的字符串
- extra:字符串,例如,可以使用该字符串存储包含额外信息的json
- recipients:预期接收者的引用列表 此活动的通知。引用可以是不同的实体。
不可见(未读通知计数器)
添加收件人模型(可能是用户模型):
from datetime import datetime last_activity_seen = FieldProperty(s.DateTime, if_missing=datetime.utcnow())
然后,您可以使用:
recipient = model.User.query.find().all()[1] actions = am.get_by_recipient(recipient).limit(10).all() # and if you want a counter of unread notifications call count = am.count_not_seen_by_recipient(recipient) # you can check if the recipient have seen a notification with not_seen = actions[0].timestamp > recipient.last_activity_seen # don't forget to update your recipient when him reads his notifications recipient.last_activity_seen = datetime.utcnow()
暴露的控制器
如果您不想让您的url以activitystream开头,只要plug使用新的应用程序id
- /activitystream/ajax update\u最后一次看到的收件人:使用^{tt2}通过ajax调用$ 以及要更新last_activity_seen的收件人的_id。 应该返回一个json,其中包含更新之前看到的最后一个活动。
- /activitystream/请参阅:更新登录用户的last_activity_seen。 并重定向到给定的target_link
通知呈现
这取决于你。我建议使用tg.render_template和tg_cache
加入myproject.lib.helpers:
from activitystream import am from tg import render_template def notification_cache(n): return { 'cache_key': n._id, # this is really important 'cache_expire': 604800, # a week 'cache_type': 'memory', }
在您希望显示通知的模板中:
<py:for each="n in h.am.get_by_recipient(request.identity['user']).limit(10)"> <li>${h.render_template( {'n': n, 'tg_cache': h.notification_cache(n)}, 'kajiki', 'myproject.templates.notification' )}<hr/></li> </py:for>
同时,您的myproject.templates.notification可能看起来像:
<a href="${h.plug_url('activitystream', '/see', params={'target_link': n.target_link})}"> <img src="${n.actor.avatar_url}"/> <div class="content"> <b>${n.actor.display_name}</b> ${_(n.verb)} <i>${n.target}</i> <div>${n.timestamp_since}</div> </div> </a>
如果需要根据收件人以不同方式呈现通知,则必须使用 另一种缓存策略