[FIX] website_sale: add/remove product cart (json controller)
[odoo/odoo.git] / addons / website_sale / controllers / website.py
1 # -*- coding: utf-8 -*-
2 import uuid
3
4 from openerp import SUPERUSER_ID
5 from openerp.osv import osv
6 from openerp.addons.web.http import request
7
8
9 class Website(osv.Model):
10     _inherit = "website"
11
12     def _get_order(self, cr, uid, order_id=None, context=None):
13         order_obj = request.registry.get('sale.order')
14         # check if order allready exists and have access
15         if order_id:
16             if not order_id in order_obj.exists(cr, uid, [order_id], context=context):
17                 return False
18             try:
19                 order = order_obj.browse(cr, uid, order_id, context=context)
20                 if order:
21                     return order
22             except:
23                 return False
24
25         fields = [k for k, v in order_obj._columns.items()]
26         order_value = order_obj.default_get(cr, SUPERUSER_ID, fields, context=context)
27         if request.httprequest.session.get('ecommerce_pricelist'):
28             order_value['pricelist_id'] = request.httprequest.session['ecommerce_pricelist']
29         order_value['partner_id'] = request.registry.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context).partner_id.id
30         order_value.update(order_obj.onchange_partner_id(cr, SUPERUSER_ID, [], order_value['partner_id'], context=context)['value'])
31
32         # add website_session_id key for access rules
33         if not request.httprequest.session.get('website_session_id'):
34             request.httprequest.session['website_session_id'] = str(uuid.uuid4())
35
36         order_value["website_session_id"] = request.httprequest.session['website_session_id']
37         order_id = order_obj.create(cr, SUPERUSER_ID, order_value, context=context)
38         order = order_obj.browse(cr, SUPERUSER_ID, order_id, context=context)
39         request.httprequest.session['ecommerce_order_id'] = order.id
40
41         return order_obj.browse(cr, uid, order_id,
42                                 context=dict(request.context, pricelist=order.pricelist_id.id))
43
44     def get_current_order(self, cr, uid, context=None):
45         if request.httprequest.session.get('ecommerce_order_id'):
46             order = self._get_order(cr, uid, order_id=request.httprequest.session['ecommerce_order_id'], context=context)
47             if not order:
48                 request.httprequest.session['ecommerce_order_id'] = False
49             return order
50         return False
51
52     def _get_transaction(self, cr, uid, tx_id=None, context=None):
53         transaction_obj = request.registry['payment.transaction']
54         if tx_id:
55             tx_ids = transaction_obj.search(cr, uid, [('id', '=', tx_id), ('state', 'not in', ['cancel'])], context=context)
56             if tx_ids:
57                 return transaction_obj.browse(cr, uid, tx_ids[0], context=context)
58         return False
59
60     def get_current_transaction(self, cr, uid, context=None):
61         if request.httprequest.session.get('website_sale_transaction_id'):
62             tx = self._get_transaction(cr, uid, tx_id=request.httprequest.session['website_sale_transaction_id'], context=context)
63             if not tx:
64                 request.httprequest.session['website_sale_transaction_id'] = False
65             return tx
66         return False
67
68     def sale_reset_order(self, cr, uid, context=None):
69         request.httprequest.session.update({
70             'ecommerce_order_id': False,
71             'ecommerce_pricelist': False,
72             'website_sale_transaction_id': False,
73         })
74         request.context.update({
75             'website_sale_order': False,
76             'website_sale_transaction': False,
77         })
78
79     def preprocess_request(self, cr, uid, ids, request, context=None):
80         request.context.update({
81             'website_sale_order': self.get_current_order(cr, uid, context=context),
82             'website_sale_transaction': self.get_current_transaction(cr, uid, context=context)
83         })
84         return super(Website, self).preprocess_request(cr, uid, ids, request, context=None)