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