[FIX] access right with sale with event crashed [NEW] website_sale_delivery module

bzr revid: fp@openerp.com-20131116224306-7is2hawhhpzazie3
This commit is contained in:
Fabien Pinckaers 2013-11-16 23:43:06 +01:00
parent 77e50c6aa6
commit b61ac1998e
13 changed files with 164 additions and 16 deletions

View 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. invoices from picking, OpenERP is able to add and compute the shipping line.
""", """,
'author': 'OpenERP SA', 'author': 'OpenERP SA',
'depends': ['sale', 'purchase', 'stock'], 'depends': ['sale', 'stock'],
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'delivery_report.xml', 'delivery_report.xml',

View File

@ -23,7 +23,15 @@ import time
from openerp.osv import fields,osv from openerp.osv import fields,osv
from openerp.tools.translate import _ 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): class sale_order(osv.osv):
_inherit = 'sale.order' _inherit = 'sale.order'
_columns = { _columns = {
@ -42,12 +50,20 @@ class sale_order(osv.osv):
result.update(carrier_id=order.carrier_id.id) result.update(carrier_id=order.carrier_id.id)
return result 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): def delivery_set(self, cr, uid, ids, context=None):
order_obj = self.pool.get('sale.order') order_obj = self.pool.get('sale.order')
line_obj = self.pool.get('sale.order.line') line_obj = self.pool.get('sale.order.line')
grid_obj = self.pool.get('delivery.grid') grid_obj = self.pool.get('delivery.grid')
carrier_obj = self.pool.get('delivery.carrier') carrier_obj = self.pool.get('delivery.carrier')
acc_fp_obj = self.pool.get('account.fiscal.position') 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): 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) grid_id = carrier_obj.grid_get(cr, uid, [order.carrier_id.id], order.partner_shipping_id.id)
if not grid_id: if not grid_id:
@ -70,7 +86,8 @@ class sale_order(osv.osv):
'product_id': grid.carrier_id.product_id.id, '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), 'price_unit': grid_obj.get_price(cr, uid, grid.id, order, time.strftime('%Y-%m-%d'), context),
'tax_id': [(6,0,taxes_ids)], '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 #remove the value of the carrier_id field on the sale order
return self.write(cr, uid, ids, {'carrier_id': False}, context=context) return self.write(cr, uid, ids, {'carrier_id': False}, context=context)

View 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): def copy(self, cr, uid, id, default=None, context=None):
if not default: if not default:
default = {} default = {}

View File

@ -35,10 +35,6 @@ from dateutil.relativedelta import relativedelta
from openerp import tools from openerp import tools
import urllib import urllib
Ecommerce.domain += [('product_variant_ids.event_ticket_ids', '=', False), ('event_ok', '=', False)]
class website_event(http.Controller): class website_event(http.Controller):
@website.route(['/event/', '/event/page/<int:page>/'], type='http', auth="public", multilang=True) @website.route(['/event/', '/event/page/<int:page>/'], type='http', auth="public", multilang=True)
def events(self, page=1, **searches): def events(self, page=1, **searches):

View File

@ -347,6 +347,7 @@ class Ecommerce(http.Controller):
domain = [('id', 'in', ids or [0] )] + domain domain = [('id', 'in', ids or [0] )] + domain
step = 20 step = 20
print '**', domain
product_count = len(product_obj.search(request.cr, request.uid, domain, context=request.context)) 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) 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 = { values = {
'partner': False, '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_obj = request.registry.get('portal.payment.acquirer')
payment_ids = payment_obj.search(request.cr, SUPERUSER_ID, [('visible', '=', True)], context=request.context) payment_ids = payment_obj.search(request.cr, SUPERUSER_ID, [('visible', '=', True)], context=request.context)

View File

@ -380,7 +380,7 @@
</ul> </ul>
<h1 class="mb32">Shopping Cart</h1> <h1 class="mb32">Shopping Cart</h1>
<div class="row"> <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"> <div t-if="not website_sale_order or not website_sale_order.order_line" class="well well-lg">
Your cart is empty! Your cart is empty!
</div> </div>
@ -473,7 +473,7 @@
<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> <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 class="oe_structure"/>
</div> </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> <h4>Policies</h4>
<ul class="list-unstyled mb32"> <ul class="list-unstyled mb32">
<li>&#9745; 30-days money-back guarantee</li> <li>&#9745; 30-days money-back guarantee</li>
@ -804,7 +804,7 @@
</ul> </ul>
<h1 class="mb32">Validate Order</h1> <h1 class="mb32">Validate Order</h1>
<div class="row"> <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"> <table class='table table-striped table-condensed' id="mycart_products" t-if="website_sale_order and website_sale_order.order_line">
<colgroup> <colgroup>
<col width="80"/> <col width="80"/>
@ -857,7 +857,7 @@
}'/></h3></th> }'/></h3></th>
</tr> </tr>
<tr class="text-muted"> <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='{ <td class="text-right"><span t-field="website_sale_order.amount_tax" t-field-options='{
"widget": "monetary", "widget": "monetary",
"display_currency": "website.pricelist_id.currency_id" "display_currency": "website.pricelist_id.currency_id"
@ -868,7 +868,7 @@
<div class="clearfix"/> <div class="clearfix"/>
<div class="oe_structure"/> <div class="oe_structure"/>
</div> </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> <h4>Bill To:</h4>
<div t-field="website_sale_order.partner_invoice_id"/> <div t-field="website_sale_order.partner_invoice_id"/>
<div> <div>
@ -884,12 +884,12 @@
</div> </div>
</div> </div>
<div class="js_payment mb64"> <div class="js_payment mb64" id="js_payment">
<p>Select your payment method:</p> <p>Payment method:</p>
<div> <div>
<t t-foreach="payments or []" t-as="payment"> <t t-foreach="payments or []" t-as="payment">
<label> <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> </label>
</t> </t>
</div> </div>

View File

@ -0,0 +1 @@
import models

View File

@ -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,
}

View File

@ -0,0 +1 @@
import sale_order

View File

@ -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}

View File

@ -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();
// }
// });
});

View File

@ -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>

View File

@ -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>