158 lines
7.3 KiB
Python
158 lines
7.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
from datetime import datetime, timedelta
|
|
import logging
|
|
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
|
from openerp.exceptions import Warning
|
|
from openerp import models, exceptions, api
|
|
from openerp.tools.translate import _
|
|
import simplejson
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class google_management(models.AbstractModel):
|
|
|
|
STR_SERVICE = 'management'
|
|
|
|
_name = 'google.%s' % STR_SERVICE
|
|
|
|
@api.model
|
|
def generate_data(self, experiment, isCreating=False):
|
|
|
|
return {
|
|
'name': experiment['name'],
|
|
'status': experiment['status'],
|
|
'variations': experiment['variations']
|
|
}
|
|
|
|
@api.model
|
|
def create_an_experiment(self, data, website_id):
|
|
gs_pool = self.env['google.service']
|
|
website = self.env['website'].browse(website_id)[0]
|
|
webPropertyId = website.google_analytics_key
|
|
action_id = self.env['ir.model.data'].xmlid_to_res_id('website_version.action_website_view')
|
|
if not webPropertyId:
|
|
raise exceptions.RedirectWarning('Click on the website you want to make A/B testing and configure the Google Analytics Key and View ID', action_id, 'go to the websites menu')
|
|
accountId = webPropertyId.split('-')[1]
|
|
profileId = website.google_analytics_view_id
|
|
if not profileId:
|
|
raise exceptions.RedirectWarning('Click on the website you want to make A/B testing and configure the Google Analytics Key and View ID', action_id, 'go to the websites menu')
|
|
url = '/analytics/v3/management/accounts/%s/webproperties/%s/profiles/%s/experiments?access_token=%s' % (accountId, webPropertyId, profileId, self.get_token())
|
|
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
|
|
data_json = simplejson.dumps(data)
|
|
try:
|
|
x = gs_pool._do_request(url, data_json, headers, type='POST')
|
|
result = x[1]['id']
|
|
except Exception, e:
|
|
_logger.info(_('An exception occured during the google analytics rquest: %s') % e)
|
|
raise
|
|
return result
|
|
|
|
@api.model
|
|
def update_an_experiment(self, data, google_id, website_id):
|
|
gs_pool = self.env['google.service']
|
|
website = self.env['website'].browse(website_id)[0]
|
|
webPropertyId = website.google_analytics_key
|
|
accountId = webPropertyId.split('-')[1]
|
|
profileId = website.google_analytics_view_id
|
|
|
|
url = '/analytics/v3/management/accounts/%s/webproperties/%s/profiles/%s/experiments/%s?access_token=%s' % (accountId, webPropertyId, profileId, google_id, self.get_token())
|
|
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
|
|
data_json = simplejson.dumps(data)
|
|
|
|
return gs_pool._do_request(url, data_json, headers, type='PUT')
|
|
|
|
@api.model
|
|
def get_experiment_info(self, google_id, website_id):
|
|
gs_pool = self.env['google.service']
|
|
website = self.env['website'].browse(website_id)[0]
|
|
webPropertyId = website.google_analytics_key
|
|
accountId = webPropertyId.split('-')[1]
|
|
profileId = website.google_analytics_view_id
|
|
|
|
params = {
|
|
'access_token': self.get_token(),
|
|
}
|
|
|
|
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
|
|
url = '/analytics/v3/management/accounts/%s/webproperties/%s/profiles/%s/experiments/%s' % (accountId, webPropertyId, profileId, google_id)
|
|
return gs_pool._do_request(url, params, headers, type='GET')
|
|
|
|
@api.model
|
|
def get_goal_info(self, website_id):
|
|
gs_pool = self.env['google.service']
|
|
website = self.env['website'].browse(website_id)[0]
|
|
webPropertyId = website.google_analytics_key
|
|
accountId = webPropertyId.split('-')[1]
|
|
profileId = website.google_analytics_view_id
|
|
|
|
params = {
|
|
'access_token': self.get_token(),
|
|
}
|
|
|
|
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
|
|
|
|
url = '/analytics/v3/management/accounts/%s/webproperties/%s/profiles/%s/goals' % (accountId, webPropertyId, profileId)
|
|
return gs_pool._do_request(url, params, headers, type='GET')
|
|
|
|
@api.model
|
|
def delete_an_experiment(self, google_id, website_id):
|
|
gs_pool = self.env['google.service']
|
|
website = self.env['website'].browse(website_id)[0]
|
|
webPropertyId = website.google_analytics_key
|
|
accountId = webPropertyId.split('-')[1]
|
|
profileId = website.google_analytics_view_id
|
|
params = {
|
|
'access_token': self.get_token()
|
|
}
|
|
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
|
|
url = '/analytics/v3/management/accounts/%s/webproperties/%s/profiles/%s/experiments/%s' % (accountId, webPropertyId, profileId, google_id)
|
|
|
|
return gs_pool._do_request(url, params, headers, type='DELETE')
|
|
|
|
@api.model
|
|
def get_token(self):
|
|
icp = self.env['ir.config_parameter'].sudo()
|
|
validity = icp.get_param('google_%s_token_validity' % self.STR_SERVICE)
|
|
token = icp.get_param('google_%s_token' % self.STR_SERVICE)
|
|
if not (validity and token):
|
|
raise Warning(_("You must configure your account."))
|
|
if datetime.strptime(validity.split('.')[0], DEFAULT_SERVER_DATETIME_FORMAT) < (datetime.now() + timedelta(minutes=3)):
|
|
token = self.do_refresh_token()
|
|
return token
|
|
|
|
@api.model
|
|
def do_refresh_token(self):
|
|
gs_pool = self.env['google.service']
|
|
icp = self.env['ir.config_parameter'].sudo()
|
|
|
|
rtoken = icp.get_param('google_%s_rtoken' % self.STR_SERVICE)
|
|
all_token = gs_pool._refresh_google_token_json(rtoken, self.STR_SERVICE)
|
|
|
|
icp.set_param('google_%s_token_validity' % self.STR_SERVICE, datetime.now() + timedelta(seconds=all_token.get('expires_in')))
|
|
icp.set_param('google_%s_token' % self.STR_SERVICE, all_token.get('access_token'))
|
|
return all_token.get('access_token')
|
|
|
|
# Should be called at configuration
|
|
def get_management_scope(self):
|
|
return 'https://www.googleapis.com/auth/analytics https://www.googleapis.com/auth/analytics.edit'
|
|
|
|
@api.model
|
|
def authorize_google_uri(self, from_url='http://www.odoo.com', context=None):
|
|
url = self.pool['google.service']._get_authorize_uri(self.env.cr, self.env.uid, from_url, self.STR_SERVICE, scope=self.get_management_scope(), context=self.env.context)
|
|
return url
|
|
|
|
# convert code from authorize into token
|
|
@api.model
|
|
def set_all_tokens(self, authorization_code):
|
|
gs_pool = self.env['google.service']
|
|
all_token = gs_pool._get_google_token_json(authorization_code, self.STR_SERVICE)
|
|
vals = {}
|
|
vals['google_%s_rtoken' % self.STR_SERVICE] = all_token.get('refresh_token')
|
|
vals['google_%s_token_validity' % self.STR_SERVICE] = datetime.now() + timedelta(seconds=all_token.get('expires_in'))
|
|
vals['google_%s_token' % self.STR_SERVICE] = all_token.get('access_token')
|
|
icp = self.env['ir.config_parameter'].sudo()
|
|
icp.set_param('google_%s_rtoken' % self.STR_SERVICE, all_token.get('refresh_token'))
|
|
icp.set_param('google_%s_token_validity' % self.STR_SERVICE, datetime.now() + timedelta(seconds=all_token.get('expires_in')))
|
|
icp.set_param('google_%s_token' % self.STR_SERVICE, all_token.get('access_token'))
|