diff --git a/addons/base_report_creator/base_report_creator.py b/addons/base_report_creator/base_report_creator.py
index 773458fe3cb..a026a077c85 100644
--- a/addons/base_report_creator/base_report_creator.py
+++ b/addons/base_report_creator/base_report_creator.py
@@ -23,33 +23,15 @@ from osv import fields, osv
from tools.translate import _
from tools import ustr
-class report_creator(osv.osv):
+class report_result(osv.osv):
"""
Report Creator
"""
- _name = "base_report_creator.report"
+ _name = "base_report_creator_report.result"
_description = "Report"
- model_set_id = False
#
# Should request only used fields
#
- def export_data(self, cr, uid, ids, fields_to_export, context=None):
- if context is None:
- context = {}
- data_l = self.read(cr, uid, ids, ['sql_query'], context=context)
- final_datas = []
- #start Loop
- for record in data_l:
- datas = []
- for key in fields_to_export:
- value = record.get(key,'')
- if isinstance(value, tuple):
- datas.append(ustr(value[1]))
- else:
- datas.append(ustr(value))
- final_datas += [datas]
- #End Loop
- return {'datas': final_datas}
def fields_get(self, cr, user, fields=None, context=None):
"""
@@ -64,9 +46,9 @@ class report_creator(osv.osv):
data = context and context.get('report_id', False) or False
if (not context) or 'report_id' not in context:
- return super(report_creator, self).fields_get(cr, user, fields, context)
+ return super(report_result, self).fields_get(cr, user, fields, context)
if data:
- report = self.browse(cr, user, data)
+ report = self.pool.get('base_report_creator.report').browse(cr, user, data,context=context)
models = {}
#Start Loop
for model in report.model_ids:
@@ -80,12 +62,8 @@ class report_creator(osv.osv):
i += 1
else:
fields['column_count'] = {'readonly': True, 'type': 'integer', 'string': 'Count', 'size': 64, 'name': 'column_count'}
-
return fields
- #
- # Should Call self.fields_get !
- #
def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
"""
Overrides orm field_view_get.
@@ -98,8 +76,8 @@ class report_creator(osv.osv):
data = context and context.get('report_id', False) or False
if (not context) or 'report_id' not in context:
- return super(report_creator, self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
- report = self.browse(cr, user, data)
+ return super(report_result, self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
+ report = self.pool.get('base_report_creator.report').browse(cr, user, context.get('report_id'), context=context)
models = {}
for model in report.model_ids:
models[model.model] = self.pool.get(model.model).fields_get(cr, user, context=context)
@@ -192,31 +170,11 @@ class report_creator(osv.osv):
"""
if context is None:
context = {}
- data = context.get('report_id', False)
- res = super(report_creator, self).read(cr, user, ids, fields, context, load)
- if (not context) or 'report_id' not in context:
- return res
- wp = ''
- for data in res:
- if not data.get('sql_query'):
- return res
- if self.model_set_id:
- wp = [self._id_get(cr, user, data, context) + (' in (%s)' % (','.join(map(lambda x: "'" + str(x) + "'", ids))))]
- cr.execute(data['sql_query'])
- res = cr.dictfetchall()
- fields_get = self.fields_get(cr, user, None, context)
- for r in res:
- for k in r:
- r[k] = r[k] or False
- field_dict = fields_get.get(k)
- field_type = field_dict and field_dict.get('type', False) or False
- if field_type and field_type == 'many2one':
- if r[k] == False:
- continue
- related_name = self.pool.get(field_dict.get('relation')).name_get(cr, user, [r[k]], context)[0]
- r[k] = related_name
-
- return res
+ report_id = context.get('active_id', False)
+ report = self.pool.get('base_report_creator.report').browse(cr, user, context.get('report_id'), context=context)
+ cr.execute(report.sql_query)
+ result = cr.dictfetchall()
+ return result
def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
"""
@@ -231,9 +189,9 @@ class report_creator(osv.osv):
context_id = context.get('report_id', False)
if (not context) or 'report_id' not in context:
- return super(report_creator, self).search(cr, user, args, offset, limit, order, context, count)
+ return {}
if context_id:
- report = self.browse(cr, user, context_id)
+ report = self.pool.get('base_report_creator.report').browse(cr, user, context_id, context=context)
i = 0
fields = {}
for f in report.field_ids:
@@ -254,10 +212,42 @@ class report_creator(osv.osv):
ctx = context or {}
ctx['getid'] = True
sql_query = report.sql_query
- cr.execute(sql_query, newargs2)
+ cr.execute(sql_query) # TODO: FILTER
result = cr.fetchall()
return map(lambda x: x[0], result)
+report_result()
+
+
+class report_creator(osv.osv):
+ """
+ Report Creator
+ """
+ _name = "base_report_creator.report"
+ _description = "Report"
+ model_set_id = False
+ #
+ # Should request only used fields
+ #
+ def export_data(self, cr, uid, ids, fields_to_export, context=None):
+ if context is None:
+ context = {}
+ data_l = self.read(cr, uid, ids, ['sql_query'], context=context)
+ final_datas = []
+ #start Loop
+ for record in data_l:
+ datas = []
+ for key in fields_to_export:
+ value = record.get(key,'')
+ if isinstance(value, tuple):
+ datas.append(ustr(value[1]))
+ else:
+ datas.append(ustr(value))
+ final_datas += [datas]
+ #End Loop
+ return {'datas': final_datas}
+
+
def _path_get(self, cr, uid, models, filter_ids=[]):
"""
@param cr: the current row, from the database cursor,
@@ -465,7 +455,7 @@ class report_creator(osv.osv):
'name': rep.name,
'view_type': 'form',
'view_mode': view_mode,
- 'res_model': 'base_report_creator.report',
+ 'res_model': 'base_report_creator_report.result',
'type': 'ir.actions.act_window',
'context': "{'report_id':%d}" % (rep.id,),
'nodestroy': True,
@@ -596,3 +586,4 @@ class report_creator_filter(osv.osv):
}
report_creator_filter()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py
index 74eb1a95b23..af2b53d1c93 100644
--- a/addons/crm/__openerp__.py
+++ b/addons/crm/__openerp__.py
@@ -41,7 +41,7 @@ appropriate staff, and make sure all future correspondence gets to the right
place.
The CRM module has a email gateway for the synchronisation interface
-between mails and OpenERP.
+between mails and OpenERP.
Create dashboard for CRM that includes:
* My Leads (list)
* Leads by Stage (graph)
@@ -95,6 +95,7 @@ Create dashboard for CRM that includes:
'crm_meeting_view.xml',
'crm_meeting_menu.xml',
+ 'crm_meeting_shortcut_data.xml',
'crm_phonecall_view.xml',
'crm_phonecall_menu.xml',
@@ -106,12 +107,12 @@ Create dashboard for CRM that includes:
'report/crm_phonecall_report_view.xml',
'process/crm_configuration_process.xml',
- 'crm_installer_view.xml',
-
+ 'crm_installer_view.xml',
+
'res_partner_view.xml',
'board_crm_view.xml',
'board_crm_statistical_view.xml',
-
+
],
'demo_xml': [
'crm_demo.xml',
diff --git a/addons/crm/crm_meeting_menu.xml b/addons/crm/crm_meeting_menu.xml
index a75528810e0..35ff86cb5b8 100644
--- a/addons/crm/crm_meeting_menu.xml
+++ b/addons/crm/crm_meeting_menu.xml
@@ -92,12 +92,6 @@
action="crm_case_categ_meet" parent="menu_meeting_sale"
sequence="1" />
-
- Meetings
- ir.ui.menu
-
-
-
Meeting Invitations
ir.actions.act_window
diff --git a/addons/crm/crm_meeting_shortcut_data.xml b/addons/crm/crm_meeting_shortcut_data.xml
new file mode 100644
index 00000000000..fcba36f7a61
--- /dev/null
+++ b/addons/crm/crm_meeting_shortcut_data.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Meetings
+ ir.ui.menu
+
+
+
+
+
+
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index a57b76bf2ce..1f06815078e 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -342,7 +342,7 @@ class mrp_bom(osv.osv):
if context is None:
context = {}
bom_data = self.read(cr, uid, id, [], context=context)
- default.update({'name': bom_data['name'] + ' ' + _('Copy')})
+ default.update({'name': bom_data['name'] + ' ' + _('Copy'), 'bom_id':False})
return super(mrp_bom, self).copy_data(cr, uid, id, default, context=context)
mrp_bom()
@@ -444,7 +444,7 @@ class mrp_production(osv.osv):
'bom_id': fields.many2one('mrp.bom', 'Bill of Material', domain=[('bom_id','=',False)]),
'routing_id': fields.many2one('mrp.routing', string='Routing', on_delete='set null', help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production plannification."),
- 'picking_id': fields.many2one('stock.picking', 'Picking list', readonly=True,
+ 'picking_id': fields.many2one('stock.picking', 'Picking list', readonly=True, ondelete="restrict",
help="This is the internal picking list that brings the finished product to the production plan"),
'move_prod_id': fields.many2one('stock.move', 'Move product', readonly=True),
'move_lines': fields.many2many('stock.move', 'mrp_production_move_ids', 'production_id', 'move_id', 'Products to Consume', domain=[('state','not in', ('done', 'cancel'))], states={'done':[('readonly',True)]}),
@@ -602,12 +602,18 @@ class mrp_production(osv.osv):
workcenter_line_obj.create(cr, uid, line)
return len(results)
- def action_cancel(self, cr, uid, ids):
+ def action_cancel(self, cr, uid, ids, context=None):
""" Cancels the production order and related stock moves.
@return: True
"""
+ if context is None:
+ context = {}
move_obj = self.pool.get('stock.move')
- for production in self.browse(cr, uid, ids):
+ for production in self.browse(cr, uid, ids, context=context):
+ if production.state == 'confirmed' and production.picking_id.state not in ('draft', 'cancel'):
+ raise osv.except_osv(
+ _('Could not cancel manufacturing order !'),
+ _('You must first cancel related internal picking attached to this manufacturing order.'))
if production.move_created_ids:
move_obj.action_cancel(cr, uid, [x.id for x in production.move_created_ids])
move_obj.action_cancel(cr, uid, [x.id for x in production.move_lines])
@@ -664,7 +670,7 @@ class mrp_production(osv.osv):
"""
stock_mov_obj = self.pool.get('stock.move')
production = self.browse(cr, uid, production_id, context=context)
-
+
final_product_todo = []
produced_qty = 0
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index a2249ca4925..26a8c643573 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -630,7 +630,8 @@
-
+
+
diff --git a/addons/product/__openerp__.py b/addons/product/__openerp__.py
index 851031e0424..712e17aebc3 100644
--- a/addons/product/__openerp__.py
+++ b/addons/product/__openerp__.py
@@ -53,6 +53,7 @@
'product_data.xml',
'product_report.xml',
'product_view.xml',
+ 'product_shortcut_data.xml',
'pricelist_view.xml',
'partner_view.xml',
'process/product_process.xml'
diff --git a/addons/product/product_shortcut_data.xml b/addons/product/product_shortcut_data.xml
new file mode 100644
index 00000000000..4f48445a197
--- /dev/null
+++ b/addons/product/product_shortcut_data.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Products
+ ir.ui.menu
+
+
+
+
+
+
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index 642ef43caf9..59623a5204e 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -9,7 +9,7 @@
search
-
+
@@ -30,7 +30,7 @@
-
+
@@ -635,12 +635,6 @@
form
-
- Products
- ir.ui.menu
-
-
-
diff --git a/addons/purchase/__openerp__.py b/addons/purchase/__openerp__.py
index 643ba4fc212..58b049e130e 100644
--- a/addons/purchase/__openerp__.py
+++ b/addons/purchase/__openerp__.py
@@ -54,7 +54,7 @@
'report/purchase_report_view.xml',
'board_purchase_view.xml',
],
- 'test': ['test/purchase_on_average_price.yml',
+ 'test': [
'test/purchase_from_order.yml',
'test/purchase_from_manual.yml',
'test/purchase_from_picking.yml',
diff --git a/addons/purchase/test/purchase_on_average_price.yml b/addons/purchase/test/purchase_on_average_price.yml
deleted file mode 100644
index 42e5e369840..00000000000
--- a/addons/purchase/test/purchase_on_average_price.yml
+++ /dev/null
@@ -1,107 +0,0 @@
--
- In order to test Checking of Cost price of product if the product price "Costing Method"
- is "Average Price" and we change value of product on incoming shipment
-
--
- I create product.
--
- !record {model: product.product, id: product_product_pen0 }:
- categ_id: product.product_category_3
- cost_method: average
- name: Pen drive
- procure_method: make_to_stock
- supply_method: buy
- type: product
- standard_price: 1500.0
- list_price: 1500.0
- supply_method: buy
- uom_id: product.product_uom_unit
- uom_po_id: product.product_uom_unit
- volume: 0.0
- warranty: 0.0
- weight: 0.0
-
--
- Update Starting Real Stock And Virtual Stock threw Wizard
--
- !record {model: stock.change.product.qty , id: stock_change_product_id }:
- product_id: product_product_pen0
- new_quantity: 2.0
- location_id: stock.stock_location_stock
--
- Then, Click on "Update Price" button of this wizard.
--
- !python {model: stock.change.product.qty }: |
- self.change_product_qty(cr, uid, [ref('stock_change_product_id')], {'active_id': ref('product_product_pen0')})
--
- I create purchase order for Pen drive.
--
- !record {model: purchase.order, id: purchase_order_po11}:
- company_id: base.main_company
- date_order: '2010-05-11'
- invoice_method: order
- location_id: stock.stock_location_stock
- order_line:
- - date_planned: '2010-05-13'
- name: Pen drive
- price_unit: 1500.0
- product_id: 'product_product_pen0'
- product_qty: 2.0
- product_uom: product.product_uom_unit
- state: draft
- partner_address_id: base.res_partner_address_7
- partner_id: base.res_partner_4
- pricelist_id: purchase.list0
--
- PO Initially in Draft State .
--
- !assert {model: purchase.order, id: purchase_order_po11}:
- - state == 'draft'
--
- PO Going to Draft To Confirm State
--
- !workflow {model: purchase.order, action: purchase_confirm, ref: purchase_order_po11}
--
- I check that the Order has transit from draft state to confirm state.
--
- !assert {model: purchase.order, id: purchase_order_po11}:
- - state == 'approved'
--
- I receive the order of the supplier the Incoming Shipments menu.
--
- !python {model: stock.picking }: |
- import time
- procurement_obj = self.pool.get('procurement.order')
- proc_ids = procurement_obj.browse(cr, uid, [ref('purchase_order_po11')])[0]
- picking_ids = self.search(cr, uid, [('purchase_id', '=', proc_ids.id),('type','=','in')])
- pickings = self.browse(cr, uid, picking_ids)
- for picking in pickings:
- move = picking.move_lines[0]
- partial_datas = {
- 'partner_id': picking.address_id.partner_id.id,
- 'address_id': picking.address_id.id,
- 'delivery_date' : time.strftime('%Y-%m-%d')
- }
- partial_datas['move%s'%(move.id)]= {
- 'product_id': move.product_id,
- 'product_qty': move.product_qty,
- 'product_uom': move.product_uom.id,
- 'product_price' : 1000.0,
- }
- self.do_partial(cr, uid, [picking.id], partial_datas)
--
- I confirm the Reservation.
--
- !python {model: stock.move }: |
- procurement_obj = self.pool.get('procurement.order')
- picking_obj = self.pool.get('stock.picking')
- proc_ids = procurement_obj.browse(cr, uid, [ref('purchase_order_po11')])[0]
- picking_ids = picking_obj.search(cr, uid, [('purchase_id', '=', proc_ids.id),('type','=','in')])
- move_ids = self.search(cr, uid, [('picking_id', '=', picking_ids)])
- self.action_done(cr,uid,move_ids)
--
- Compare With Avarage Price Has Been Updated that is Correct
--
- !assert {model: product.product, id: product_product_pen0 ,string: Updated Avarage Price Has not been Correct}:
- - standard_price == 1250
-
diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml
index dca180baeec..24da97c58ea 100644
--- a/addons/stock/product_view.xml
+++ b/addons/stock/product_view.xml
@@ -106,7 +106,7 @@
+ type="action" icon="gtk-execute" groups = "stock.group_stock_manager,stock.group_stock_user"/>
diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py
index 1b0bbce9cd1..52c923a931c 100644
--- a/addons/stock/wizard/stock_partial_picking.py
+++ b/addons/stock/wizard/stock_partial_picking.py
@@ -38,6 +38,9 @@ class stock_partial_picking(osv.osv_memory):
for move in picking.move_lines:
if picking.type == 'in' and move.product_id.cost_method == 'average':
picking_type = 'in'
+ break
+ else:
+ picking_type = 'out'
return picking_type
def default_get(self, cr, uid, fields, context=None):
@@ -156,7 +159,7 @@ class stock_partial_picking(osv.osv_memory):
'prodlot_id': move.prodlot_id.id,
}
if (picking_type == 'in') and (move.product_id.cost_method == 'average'):
- partial_datas['move%s' % (move.id)].update({
+ partial_datas['move%s' % (move.move_id.id)].update({
'product_price' : move.cost,
'product_currency': move.currency.id,
})