def format_for_source(self, article, subscriber, source, codes=None): """Constructs a dictionary that represents the parameters passed to the IPNews InsertNews stored procedure :type article: object :return: returns the sequence number of the subscriber and the constructed parameter dictionary """ pass_through = article.get('auto_publish', False) try: docs = [] for category in self._get_category_list(article.get('anpa_category')): # All NZN sourced content is AAP content for the AAP output formatted article['source'] = source pub_seq_num, odbc_item = self.get_odbc_item(article, subscriber, category, codes, pass_through) if article.get(FORMAT) == FORMATS.PRESERVED: # @article_text body = get_text(self.append_body_footer(article)) odbc_item['article_text'] = body.replace('\'', '\'\'') odbc_item['texttab'] = 't' elif article.get(FORMAT, FORMATS.HTML) == FORMATS.HTML: body = self.get_wrapped_text_content( to_ascii(self.append_body_footer(article))).replace('\'', '\'\'') # if we have a dateline inject it if 'dateline' in article and 'text' in article.get('dateline', {}) and not pass_through: if body.startswith(' '): body = ' {} {}'.format(article.get('dateline') .get('text').replace('\'', '\'\''), body[3:]) odbc_item['article_text'] = body odbc_item['texttab'] = 'x' if not pass_through: self.add_ednote(odbc_item, article) self.add_byline(odbc_item, article) odbc_item['article_text'] += '\r\n' + article.get('source', '') sign_off = article.get('sign_off', '') or '' if len(sign_off) > 0: odbc_item['article_text'] += ' ' + sign_off odbc_item['service_level'] = get_service_level(category, article) # @service_level odbc_item['wordcount'] = article.get('word_count') or 0 # @wordcount odbc_item['priority'] = map_priority(article.get('priority')) # @priority docs.append((pub_seq_num, json.dumps(odbc_item))) return docs except Exception as ex: raise FormatterError.AAPIpNewsFormatterError(ex, subscriber)
def format(self, article, subscriber): """ Constructs a dictionary that represents the parameters passed to the IPNews InsertNews stored procedure :return: returns the sequence number of the subscriber and the constructed parameter dictionary """ try: docs = [] for category in article.get('anpa_category'): pub_seq_num = superdesk.get_resource_service('subscribers').generate_sequence_number(subscriber) odbc_item = {'originator': article.get('source', None), 'sequence': pub_seq_num, 'category': category.get('qcode'), 'headline': article.get('headline', '').replace('\'', '\'\''), 'author': article.get('byline', '').replace('\'', '\'\''), 'keyword': self.append_legal(article=article, truncate=True).replace('\'', '\'\''), 'subject_reference': set_subject(category, article)} if 'subject_reference' in odbc_item and odbc_item['subject_reference'] is not None \ and odbc_item['subject_reference'] != '00000000': odbc_item['subject'] = subject_codes[odbc_item['subject_reference'][:2] + '000000'] if odbc_item['subject_reference'][2:5] != '000': odbc_item['subject_matter'] = subject_codes[odbc_item['subject_reference'][:5] + '000'] else: odbc_item['subject_matter'] = '' if not odbc_item['subject_reference'].endswith('000'): odbc_item['subject_detail'] = subject_codes[odbc_item['subject_reference']] else: odbc_item['subject_detail'] = '' else: odbc_item['subject_reference'] = '00000000' odbc_item['take_key'] = article.get('anpa_take_key', None) # @take_key odbc_item['usn'] = article.get('unique_id', None) # @usn if article[ITEM_TYPE] == CONTENT_TYPE.PREFORMATTED: # @article_text odbc_item['article_text'] = self.append_body_footer(article).replace('\'', '\'\'') elif article[ITEM_TYPE] == CONTENT_TYPE.TEXT: soup = BeautifulSoup(self.append_body_footer(article), "html.parser") text = StringIO() for p in soup.findAll('p'): text.write('\x19\r\n') ptext = p.get_text('\n') for l in ptext.split('\n'): if len(l) > 80: text.write(textwrap.fill(l, 80).replace('\n', ' \r\n')) else: text.write(l + ' \r\n') odbc_item['article_text'] = text.getvalue().replace('\'', '\'\'') if 'genre' in article: odbc_item['genre'] = article['genre'][0].get('name', None) else: odbc_item['genre'] = 'Current' # @genre if article.get(ITEM_TYPE, CONTENT_TYPE.TEXT) == CONTENT_TYPE.TEXT: odbc_item['texttab'] = 'x' elif article.get(ITEM_TYPE, None) == CONTENT_TYPE.PREFORMATTED: odbc_item['texttab'] = 't' odbc_item['wordcount'] = article.get('word_count', None) # @wordcount odbc_item['news_item_type'] = 'News' odbc_item['priority'] = map_priority(article.get('priority')) # @priority odbc_item['service_level'] = 'a' # @service_level odbc_item['fullStory'] = 1 odbc_item['ident'] = '0' # @ident SelectorcodeMapper().map(article, category.get('qcode').upper(), subscriber=subscriber, formatted_item=odbc_item) headline_prefix = LocatorMapper().map(article, category.get('qcode').upper()) if headline_prefix: odbc_item['headline'] = '{}:{}'.format(headline_prefix, odbc_item['headline']) if article.get(EMBARGO): embargo = '{}{}'.format('Embargo Content. Timestamp: ', article.get(EMBARGO).isoformat()) odbc_item['article_text'] = embargo + odbc_item['article_text'] docs.append((pub_seq_num, odbc_item)) return docs except Exception as ex: raise FormatterError.AAPIpNewsFormatterError(ex, subscriber)