[FIX] access right with sale with event crashed [NEW] website_sale_delivery module
authorFabien Pinckaers <fp@openerp.com>
Sat, 16 Nov 2013 22:43:06 +0000 (23:43 +0100)
committerFabien Pinckaers <fp@openerp.com>
Sat, 16 Nov 2013 22:43:06 +0000 (23:43 +0100)
bzr revid: fp@openerp.com-20131116224306-7is2hawhhpzazie3

13 files changed:
addons/delivery/__openerp__.py
addons/delivery/sale.py
addons/sale/sale.py
addons/website_event/controllers/main.py
addons/website_sale/controllers/main.py
addons/website_sale/views/website_sale.xml
addons/website_sale_delivery/__init__.py [new file with mode: 0644]
addons/website_sale_delivery/__openerp__.py [new file with mode: 0644]
addons/website_sale_delivery/models/__init__.py [new file with mode: 0644]
addons/website_sale_delivery/models/sale_order.py [new file with mode: 0644]
addons/website_sale_delivery/static/src/js/website_sale_delivery.js [new file with mode: 0644]
addons/website_sale_delivery/views/website_sale_delivery.xml [new file with mode: 0644]
addons/website_sale_delivery/views/website_sale_delivery_view.xml [new file with mode: 0644]

index 0ea891b..5c4aac8 100644 (file)
@@ -32,7 +32,7 @@ You can define your own carrier and delivery grids for prices. When creating
 invoices from picking, OpenERP is able to add and compute the shipping line.
 """,
     'author': 'OpenERP SA',
-    'depends': ['sale', 'purchase', 'stock'],
+    'depends': ['sale', 'stock'],
     'data': [
         'security/ir.model.access.csv',
         'delivery_report.xml',
index 1b79729..f43eb1c 100644 (file)
@@ -23,7 +23,15 @@ import time
 from openerp.osv import fields,osv
 from openerp.tools.translate import _
 
-# Overloaded sale_order to manage carriers :
+class sale_order_line(osv.osv):
+    _inherit = 'sale.order.line'
+    _columns = {
+        'is_delivery':fields.boolean("Is a Delivery"),
+    }
+    _defaults = {
+        'is_delivery': False
+    }
+
 class sale_order(osv.osv):
     _inherit = 'sale.order'
     _columns = {
@@ -42,6 +50,12 @@ class sale_order(osv.osv):
         result.update(carrier_id=order.carrier_id.id)
         return result
 
+    def _delivery_unset(self, cr, uid, order, context=None):
+        for line in order.order_line:
+            if line.is_delivery:
+                self.pool.get('sale.order.line').unlink(cr, uid, [line.id], context=context)
+        return True
+
     def delivery_set(self, cr, uid, ids, context=None):
         order_obj = self.pool.get('sale.order')
         line_obj = self.pool.get('sale.order.line')
@@ -49,6 +63,8 @@ class sale_order(osv.osv):
         carrier_obj = self.pool.get('delivery.carrier')
         acc_fp_obj = self.pool.get('account.fiscal.position')
         for order in self.browse(cr, uid, ids, context=context):
+            self._delivery_unset(cr, uid, order, context=context)
+        for order in self.browse(cr, uid, ids, context=context):
             grid_id = carrier_obj.grid_get(cr, uid, [order.carrier_id.id], order.partner_shipping_id.id)
             if not grid_id:
                 raise osv.except_osv(_('No Grid Available!'), _('No grid matching for this carrier!'))
@@ -70,7 +86,8 @@ class sale_order(osv.osv):
                 'product_id': grid.carrier_id.product_id.id,
                 'price_unit': grid_obj.get_price(cr, uid, grid.id, order, time.strftime('%Y-%m-%d'), context),
                 'tax_id': [(6,0,taxes_ids)],
-                'type': 'make_to_stock'
+                'type': 'make_to_stock',
+                'is_delivery': True
             })
         #remove the value of the carrier_id field on the sale order
         return self.write(cr, uid, ids, {'carrier_id': False}, context=context)
index ad048e5..11ca67b 100644 (file)
@@ -39,6 +39,10 @@ class sale_order(osv.osv):
         },
     }
 
+    # Hook for website_sale to inherit (website_sale_delivery)
+    def _get_website_data(self, cr, uid, order, context):
+        return {}
+
     def copy(self, cr, uid, id, default=None, context=None):
         if not default:
             default = {}
index 0f05620..e811c13 100644 (file)
@@ -35,10 +35,6 @@ from dateutil.relativedelta import relativedelta
 from openerp import tools
 import urllib
 
-
-Ecommerce.domain += [('product_variant_ids.event_ticket_ids', '=', False), ('event_ok', '=', False)]
-
-
 class website_event(http.Controller):
     @website.route(['/event/', '/event/page/<int:page>/'], type='http', auth="public", multilang=True)
     def events(self, page=1, **searches):
index 0744f2e..ec250ea 100644 (file)
@@ -347,6 +347,7 @@ class Ecommerce(http.Controller):
                 domain = [('id', 'in', ids or [0] )] + domain
 
         step = 20
+        print '**', domain
         product_count = len(product_obj.search(request.cr, request.uid, domain, context=request.context))
         pager = request.website.pager(url="/shop/", total=product_count, page=page, step=step, scope=7, url_args=post)
 
@@ -711,8 +712,9 @@ class Ecommerce(http.Controller):
 
         values = {
             'partner': False,
-            'order': order
+            'order': order,
         }
+        values.update( request.registry.get('sale.order')._get_website_data(request.cr, request.uid, order, request.context) )
 
         payment_obj = request.registry.get('portal.payment.acquirer')
         payment_ids = payment_obj.search(request.cr, SUPERUSER_ID, [('visible', '=', True)], context=request.context)
index c4407fc..0608f6d 100644 (file)
                 </ul>
                 <h1 class="mb32">Shopping Cart</h1>
                 <div class="row">
-                    <div class="col-md-8 col-md-offset-1 oe_mycart">
+                    <div class="col-md-8 col-sm-9 oe_mycart">
                         <div t-if="not website_sale_order or not website_sale_order.order_line" class="well well-lg">
                             Your cart is empty!
                         </div>
                         <a t-if="website_sale_order and website_sale_order.order_line" href="/shop/checkout/" class="btn btn-primary pull-right mb32">Process Checkout <span class="icon-long-arrow-right"/></a>
                         <div class="oe_structure"/>
                     </div>
-                    <div class="col-md-3 text-muted" id="right_column">
+                    <div class="col-lg-3 col-lg-offset-1 col-sm-3 text-muted" id="right_column">
                         <h4>Policies</h4>
                         <ul class="list-unstyled mb32">
                             <li>&#9745; 30-days money-back guarantee</li>
                 </ul>
                 <h1 class="mb32">Validate Order</h1>
                 <div class="row">
-                <div class="col-md-8 oe_mycart">
+                <div class="col-lg-8 col-sm-9 oe_mycart">
                     <table class='table table-striped table-condensed' id="mycart_products" t-if="website_sale_order and website_sale_order.order_line">
                         <colgroup>
                             <col width="80"/>
                                 }'/></h3></th>
                             </tr>
                             <tr class="text-muted">
-                                <td><abbr title="Taxes may be updated after providing shipping address">Incl. Taxes:</abbr></td>
+                                <td>Incl. Taxes:</td>
                                 <td class="text-right"><span t-field="website_sale_order.amount_tax" t-field-options='{
                                     "widget": "monetary",
                                     "display_currency": "website.pricelist_id.currency_id"
                     <div class="clearfix"/>
                     <div class="oe_structure"/>
                   </div>
-                  <div class="col-md-3 col-md-offset-1 text-muted" id="right_column">
+                  <div class="col-lg-3 col-lg-offset-1 col-sm-3 text-muted" id="right_column">
                       <h4>Bill To:</h4>
                       <div t-field="website_sale_order.partner_invoice_id"/>
                       <div>
                   </div>
                 </div>
 
-                <div class="js_payment mb64">
-                    <p>Select your payment method:</p>
+                <div class="js_payment mb64" id="js_payment">
+                    <p>Payment method:</p>
                     <div>
                         <t t-foreach="payments or []" t-as="payment">
                             <label>
-                                <input t-att-value="payment.id" type="radio" name="payment_type"/> <t t-esc="payment.name"/>
+                                <input t-att-value="payment.id" type="radio" name="payment_type"/> <span t-field="payment.name"/>
                             </label>
                         </t>
                     </div>
diff --git a/addons/website_sale_delivery/__init__.py b/addons/website_sale_delivery/__init__.py
new file mode 100644 (file)
index 0000000..bff786c
--- /dev/null
@@ -0,0 +1 @@
+import models
diff --git a/addons/website_sale_delivery/__openerp__.py b/addons/website_sale_delivery/__openerp__.py
new file mode 100644 (file)
index 0000000..e2ded28
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    'name': 'eCommerce Delivery Methods',
+    'category': 'Website',
+    'summary': 'Add delivery costs to sales',
+    'version': '1.0',
+    'description': """
+Delivery Costs
+==============
+""",
+    'author': 'OpenERP SA',
+    'depends': ['website_sale', 'delivery'],
+    'data': [
+        'views/website_sale_delivery.xml',
+        'views/website_sale_delivery_view.xml',
+    ],
+    'demo': [],
+    'qweb': [],
+    'installable': True,
+}
diff --git a/addons/website_sale_delivery/models/__init__.py b/addons/website_sale_delivery/models/__init__.py
new file mode 100644 (file)
index 0000000..553da9f
--- /dev/null
@@ -0,0 +1 @@
+import sale_order
diff --git a/addons/website_sale_delivery/models/sale_order.py b/addons/website_sale_delivery/models/sale_order.py
new file mode 100644 (file)
index 0000000..1dad9c3
--- /dev/null
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+
+from openerp.osv import orm, fields
+
+class delivery_carrier(orm.Model):
+    _inherit = 'delivery.carrier'
+    _columns = {
+        'website_published': fields.boolean('Available in the website'),
+        'website_description': fields.text('Description for the website'),
+    }
+    _defaults = {
+        'website_published': True
+    }
+
+class sale_order(orm.Model):
+    _inherit = 'sale.order'
+    def _get_website_data(self, cr, uid, order, context=None):
+
+        # We need a delivery only if we have stockable products
+        todo = False
+        for line in order.order_line:
+            if line.product_id.type in ('consu','product'):
+                todo = True
+        if not todo: return {'deliveries': []}
+
+        carrier_obj = self.pool.get('delivery.carrier')
+        dids = carrier_obj.search(cr, uid, [], context=context)
+        context['order_id'] = order.id
+        deliveries = carrier_obj.browse(cr, uid, dids, context=context)
+
+        # By default, select the first carrier
+        if not order.carrier_id and dids:
+            self.pool.get('sale.order').write(cr, uid, [order.id], {'carrier_id': dids[0]}, context=context)
+
+        # recompute delivery costs
+        self.pool.get('sale.order').delivery_set(cr, uid, [order.id], context=context)
+        return {'deliveries': deliveries}
diff --git a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js
new file mode 100644 (file)
index 0000000..0c9f589
--- /dev/null
@@ -0,0 +1,24 @@
+$(document).ready(function () {
+
+    // $('.js_nav_month a:first').on('click', function (e) {
+    //     e.preventDefault();
+    //     var $ul = $(this).next("ul");
+    //     if (!$ul.find('li').length) {
+    //         // TODO: Why POST? (to pass the domain) A GET would be more appropriate...
+    //         // This should be done server side anyway...
+    //         $.post('/blog/nav', {'domain': $(this).data("domain")}, function (result) {
+    //             var blog_id = +window.location.pathname.split("/").pop();
+    //             $(JSON.parse(result)).each(function () {
+    //                 var $li = $($.parseHTML(this.fragment));
+    //                 if (blog_id == this.id) $li.addClass("active");
+    //                 if (!this.website_published) $li.find('a').css("color", "red");
+    //                 $ul.append($li);
+    //             });
+
+    //         });
+    //     } else {
+    //         $ul.toggle();
+    //     }
+    // });
+
+});
diff --git a/addons/website_sale_delivery/views/website_sale_delivery.xml b/addons/website_sale_delivery/views/website_sale_delivery.xml
new file mode 100644 (file)
index 0000000..6625f62
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+    <template id="delivery" name="Delivery Costs" inherit_id="website_sale.payment">
+        <xpath expr="//t[@t-set='head']" position="inside">
+            <script type="text/javascript" src="/website_sale_delivery/static/src/js/website_sale_delivery.js"></script>
+        </xpath>
+        <xpath expr="//div[@id='js_payment']" position="before">
+
+            <p>Choose Your Delivery method:</p>
+            <ul class="list-unstyled">
+                <li t-foreach="deliveries" t-as="delivery">
+                    <label>
+                        <input t-att-value="delivery.id" type="radio" name="delivery_type"/>
+                        <span t-field="delivery.name"/>
+                        <span class="badge" t-field="delivery.price"/>
+                        <!-- TODO: add monetary widget -->
+                    </label>
+                </li>
+            </ul>
+
+        </xpath>
+    </template>
+
+ </data>
+</openerp>
diff --git a/addons/website_sale_delivery/views/website_sale_delivery_view.xml b/addons/website_sale_delivery/views/website_sale_delivery_view.xml
new file mode 100644 (file)
index 0000000..6668944
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+<data>
+
+    <record model="ir.ui.view" id="view_delivery_carrier_form">
+        <field name="name">delivery.carrier.website.form</field>
+        <field name="model">delivery.carrier</field>
+        <field name="inherit_id" ref="delivery.view_delivery_carrier_form"/>
+        <field name="arch" type="xml">
+            <xpath expr="//group[@name='general']" position="after">
+                <group name="website">
+                    <field name="website_published"/>
+                    <field name="website_description" attrs="{'invisible':[('website_published', '=', False)]}"/>
+                </group>
+            </xpath>
+        </field>
+    </record>
+
+ </data>
+</openerp>