Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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