# -*- coding: utf-8 -*- from odoo import http 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 from odoo.addons.auth_signup.controllers.main import AuthSignupHome from odoo.addons.sale.controllers.portal import CustomerPortal from odoo.addons.portal.controllers.portal import pager as portal_pager, get_records_pager class kalachakra_event(WebsiteEventController,PaymentProcessing,AuthSignupHome): def _extract_searched_event_tags(self, searches): tags = request.env['event.tag'] if searches.get('tags'): tags = request.env['event.tag'].search([('name', '=', searches['tags'])]) return tags @http.route(['/event/calendar'], type='http', auth='public', website=True, sitemap=False,csrf=False) def eventCalendar(self,**post): url='https://calendar.google.com/calendar/embed?height=600&wkst=2&bgcolor=%23ffffff&ctz=Europe%2FParis&mode=WEEK&src=aXRrYWxhY2hha3JhQGdtYWlsLmNvbQ&src=bjYxODA1OXQ2dmRwNmp0Y3Foa3FjMTMwdWtAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&src=MnJzc2VvY3MzcGNiaDliaGFvNXZ1a3JpM3NAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&src=cGJ0YjBtbTBja2NsMDZmdTNvb2ViMDJpOXNAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&src=ZnIuZnJlbmNoI2hvbGlkYXlAZ3JvdXAudi5jYWxlbmRhci5nb29nbGUuY29t&color=%23039BE5&color=%238E24AA&color=%23E4C441&color=%237CB342&color=%230B8043" style="border:solid 1px #777" width="800" height="600" frameborder="0" scrolling="no"' #url='https://calendar.google.com/calendar/embed?height=600&wkst=1&bgcolor=%23ffffff&ctz=Europe%2FParis&src=cmF5bmFsZC5jYW5kZWxpZXJAZ21haWwuY29t&src=Z3I4aGdpbm5hYjNwZ2ExY3M4MTAxczVlcjhAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&src=ZnIuZnJlbmNoI2hvbGlkYXlAZ3JvdXAudi5jYWxlbmRhci5nb29nbGUuY29t&color=%23039BE5&color=%23D50000&color=%237986CB' return http.request.render('kalachakra.event_calendar',{'url':url}) @http.route(['/event/calendartui'], type='http', auth='public', website=True, sitemap=False,csrf=False) def eventCalendartui(self,**post): return http.request.render('kalachakra.event_calendartui') @http.route(['/kalachakra/contactus'], type='http', auth='public', website=True, sitemap=False,csrf=False) def kalachakracontactus(self,**post): return http.request.render('kalachakra.contactus') @http.route(['/kalachakra/programme'], type='http', auth='public', website=True, sitemap=False,csrf=False) def kalachakracontactus(self,**post): return http.request.redirect('https://www.dropbox.com/s/ijsd6n82oyp0gw8/programme_Paris.pdf?dl=0') @http.route(['/event/registration/step1'], type='http', auth='user', website=True, sitemap=False,csrf=False) def event_registration_step1(self,event_id,*args,**kw): #contact lié à l'utilisateur userid=request.env.context.get('uid') user=request.env['res.users'].search([('id','=',int(userid))]) partner=request.env['res.partner'].sudo().search([('id','=',int(user.partner_id))]) request.session['partner_id']=int(partner.id) #si le pays n'est pas renseigné, on le renseigne avec France #c'est indispensable pour pouvoir régléer le devis if not partner.country_id: country=request.env['res.country'].search([('name','=','France')]) partner.country_id=country.id data={} data['partner']=partner #évenement request.session['event_id']=int(event_id) event=request.env['event.event'].sudo().search([('id','=',int(event_id))]) data['event']=event data['status']=partner.member_status if data['status']=='not member':data['status']='standard' #prix data['price']='' if data['status']=='standard':data['price']=event.booking_price if data['status']=='member':data['price']=event.booking_member_price if data['status']=='super member':data['price']=event.booking_super_member_price if event.online_event: return http.request.render('kalachakra.registration_distancial',data) @http.route(['/kalachakra/makedonation'], type='http', auth='public', website=True, sitemap=False,csrf=False) def makedonation(self,**post): data={} userid=request.env.context.get('uid') #title options title=request.env['res.partner.title'].sudo().search([]) data['titles']=title title_male=request.env['res.partner.title'].sudo().search([('name','=','Monsieur')]) #country options country=request.env['res.country'].sudo().search([]) data['countries']=country country_france=request.env['res.country'].sudo().search([('name','=','France')]) if userid: user=request.env['res.users'].search([('id','=',int(userid))]) partner=request.env['res.partner'].sudo().search([('id','=',int(user.partner_id))]) request.session['partner_id']=int(partner.id) data['partner']=partner else: partner=request.env['res.partner'] partner.email='' partner.title=title_male.id partner.country_id=country_france.id partner.firstname='' partner.name='' partner.street='' partner.street2='' partner.zip='' data['partner']=partner data['amount']=10 return http.request.render('kalachakra.makedonation_form',data) @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['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') #title options title=request.env['res.partner.title'].sudo().search([]) data['titles']=title if userid: user=request.env['res.users'].search([('id','=',int(userid))]) partner=request.env['res.partner'].sudo().search([('id','=',int(user.partner_id))]) request.session['partner_id']=int(partner.id) data['partner']=partner data['registred']=True else: data['registred']=False title_male=request.env['res.partner.title'].sudo().search([('name','=','Monsieur')]) #country options country=request.env['res.country'].sudo().search([]) data['countries']=country country_france=request.env['res.country'].sudo().search([('name','=','France')]) partner=request.env['res.partner'] partner.email='' partner.title=title_male.id partner.country_id=country_france.id partner.firstname='' partner.name='' partner.street='' partner.street2='' partner.zip='' 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 : on supprime les éléments générés ( don , adhésion) 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))]) partner=request.env['res.partner'].sudo().search([('id','=',int(user.partner_id))]) request.session['partner_id']=int(partner.id) else: #si pas connecté on chercher le contact indiqué par l'email partner=request.env['res.partner'].sudo().search([('email','=',post.get('email'))],limit=1) #si pas de contact on le créé dans la base if not partner: vals={} vals['email']=post.get('email') vals['name']=post.get('name') vals['firstname']=post.get('firstname') vals['title']=int(post.get('title_id')) vals['street']=post.get('street') vals['street2']=post.get('street2') vals['zip']=post.get('zip') vals['country_id']=int(post.get('country_id')) vals['phone']=post.get('phone') partner=request.env['res.partner'].sudo().create(vals) data={} if request.session['kalachakra_transaction']=='donation': data['submit_txt']='Donate now' if request.session['kalachakra_transaction']=='membership': data['submit_txt']='Pay now' data['success_url']='/kalachakra/payment/success' data['error_url']='/kalachakra/payment/error' 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), ('provider', '!=', 'transfer') ])) else: data['acquirers'] = list(request.env['payment.acquirer'].search([ ('state', 'in', ['enabled', 'test']), ('company_id', '=', request.env.company.id) ])) payment_tokens = partner.payment_token_ids payment_tokens |= partner.commercial_partner_id.sudo().payment_token_ids data['payment_tokens']=payment_tokens #create donation 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 #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) vals['amount']=post.get('amount') 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) @http.route(['/kalachakra/payment/transaction/', '/kalachakra/payment/transaction/', '/kalachakra/payment/transaction//'], type='json', auth="public", website=True) def kalachakra_payment_transaction(self, acquirer_id,order_id, save_token=False, so_id=None, access_token=None, token=None, **kwargs): """ Json method that creates a payment.transaction, used to create a transaction when the user clicks on 'pay now' button. After having created the transaction, the event continues and the user is redirected to the acquirer website. :param int acquirer_id: id of a payment.acquirer record. If not set the user is redirected to the checkout page """ # Ensure a payment acquirer is selected if not acquirer_id: return False try: acquirer_id = int(acquirer_id) 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) # 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) # 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): """ Method that handles payment using saved tokens :param int pm_id: id of the payment.token that we want to use to pay. """ try: pm_id = int(pm_id) except ValueError: return request.redirect('/shop/?error=invalid_token_id') # We retrieve the token the user want to use to pay if not request.env['payment.token'].sudo().search_count([('id', '=', pm_id)]): return request.redirect('/shop/?error=token_not_found') # Create transaction vals = {'payment_token_id': pm_id, 'return_url': '/kalachakra/payment/validate'} 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') @http.route(['/kalachakra/payment/process'], type="http", auth="public", website=True, sitemap=False) def kalachakra_payment_status_page(self, **kwargs): # When the customer is redirect to this website page, # we retrieve the payment transaction list from his session tx_ids_list = self.get_payment_transaction_ids() payment_transaction_ids = request.env['payment.transaction'].sudo().browse(tx_ids_list).exists() render_ctx = { 'payment_tx_ids': payment_transaction_ids.ids, } return request.render("payment.payment_process_page", render_ctx) @http.route('/kalachakra/payment/validate', type='http', auth="public", website=True, sitemap=False) def kalachakra_payment_validate(self, transaction_id=None, sale_order_id=None, **post): """ Method that should be called by the server when receiving an update for a transaction. State at this point : - UDPATE ME """ 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) 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")