Package: collective.socialpublisher
IntroductionProvides a viewlet (and under-the-hood machinery) for managers that allows to publish contents to social networks (only twitter ATM). Social publication can be automated by enabling it per-content.To enable the viewlet just mark the content-type you want withcollective.socialpublisher.interfaces.IPublishable. You can do it from ZMI or trough ZMCL:<class class="Products.ATContentTypes.content.event.ATEvent">
    <implements interface="collectinve.socialpublisher.interfaces.IPublishable" />
</class>

NOTE: this is already done by the package in this alpha stage.Twitter accounts management is done bycollective.twitter.accounts.You can provide a publisher by registeriing an utility providingcollective.socialpublisher.interfaces.ISocialPublisherUtility. Seecollective.socialpublisher.utilityfor details.To enable auto-publishing you have to enable it per-content (waiting for global configuration) and you have to create a cron the calls@@social-auto-publish. You can do it usingProducts.cron4ploneor trough buildout like this:[instance]
...
zope-conf-additional =
  <clock-server>
      method /plonesite/@@social-auto-publish
      period 1000
      user admin
      password admin
  </clock-server>See alsohttp://collective-docs.readthedocs.org/en/latest/misc/asyncronoustasks.html.Tested onPlone 4.1 + 4.2rc1Publish managerLet’s create an Event>>> from plone.app.testing import setRoles
>>> from plone.app.testing import TEST_USER_ID
>>> portal = layer['portal']
>>> setRoles(portal, TEST_USER_ID, ['Manager'])
>>> evid = portal.invokeFactory('Event', 'event')
>>> event = portal[evid]and check that is enabled for publishing>>> from collective.socialpublisher.interfaces import IPublishable
>>> IPublishable.providedBy(event)
Trueget the manager>>> from collective.socialpublisher.interfaces import IPublishStorageManager
>>> manager = IPublishStorageManager(event, None)
>>> manager is None
Falsestorage must be a PersistentDict>>> from persistent.dict import PersistentDict
>>> isinstance(manager.storage,PersistentDict)
Trueand accounts must be an empty dict and text an empty string.>>> manager.get_accounts()
{}
>>> manager.get_text()
''We can save an account for a given publisher>>> publisher = 'twitter'
>>> account_id = 'simahawk'
>>> manager.set_account(publisher,account_id)
>>> manager.get_account(publisher)
'simahawk'
>>> manager.get_accounts()
{'twitter': 'simahawk'}let’s add another publisher/account.>>> publisher = 'facebook'
>>> account_id = 'simahawkfb'
>>> manager.set_account(publisher,account_id)
>>> manager.get_account(publisher)
'simahawkfb'
>>> manager.get_accounts()
{'twitter': 'simahawk', 'facebook': 'simahawkfb'}We can also save the text to be published>>> manager.set_text('foo bar')
>>> manager.get_text()
'foo bar'Then we can hard reset the settings like this:>>> manager._reset_storage()
>>> manager.get_accounts()
{}
>>> manager.get_text()
''TODOtests + docsadd support for linkedin and facebookmake query for auto-publish content dynamic/configurable…Changelog1.0a3[add] test buildout.cfg[imp] improved tests[imp] improved docs[add] global config using p.a.registry + controlpanel[imp] you can now turn off auto-publish globally1.0a2[fix] old twitter import[imp] ‘update’ button for saving settings without publishing[imp] ‘one-shot-text’ a flag for changing the text only for the current publishing without overwriting the stored one[imp] if cron4plone is present display any available cron schedule[imp] improved styles a bit1.0a1Initial releaseCreditsThis product was developed by Domsense.