1 # -*- coding: utf-8 -*-
3 from openerp.osv import orm, fields
4 from openerp.addons.web.http import request
5 from openerp import SUPERUSER_ID
8 class Website(orm.Model):
11 def _get_pricelist_id(self, cr, uid, ids, field_name, arg, context=None):
12 pricelist_id = self.ecommerce_get_pricelist_id(cr, uid, None, context=context)
13 return dict.fromkeys(ids, pricelist_id)
16 'pricelist_id': fields.function(
17 _get_pricelist_id, type='many2one', obj='product.pricelist')
20 # ************************************************************
21 # Ecommerce pricelist management
22 # ***********************************************************
24 def ecommerce_get_pricelist_id(self, cr, uid, ids, context=None):
25 if not request.httprequest.session.get('ecommerce_pricelist') or request.httprequest.session.get('ecommerce_pricelist_uid') != uid:
26 self._ecommerce_change_pricelist(cr, uid, None, context=context)
27 return request.httprequest.session.get('ecommerce_pricelist')
29 def _ecommerce_change_pricelist(self, cr, uid, code=None, context=None):
30 request.httprequest.session.setdefault('ecommerce_pricelist', False)
34 pricelist_obj = self.pool.get('product.pricelist')
35 pricelist_ids = pricelist_obj.search(cr, SUPERUSER_ID, [('code', '=', code)], context=context)
37 pricelist_id = pricelist_ids[0]
40 partner_id = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context).partner_id.id
41 pricelist_id = self.pool.get('sale.order').onchange_partner_id(cr, SUPERUSER_ID, [], partner_id, context=context)['value']['pricelist_id']
43 request.httprequest.session['ecommerce_pricelist'] = pricelist_id
44 request.httprequest.session['ecommerce_pricelist_uid'] = uid
46 order = self.ecommerce_get_current_order(cr, uid, context=context)
48 values = {'pricelist_id': pricelist_id}
49 values.update(order.onchange_pricelist_id(pricelist_id, None)['value'])
51 for line in order.order_line:
52 self._ecommerce_add_product_to_cart(cr, uid, order_line_id=line.id, number=0)
54 # ************************************************************
55 # Ecommerce quotation management
56 # ************************************************************
58 def _ecommerce_add_product_to_cart(self, cr, uid, product_id=0, order_line_id=0, number=1, set_number=-1, context=None):
59 order = self.ecommerce_get_current_order(cr, uid, context=context)
61 order = self.ecommerce_get_new_order(cr, uid, context=context)
63 order_line_obj = self.pool.get('sale.order.line')
64 order_obj = self.pool.get('sale.order')
66 context = dict(context or {}, pricelist=self.ecommerce_get_pricelist_id(cr, uid, None, context=context))
68 # set order_line_id and product_id
71 for line in order.order_line:
72 if line.id == order_line_id:
76 product_id = order_line.product_id.id
80 order_line_ids = order_line_obj.search(cr, SUPERUSER_ID,
81 [('order_id', '=', order.id), ('product_id', '=', product_id)], context=context)
83 order_line_id = order_line_ids[0]
85 if not order_line_id and not product_id:
88 # values initialisation
93 order_line_val = order_line_obj.read(cr, SUPERUSER_ID, [order_line_id], [], context=context)[0]
95 product_id = order_line_val['product_id'][0]
99 quantity = order_line_val['product_uom_qty'] + number
102 order_line_ids = [order_line_id]
104 fields = [k for k, v in order_line_obj._columns.items()]
105 values = order_line_obj.default_get(cr, SUPERUSER_ID, fields, context=context)
108 # change and record value
110 vals = order_line_obj._recalculate_product_values(cr, uid, order_line_ids, product_id, fiscal_position=order.fiscal_position.id, context=context)
112 values['product_uom_qty'] = quantity
113 values['product_id'] = product_id
114 values['order_id'] = order.id
116 product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
117 values['name'] = "%s: %s" % (product.name, product.variants) if product.variants else product.name
118 if values.get('tax_id'):
119 values['tax_id'] = [(6, 0, values['tax_id'])]
121 order_obj.write(cr, SUPERUSER_ID, [order.id], {'order_line': [(1, order_line_id, values) if order_line_id else (0, 0, values)]}, context=context)
124 order_line_obj.unlink(cr, SUPERUSER_ID, order_line_ids, context=context)
126 order = self.ecommerce_get_current_order(cr, uid, context=context)
127 if not order or not order.order_line:
128 self._ecommerce_change_pricelist(cr, uid, None, context=context)
132 def _ecommerce_get_quotation_values(self, cr, uid, context=None):
133 """ Generate the values for a new ecommerce quotation. """
134 SaleOrder = self.pool.get('sale.order')
135 fields = [k for k, v in SaleOrder._columns.items()]
136 values = SaleOrder.default_get(cr, SUPERUSER_ID, fields, context=context)
137 if request.httprequest.session.get('ecommerce_pricelist'):
138 values['pricelist_id'] = request.httprequest.session['ecommerce_pricelist']
139 values['partner_id'] = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context).partner_id.id
140 values.update(SaleOrder.onchange_partner_id(cr, SUPERUSER_ID, [], values['partner_id'], context=context)['value'])
141 values['website_session_id'] = request.httprequest.session['website_session_id']
144 def _ecommerce_create_quotation(self, cr, uid, context=None):
145 """ Create a new quotation used in the ecommerce (event, sale) """
146 SaleOrder = self.pool.get('sale.order')
147 quotation_values = self._ecommerce_get_quotation_values(cr, uid, context=context)
148 quotation_values['user_id'] = False
149 return SaleOrder.create(cr, SUPERUSER_ID, quotation_values, context=context)
151 def ecommerce_get_new_order(self, cr, uid, context=None):
152 """ Create a new quotation for the ecommerce and update the session
153 accordingly: website_session_id if not set, ecommerce_order_id """
154 SaleOrder = self.pool.get('sale.order')
156 # add website_session_id key for access rules
157 if not request.httprequest.session.get('website_session_id'):
158 request.httprequest.session['website_session_id'] = str(uuid.uuid4())
160 order_id = self._ecommerce_create_quotation(cr, uid, context=context)
161 request.httprequest.session['ecommerce_order_id'] = order_id
162 context = dict(context or {}, pricelist=self.ecommerce_get_pricelist_id(cr, uid, None, context=context))
163 return SaleOrder.browse(cr, SUPERUSER_ID, order_id, context=context)
165 def ecommerce_get_current_order(self, cr, uid, context=None):
166 SaleOrder = self.pool.get('sale.order')
167 context = dict(context or {}, pricelist=self.ecommerce_get_pricelist_id(cr, uid, None, context=context))
168 order_id = request.httprequest.session.get('ecommerce_order_id')
170 request.httprequest.session['ecommerce_order_id'] = False
172 if not order_id in SaleOrder.exists(cr, uid, [order_id], context=context):
173 request.httprequest.session['ecommerce_order_id'] = False
176 order = SaleOrder.browse(cr, SUPERUSER_ID, order_id, context=context)
177 assert order.website_session_id == request.httprequest.session['website_session_id']
180 request.httprequest.session['ecommerce_order_id'] = False
183 # ************************************************************
184 # Ecommerce transaction management
185 # ************************************************************
187 def _get_transaction(self, cr, uid, tx_id=None, context=None):
188 transaction_obj = self.pool.get('payment.transaction')
190 tx_ids = transaction_obj.search(cr, uid, [('id', '=', tx_id), ('state', 'not in', ['cancel'])], context=context)
192 return transaction_obj.browse(cr, uid, tx_ids[0], context=context)
195 def ecommerce_get_current_transaction(self, cr, uid, context=None):
196 if request.httprequest.session.get('website_sale_transaction_id'):
197 tx = self._get_transaction(cr, uid, tx_id=request.httprequest.session['website_sale_transaction_id'], context=context)
199 request.httprequest.session['website_sale_transaction_id'] = False
203 def ecommerce_reset(self, cr, uid, context=None):
204 request.httprequest.session.update({
205 'ecommerce_order_id': False,
206 'ecommerce_pricelist': False,
207 'website_sale_transaction_id': False,
209 request.context.update({
210 'website_sale_order': False,
211 'website_sale_transaction': False,
214 def preprocess_request(self, cr, uid, ids, request, context=None):
215 request.context.update({
216 'website_sale_order': self.ecommerce_get_current_order(cr, uid, context=context),
217 'website_sale_transaction': self.ecommerce_get_current_transaction(cr, uid, context=context)
219 return super(Website, self).preprocess_request(cr, uid, ids, request, context=None)
221 def ecommerce_get_product_domain(self):
223 ("sale_ok", "=", True),
224 # force search on product.product to use the orm (exclude active, acl,..)
225 ("product_variant_ids.id", "!=", False),