[FIX] website_event_sale: multi tickets
bzr revid: chm@openerp.com-20140502140152-hx7ktaf0cg2m7ija
This commit is contained in:
parent
ee16b014b1
commit
c10800f2f1
|
@ -37,6 +37,9 @@ class product_template(osv.osv):
|
||||||
|
|
||||||
class product(osv.osv):
|
class product(osv.osv):
|
||||||
_inherit = 'product.product'
|
_inherit = 'product.product'
|
||||||
|
_columns = {
|
||||||
|
'event_ticket_ids': fields.one2many('event.event.ticket', 'product_id', 'Event Tickets'),
|
||||||
|
}
|
||||||
|
|
||||||
def onchange_event_ok(self, cr, uid, ids, type, event_ok, context=None):
|
def onchange_event_ok(self, cr, uid, ids, type, event_ok, context=None):
|
||||||
# cannot directly forward to product.template as the ids are theoretically different
|
# cannot directly forward to product.template as the ids are theoretically different
|
||||||
|
|
|
@ -28,54 +28,23 @@ from openerp.tools.translate import _
|
||||||
|
|
||||||
class website_event(website_event):
|
class website_event(website_event):
|
||||||
|
|
||||||
@http.route(['/event/add_cart'], type='http', auth="public", website=True, multilang=True)
|
@http.route(['/event/cart/update'], type='http', auth="public", methods=['POST'], website=True, multilang=True)
|
||||||
def add_cart(self, event_id, **post):
|
def cart_update(self, event_id, **post):
|
||||||
user_obj = request.registry['res.users']
|
cr, uid, context = request.cr, request.uid, request.context
|
||||||
order_line_obj = request.registry.get('sale.order.line')
|
|
||||||
ticket_obj = request.registry.get('event.event.ticket')
|
ticket_obj = request.registry.get('event.event.ticket')
|
||||||
order_obj = request.registry.get('sale.order')
|
|
||||||
|
|
||||||
order = request.website.sale_get_order(force_create=1)
|
sale = False
|
||||||
|
|
||||||
partner_id = user_obj.browse(request.cr, SUPERUSER_ID, request.uid,
|
|
||||||
context=request.context).partner_id.id
|
|
||||||
|
|
||||||
fields = [k for k, v in order_line_obj._columns.items()]
|
|
||||||
values = order_line_obj.default_get(request.cr, SUPERUSER_ID, fields,
|
|
||||||
context=request.context)
|
|
||||||
|
|
||||||
_values = None
|
|
||||||
for key, value in post.items():
|
for key, value in post.items():
|
||||||
try:
|
quantity = int(value or "0")
|
||||||
quantity = int(value)
|
if not quantity:
|
||||||
assert quantity > 0
|
|
||||||
except:
|
|
||||||
quantity = None
|
|
||||||
ticket_id = key.split("-")[0] == 'ticket' and int(key.split("-")[1]) or None
|
|
||||||
if not ticket_id or not quantity:
|
|
||||||
continue
|
continue
|
||||||
ticket = ticket_obj.browse(request.cr, request.uid, ticket_id,
|
sale = True
|
||||||
context=request.context)
|
ticket_id = key.split("-")[0] == 'ticket' and int(key.split("-")[1]) or None
|
||||||
|
ticket = ticket_obj.browse(cr, SUPERUSER_ID, ticket_id, context=context)
|
||||||
|
request.website.sale_get_order(force_create=1)._cart_update(
|
||||||
|
product_id=ticket.product_id.id, add_qty=quantity, context=dict(context, event_ticket_id=ticket.id))
|
||||||
|
|
||||||
values['product_id'] = ticket.product_id.id
|
if not sale:
|
||||||
values['event_id'] = ticket.event_id.id
|
|
||||||
values['event_ticket_id'] = ticket.id
|
|
||||||
values['product_uom_qty'] = quantity
|
|
||||||
values['price_unit'] = ticket.price
|
|
||||||
values['order_id'] = order.id
|
|
||||||
values['name'] = "%s: %s" % (ticket.event_id.name, ticket.name)
|
|
||||||
|
|
||||||
# change and record value
|
|
||||||
pricelist_id = order.pricelist_id and order.pricelist_id.id or False
|
|
||||||
_values = order_line_obj.product_id_change(
|
|
||||||
request.cr, SUPERUSER_ID, [], pricelist_id, ticket.product_id.id,
|
|
||||||
partner_id=partner_id, context=request.context)['value']
|
|
||||||
_values.update(values)
|
|
||||||
|
|
||||||
order_line_id = order_line_obj.create(request.cr, SUPERUSER_ID, _values, context=request.context)
|
|
||||||
order_obj.write(request.cr, SUPERUSER_ID, [order.id], {'order_line': [(4, order_line_id)]}, context=request.context)
|
|
||||||
|
|
||||||
if not _values:
|
|
||||||
return request.redirect("/event/%s" % event_id)
|
return request.redirect("/event/%s" % event_id)
|
||||||
return request.redirect("/shop/checkout")
|
return request.redirect("/shop/checkout")
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
import product
|
import product
|
||||||
import website
|
import website
|
||||||
|
import sale_order
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from openerp import SUPERUSER_ID
|
||||||
|
from openerp.osv import osv, fields
|
||||||
|
from openerp.tools.translate import _
|
||||||
|
|
||||||
|
# defined for access rules
|
||||||
|
class sale_order(osv.Model):
|
||||||
|
_inherit = "sale.order"
|
||||||
|
|
||||||
|
def _cart_find_product_line(self, cr, uid, ids, product_id=None, line_id=None, context=None):
|
||||||
|
for so in self.browse(cr, uid, ids, context=context):
|
||||||
|
order_line_id = None
|
||||||
|
domain = [('order_id', '=', so.id), ('product_id', '=', product_id)]
|
||||||
|
if line_id:
|
||||||
|
domain += [('id', '=', line_id)]
|
||||||
|
elif context.get("event_ticket_id"):
|
||||||
|
domain += [('event_ticket_id', '=', context.get("event_ticket_id"))]
|
||||||
|
order_line_ids = self.pool.get('sale.order.line').search(cr, SUPERUSER_ID, domain, context=context)
|
||||||
|
if order_line_ids:
|
||||||
|
order_line_id = order_line_ids[0]
|
||||||
|
return order_line_id
|
||||||
|
|
||||||
|
def _website_product_id_change(self, cr, uid, ids, order_id, product_id, line_id=None, context=None):
|
||||||
|
values = super(sale_order,self)._website_product_id_change(cr, uid, ids, order_id, product_id, line_id=None, context=None)
|
||||||
|
|
||||||
|
event_ticket_id = None
|
||||||
|
if context.get("event_ticket_id"):
|
||||||
|
event_ticket_id = context.get("event_ticket_id")
|
||||||
|
elif line_id:
|
||||||
|
line = self.pool.get('sale.order.line').browse(cr, SUPERUSER_ID, line_id, context=context)
|
||||||
|
if line.event_ticket_id:
|
||||||
|
event_ticket_id = line.event_ticket_id.id
|
||||||
|
else:
|
||||||
|
product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||||
|
if product.event_ticket_ids:
|
||||||
|
event_ticket_id = product.event_ticket_ids[0]
|
||||||
|
|
||||||
|
if event_ticket_id:
|
||||||
|
ticket = self.pool.get('event.event.ticket').browse(cr, uid, event_ticket_id, context=context)
|
||||||
|
if product_id != ticket.product_id.id:
|
||||||
|
raise osv.except_osv(_('Error!'),_("The ticket doesn't match with this product."))
|
||||||
|
|
||||||
|
values['product_id'] = ticket.product_id.id
|
||||||
|
values['event_id'] = ticket.event_id.id
|
||||||
|
values['event_ticket_id'] = ticket.id
|
||||||
|
values['price_unit'] = ticket.price
|
||||||
|
values['name'] = "%s: %s" % (ticket.event_id.name, ticket.name)
|
||||||
|
|
||||||
|
return values
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
<template id="event_description_full" inherit_id="website_event.event_description_full" inherit_option_id="website_event.event_description_full" name="Event's Ticket form">
|
<template id="event_description_full" inherit_id="website_event.event_description_full" inherit_option_id="website_event.event_description_full" name="Event's Ticket form">
|
||||||
<xpath expr="//div[@t-field='event.description']" position="before">
|
<xpath expr="//div[@t-field='event.description']" position="before">
|
||||||
<form t-attf-action="/event/add_cart?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids">
|
<form t-attf-action="/event/cart/update?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids">
|
||||||
<table itemprop="offers" class="table table-striped">
|
<table itemprop="offers" class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
|
@ -234,9 +234,9 @@ class website_sale(http.Controller):
|
||||||
return request.redirect("/shop/cart")
|
return request.redirect("/shop/cart")
|
||||||
|
|
||||||
@http.route(['/shop/cart/update_json'], type='json', auth="public", methods=['POST'], website=True, multilang=True)
|
@http.route(['/shop/cart/update_json'], type='json', auth="public", methods=['POST'], website=True, multilang=True)
|
||||||
def cart_update_json(self, product_id, add_qty=None, set_qty=None):
|
def cart_update_json(self, product_id, line_id, add_qty=None, set_qty=None):
|
||||||
order = request.website.sale_get_order(force_create=1)
|
order = request.website.sale_get_order(force_create=1)
|
||||||
quantity = order._cart_update(product_id=product_id, add_qty=add_qty, set_qty=set_qty)
|
quantity = order._cart_update(product_id=product_id, line_id=line_id, add_qty=add_qty, set_qty=set_qty)
|
||||||
return {
|
return {
|
||||||
'quantity': quantity,
|
'quantity': quantity,
|
||||||
'cart_quantity': order.cart_quantity,
|
'cart_quantity': order.cart_quantity,
|
||||||
|
|
|
@ -40,40 +40,51 @@ class sale_order(osv.Model):
|
||||||
'order': order
|
'order': order
|
||||||
}
|
}
|
||||||
|
|
||||||
def _cart_find_product_line(self, cr, uid, ids, product_id=None, context=None):
|
def _cart_find_product_line(self, cr, uid, ids, product_id=None, line_id=None, context=None):
|
||||||
for so in self.browse(cr, uid, ids, context=context):
|
for so in self.browse(cr, uid, ids, context=context):
|
||||||
line_id = None
|
order_line_id = None
|
||||||
line_ids = self.pool.get('sale.order.line').search(cr, SUPERUSER_ID, [('order_id', '=', so.id), ('product_id', '=', product_id)], context=context)
|
domain = [('order_id', '=', so.id), ('product_id', '=', product_id)]
|
||||||
if line_ids:
|
if line_id:
|
||||||
line_id = line_ids[0]
|
domain += [('id', '=', line_id)]
|
||||||
return line_id
|
order_line_ids = self.pool.get('sale.order.line').search(cr, SUPERUSER_ID, domain, context=context)
|
||||||
|
if order_line_ids:
|
||||||
|
order_line_id = order_line_ids[0]
|
||||||
|
return order_line_id
|
||||||
|
|
||||||
def _cart_update(self, cr, uid, ids, product_id=None, add_qty=0, set_qty=0, context=None):
|
def _website_product_id_change(self, cr, uid, ids, order_id, product_id, line_id=None, context=None):
|
||||||
|
so = self.pool.get('sale.order').browse(cr, uid, order_id, context=context)
|
||||||
|
|
||||||
|
values = self.pool.get('sale.order.line').product_id_change(cr, SUPERUSER_ID, [],
|
||||||
|
pricelist=so.pricelist_id.id,
|
||||||
|
product=product_id,
|
||||||
|
partner_id=so.partner_id.id,
|
||||||
|
context=context
|
||||||
|
)['value']
|
||||||
|
|
||||||
|
if line_id:
|
||||||
|
line = self.pool.get('sale.order.line').browse(cr, SUPERUSER_ID, line_id, context=context)
|
||||||
|
values['name'] = line.name
|
||||||
|
else:
|
||||||
|
product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||||
|
values['name'] = product.name_get()[0][1]
|
||||||
|
|
||||||
|
values['product_id'] = product_id
|
||||||
|
values['order_id'] = order_id
|
||||||
|
if values.get('tax_id') != None:
|
||||||
|
values['tax_id'] = [(6, 0, values['tax_id'])]
|
||||||
|
return values
|
||||||
|
|
||||||
|
def _cart_update(self, cr, uid, ids, product_id=None, line_id=None, add_qty=0, set_qty=0, context=None):
|
||||||
""" Add or set product quantity, add_qty can be negative """
|
""" Add or set product quantity, add_qty can be negative """
|
||||||
sol = self.pool.get('sale.order.line')
|
sol = self.pool.get('sale.order.line')
|
||||||
|
|
||||||
def product_id_change(so, product_id):
|
|
||||||
values = sol.product_id_change(cr, SUPERUSER_ID, [],
|
|
||||||
pricelist=so.pricelist_id.id,
|
|
||||||
product=product_id,
|
|
||||||
partner_id=so.partner_id.id,
|
|
||||||
context=context
|
|
||||||
)['value']
|
|
||||||
values['name'] = "%s: %s" % (product.name, product.variants) if product.variants else product.name
|
|
||||||
values['product_id'] = product_id
|
|
||||||
values['order_id'] = so.id
|
|
||||||
if values.get('tax_id') != None:
|
|
||||||
values['tax_id'] = [(6, 0, values['tax_id'])]
|
|
||||||
return values
|
|
||||||
|
|
||||||
quantity = 0
|
quantity = 0
|
||||||
for so in self.browse(cr, uid, ids, context=context):
|
for so in self.browse(cr, uid, ids, context=context):
|
||||||
product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
line_id = so._cart_find_product_line(product_id, line_id, context=context)
|
||||||
line_id = so._cart_find_product_line(product_id)
|
|
||||||
|
|
||||||
# Create line if no line with product_id can be located
|
# Create line if no line with product_id can be located
|
||||||
if not line_id:
|
if not line_id:
|
||||||
values = product_id_change(so, product_id)
|
values = self._website_product_id_change(cr, uid, ids, so.id, product_id, context=context)
|
||||||
line_id = sol.create(cr, SUPERUSER_ID, values, context=context)
|
line_id = sol.create(cr, SUPERUSER_ID, values, context=context)
|
||||||
|
|
||||||
# compute new quantity
|
# compute new quantity
|
||||||
|
@ -87,7 +98,7 @@ class sale_order(osv.Model):
|
||||||
sol.unlink(cr, SUPERUSER_ID, [line_id], context=context)
|
sol.unlink(cr, SUPERUSER_ID, [line_id], context=context)
|
||||||
else:
|
else:
|
||||||
# update line
|
# update line
|
||||||
values = product_id_change(so, product_id)
|
values = self._website_product_id_change(cr, uid, ids, so.id, product_id, line_id, context=context)
|
||||||
values['product_uom_qty'] = quantity
|
values['product_uom_qty'] = quantity
|
||||||
sol.write(cr, SUPERUSER_ID, [line_id], values, context=context)
|
sol.write(cr, SUPERUSER_ID, [line_id], values, context=context)
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,8 @@ $(document).ready(function () {
|
||||||
var value = parseInt($input.val(), 10);
|
var value = parseInt($input.val(), 10);
|
||||||
if (isNaN(value)) value = 0;
|
if (isNaN(value)) value = 0;
|
||||||
openerp.jsonRpc("/shop/cart/update_json", 'call', {
|
openerp.jsonRpc("/shop/cart/update_json", 'call', {
|
||||||
'product_id': parseInt($input.data('id'),10),
|
'line_id': parseInt($input.data('line-id'),10),
|
||||||
|
'product_id': parseInt($input.data('product-id'),10),
|
||||||
'set_qty': value})
|
'set_qty': value})
|
||||||
.then(function (data) {
|
.then(function (data) {
|
||||||
if (!data.quantity) {
|
if (!data.quantity) {
|
||||||
|
|
|
@ -547,7 +547,9 @@
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<input type="text" class="js_quantity form-control"
|
<input type="text" class="js_quantity form-control"
|
||||||
t-att-data-id="line.product_id.id" t-att-value="int(line.product_uom_qty)"/>
|
t-att-data-line-id="line.id"
|
||||||
|
t-att-data-product-id="line.product_id.id"
|
||||||
|
t-att-value="int(line.product_uom_qty)"/>
|
||||||
<span class="input-group-addon">
|
<span class="input-group-addon">
|
||||||
<a t-attf-href="#" class="mb8 float_left js_add_cart_json">
|
<a t-attf-href="#" class="mb8 float_left js_add_cart_json">
|
||||||
<i class="fa fa-plus"></i>
|
<i class="fa fa-plus"></i>
|
||||||
|
|
Loading…
Reference in New Issue