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

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为什么我不能在try/catch中键入多个输入?   当文件名为泰语时,enctype=“multipart/formdata”的java upload file获得了奇怪的文件名   java使用jsp在tomcat中开发kerberos   Java\JSON:无法识别的属性异常:无法识别的字段“CefMessagesGenerators”错误   java在片段中删除工具栏   java ActionListener无法处理所有对象   JAVA调用从其他包继承的类的成员(其他类类型)   java RestyGWT和GWT集成:无法获取资源   java如何检查正在执行的类   java JavaFX自定义节点不呈现子节点   持久性如何在java中非持久地存储列表的内容   java EditText在禁用时恢复为灰色文本