111 lines
4.2 KiB
Python
111 lines
4.2 KiB
Python
import logging
|
|
|
|
import requests
|
|
|
|
from odoo import models, fields, _
|
|
from odoo.tools import config
|
|
from datetime import datetime, timedelta
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class CRMLeadCronJob(models.Model):
|
|
_inherit = "crm.lead"
|
|
_facebook_base_url = "https://graph.facebook.com"
|
|
_config: dict = config.misc.get('crm_sync_data')
|
|
|
|
# -------------------------------------------------------------------------
|
|
# CRON
|
|
# -------------------------------------------------------------------------
|
|
|
|
def _auto_get_facebook_lead_entries(self):
|
|
""" This method is called from a cron job.
|
|
"""
|
|
_logger.info("RUNNING get lead entries from facebook")
|
|
check_valid_token = self._check_expire_facebook_token()
|
|
if not check_valid_token:
|
|
_logger.info("Lỗi: Get Facebook lead, token không hợp lệ")
|
|
return
|
|
data = self._get_data_facebook_lead()
|
|
if data is None:
|
|
return
|
|
|
|
print(data)
|
|
|
|
# moves = self.search([
|
|
# ('state', '=', 'draft'),
|
|
# ('date', '<=', fields.Date.context_today(self)),
|
|
# ('auto_post', '!=', 'no'),
|
|
# ('to_check', '=', False),
|
|
# ], limit=100)
|
|
#
|
|
# try: # try posting in batch
|
|
# with self.env.cr.savepoint():
|
|
# moves._post()
|
|
# except UserError: # if at least one move cannot be posted, handle moves one by one
|
|
# for move in moves:
|
|
# try:
|
|
# with self.env.cr.savepoint():
|
|
# move._post()
|
|
# except UserError as e:
|
|
# move.to_check = True
|
|
# msg = _('The move could not be posted for the following reason: %(error_message)s', error_message=e)
|
|
# move.message_post(body=msg, message_type='comment')
|
|
#
|
|
# if len(moves) == 100: # assumes there are more whenever search hits limit
|
|
# self.env.ref('account.ir_cron_auto_post_draft_entry')._trigger()
|
|
|
|
# -------------------------------------------------------------------------
|
|
# HELPER METHODS
|
|
# -------------------------------------------------------------------------
|
|
|
|
def _refresh_facebook_token(self):
|
|
url = f"{self._facebook_base_url}/v14.0/oauth/access_token"
|
|
|
|
params = {
|
|
'grant_type': 'fb_exchange_token',
|
|
'client_id': self._config.get("facebook_app_id"),
|
|
'client_secret': self._config.get("facebook_app_secret"),
|
|
'fb_exchange_token': self._config.get("facebook_access_token"),
|
|
}
|
|
|
|
response = requests.get(url, params=params)
|
|
|
|
if response.status_code == 200:
|
|
config.misc['crm_sync_data']['facebook_access_token'] = response.json().get('access_token')
|
|
config.save()
|
|
return True
|
|
_logger.warning("Gọi API refresh facebook token lỗi")
|
|
_logger.warning(response.text)
|
|
return False
|
|
|
|
def _check_expire_facebook_token(self):
|
|
url = f"{self._facebook_base_url}/v14.0/debug_token"
|
|
params = {
|
|
'access_token': self._config.get("facebook_access_token"),
|
|
'input_token': self._config.get("facebook_access_token")
|
|
}
|
|
|
|
response = requests.get(url, params=params)
|
|
|
|
if response.status_code == 200:
|
|
token_expires_at = datetime.fromtimestamp(response.json().get('data').get('expires_at'))
|
|
print("token_expires_at =", token_expires_at)
|
|
if token_expires_at - timedelta(days=7) < datetime.now():
|
|
self._refresh_facebook_token()
|
|
return True
|
|
|
|
_logger.warning("Lỗi: facebook access token đã hết hạn")
|
|
_logger.warning(response.text)
|
|
return False
|
|
|
|
def _get_data_facebook_lead(self):
|
|
url = f"{self._facebook_base_url}/v14.0/{self._config.get('facebook_page_id')}/leads"
|
|
params = {'access_token': self._config.get("facebook_access_token")}
|
|
response = requests.get(url, params=params)
|
|
|
|
if response.status_code == 200:
|
|
return response.json()
|
|
_logger.info("Lỗi: Get Facebook lead, không lấy được data lead")
|
|
return None
|