Odoo-Tutorial/crm_sync_data/models/models.py
2025-03-04 16:53:07 +07:00

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