Heredar Clases Web en Odoo (http.Controller)
Un tema muy importante que ha empezado a tomar importancia en Odoo es el desarrollo y las modificaciones del E-commerce desafortunadamente no tenemos mucha información así que estaré subiendo temas y mis propias investigaciones:
Lo primero con lo que quiero empezar es como hacer herencia de una clase web, esto se realiza de una forma muy sencilla:
- Debemos importar la clase a la cual vamos a heredar por ejemplo si queremos heredar la clase website_sale lo haríamos de la siguiente manera:
from openerp.addons.website_sale.controllers.main import website_sale
Observamos que básicamente hacemos un recorrido de toda la ruta de archivos hasta llegar al que contiene la clase a heredar.
- Segundo creamos la clase y la heredamos:
class website_sale_extension(website_sale):
- Con esto podremos hacer uso de los metodos propios de website_sale, podremos extenderlos o reemplazarlos.
Un ejemplo seria el siguiente, en donde arregle un Bug que tenia Odoo al momento de procesar un pago:
# -*- coding: utf-8 -*-
from openerp import http
from openerp import SUPERUSER_ID
from openerp.api import Environment
from openerp.addons.web.http import request
import logging
import werkzeug
from openerp import http
from openerp import tools
from openerp.tools.translate import _
from openerp.addons.website.models.website import slug
from openerp.addons.website_sale.controllers.main import website_sale
PPG = 20 # Products Per Page
PPR = 4 # Products Per Row
class website_sale_portal_invoice(website_sale):
def checkout_form_save(self, checkout):
cr, uid, context, registry = request.cr, request.uid, request.context, request.registry
order = request.website.sale_get_order(force_create=1, context=context)
orm_partner = registry.get('res.partner')
orm_user = registry.get('res.users')
order_obj = request.registry.get('sale.order')
partner_lang = request.lang if request.lang in [lang.code for lang in request.website.language_ids] else None
billing_info = {'customer': True}
if partner_lang:
billing_info['lang'] = partner_lang
billing_info.update(self.checkout_parse('billing', checkout, True))
# set partner_id
partner_id = None
if request.uid != request.website.user_id.id:
partner_id = orm_user.browse(cr, SUPERUSER_ID, uid, context=context).partner_id.id
elif order.partner_id:
user_ids = request.registry['res.users'].search(cr, SUPERUSER_ID,
[("partner_id", "=", order.partner_id.id)], context=dict(context or {}, active_test=False))
if not user_ids or request.website.user_id.id not in user_ids:
partner_id = order.partner_id.id
# save partner informations
if partner_id and request.website.partner_id.id != partner_id:
orm_partner.write(cr, SUPERUSER_ID, [partner_id], billing_info, context=context)
else:
# create partner
billing_info['team_id'] = request.website.salesteam_id.id
partner_id = orm_partner.create(cr, SUPERUSER_ID, billing_info, context=context)
order.write({'partner_id': partner_id})
### Correccion ###
order.onchange_partner_id()
### Error ###
# order_obj.onchange_partner_id(cr, SUPERUSER_ID, [order.id], context=context)
order.write({'partner_invoice_id': partner_id})
# create a new shipping partner
if checkout.get('shipping_id') == -1:
shipping_info = self._get_shipping_info(checkout)
if partner_lang:
shipping_info['lang'] = partner_lang
shipping_info['parent_id'] = partner_id
checkout['shipping_id'] = orm_partner.create(cr, SUPERUSER_ID, shipping_info, context)
if checkout.get('shipping_id'):
order.write({'partner_shipping_id': checkout['shipping_id']})
order_info = {
'message_partner_ids': [(4, partner_id), (3, request.website.partner_id.id)],
}
order_obj.write(cr, SUPERUSER_ID, [order.id], order_info, context=context)
Los puntos a resaltar en el código son los comentarios correccion y error con mi solución.