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")
 | |
| 
 |