@ -4,6 +4,7 @@ from odoo.http import request
import werkzeug
from datetime import datetime
from odoo.tools import format_datetime , format_date , is_html_empty
from dateutil.relativedelta import relativedelta
from odoo.exceptions import UserError
from odoo.addons.website_event.controllers.main import WebsiteEventController
from odoo.addons.payment.controllers.portal import PaymentProcessing
@ -89,13 +90,24 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
@http.route ( [ ' /kalachakra/participation ' ] , type = ' http ' , auth = ' public ' , website = True , sitemap = False , csrf = False )
def participation ( self , type = None , * * post ) :
data = { }
request . session [ ' kalachakra_transaction ' ] = ' '
if type == ' donation ' :
request . session [ ' donation_transaction ' ] = True
request . session [ ' kalachakra_transaction ' ] = ' donation '
data [ ' kalachakra_transaction ' ] = ' donation '
data [ ' title ' ] = ' make donation '
data [ ' amount ' ] = 10
#donation product
data [ ' products ' ] = request . env [ ' product.product ' ] . search ( [ ( ' donation ' , ' = ' , True ) ] )
if type == ' membership ' :
request . session [ ' kalachakra_transaction ' ] = ' membership '
data [ ' kalachakra_transaction ' ] = ' membership '
data [ ' title ' ] = ' Become a member '
p = request . env [ ' product.template ' ] . search ( [ ( ' membership_product ' , ' = ' , True ) ] )
if not p : raise UserError ( _ ( ' No membership product, please add one ' ) )
data [ ' amount ' ] = p . list_price
#membership product
data [ ' products ' ] = p
userid = request . env . context . get ( ' uid ' )
@ -137,14 +149,21 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
data [ ' partner ' ] = partner
return http . request . render ( ' kalachakra.participation_form ' , data )
@http.route ( [ ' /kalachakra/payment_choice ' ] , type = ' http ' , auth = ' public ' , website = True , sitemap = False , csrf = False )
def payment_choice ( self , * * post ) :
#gestion du retour page précédente depuis page de paiement
if not post . get ( ' product_id ' ) :
if request . session [ ' kalachakra_transaction ' ] == ' donation ' :
request . env [ ' donation.donation ' ] . search ( [ ' id ' , ' = ' , int ( request . session [ ' donation_id ' ] ) ] ) . unlink ( )
if request . session [ ' kalachakra_transaction ' ] == ' membership ' :
request . env [ ' kalachakra.membership ' ] . search ( [ ' id ' , ' = ' , int ( request . session [ ' membership_id ' ] ) ] ) . unlink ( )
return request . redirect ( ' /kalachakra/participation?type= ' + request . session [ ' kalachakra_transaction ' ] )
userid = request . env . context . get ( ' uid ' )
if userid :
user = request . env [ ' res.users ' ] . search ( [ ( ' id ' , ' = ' , int ( userid ) ) ] )
@ -170,11 +189,15 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
data = { }
data [ ' submit_txt ' ] = ' Donate now '
if request . session [ ' kalachakra_transaction ' ] == ' donation ' :
data [ ' submit_txt ' ] = ' Donate now '
if request . session [ ' kalachakra_transaction ' ] in [ ' membership ' ] :
data [ ' submit_txt ' ] = ' Pay now '
data [ ' success_url ' ] = ' /kalachakra/payment/success '
data [ ' error_url ' ] = ' /kalachakra/payment/error '
if request . session . get ( ' donation_transaction ' ) == True :
if request . session [ ' kalachakra_transaction ' ] in [ ' donation ' , ' membership ' ] :
data [ ' acquirers ' ] = list ( request . env [ ' payment.acquirer ' ] . search ( [
( ' state ' , ' in ' , [ ' enabled ' , ' test ' ] ) ,
( ' company_id ' , ' = ' , request . env . company . id ) ,
@ -195,57 +218,48 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
data [ ' payment_tokens ' ] = payment_tokens
#create donation
vals = { }
vals [ ' partner_id ' ] = partner . id
vals [ ' donation_date ' ] = datetime . now ( )
vals [ ' tax_receipt_option ' ] = ' annual '
#mode de paiement CB
electronic_method = request . env [ ' account.payment.method ' ] . search ( [ ( ' code ' , ' = ' , ' electronic ' ) ] , limit = 1 )
if electronic_method :
cb_mode = request . env [ ' account.payment.mode ' ] . search ( [ ( ' payment_method_id ' , ' = ' , int ( electronic_method . id ) ) ] , limit = 1 )
if cb_mode :
vals [ ' payment_mode_id ' ] = cb_mode . id
else :
raise Warning ( ' please configure credit card mode ' )
vals [ ' state ' ] = ' draft '
vals [ ' payment_ref ' ] = ' internet '
donation_draft = request . env [ ' donation.donation ' ] . sudo ( ) . create ( vals )
vals = { }
#create line donation
vals [ ' donation_id ' ] = donation_draft . id
product = request . env [ ' product.product ' ] . search ( [ ( ' id ' , ' = ' , int ( post . get ( ' product_id ' ) ) ) ] )
vals [ ' product_id ' ] = int ( post . get ( ' product_id ' ) )
vals [ ' display_name ' ] = product . name
vals [ ' quantity ' ] = 1
vals [ ' unit_price ' ] = post . get ( ' amount ' )
vals [ ' tax_receipt_ok ' ] = product . tax_receipt_ok
donation_line = request . env [ ' donation.line ' ] . sudo ( ) . create ( vals )
#create sale order
# vals={}
# vals['partner_id']=partner.id
# order_draft=request.env['sale.order'].sudo().create(vals)
# data['order_id']=order_draft.id
# #création des lignes de devis
# vals={}
# vals['order_id']=order_draft.id
# #ajout du produit
# vals['product_id']=int(post.get('product_id'))
# vals['product_uom_qty']=1
# vals['price_unit']=post.get('amount')
# product=request.env['product.product'].search([('id','=',int(post.get('product_id')))])
# vals['name']=product.name
# order_line=request.env['sale.order.line'].sudo().create(vals)
if request . session [ ' kalachakra_transaction ' ] in [ ' donation ' ] :
vals = { }
vals [ ' partner_id ' ] = partner . id
vals [ ' donation_date ' ] = datetime . now ( )
vals [ ' tax_receipt_option ' ] = ' annual '
#mode de paiement CB
electronic_method = request . env [ ' account.payment.method ' ] . search ( [ ( ' code ' , ' = ' , ' electronic ' ) ] , limit = 1 )
if electronic_method :
cb_mode = request . env [ ' account.payment.mode ' ] . search ( [ ( ' payment_method_id ' , ' = ' , int ( electronic_method . id ) ) ] , limit = 1 )
if cb_mode :
vals [ ' payment_mode_id ' ] = cb_mode . id
else :
raise Warning ( ' please configure credit card mode ' )
vals [ ' state ' ] = ' draft '
vals [ ' payment_ref ' ] = ' internet '
donation_draft = request . env [ ' donation.donation ' ] . sudo ( ) . create ( vals )
vals = { }
#create line donation
vals [ ' donation_id ' ] = donation_draft . id
product = request . env [ ' product.product ' ] . search ( [ ( ' id ' , ' = ' , int ( post . get ( ' product_id ' ) ) ) ] )
vals [ ' product_id ' ] = int ( post . get ( ' product_id ' ) )
vals [ ' display_name ' ] = product . name
vals [ ' quantity ' ] = 1
vals [ ' unit_price ' ] = post . get ( ' amount ' )
vals [ ' tax_receipt_ok ' ] = product . tax_receipt_ok
donation_line = request . env [ ' donation.line ' ] . sudo ( ) . create ( vals )
data [ ' order_id ' ] = donation_draft . id
request . session [ ' donation_id ' ] = donation_draft . id
data [ ' order_id ' ] = donation_draft . id
request . session [ ' donation_id ' ] = donation_draft . id
#create membership
if request . session [ ' kalachakra_transaction ' ] in [ ' membership ' ] :
vals = { }
vals [ ' partner_id ' ] = partner . id
vals [ ' product_id ' ] = int ( post . get ( ' product_id ' ) )
vals [ ' start_date ' ] = datetime . now ( )
vals [ ' end_date ' ] = datetime . now ( ) + relativedelta ( years = 1 )
membership = request . env [ ' kalachakra.membership ' ] . sudo ( ) . create ( vals )
data [ ' order_id ' ] = membership . id
request . session [ ' membership_id ' ] = membership . id
return http . request . render ( ' kalachakra.payment_choice_form ' , data )
@ -263,7 +277,10 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
user is redirected to the checkout page
"""
# Ensure a payment acquirer is selected
donation_id = order_id
if not acquirer_id :
return False
@ -272,37 +289,71 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
except :
return False
if request . session [ ' kalachakra_transaction ' ] in [ ' donation ' ] :
# Retrieve the donation
donation_id = order_id
donation = request . env [ ' donation.donation ' ] . search ( [ ( ' id ' , ' = ' , int ( donation_id ) ) ] , limit = 1 )
# Retrieve the donation
donation = request . env [ ' donation.donation ' ] . search ( [ ( ' id ' , ' = ' , int ( donation_id ) ) ] , limit = 1 )
# Ensure there is something to proceed
if not donation or ( donation and not donation . line_ids ) :
return False
# Ensure there is something to proceed
if not donation or ( donation and not donation . line_ids ) :
return False
assert donation . partner_id . id != request . website . partner_id . id
# Create transaction
vals = { ' acquirer_id ' : acquirer_id ,
' return_url ' : ' /kalachakra/payment/validate ' }
if save_token :
vals [ ' type ' ] = ' form_save '
if token :
vals [ ' payment_token_id ' ] = int ( token )
transaction = donation . _create_payment_transaction ( vals )
# store the new transaction into the transaction list and if there's an old one, we remove it
# until the day the ecommerce supports multiple orders at the same time
last_tx_id = request . session . get ( ' __website_sale_last_tx_id ' )
last_tx = request . env [ ' payment.transaction ' ] . browse ( last_tx_id ) . sudo ( ) . exists ( )
if last_tx :
PaymentProcessing . remove_payment_transaction ( last_tx )
PaymentProcessing . add_payment_transaction ( transaction )
request . session [ ' __website_sale_last_tx_id ' ] = transaction . id
return transaction . render_donation_button ( donation )
if request . session [ ' kalachakra_transaction ' ] in [ ' membership ' ] :
# Retrieve the donation
membership_id = order_id
membership = request . env [ ' kalachakra.membership ' ] . search ( [ ( ' id ' , ' = ' , int ( membership_id ) ) ] , limit = 1 )
assert donation . partner_id . id != request . website . partner_id . id
# Create transaction
vals = { ' acquirer_id ' : acquirer_id ,
' return_url ' : ' /kalachakra/payment/validate ' }
if save_token :
vals [ ' type ' ] = ' form_save '
if token :
vals [ ' payment_token_id ' ] = int ( token )
transaction = donation . _create_payment_transaction ( vals )
# store the new transaction into the transaction list and if there's an old one, we remove it
# until the day the ecommerce supports multiple orders at the same time
last_tx_id = request . session . get ( ' __website_sale_last_tx_id ' )
last_tx = request . env [ ' payment.transaction ' ] . browse ( last_tx_id ) . sudo ( ) . exists ( )
if last_tx :
PaymentProcessing . remove_payment_transaction ( last_tx )
PaymentProcessing . add_payment_transaction ( transaction )
request . session [ ' __website_sale_last_tx_id ' ] = transaction . id
return transaction . render_donation_button ( donation )
# Ensure there is something to proceed
if not membership :
return False
assert membership . partner_id . id != request . website . partner_id . id
# Create transaction
vals = { ' acquirer_id ' : acquirer_id ,
' return_url ' : ' /kalachakra/payment/validate ' }
if save_token :
vals [ ' type ' ] = ' form_save '
if token :
vals [ ' payment_token_id ' ] = int ( token )
transaction = membership . _create_payment_transaction ( vals )
# store the new transaction into the transaction list and if there's an old one, we remove it
# until the day the ecommerce supports multiple orders at the same time
last_tx_id = request . session . get ( ' __website_sale_last_tx_id ' )
last_tx = request . env [ ' payment.transaction ' ] . browse ( last_tx_id ) . sudo ( ) . exists ( )
if last_tx :
PaymentProcessing . remove_payment_transaction ( last_tx )
PaymentProcessing . add_payment_transaction ( transaction )
request . session [ ' __website_sale_last_tx_id ' ] = transaction . id
return transaction . render_membership_button ( membership )
http . route ( ' /kalachakra/payment/token ' , type = ' http ' , auth = ' public ' , website = True , sitemap = False )
def kalachakra_payment_token ( self , pm_id = None , * * kwargs ) :
@ -323,7 +374,12 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
# Create transaction
vals = { ' payment_token_id ' : pm_id , ' return_url ' : ' /kalachakra/payment/validate ' }
tx = donation . _create_payment_transaction ( vals )
if request . session [ ' kalachakra_transaction ' ] in [ ' donation ' ] :
tx = donation . _create_payment_transaction ( vals )
if request . session [ ' kalachakra_transaction ' ] in [ ' membership ' ] :
tx = membership . _create_payment_transaction ( vals )
request . session [ ' transaction_id ' ] = tx . id
PaymentProcessing . add_payment_transaction ( tx )
return request . redirect ( ' kalachakra/payment/process ' )
@ -347,11 +403,20 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
- UDPATE ME
"""
donation_id = int ( request . session [ ' donation_id ' ] )
#validation du don car la tranasction est ok
donation = request . env [ ' donation.donation ' ] . search ( [ ( ' id ' , ' = ' , donation_id ) ] )
donation . state = ' done '
request . session [ ' donation_id ' ] = None
if request . session [ ' kalachakra_transaction ' ] in [ ' donation ' ] :
donation_id = int ( request . session [ ' donation_id ' ] )
#validation du don car la tranasction est ok
donation = request . env [ ' donation.donation ' ] . search ( [ ( ' id ' , ' = ' , donation_id ) ] )
donation . state = ' done '
request . session [ ' donation_id ' ] = None
if request . session [ ' kalachakra_transaction ' ] in [ ' membership ' ] :
membership_id = int ( request . session [ ' membership_id ' ] )
#validation du don car la tranasction est ok
membership = request . env [ ' kalachakra.membership ' ] . search ( [ ( ' id ' , ' = ' , membership_id ) ] )
membership . state = ' done '
request . session [ ' membership_id ' ] = None
transaction_id = int ( request . session [ ' __website_sale_last_tx_id ' ] )
tx = request . env [ ' payment.transaction ' ] . sudo ( ) . browse ( transaction_id )
@ -362,43 +427,10 @@ class kalachakra_event(WebsiteEventController,PaymentProcessing):
PaymentProcessing . remove_payment_transaction ( tx )
return request . redirect ( ' /kalachakra/payment/confirmation ' )
# if sale_order_id is None:
# order = request.website.sale_get_order()
# else:
# order = request.env['sale.order'].sudo().browse(sale_order_id)
# assert order.id == request.session.get('sale_last_order_id')
# if transaction_id:
# tx = request.env['payment.transaction'].sudo().browse(transaction_id)
# assert tx in order.transaction_ids()
# elif order:
# tx = order.get_portal_last_transaction()
# else:
# tx = None
# if not order or (order.amount_total and not tx):
# return request.redirect('/kalachakra/ma')
# if order and not order.amount_total and not tx:
# order.with_context(send_email=True).action_confirm()
# return request.redirect(order.get_portal_url())
# # clean context and session, then redirect to the confirmation page
# request.website.sale_reset()
# if tx and tx.state == 'draft':
# return request.redirect('/kalachakra/')
# PaymentProcessing.remove_payment_transaction(tx)
# return request.redirect('/kalachakra/payment/confirmation')
@http.route ( [ ' /kalachakra/payment/confirmation ' ] , type = ' http ' , auth = " public " , website = True , sitemap = False )
def kalachakra_payment_confirmation ( self , * * post ) :
return request . render ( " kalachakra.thankyou " )
# sale_order_id = request.session.get('sale_last_order_id')
# if sale_order_id:
# order = request.env['sale.order'].sudo().browse(sale_order_id)
# return request.render("website_sale.confirmation", {'order': order})
# else:
# return request.redirect('/shop')