# -*- coding: utf-8 -*-
#################################################################################
# Author : Webkul Software Pvt. Ltd. (:wink:
# Copyright(c): 2015-Present Webkul Software Pvt. Ltd.
# All Rights Reserved.
#
#
#
# This program is copyright property of the author mentioned above.
# You can`t redistribute it and/or modify it.
#
#
# You should have received a copy of the License along with this program.
# If not, see ;
#################################################################################
from odoo import http
from odoo.http import request
from odoo import fields
import logging
_logger = logging.getLogger(__name__)
from odoo.addons.website_sale.controllers.main import WebsiteSale
import datetime
class WebsiteSale(WebsiteSale):
def create_aff_visit_entry(self,vals):
ppc_exist = self.check_ppc_exist(vals)
if ppc_exist:
visit = ppc_exist
else:
visit = request.env['affiliate.visit'].sudo().create(vals)
return visit
def check_ppc_exist(self,vals):
domain = [('type_id','=',vals['type_id']),('affiliate_method','=',vals['affiliate_method']),('affiliate_key','=',vals['affiliate_key']),('ip_address','=',vals['ip_address'])]
visit = request.env['affiliate.visit'].sudo().search(domain)
check_unique_ppc = request.env['res.config.settings'].sudo().website_constant().get('unique_ppc_traffic')
# "check_unique_ppc" it cheacks that in config setting wheather the unique ppc is enable or not
if check_unique_ppc:
if visit:
return visit
else:
return False
else:
return False
# override shop action in website_sale
@http.route([
'/shop',
'/shop/page/',
'/shop/category/',
'/shop/category//page/'
], type='http', auth="public", website=True,sitemap=WebsiteSale.sitemap_shop)
def shop(self, page=0, category=None, search='', ppg=False, **post):
enable_ppc = request.env['res.config.settings'].sudo().website_constant().get('enable_ppc')
expire = False
result = super(WebsiteSale,self).shop(page=page, category=category, search=search, ppg=ppg, **post)
aff_key = request.httprequest.args.get('aff_key')
if category and aff_key:
expire = self.calc_cookie_expire_date()
path = request.httprequest.full_path
partner_id = request.env['res.partner'].sudo().search([('res_affiliate_key','=',aff_key),('is_affiliate','=',True)])
vals = self.create_affiliate_visit(aff_key,partner_id,category)
vals.update({'affiliate_type':'category'})
if ( len(partner_id) == 1):
affiliate_visit = self.create_aff_visit_entry(vals) if enable_ppc else False
result.set_cookie(key='affkey_%s'%(aff_key), value='category_%s'%(category.id),expires=expire)
else:
_logger.info("=====affiliate_visit not created by category===========")
else:
if aff_key:
expire = self.calc_cookie_expire_date()
partner_id = request.env['res.partner'].sudo().search([('res_affiliate_key','=',aff_key),('is_affiliate','=',True)])
if partner_id:
result.set_cookie(key='affkey_%s'%(aff_key), value='shop',expires=expire)
return result
@http.route(['/shop/'], type='http', auth="public", website=True)
def product(self, product, category='', search='', **kwargs):
_logger.info("=====product page=========")
_logger.info("=====product page aff_key==%r=========",request.httprequest.args)
enable_ppc = request.env['res.config.settings'].sudo().website_constant().get('enable_ppc')
expire = self.calc_cookie_expire_date()
result = super(WebsiteSale,self).product(product=product, category=category, search=search, **kwargs)
if request.httprequest.args.get('aff_key'):
# path is the complete url with url = xxxx?aff_key=XXXXXXXX
path = request.httprequest.full_path
# aff_key is fetch from url
aff_key = request.httprequest.args.get('aff_key')
partner_id = request.env['res.partner'].sudo().search([('res_affiliate_key','=',aff_key),('is_affiliate','=',True)])
vals = self.create_affiliate_visit(aff_key,partner_id,product)
vals.update({'affiliate_type':'product'})
if ( len(partner_id) == 1):
affiliate_visit = self.create_aff_visit_entry(vals) if enable_ppc else False
# "create_aff_visit_entry " this methods check weather the visit is already created or not or if created return the no. of existing record in object
result.set_cookie(key='affkey_%s'%(aff_key),value='product_%s'%(product.id),expires=expire)
_logger.info("============affiliate_visit created by product==%r=======",affiliate_visit)
else:
_logger.info("=====affiliate_visit not created by product===========%s %s"%(aff_key,partner_id))
return result
@http.route(['/shop/confirmation'], type='http', auth="public", website=True)
def shop_payment_confirmation(self, **post):
result = super(WebsiteSale,self).shop_payment_confirmation(**post)
# here result id http.render argument is http.render{ http.render(template, qcontext=None, lazy=True, **kw) }
sale_order_id = result.qcontext.get('order')
return self.update_affiliate_visit_cookies( sale_order_id,result )
def create_affiliate_visit(self,aff_key,partner_id,type_id):
""" method to delete the cookie after update function on id"""
vals = {
'affiliate_method':'ppc',
'affiliate_key':aff_key,
'affiliate_partner_id':partner_id.id,
'url':request.httprequest.full_path,
'ip_address':request.httprequest.environ['REMOTE_ADDR'],
'type_id':type_id.id,
'convert_date':fields.datetime.now(),
'affiliate_program_id': partner_id.affiliate_program_id.id,
}
return vals
def update_affiliate_visit_cookies(self , sale_order_id ,result):
"""update affiliate.visit from cokkies data i.e created in product and shop method"""
cookies = dict(request.httprequest.cookies)
visit = request.env['affiliate.visit']
arr=[]# contains cookies product_id
for k,v in cookies.items():
if 'affkey_' in k:
arr.append(k.split('_')[1])
if arr:
partner_id = request.env['res.partner'].sudo().search([('res_affiliate_key','=',arr[0]),('is_affiliate','=',True)])
for s in sale_order_id.order_line:
if len(arr)>0 and partner_id:
product_tmpl_id = s.product_id.product_tmpl_id.id
aff_visit = visit.sudo().create({
'affiliate_method':'pps',
'affiliate_key':arr[0],
'affiliate_partner_id':partner_id.id,
'url':"",
'ip_address':request.httprequest.environ['REMOTE_ADDR'],
'type_id':product_tmpl_id,
'affiliate_type': 'product',
'type_name':s.product_id.id,
'sales_order_line_id':s.id,
'convert_date':fields.datetime.now(),
'affiliate_program_id': partner_id.affiliate_program_id.id,
'product_quantity' : s.product_uom_qty,
'is_converted':True
})
# delete cookie after first sale occur
cookie_del_status=False
for k,v in cookies.items():
if 'affkey_' in k:
cookie_del_status = result.delete_cookie(key=k)
return result
def calc_cookie_expire_date(self):
ConfigValues = request.env['res.config.settings'].sudo().website_constant()
cookie_expire = ConfigValues.get('cookie_expire')
cookie_expire_period = ConfigValues.get('cookie_expire_period')
time_dict = {
'hours':cookie_expire,
'days':cookie_expire*24,
'months':cookie_expire*24*30,
}
return datetime.datetime.utcnow() + datetime.timedelta(hours=time_dict[cookie_expire_period])