def publish(self, publishers=[], accounts={}): obj = self.context selected_publishers = self.request.get('publishers', publishers) if not selected_publishers: msg = _(u"Select at list one publisher!") self.update_message(msg, type="error") return published = {} self._update_settings(publishers=publishers, accounts=accounts) content = self.get_content() manager = IPublishStorageManager(obj) if manager.get_text() and not self.request.get('one_shot_text'): content = manager.get_text() published['content'] = content selected_accounts = self.request.get('accounts', accounts) for pub in selected_publishers: account_id = selected_accounts.get(pub) self._publish(content, pub, account_id) published[pub] = account_id msg = _(u'content_published', default=u"Content published on ${published_on}", mapping={'published_on': ', '.join(selected_publishers)}) translated = self.context.translate(msg) self.update_message(translated) return published
def test_publish(self): test_utils.register_fake_publisher() utility = component.queryUtility(ISocialPublisherUtility, name=test_utils.FakePublisher.id) # let's create an event event = self.create_event() # and get its manager manager = IPublishStorageManager(event) # we must have empty values here self.assertEqual(manager.get_accounts(), {}) self.assertEqual(manager.get_text(), '') # we can now publish it using `social-publish` view view = event.restrictedTraverse('@@social-publish') publishers = [test_utils.FakePublisher.id] accounts = {test_utils.FakePublisher.id: 'simahawk'} result = view.publish(publishers=publishers, accounts=accounts) # we expect the content of the publication to be equal `get_text` result # and the publisher/account mapping matching the one we pass to the publisher expected = { 'content': 'Great event http://nohost/plone/event', 'fakepub': 'simahawk' } self.assertEqual(result, expected) # publisher/account mapping is saved by default by the publishing view self.assertEqual(manager.get_accounts(), {'fakepub': 'simahawk'})
def _update_settings(self, publishers=[], accounts={}): obj = self.context selected_publishers = self.request.get('publishers', publishers) manager = IPublishStorageManager(obj) custom_text = self.request.get('text', '').strip() if not self.request.get('one_shot_text'): manager.set_text(custom_text) selected_accounts = self.request.get('accounts', accounts) for pub in selected_publishers: account_id = selected_accounts.get(pub) manager.set_account(pub, account_id)
def accounts(self): res = {} manager = IPublishStorageManager(self.context, None) selected = "" for pub in self.publishers: selected = None if manager: selected = manager.get_account(pub.id) accounts = pub.get_accounts() res[pub.id] = [ dict(id=x, selected=x == selected) for x in accounts.keys() ] return res
def accounts(self): res = {} manager = IPublishStorageManager(self.context, None) selected = "" for pub in self.publishers: selected = None if manager: selected = manager.get_account(pub.id) accounts = pub.get_accounts() res[pub.id] = [ dict(id = x, selected = x == selected) for x in accounts.keys() ] return res
def publish(self): settings = utils.get_global_settings() if not settings.autopublish_enabled: self.logger.info(self.msg_autopublish_disabled) return self.msg_autopublish_disabled for brain in self.get_items(): obj = brain.getObject() manager = IPublishStorageManager(obj) # XXX: we should delegate default text get to manager (?) content = manager.get_text() or utils.get_text(obj) for publisher, account_id in manager.get_accounts().items(): self._publish(content, publisher, account_id=account_id) self.logger.info(self.msg_autopublish_done) return self.msg_autopublish_done
def get_text(obj): # XXX: make this smarter (using per-type adapters?) LIMIT = 140 manager = IPublishStorageManager(obj) if manager.get_text(): txt = manager.get_text()[:LIMIT] else: txt = obj.Title() link = obj.absolute_url() # XXX: handle this is an smart way # short_link = getTinyURL(link) short_link = None if short_link: link = short_link else: short_link = link available_chars = LIMIT - (len(short_link)+1) txt = "%s %s" % (txt[:available_chars],short_link) return txt
def test_publish(self): test_utils.register_fake_publisher() utility = component.queryUtility(ISocialPublisherUtility, name=test_utils.FakePublisher.id) # let's create an event event = self.create_event() # and get its manager manager = IPublishStorageManager(event) # we must have empty values here self.assertEqual(manager.get_accounts(),{}) self.assertEqual(manager.get_text(),'') # we can now publish it using `social-publish` view view = event.restrictedTraverse('@@social-publish') publishers = [test_utils.FakePublisher.id] accounts = {test_utils.FakePublisher.id:'simahawk'} result = view.publish(publishers=publishers,accounts=accounts) # we expect the content of the publication to be equal `get_text` result # and the publisher/account mapping matching the one we pass to the publisher expected = {'content': 'Great event http://nohost/plone/event', 'fakepub': 'simahawk'} self.assertEqual(result,expected) # publisher/account mapping is saved by default by the publishing view self.assertEqual(manager.get_accounts(),{'fakepub': 'simahawk'})
def get_text(self): manager = IPublishStorageManager(self.context, None) saved = manager.get_text() default = utils.get_text(self.context) return saved or default