You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							186 lines
						
					
					
						
							7.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							186 lines
						
					
					
						
							7.6 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								
							 | 
						|
								from odoo import models, fields, api
							 | 
						|
								import requests
							 | 
						|
								import logging
							 | 
						|
								import json
							 | 
						|
								
							 | 
						|
								_logger = logging.getLogger(__name__)
							 | 
						|
								
							 | 
						|
								class NewsChannel(models.Model):
							 | 
						|
								    _inherit = 'mail.channel'
							 | 
						|
								
							 | 
						|
								    is_news_channel = fields.Boolean(default=False, invisible=True)
							 | 
						|
								    language_id = fields.Many2one('res.lang', 'Language')
							 | 
						|
								    url = fields.Char('URL')
							 | 
						|
								    category = fields.Char('Category')
							 | 
						|
								    channel_ref = fields.Char('Channel Reference', invisible=True)
							 | 
						|
								    last_updated = fields.Datetime("Last Updated")
							 | 
						|
								
							 | 
						|
								    def update_news_content(self, channel, contents):
							 | 
						|
								        """
							 | 
						|
								            {
							 | 
						|
								            'body': HTML content of the message
							 | 
						|
								            'model': u'res.partner',
							 | 
						|
								            'record_name': u'Agrolait',
							 | 
						|
								            'attachment_ids': [
							 | 
						|
								                {
							 | 
						|
								                    'file_type_icon': u'webimage',
							 | 
						|
								                    'id': 45,
							 | 
						|
								                    'name': u'sample.png',
							 | 
						|
								                    'filename': u'sample.png'
							 | 
						|
								                }
							 | 
						|
								            ],
							 | 
						|
								            'needaction_partner_ids': [], # list of partner ids
							 | 
						|
								            'res_id': 7,
							 | 
						|
								            'tracking_value_ids': [
							 | 
						|
								                {
							 | 
						|
								                    'old_value': "",
							 | 
						|
								                    'changed_field': "Customer",
							 | 
						|
								                    'id': 2965,
							 | 
						|
								                    'new_value': "Axelor"
							 | 
						|
								                }
							 | 
						|
								            ],
							 | 
						|
								            'author_id': (3, u'Administrator'),
							 | 
						|
								            'email_from': 'sacha@pokemon.com' # email address or False
							 | 
						|
								            'subtype_id': (1, u'Discussions'),
							 | 
						|
								            'channel_ids': [], # list of channel ids
							 | 
						|
								            'date': '2015-06-30 08:22:33',
							 | 
						|
								            'partner_ids': [[7, "Sacha Du Bourg-Palette"]], # list of partner name_get
							 | 
						|
								            'message_type': u'comment',
							 | 
						|
								            'id': 59,
							 | 
						|
								            'subject': False
							 | 
						|
								            'is_note': True # only if the subtype is internal
							 | 
						|
								            }
							 | 
						|
								        """
							 | 
						|
								        body = contents.get('articles', False)
							 | 
						|
								        body_contents = ""
							 | 
						|
								        for data in body:
							 | 
						|
								            body_contents += """
							 | 
						|
								                <p> 
							 | 
						|
								                <p style="margin-bottom: 10px;"><img src="%s" width="300px" height="300px"/></p>
							 | 
						|
								                <p style="margin-bottom: 0px;"><b>Title:</b>%s</p>
							 | 
						|
								                <p style="margin-bottom: 0px;"><b>Description:</b>%s</p>
							 | 
						|
								                <p style="margin-bottom: 0px;"><b>Author:</b>%s      <b>publishedAt:</b>%s</p>
							 | 
						|
								                <p style="margin-bottom: 0px;"><b><a href="%s">Read more.. </a></b></p>
							 | 
						|
								                <p style="padding-bottom:10px">
							 | 
						|
								                <hr/>
							 | 
						|
								            """%(data.get('urlToImage', False), data.get('title', False), data.get('description', False),
							 | 
						|
								                 data.get('author', False), data.get('publishedAt', False), data.get('url', False),)
							 | 
						|
								
							 | 
						|
								        data = {
							 | 
						|
								                'body': body_contents,
							 | 
						|
								                'model': u'mail.channel',
							 | 
						|
								                'record_name': channel.name,
							 | 
						|
								                'res_id': channel.id,
							 | 
						|
								                'author_id': 3,
							 | 
						|
								                'email_from': u'Administrator <admin@yourcompany.example.com>', # email address or False
							 | 
						|
								                'subtype_id': 1,
							 | 
						|
								                'channel_ids': [channel.id], # list of channel ids
							 | 
						|
								                'message_type': u'notification',
							 | 
						|
								                'subject': False,
							 | 
						|
								                'parent_id': False,
							 | 
						|
								                'reply_to': u'YourCompany <catchall@gmail.com>',
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        data.update({'message_id': self.env['mail.message'].sudo()._get_message_id(data)})
							 | 
						|
								        self.env['mail.message'].sudo().create(data)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def news_sync(self):
							 | 
						|
								        """
							 | 
						|
								        Sync the news according to the each channels, where the news api not providing a single sync for  all channels,
							 | 
						|
								        so we are iterating here on each channels to sync.
							 | 
						|
								        Lets hope for a good Updated api from them in future
							 | 
						|
								        :return:
							 | 
						|
								        """
							 | 
						|
								        default_key = self.env['news.channel.config.settings'].get_default_news_api_key([])
							 | 
						|
								        api_key = default_key.get('news_api_key', False)
							 | 
						|
								        if api_key:
							 | 
						|
								            query = """delete from mail_message m where m.res_id in
							 | 
						|
								             (select distinct id from mail_channel c where c.is_news_channel = True)"""
							 | 
						|
								            self._cr.execute(query)
							 | 
						|
								            channels_pool = self.search([('is_news_channel', '=', True)])
							 | 
						|
								            url = "https://newsapi.org/v1/articles"
							 | 
						|
								            querystring = {
							 | 
						|
								                           "apiKey": api_key,
							 | 
						|
								                           }
							 | 
						|
								            headers = {
							 | 
						|
								                'cache-control': "no-cache",
							 | 
						|
								            }
							 | 
						|
								            for channels in channels_pool:
							 | 
						|
								                querystring.update({"source": channels.channel_ref, })
							 | 
						|
								                response = requests.request("GET", url, headers=headers, params=querystring)
							 | 
						|
								                try:
							 | 
						|
								                    if response.status_code == 200:
							 | 
						|
								                        contents = json.loads(response.text)
							 | 
						|
								                        if contents and contents.get('status') == 'ok':
							 | 
						|
								                            self.update_news_content(channels, contents)
							 | 
						|
								                except Exception as e:
							 | 
						|
								                    _logger.info(e)
							 | 
						|
								                    continue
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class NewsChannelConfigSettings(models.Model):
							 | 
						|
								    _name = 'news.channel.config.settings'
							 | 
						|
								    _inherit = 'res.config.settings'
							 | 
						|
								
							 | 
						|
								    news_api_key = fields.Char('Api Key')
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def get_default_news_api_key(self, fields):
							 | 
						|
								        ir_values = self.env['ir.values']
							 | 
						|
								        news_api_key = ir_values.get_default('news.channel.config.settings', 'news_api_key')
							 | 
						|
								        return {'news_api_key': news_api_key}
							 | 
						|
								
							 | 
						|
								    @api.multi
							 | 
						|
								    def set_default_news_api_key(self):
							 | 
						|
								        ir_values = self.env['ir.values']
							 | 
						|
								        for record in self:
							 | 
						|
								            ir_values.sudo().set_default('news.channel.config.settings', 'news_api_key', record.news_api_key)
							 | 
						|
								
							 | 
						|
								    @api.multi
							 | 
						|
								    def execute(self):
							 | 
						|
								        """
							 | 
						|
								        Which invokes when you click on apply button on config page
							 | 
						|
								        Here we update all channels from news api, list under menu 'News'
							 | 
						|
								        Url https://newsapi.org/v1/sources lists the sources
							 | 
						|
								        :return: {'tag': 'reload', 'type': 'ir.actions.client'}
							 | 
						|
								        """
							 | 
						|
								        print self.news_api_key, "self.news_api_keyself.news_api_key"
							 | 
						|
								        if self.news_api_key:
							 | 
						|
								            try:
							 | 
						|
								                url = "https://newsapi.org/v1/sources"
							 | 
						|
								                querystring = {"language": "en"}
							 | 
						|
								                headers = {
							 | 
						|
								                    'cache-control': "no-cache"
							 | 
						|
								                }
							 | 
						|
								                response = requests.request("GET", url, headers=headers, params=querystring)
							 | 
						|
								                data = eval(response.text)
							 | 
						|
								                language_model = self.env['res.lang']
							 | 
						|
								                Channel = self.env['mail.channel']
							 | 
						|
								                channel_data = {}
							 | 
						|
								                if data.get('status') == 'ok':
							 | 
						|
								                    for values in data['sources']:
							 | 
						|
								                        channel_id = Channel.search([('channel_ref', '=', values['id'])])
							 | 
						|
								                        if not len(channel_id):
							 | 
						|
								                            language = language_model.search([('iso_code', '=', values.get('language', False))])
							 | 
						|
								                            channel_data.update({
							 | 
						|
								                                'name': values['name'],
							 | 
						|
								                                'channel_ref': values['id'],
							 | 
						|
								                                'language_id': language and language.id,
							 | 
						|
								                                'category': values['category'],
							 | 
						|
								                                'url': values['url'],
							 | 
						|
								                                'is_news_channel': True,
							 | 
						|
								                                'description': values['description'],
							 | 
						|
								                            })
							 | 
						|
								                            Channel.create(channel_data)
							 | 
						|
								                    return super(NewsChannelConfigSettings, self).execute()
							 | 
						|
								                else:
							 | 
						|
								                    raise Exception
							 | 
						|
								            except Exception as e:
							 | 
						|
								                _logger.info(e)
							 | 
						|
								        else:
							 | 
						|
								            return Warning("Give Proper Api Key")
							 | 
						|
								
							 |