def queue_transmission(self, doc): try: if doc.get('destination_groups'): destination_groups = self.resolve_destination_groups( doc.get('destination_groups')) output_channels, selector_codes, format_types = \ self.resolve_output_channels(destination_groups.values()) for output_channel in output_channels.values(): subscribers = self.get_subscribers(output_channel) if subscribers and subscribers.count() > 0: formatter = get_formatter(output_channel['format']) pub_seq_num, formatted_doc = formatter.format( doc, output_channel) formatted_item = { 'formatted_item': formatted_doc, 'format': output_channel['format'], 'item_id': doc['_id'], 'item_version': doc.get('last_version', 0), 'published_seq_num': pub_seq_num } formatted_item_id = get_resource_service( 'formatted_item').post([formatted_item])[0] publish_queue_items = [] for subscriber in subscribers: for destination in subscriber.get( 'destinations', []): publish_queue_item = dict() publish_queue_item['item_id'] = doc['_id'] publish_queue_item[ 'formatted_item_id'] = formatted_item_id publish_queue_item[ 'subscriber_id'] = subscriber['_id'] publish_queue_item['destination'] = destination publish_queue_item[ 'output_channel_id'] = output_channel[ '_id'] publish_queue_item[ 'selector_codes'] = selector_codes.get( output_channel['_id'], []) publish_queue_item[ 'published_seq_num'] = pub_seq_num publish_queue_items.append(publish_queue_item) get_resource_service('publish_queue').post( publish_queue_items) else: raise PublishQueueError.destination_group_not_found_error( KeyError('Destination groups empty for article: {}'.format( doc['_id'])), None) except: raise
def queue_transmission(self, doc, subscribers): """ Method formats and then queues the article for transmission to the passed subscribers. ::Important Note:: Format Type across Subscribers can repeat. But we can't have formatted item generated once based on the format_types configured across for all the subscribers as the formatted item must have a published sequence number generated by Subscriber. :param dict doc: document to queue for transmission :param list subscribers: List of subscriber dict. :return : (list, bool) tuple of list of missing formatters and boolean flag. True if queued else False """ try: queued = False no_formatters = [] for subscriber in subscribers: try: for destination in subscriber['destinations']: # Step 2(a) formatter = get_formatter(destination['format'], doc) if not formatter: # if formatter not found then record it no_formatters.append(destination['format']) continue formatted_docs = formatter.format(doc, subscriber) for pub_seq_num, formatted_doc in formatted_docs: publish_queue_item = dict() publish_queue_item['item_id'] = doc['_id'] publish_queue_item['item_version'] = doc[config.VERSION] + 1 publish_queue_item['formatted_item'] = formatted_doc publish_queue_item['subscriber_id'] = subscriber['_id'] publish_queue_item['destination'] = destination publish_queue_item['published_seq_num'] = pub_seq_num publish_queue_item['publish_schedule'] = doc.get('publish_schedule', None) publish_queue_item['unique_name'] = doc.get('unique_name', None) publish_queue_item['content_type'] = doc.get('type', None) publish_queue_item['headline'] = doc.get('headline', None) self.set_state(doc, publish_queue_item) if publish_queue_item.get(config.CONTENT_STATE): publish_queue_item['publishing_action'] = publish_queue_item.get(config.CONTENT_STATE) del publish_queue_item[config.CONTENT_STATE] else: publish_queue_item['publishing_action'] = self.published_state get_resource_service('publish_queue').post([publish_queue_item]) queued = True except: logger.exception("Failed to queue item for id {} with headline {} for subscriber {}." .format(doc.get(config.ID_FIELD), doc.get('headline'), subscriber.get('name'))) return no_formatters, queued except: raise
def queue_transmission(self, doc): try: if doc.get('destination_groups'): any_channel_closed = False destination_groups = self.resolve_destination_groups(doc.get('destination_groups')) output_channels, selector_codes, format_types = \ self.resolve_output_channels(destination_groups.values()) for output_channel in output_channels.values(): if output_channel.get('is_active', True) is False: any_channel_closed = True subscribers = self.get_subscribers(output_channel) if subscribers and subscribers.count() > 0: formatter = get_formatter(output_channel['format']) pub_seq_num, formatted_doc = formatter.format(doc, output_channel) formatted_item = {'formatted_item': formatted_doc, 'format': output_channel['format'], 'item_id': doc['_id'], 'item_version': doc.get('last_version', 0), 'published_seq_num': pub_seq_num} formatted_item_id = get_resource_service('formatted_item').post([formatted_item])[0] publish_queue_items = [] for subscriber in subscribers: for destination in subscriber.get('destinations', []): publish_queue_item = dict() publish_queue_item['item_id'] = doc['_id'] publish_queue_item['formatted_item_id'] = formatted_item_id publish_queue_item['subscriber_id'] = subscriber['_id'] publish_queue_item['destination'] = destination publish_queue_item['output_channel_id'] = output_channel['_id'] publish_queue_item['selector_codes'] = selector_codes.get(output_channel['_id'], []) publish_queue_item['published_seq_num'] = pub_seq_num publish_queue_item['publish_schedule'] = doc.get('publish_schedule', None) publish_queue_item['publishing_action'] = doc.get(config.CONTENT_STATE, None) publish_queue_item['unique_name'] = doc.get('unique_name', None) publish_queue_item['content_type'] = doc.get('type', None) publish_queue_item['headline'] = doc.get('headline', None) publish_queue_items.append(publish_queue_item) get_resource_service('publish_queue').post(publish_queue_items) return any_channel_closed else: raise PublishQueueError.destination_group_not_found_error( KeyError('Destination groups empty for article: {}'.format(doc['_id'])), None) except: raise
def queue_transmission(self, doc, subscribers, target_media_type=None): """ Method formats and then queues the article for transmission to the passed subscribers. ::Important Note:: Format Type across Subscribers can repeat. But we can't have formatted item generated once based on the format_types configured across for all the subscribers as the formatted item must have a published sequence number generated by Subscriber. :param: target_media_type - dictate if the doc being queued is a Takes Package or an Individual Article. Valid values are - Wire, Digital. If Digital then the doc being queued is a Takes Package and if Wire then the doc being queues is an Individual Article. """ try: queued = False no_formatters = [] for subscriber in self.filter_subscribers(doc, subscribers, target_media_type): for destination in subscriber['destinations']: # Step 2(a) formatter = get_formatter(destination['format'], doc) if not formatter: # if formatter not found then record it no_formatters.append(destination['format']) continue formatted_docs = formatter.format(doc, subscriber) for pub_seq_num, formatted_doc in formatted_docs: publish_queue_item = dict() publish_queue_item['item_id'] = doc['_id'] publish_queue_item['item_version'] = doc[config.VERSION] + 1 publish_queue_item['formatted_item'] = formatted_doc publish_queue_item['subscriber_id'] = subscriber['_id'] publish_queue_item['destination'] = destination publish_queue_item['published_seq_num'] = pub_seq_num publish_queue_item['publish_schedule'] = doc.get('publish_schedule', None) publish_queue_item['unique_name'] = doc.get('unique_name', None) publish_queue_item['content_type'] = doc.get('type', None) publish_queue_item['headline'] = doc.get('headline', None) self.set_state(doc, publish_queue_item) if publish_queue_item.get(config.CONTENT_STATE): publish_queue_item['publishing_action'] = publish_queue_item.get(config.CONTENT_STATE) del publish_queue_item[config.CONTENT_STATE] else: publish_queue_item['publishing_action'] = self.published_state get_resource_service('publish_queue').post([publish_queue_item]) queued = True return no_formatters, queued except: raise
def queue_transmission(self, doc): try: if doc.get('destination_groups'): destination_groups = self.resolve_destination_groups(doc.get('destination_groups')) output_channels, selector_codes, format_types = \ self.resolve_output_channels(destination_groups.values()) for output_channel in output_channels.values(): subscribers = self.get_subscribers(output_channel) if subscribers and subscribers.count() > 0: formatter = get_formatter(output_channel['format']) pub_seq_num, formatted_doc = formatter.format(doc, output_channel) formatted_item = {'formatted_item': formatted_doc, 'format': output_channel['format'], 'item_id': doc['_id'], 'item_version': doc.get('last_version', 0), 'published_seq_num': pub_seq_num} formatted_item_id = get_resource_service('formatted_item').post([formatted_item])[0] publish_queue_items = [] for subscriber in subscribers: for destination in subscriber.get('destinations', []): publish_queue_item = dict() publish_queue_item['item_id'] = doc['_id'] publish_queue_item['formatted_item_id'] = formatted_item_id publish_queue_item['subscriber_id'] = subscriber['_id'] publish_queue_item['destination'] = destination publish_queue_item['output_channel_id'] = output_channel['_id'] publish_queue_item['selector_codes'] = selector_codes.get(output_channel['_id'], []) publish_queue_item['published_seq_num'] = pub_seq_num publish_queue_items.append(publish_queue_item) get_resource_service('publish_queue').post(publish_queue_items) else: raise PublishQueueError.destination_group_not_found_error( KeyError('Destination groups empty for article: {}'.format(doc['_id'])), None) except: raise