Skip to main content

read/unread status for Plone contents

Project description

collective.readunread

Introduction

This package provides read/unread status for Plone objects.

It adds a “readBy” field and a proper index to any object marked with IReadByProvider interface.

How to use it

In order to activate read/unread feature the target object must implement:

collective.readunread.interfaces.IReadByProvider

You can add a ZCML slug in your package like:

<five:implements
  class="Products.ATContentTypes.content.document.ATDocument"
  interface="collective.readunread.interfaces.IReadByProvider"
  />

How it works

For testing purpose we’ll assign it to the Document content type

>>> from zope import interface
>>> from Products.ATContentTypes.content.document import ATDocument
>>> from collective.readunread.interfaces import IReadByProvider
>>> interface.classImplements(ATDocument,IReadByProvider)

and create a Document

>>> self.setRoles(('Manager',))
>>> docid = self.folder.invokeFactory('Document', 'document')
>>> doc = self.folder[docid]

We must trigger IObjectInitializedEvent on it since we have a subcriber that will take care of pushing the userid of the creator into ‘readBy’ field

>>> from Products.Archetypes.event import ObjectInitializedEvent
>>> from zope.event import notify
>>> notify(ObjectInitializedEvent(doc))

We can use the manager adapter for handling readby status

>>> from collective.readunread.interfaces import IReadByManager
>>> manager = IReadByManager(doc)

Since the doc is new we should get only creator’s ID

>>> len(manager.get_readby()) == 1
True
>>> manager.get_readby()
('test_user_1_',)

Let’s read the doc as other users. The following will create 3 new users

>>> from collective.readunread.tests.tests import setupMembers
>>> setupMembers(self.portal, n=3)

We have two ways for setting the doc as ‘read’ by a user. First, we can trigger the PostValidationHook event with the user (that simulates viewing the doc)

>>> from collective.readunread.tests.tests import fireViewEvent
>>> fireViewEvent(doc,'user1')
>>> fireViewEvent(doc,'user2')

Let’s see who read the doc

>>> 'user1' in manager.get_readby()
True
>>> 'user2' in manager.get_readby()
True
>>> 'user3' in manager.get_readby()
False

The second way is to set it trough the manager

>>> manager.set_readby(['user3',])
>>> 'user3' in manager.get_readby()
True

We can check the status of a user

>>> manager.get_status('user3')
'read'

We can also set a user as unread

>>> manager.set_unreadby(['user3',])
>>> 'user3' not in manager.get_readby()
True
>>> manager.get_status('user3')
'unread'

TODO

  • document & test buttons macro
  • document & test helper views

Changelog

1.0b6

  • fix missing import browser package

1.0b5

  • update docs
  • added doctest for manager
  • fixed adapter
  • improved utils

1.0b4

  • fix profile name
  • add .gitignore

1.0b3

  • missing HISTORY update (experimenting w/ jarn.mkrelease)

1.0b2

  • updated docs

1.0b1dev (unreleased)

  • Initial release

Credits

Developed with the support of International Traning Center of the ILO.

ITCILO - Logo

Authors

This product was developed by Domsense.

Domsense Website

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
collective.readunread-1.0b6.zip (42.1 kB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page