可插入,用于创建简单的活动流。

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_templatetg_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>

如果需要根据收件人以不同方式呈现通知,则必须使用 另一种缓存策略

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

推荐PyPI第三方库


热门话题
java Hibernate在创建表之前尝试更改表   JavaServletContext。getContextPath()始终返回根路径   java Spring MVC从控制器到JSP获取日期   java从JSON获取所有用户并将其放入TextView   java将表面积从一个圆添加到另一个圆   java什么是类级、对象级、显式和内在锁定?   数组Java高分列表   java如何使文本视图位于底部的中心?   java MediaPlayer在使用处理程序时滞后   swing是否在Java中更新JFrame的位置?   从数据库加载属性时发生java异常。属性文件   javajrubypermgen。内存不足。堆空间内存泄漏   使用fmt标记在jsp中实现java国际化   java对话框打开关闭的对话框而不创建新对话框   java图像像素数据读取和打印   在安卓中使用java在何处编写点击事件