diff --git a/addons/account/account.py b/addons/account/account.py index 4b9c70d7b32..34306b703aa 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1256,7 +1256,7 @@ class account_move(osv.osv): context = {} c = context.copy() c['novalidate'] = True - result = super(osv.osv, self).write(cr, uid, ids, vals, c) + result = super(account_move, self).write(cr, uid, ids, vals, c) self.validate(cr, uid, ids, context=context) return result diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 06fa0938dcb..1322226bfb6 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -1273,7 +1273,7 @@ class account_move_line(osv.osv): 'user_id': uid })] - result = super(osv.osv, self).create(cr, uid, vals, context=context) + result = super(account_move_line, self).create(cr, uid, vals, context=context) # CREATE Taxes if vals.get('account_tax_id', False): tax_id = tax_obj.browse(cr, uid, vals['account_tax_id']) diff --git a/addons/account/company.py b/addons/account/company.py index bbbb8aa60c8..c903b6d4a71 100644 --- a/addons/account/company.py +++ b/addons/account/company.py @@ -32,7 +32,7 @@ class res_company(osv.osv): string="Reserve and Profit/Loss Account", view_load=True, domain="[('type', '=', 'other')]", - help="This Account is used for transferring Profit/Loss(If It is Profit: Amount will be added, Loss : Amount will be deducted.), Which is calculated from Profit & Loss Report"), + help="This account is used for transferring Profit/Loss (If It is Profit: Amount will be added, Loss : Amount will be deducted.), as calculated in Profit & Loss Report"), } _defaults = { diff --git a/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py b/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py index 93208532e45..186d39c4859 100644 --- a/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py +++ b/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py @@ -29,7 +29,7 @@ class account_analytic_cost_ledger_journal_report(osv.osv_memory): _columns = { 'date1': fields.date('Start of period', required=True), 'date2': fields.date('End of period', required=True), - 'journal': fields.many2many('account.analytic.journal', 'ledger_journal_rel', 'ledger_id', 'Journal_id', 'Journals'), + 'journal': fields.many2many('account.analytic.journal', 'ledger_journal_rel', 'ledger_id', 'journal_id', 'Journals'), } _defaults = { diff --git a/addons/account/test/account_report.yml b/addons/account/test/account_report.yml index d5bb6bada65..40ba7ea7127 100644 --- a/addons/account/test/account_report.yml +++ b/addons/account/test/account_report.yml @@ -147,7 +147,7 @@ !python {model: account.account}: | ctx={} ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False} + data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False,'target_move': 'all'} from tools import test_reports test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account') - @@ -156,7 +156,7 @@ !python {model: account.account}: | ctx={} ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True} + data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True,'target_move': 'all'} from tools import test_reports test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account') - diff --git a/addons/account/wizard/account_report_account_balance.py b/addons/account/wizard/account_report_account_balance.py index a72d58dd904..4e52066b49e 100644 --- a/addons/account/wizard/account_report_account_balance.py +++ b/addons/account/wizard/account_report_account_balance.py @@ -19,13 +19,17 @@ # ############################################################################## -from osv import osv +from osv import osv, fields class account_balance_report(osv.osv_memory): _inherit = "account.common.account.report" _name = 'account.balance.report' _description = 'Trial Balance Report' + _columns = { + 'journal_ids': fields.many2many('account.journal', 'account_balance_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), + } + _defaults = { 'journal_ids': [], } diff --git a/addons/account/wizard/account_report_aged_partner_balance.py b/addons/account/wizard/account_report_aged_partner_balance.py index 4e6c6dea752..9b89b30c93b 100644 --- a/addons/account/wizard/account_report_aged_partner_balance.py +++ b/addons/account/wizard/account_report_aged_partner_balance.py @@ -35,6 +35,7 @@ class account_aged_trial_balance(osv.osv_memory): 'direction_selection': fields.selection([('past','Past'), ('future','Future')], 'Analysis Direction', required=True), + 'journal_ids': fields.many2many('account.journal', 'account_aged_trial_balance_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'period_length': 30, diff --git a/addons/account/wizard/account_report_balance_sheet.py b/addons/account/wizard/account_report_balance_sheet.py index 873ede3832c..01a89168a43 100644 --- a/addons/account/wizard/account_report_balance_sheet.py +++ b/addons/account/wizard/account_report_balance_sheet.py @@ -40,11 +40,9 @@ class account_bs_report(osv.osv_memory): _columns = { 'display_type': fields.boolean("Landscape Mode"), 'reserve_account_id': fields.many2one('account.account', 'Reserve & Profit/Loss Account', - required=True, - help='This Account is used for transfering Profit/Loss ' \ - '(Profit: Amount will be added, Loss: Amount will be duducted), ' \ - 'which is calculated from Profilt & Loss Report', + help='This account is used for transferring Profit/Loss (If It is Profit: Amount will be added, Loss : Amount will be deducted.), as calculated in Profit & Loss Report', domain = [('type','=','other')]), + 'journal_ids': fields.many2many('account.journal', 'account_bs_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults={ diff --git a/addons/account/wizard/account_report_balance_sheet_view.xml b/addons/account/wizard/account_report_balance_sheet_view.xml index 22a6e0608b2..faac52388a1 100644 --- a/addons/account/wizard/account_report_balance_sheet_view.xml +++ b/addons/account/wizard/account_report_balance_sheet_view.xml @@ -21,7 +21,7 @@ - + diff --git a/addons/account/wizard/account_report_central_journal.py b/addons/account/wizard/account_report_central_journal.py index d66be0a70e4..eed21f976a5 100644 --- a/addons/account/wizard/account_report_central_journal.py +++ b/addons/account/wizard/account_report_central_journal.py @@ -19,13 +19,17 @@ # ############################################################################## -from osv import osv +from osv import osv, fields class account_central_journal(osv.osv_memory): _name = 'account.central.journal' _description = 'Account Central Journal' _inherit = "account.common.journal.report" + _columns = { + 'journal_ids': fields.many2many('account.journal', 'account_central_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), + } + def _print_report(self, cr, uid, ids, data, context=None): data = self.pre_print_report(cr, uid, ids, data, context=context) return { diff --git a/addons/account/wizard/account_report_common.py b/addons/account/wizard/account_report_common.py index 0d0b69ce132..48130b041d0 100644 --- a/addons/account/wizard/account_report_common.py +++ b/addons/account/wizard/account_report_common.py @@ -35,7 +35,7 @@ class account_common_report(osv.osv_memory): 'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods')], "Filter by", required=True), 'period_from': fields.many2one('account.period', 'Start Period'), 'period_to': fields.many2one('account.period', 'End Period'), - 'journal_ids': fields.many2many('account.journal', 'account_common_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), + 'journal_ids': fields.many2many('account.journal', string='Journals', required=True), 'date_from': fields.date("Start Date"), 'date_to': fields.date("End Date"), 'target_move': fields.selection([('posted', 'All Posted Entries'), diff --git a/addons/account/wizard/account_report_general_journal.py b/addons/account/wizard/account_report_general_journal.py index af091d9bc08..521c4667a80 100644 --- a/addons/account/wizard/account_report_general_journal.py +++ b/addons/account/wizard/account_report_general_journal.py @@ -19,17 +19,21 @@ # ############################################################################## -from osv import osv +from osv import osv, fields class account_general_journal(osv.osv_memory): _inherit = "account.common.journal.report" _name = 'account.general.journal' _description = 'Account General Journal' + _columns = { + 'journal_ids': fields.many2many('account.journal', 'account_general_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), + } + def _print_report(self, cr, uid, ids, data, context=None): data = self.pre_print_report(cr, uid, ids, data, context=context) return {'type': 'ir.actions.report.xml', 'report_name': 'account.general.journal', 'datas': data} account_general_journal() -#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_report_general_ledger.py b/addons/account/wizard/account_report_general_ledger.py index ed75b3c1dce..d0b3c0fa3d3 100644 --- a/addons/account/wizard/account_report_general_ledger.py +++ b/addons/account/wizard/account_report_general_ledger.py @@ -32,6 +32,7 @@ class account_report_general_ledger(osv.osv_memory): help='If you selected to filter by date or period, this field allow you to add a row to display the amount of debit/credit/balance that precedes the filter you\'ve set.'), 'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"), 'sortby': fields.selection([('sort_date', 'Date'), ('sort_journal_partner', 'Journal & Partner')], 'Sort by', required=True), + 'journal_ids': fields.many2many('account.journal', 'account_report_general_ledger_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'landscape': True, diff --git a/addons/account/wizard/account_report_partner_balance.py b/addons/account/wizard/account_report_partner_balance.py index eff9e71cb72..80ee455456c 100644 --- a/addons/account/wizard/account_report_partner_balance.py +++ b/addons/account/wizard/account_report_partner_balance.py @@ -31,6 +31,7 @@ class account_partner_balance(osv.osv_memory): _columns = { 'display_partner': fields.selection([('non-zero_balance', 'With balance is not equal to 0'), ('all', 'All Partners')] ,'Display Partners'), + 'journal_ids': fields.many2many('account.journal', 'account_partner_balance_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { @@ -51,4 +52,4 @@ class account_partner_balance(osv.osv_memory): account_partner_balance() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_report_partner_ledger.py b/addons/account/wizard/account_report_partner_ledger.py index 8a2b6c7bacb..7a3f3932f1b 100644 --- a/addons/account/wizard/account_report_partner_ledger.py +++ b/addons/account/wizard/account_report_partner_ledger.py @@ -35,6 +35,7 @@ class account_partner_ledger(osv.osv_memory): 'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods'), ('unreconciled', 'Unreconciled Entries')], "Filter by", required=True), 'page_split': fields.boolean('One Partner Per Page', help='Display Ledger Report with One partner per page'), 'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"), + 'journal_ids': fields.many2many('account.journal', 'account_partner_ledger_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'initial_balance': False, diff --git a/addons/account/wizard/account_report_print_journal.py b/addons/account/wizard/account_report_print_journal.py index f4a5fcaf9f9..d7e8f11a7f8 100644 --- a/addons/account/wizard/account_report_print_journal.py +++ b/addons/account/wizard/account_report_print_journal.py @@ -30,6 +30,7 @@ class account_print_journal(osv.osv_memory): 'sort_selection': fields.selection([('date', 'Date'), ('ref', 'Reference Number'),], 'Entries Sorted by', required=True), + 'journal_ids': fields.many2many('account.journal', 'account_print_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'sort_selection': 'date', @@ -44,4 +45,4 @@ class account_print_journal(osv.osv_memory): account_print_journal() -#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_report_profit_loss.py b/addons/account/wizard/account_report_profit_loss.py index 6372539c056..f4c2897bfe0 100644 --- a/addons/account/wizard/account_report_profit_loss.py +++ b/addons/account/wizard/account_report_profit_loss.py @@ -28,14 +28,15 @@ class account_pl_report(osv.osv_memory): _inherit = "account.common.account.report" _name = "account.pl.report" _description = "Account Profit And Loss Report" + _columns = { 'display_type': fields.boolean("Landscape Mode"), + 'journal_ids': fields.many2many('account.journal', 'account_pl_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'display_type': False, 'journal_ids': [], - 'target_move': False } def _print_report(self, cr, uid, ids, data, context=None): diff --git a/addons/account/wizard/account_report_profit_loss_view.xml b/addons/account/wizard/account_report_profit_loss_view.xml index d9876f57454..75b6766ff87 100644 --- a/addons/account/wizard/account_report_profit_loss_view.xml +++ b/addons/account/wizard/account_report_profit_loss_view.xml @@ -9,9 +9,6 @@ - - - diff --git a/addons/account_analytic_plans/account_analytic_plans.py b/addons/account_analytic_plans/account_analytic_plans.py index c8ab5334d8a..c62e6ea98d0 100644 --- a/addons/account_analytic_plans/account_analytic_plans.py +++ b/addons/account_analytic_plans/account_analytic_plans.py @@ -366,7 +366,7 @@ class account_move_line(osv.osv): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): if context is None: context = {} - result = super(osv.osv, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) + result = super(account_move_line, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) return result account_move_line() @@ -496,4 +496,4 @@ class account_bank_statement_line(osv.osv): } account_bank_statement_line() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/anonymization/anonymization.py b/addons/anonymization/anonymization.py index 5d1f8a76e1c..4af387a5c02 100644 --- a/addons/anonymization/anonymization.py +++ b/addons/anonymization/anonymization.py @@ -239,7 +239,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory): return res _columns = { - 'name': fields.char(size='64', string='File Name'), + 'name': fields.char(size=64, string='File Name'), 'summary': fields.function(_get_summary, type='text', string='Summary'), 'file_export': fields.binary(string='Export'), 'file_import': fields.binary(string='Import'), diff --git a/addons/crm/crm.py b/addons/crm/crm.py index 512192ddce7..4031f3d9868 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -381,7 +381,7 @@ class crm_case(crm_base): default.update({ 'date_closed': False, }) if self._columns.get('date_open'): default.update({ 'date_open': False }) - return super(osv.osv, self).copy(cr, uid, id, default, context=context) + return super(crm_case, self).copy(cr, uid, id, default, context=context) def case_open(self, cr, uid, ids, *args): diff --git a/addons/crm/test/test_crm_lead.yml b/addons/crm/test/test_crm_lead.yml index 6a954939e04..5e9b7a5cfca 100644 --- a/addons/crm/test/test_crm_lead.yml +++ b/addons/crm/test/test_crm_lead.yml @@ -92,7 +92,6 @@ - !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_1}: action: 'exist' - name: 'existing partner' - Then, Click on "Create Opportunity" button. - @@ -104,7 +103,6 @@ - !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_2}: action: 'nothing' - name: 'Do not link to a partner' - Then, Click on "Create Opportunity" button. - diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py index 8200dbd1675..87ab9229d26 100644 --- a/addons/crm/wizard/crm_lead_to_opportunity.py +++ b/addons/crm/wizard/crm_lead_to_opportunity.py @@ -37,7 +37,7 @@ class crm_lead2opportunity_partner(osv.osv_memory): ('nothing', 'Do not link to a partner')], \ 'Action', required=True), 'name': fields.selection([('convert', 'Convert to Opportunity'), ('merge', 'Merge with existing Opportunity')],'Select Action', required=True), - 'opportunity_ids': fields.many2many('crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id', 'Opportunities', domain=[('type', '=', 'opportunity')]), + 'opportunity_ids': fields.many2many('crm.lead', string='Opportunities', domain=[('type', '=', 'opportunity')]), } def default_get(self, cr, uid, fields, context=None): @@ -236,7 +236,7 @@ class crm_lead2opportunity_mass_convert(osv.osv_memory): _columns = { - 'user_ids': fields.many2many('res.users', 'mass_convert_rel', 'user_id', 'wizard_id', 'Salesmans'), + 'user_ids': fields.many2many('res.users', string='Salesmans'), 'section_id': fields.many2one('crm.case.section', 'Sales Team'), } diff --git a/addons/crm_partner_assign/test/test_crm_partner_assign.yml b/addons/crm_partner_assign/test/test_crm_partner_assign.yml index b214f535275..359fa8454f6 100644 --- a/addons/crm_partner_assign/test/test_crm_partner_assign.yml +++ b/addons/crm_partner_assign/test/test_crm_partner_assign.yml @@ -108,6 +108,7 @@ 'email_to': 'info@axelor.com', 'email_from': 'Administrator ', 'reply_to': 'sales_openerp@openerp.com', + 'state': 'draft', 'history': 'latest', } ids = self.create(cr, uid, vals, context={'active_id': ref('crm_lead_questionnaireonopenerp0'), 'active_model': 'crm.lead'}) diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml b/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml index d3ecddb1aa3..8bdb03cf962 100644 --- a/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml +++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml @@ -25,7 +25,6 @@ - diff --git a/addons/crm_profiling/crm_profiling.py b/addons/crm_profiling/crm_profiling.py index 90dc0818743..59137966da0 100644 --- a/addons/crm_profiling/crm_profiling.py +++ b/addons/crm_profiling/crm_profiling.py @@ -264,7 +264,7 @@ class crm_segmentation(osv.osv): } _constraints = [ - (orm.orm._check_recursion, 'Error ! You can not create recursive profiles.', ['parent_id']) + (osv.osv._check_recursion, 'Error ! You can not create recursive profiles.', ['parent_id']) ] def process_continue(self, cr, uid, ids, start=False): diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index d40f9541b01..61006f96782 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -65,7 +65,9 @@ class mail_compose_message(osv.osv_memory): _columns = { 'use_template': fields.boolean('Use Template'), - 'template_id': fields.selection(_get_templates, 'Template'), + 'template_id': fields.selection(_get_templates, 'Template', + size=-1 # means we want an int db column + ), } def on_change_template(self, cr, uid, ids, use_template, template_id, email_from=None, email_to=None, context=None): diff --git a/addons/hr_attendance/wizard/hr_attendance_sign_in_out.py b/addons/hr_attendance/wizard/hr_attendance_sign_in_out.py index 7a51c2b9e1e..2631139b38d 100644 --- a/addons/hr_attendance/wizard/hr_attendance_sign_in_out.py +++ b/addons/hr_attendance/wizard/hr_attendance_sign_in_out.py @@ -29,7 +29,7 @@ class hr_si_so_ask(osv.osv_memory): _columns = { 'name': fields.char('Employees name', size=32, required=True, readonly=True), 'last_time': fields.datetime('Your last sign out', required=True), - 'emp_id': fields.char('Empoyee ID', size=32, required=True, readonly=True), + 'emp_id': fields.many2one('hr.employee', 'Empoyee ID', readonly=True), } def _get_empname(self, cr, uid, context=None): @@ -52,10 +52,12 @@ class hr_si_so_ask(osv.osv_memory): def sign_in(self, cr, uid, ids, context=None): data = self.read(cr, uid, ids, [], context=context)[0] + data['emp_id'] = data['emp_id'] and data['emp_id'][0] return self.pool.get('hr.sign.in.out').sign_in(cr, uid, data, context) def sign_out(self, cr, uid, ids, context=None): data = self.read(cr, uid, ids, [], context=context)[0] + data['emp_id'] = data['emp_id'] and data['emp_id'][0] return self.pool.get('hr.sign.in.out').sign_out(cr, uid, data, context) hr_si_so_ask() @@ -68,7 +70,7 @@ class hr_sign_in_out(osv.osv_memory): _columns = { 'name': fields.char('Employees name', size=32, required=True, readonly=True), 'state': fields.char('Current state', size=32, required=True, readonly=True), - 'emp_id': fields.char('Employee ID', size=32, required=True, readonly=True), + 'emp_id': fields.many2one('hr.employee', 'Empoyee ID', readonly=True), } def _get_empid(self, cr, uid, context=None): @@ -88,6 +90,7 @@ class hr_sign_in_out(osv.osv_memory): obj_model = self.pool.get('ir.model.data') att_obj = self.pool.get('hr.attendance') data = self.read(cr, uid, ids, [], context=context)[0] + data['emp_id'] = data['emp_id'] and data['emp_id'][0] emp_id = data['emp_id'] att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id)], limit=1, order='name desc') last_att = att_obj.browse(cr, uid, att_id, context=context) @@ -113,6 +116,7 @@ class hr_sign_in_out(osv.osv_memory): obj_model = self.pool.get('ir.model.data') att_obj = self.pool.get('hr.attendance') data = self.read(cr, uid, ids, [], context=context)[0] + data['emp_id'] = data['emp_id'] and data['emp_id'][0] emp_id = data['emp_id'] att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id),('action', '!=', 'action')], limit=1, order='name desc') last_att = att_obj.browse(cr, uid, att_id, context=context) diff --git a/addons/idea/test/test_idea.yml b/addons/idea/test/test_idea.yml index 402f93f4817..4ce9d706e69 100644 --- a/addons/idea/test/test_idea.yml +++ b/addons/idea/test/test_idea.yml @@ -56,7 +56,7 @@ - !python {model: idea.post.vote}: | uid2 = ref('test_idea_user1') - new_id = self.create(cr, uid2, {'vote': 50}, {"active_ids": [ref("idea_idea_0")]}) + new_id = self.create(cr, uid2, {'vote': "50"}, {"active_ids": [ref("idea_idea_0")]}) self.do_vote(cr, uid2, [new_id], {"active_ids": [ref("idea_idea_0")]}) - | @@ -69,7 +69,7 @@ - !python {model: idea.post.vote}: | uid2 = ref('test_idea_user2') - new_id = self.create(cr, uid2, {'vote': 100, 'note': 'We can learn many things from technical presentation'}, {"active_ids": [ref("idea_idea_0")]}) + new_id = self.create(cr, uid2, {'vote': "100", 'note': 'We can learn many things from technical presentation'}, {"active_ids": [ref("idea_idea_0")]}) self.do_vote(cr, uid2, [new_id], {'active_ids': [ref('idea_idea_0')]}) - | diff --git a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py index 2ab26d66439..e43dbfecf2b 100644 --- a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py +++ b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py @@ -117,7 +117,8 @@ class partner_vat_list_13(osv.osv_memory): """ Partner Vat Listing """ _name = "partner.vat.list_13" _columns = { - 'partner_ids': fields.many2many('vat.listing.clients', 'vat_partner_rel', 'vat_id', 'partner_id', 'Clients', required=False, help='You can remove clients/partners which you do not want to show in xml file'), + # TODO the referenced model has been deleted at revno 4672.1.2. + #'partner_ids': fields.many2many('vat.listing.clients', 'vat_partner_rel', 'vat_id', 'partner_id', 'Clients', required=False, help='You can remove clients/partners which you do not want to show in xml file'), 'name': fields.char('File Name', size=32), 'msg': fields.text('File created', size=64, readonly=True), 'file_save' : fields.binary('Save File', readonly=True), @@ -127,7 +128,8 @@ class partner_vat_list_13(osv.osv_memory): return context.get('partner_ids', []) _defaults={ - 'partner_ids': _get_partners + # TODO the referenced model has been deleted at revno 4672.1.2. + # 'partner_ids': _get_partners } def create_xml(self, cursor, user, ids, context=None): diff --git a/addons/l10n_be/wizard/l10n_be_vat_intra.py b/addons/l10n_be/wizard/l10n_be_vat_intra.py index 2596076c048..84093cbe066 100644 --- a/addons/l10n_be/wizard/l10n_be_vat_intra.py +++ b/addons/l10n_be/wizard/l10n_be_vat_intra.py @@ -83,9 +83,10 @@ class partner_vat_intra(osv.osv_memory): else: data_cmpny = obj_user.browse(cursor, user, user).company_id data = self.read(cursor, user, ids)[0] - company_vat = data_cmpny.partner_id.vat.replace(' ','').upper() + company_vat = data_cmpny.partner_id.vat if not company_vat: raise osv.except_osv(_('Data Insufficient'),_('No VAT Number Associated with Main Company!')) + company_vat = company_vat.replace(' ','').upper() seq_controlref = obj_sequence.get(cursor, user, 'controlref') seq_declarantnum = obj_sequence.get(cursor, user, 'declarantnum') diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index 0bfaf06890a..93bf0b004d8 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -82,9 +82,9 @@ class mail_compose_message(osv.osv_memory): else: # default mode result['model'] = context.get('active_model', False) - if vals: - for field in fields: - result.update({field : vals.get(field, False)}) + for field in vals: + if field in fields: + result.update({field : vals[field]}) # link to model and record if not done yet if not result.get('model') or not result.get('res_id'): diff --git a/addons/mrp/test/mrp_phantom_bom.yml b/addons/mrp/test/mrp_phantom_bom.yml index 6bb297fbcfb..1f499a5fb7f 100644 --- a/addons/mrp/test/mrp_phantom_bom.yml +++ b/addons/mrp/test/mrp_phantom_bom.yml @@ -205,9 +205,8 @@ I am checking Procurement orders. There are 3 orders generated for Oranges, Sugar and Water. - !python {model: procurement.order}: | - from tools.translate import _ proc_ids = self.search(cr, uid, [('product_id','in',[ref('product_product_orange0'),ref('product_product_sugar0'),ref('product_product_water0')])]) - assert proc_ids, _('No Procurements!') + assert proc_ids, 'No Procurements!' - The scheduler runs. - @@ -219,9 +218,8 @@ stock moves for Oranges, Sugar and Water made correctly. - !python {model: stock.picking}: | - from tools.translate import _ pick_ids = self.search(cr, uid, [('type','=','internal')]) - assert pick_ids, _('No Internal Pickings!') + assert pick_ids, 'No Internal Pickings!' - According to minimum stock rules. I have 2 purchase orders for Sugar with 6 Kg from Axelor and Orange 60 Kg from ASUStek. @@ -229,50 +227,24 @@ I confirm the purchase order of Sugar and Orange. - !python {model: purchase.order}: | - from tools.translate import _ import netsvc purch_ids = self.search(cr, uid, [('state','=','draft')]) - assert purch_ids, _('No Purchase Orders were made!') + assert purch_ids, 'No Purchase Orders were made!' wf_service = netsvc.LocalService("workflow") for p_id in purch_ids: wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_confirm', cr) - - I see two incoming pickings for Orange and Sugar. + I see two incoming pickings for Orange and Sugar, and receive them. - !python {model: stock.picking}: | - from tools.translate import _ pick_ids = self.search(cr, uid, [('type','=','in')]) - assert pick_ids, _('No Incoming Shipments found!') -- - I receive both the products. My incoming pickings are done. -- - I create record for the incoming picking wizard. -- - !record {model: stock.partial.picking, id: stock_partial_picking0}: - date: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") -- - I make my pickings done. -- - !python {model: stock.partial.picking}: | - pick_obj = self.pool.get('stock.picking') - picking_ids = pick_obj.search(cr, uid, [('type','=','in'),('state','=','assigned')]) - partial = self.browse(cr, uid, 1, context) - partial_datas = { - 'delivery_date': partial.date - } - for pick in pick_obj.browse(cr, uid, picking_ids): - for m in pick.move_lines: - partial_datas['move%s'%(m.id)] = { - 'product_id': m.product_id.id, - 'product_qty': m.product_qty, - 'product_uom': m.product_uom.id - } - if (pick.type == 'in') and (m.product_id.cost_method == 'average'): - partial_datas['move%s'%(m.id)].update({ - 'product_price': m.product_price, - 'product_currency': m.product_currency - }) - pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context) + assert pick_ids, 'No Incoming Shipments found!' + stock_partial_picking = self.pool.get('stock.partial.picking') + for pick_id in pick_ids: + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick_id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - Again the scheduler runs. - @@ -283,19 +255,15 @@ I check my internal picking of "Orange Juice" is done. - !python {model: stock.picking}: | - from tools.translate import _ pick_ids = self.search(cr, uid, [('type','=','internal'),('state','=','done')]) - assert pick_ids, _('Internal Picking is not done yet!') + assert pick_ids, 'Internal Picking is not done yet!' - I check my manufacturing order for "Orange Juice" is ready or not. - !python {model: mrp.production}: | - from tools.translate import _ - pick_ids = self.search(cr, uid, [('state','=','ready'),('id','=',ref('mrp_production_mo0'))]) - assert pick_ids, _('Manufacturing order is not ready!') + prod_ids = self.search(cr, uid, [('state','=','ready'),('id','=',ref('mrp_production_mo0'))]) + assert prod_ids, 'Manufacturing order is not ready!' - I start the production order. - !workflow {model: mrp.production, action: button_produce, ref: mrp_production_mo0} - - diff --git a/addons/mrp/test/mrp_procurement.yml b/addons/mrp/test/mrp_procurement.yml index 568a5f0b0e8..4aaf1560432 100644 --- a/addons/mrp/test/mrp_procurement.yml +++ b/addons/mrp/test/mrp_procurement.yml @@ -195,74 +195,26 @@ I Check incoming shipments for cloth. And receive products. - !python {model: stock.picking}: | - from tools.translate import _ pick_ids = self.search(cr, uid, [('address_id.name','=','Wong'),('state','=','assigned')]) - assert pick_ids, _('No Incoming Shipments found!') -- - I create record for partial picking. -- - !record {model: stock.partial.picking, id: stock_partial_picking0}: - date: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") - -- - I make my picking done. -- - !python {model: stock.partial.picking}: | - pick_obj = self.pool.get('stock.picking') - picking_ids = pick_obj.search(cr, uid, [('address_id.name','=','Wong'),('state','=','assigned')]) - partial = self.browse(cr, uid, 1, context) - partial_datas = { - 'delivery_date' : partial.date - } - for pick in pick_obj.browse(cr, uid, picking_ids): - for m in pick.move_lines: - partial_datas['move%s'%(m.id)] = { - 'product_id' : m.product_id.id, - 'product_qty' : m.product_qty, - 'product_uom' : m.product_uom.id - } - if (pick.type == 'in') and (m.product_id.cost_method == 'average'): - partial_datas['move%s'%(m.id)].update({ - 'product_price' : m.product_price, - 'product_currency': m.product_currency - }) - pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context) + assert pick_ids, 'No Incoming Shipments found!' + stock_partial_picking = self.pool.get('stock.partial.picking') + for pick_id in pick_ids: + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick_id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I Check incoming shipments for buttons and receive products. - !python {model: stock.picking}: | - from tools.translate import _ pick_ids = self.search(cr, uid, [('address_id.name','=','Tang'),('state','=','assigned')]) - assert pick_ids, _('No Incoming Shipments found!') -- - I create record for partial picking. -- - !record {model: stock.partial.picking, id: stock_partial_picking0}: - date: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") - -- - I make my picking done. -- - !python {model: stock.partial.picking}: | - pick_obj = self.pool.get('stock.picking') - picking_ids = pick_obj.search(cr, uid, [('address_id.name','=','Tang'),('state','=','assigned')]) - partial = self.browse(cr, uid, 1, context) - partial_datas = { - 'delivery_date': partial.date - } - for pick in pick_obj.browse(cr, uid, picking_ids): - for m in pick.move_lines: - partial_datas['move%s'%(m.id)] = { - 'product_id': m.product_id.id, - 'product_qty': m.product_qty, - 'product_uom': m.product_uom.id - } - if (pick.type == 'in') and (m.product_id.cost_method == 'average'): - partial_datas['move%s'%(m.id)].update({ - 'product_price': m.product_price, - 'product_currency': m.product_currency - }) - pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context) + assert pick_ids, 'No Incoming Shipments found!' + stock_partial_picking = self.pool.get('stock.partial.picking') + for pick_id in pick_ids: + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick_id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - Run scheduler again. - @@ -297,7 +249,6 @@ I produce 2 products with 5.00 quantities each. - !python {model: mrp.product.produce}: | - from tools.translate import _ prod_obj = self.pool.get('mrp.production') prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')]) self.do_produce(cr, uid, [ref('mrp_product_produce0')], context={'active_ids': prod_ids}) @@ -321,8 +272,7 @@ And finally production order is done. - !python {model: mrp.product.produce}: | - from tools.translate import _ prod_obj = self.pool.get('mrp.production') prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')]) - self.do_produce(cr, uid, [1], context={'active_ids': prod_ids}) + self.do_produce(cr, uid, [ref('mrp_product_produce0')], context={'active_ids': prod_ids}) diff --git a/addons/outlook/installer.py b/addons/outlook/installer.py index 4d0ac1e1971..2be0c243037 100644 --- a/addons/outlook/installer.py +++ b/addons/outlook/installer.py @@ -41,7 +41,7 @@ class outlook_installer(osv.osv_memory): 'doc_name':fields.char('File name', size=64), 'outlook':fields.boolean('Outlook Plug-in ', help="Allows you to select an object that you would like to add to your email and its attachments."), 'plugin_file':fields.binary('Outlook Plug-in', readonly=True, help="outlook plug-in file. Save as this file and install this plug-in in outlook."), - 'doc_file':fields.char('Installation Manual',size="264",help="The documentation file :- how to install Outlook Plug-in.", readonly=True), + 'doc_file':fields.char('Installation Manual',size=264,help="The documentation file :- how to install Outlook Plug-in.", readonly=True), 'description':fields.text('Description', readonly=True) } diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 19f18d92dd6..ee2173dcd49 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -264,7 +264,7 @@ class pos_order(osv.osv): args['partner_id'] = order.partner_id and order.partner_id.id or None statement_id = statement_obj.search(cr,uid, [ - ('journal_id', '=', data['journal']), + ('journal_id', '=', int(data['journal'])), ('company_id', '=', curr_company), ('user_id', '=', uid), ('state', '=', 'open')], context=context) @@ -274,7 +274,7 @@ class pos_order(osv.osv): statement_id = statement_id[0] args['statement_id'] = statement_id args['pos_statement_id'] = order_id - args['journal_id'] = data['journal'] + args['journal_id'] = int(data['journal']) args['type'] = 'customer' args['ref'] = order.name statement_line_obj.create(cr, uid, args, context=context) diff --git a/addons/point_of_sale/test/point_of_sale_report.yml b/addons/point_of_sale/test/point_of_sale_report.yml index f31f9ec0f49..f3ea5995b9e 100644 --- a/addons/point_of_sale/test/point_of_sale_report.yml +++ b/addons/point_of_sale/test/point_of_sale_report.yml @@ -34,6 +34,11 @@ if tools.config['test_report_directory']: file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-receipt report'+format), 'wb+').write(data) +- + Create a record for the root user in pos.payment.report.user (used by the next python block). +- + !record {model: pos.payment.report.user, id: pos_payment_report_user_1}: + user_id: [] - Print the POS Payment Report through the wizard - diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py index 696c4d708fe..29b4aa29318 100644 --- a/addons/purchase/stock.py +++ b/addons/purchase/stock.py @@ -124,68 +124,15 @@ class stock_picking(osv.osv): purchase_obj.write(cursor, user, [picking.purchase_id.id], {'invoice_id': invoice_id,}) return super(stock_picking, self)._invoice_hook(cursor, user, picking, invoice_id) -stock_picking() - class stock_partial_picking(osv.osv_memory): _inherit = 'stock.partial.picking' - def default_get(self, cr, uid, fields, context=None): - """ To get default values for the object. - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param fields: List of fields for which we want default values - @param context: A standard dictionary - @return: A dictionary which of fields with values. - """ - if context is None: - context = {} - pick_obj = self.pool.get('stock.picking') - res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context) - for pick in pick_obj.browse(cr, uid, context.get('active_ids', []), context=context): - has_product_cost = (pick.type == 'in' and pick.purchase_id) - for m in pick.move_lines: - if m.state in ('done','cancel') : - continue - if has_product_cost and m.product_id.cost_method == 'average' and m.purchase_line_id: - # We use the original PO unit purchase price as the basis for the cost, expressed - # in the currency of the PO (i.e the PO's pricelist currency) - list_index = 0 - for item in res['product_moves_in']: - if item['move_id'] == m.id: - res['product_moves_in'][list_index]['cost'] = m.purchase_line_id.price_unit - res['product_moves_in'][list_index]['currency'] = m.picking_id.purchase_id.pricelist_id.currency_id.id - list_index += 1 - return res -stock_partial_picking() + # Overridden to inject the purchase price as true 'cost price' when processing + # incoming pickings. + def _product_cost_for_average_update(self, cr, uid, move): + if move.picking_id.purchase_id: + return {'cost': move.purchase_line_id.price_unit, + 'currency': move.picking_id.purchase_id.pricelist_id.currency_id.id} + return super(stock_partial_picking, self)._product_cost_for_average_update(cr, uid, move) -class stock_partial_move(osv.osv_memory): - _inherit = "stock.partial.move" - def default_get(self, cr, uid, fields, context=None): - """ To get default values for the object. - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param fields: List of fields for which we want default values - @param context: A standard dictionary - @return: A dictionary which of fields with values. - """ - if context is None: - context = {} - res = super(stock_partial_move, self).default_get(cr, uid, fields, context=context) - move_obj = self.pool.get('stock.move') - for m in move_obj.browse(cr, uid, context.get('active_ids', []), context=context): - if m.picking_id.type == 'in' and m.product_id.cost_method == 'average' \ - and m.purchase_line_id and m.picking_id.purchase_id: - # We use the original PO unit purchase price as the basis for the cost, expressed - # in the currency of the PO (i.e the PO's pricelist currency) - list_index = 0 - for item in res['product_moves_in']: - if item['move_id'] == m.id: - res['product_moves_in'][list_index]['cost'] = m.purchase_line_id.price_unit - res['product_moves_in'][list_index]['currency'] = m.picking_id.purchase_id.pricelist_id.currency_id.id - list_index += 1 - return res -stock_partial_move() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/purchase/test/purchase_from_picking.yml b/addons/purchase/test/purchase_from_picking.yml index 9425ad94812..8d63aa3e02c 100644 --- a/addons/purchase/test/purchase_from_picking.yml +++ b/addons/purchase/test/purchase_from_picking.yml @@ -137,7 +137,7 @@ pur_id1=pur_obj.browse(cr, uid, ref("purchase_order_po2")) pick_ids = [x.id for x in pur_id1.picking_ids] id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.expenses_journal')}, - {'active_ids': pick_ids}) + {'active_ids': pick_ids, 'active_model': 'stock.picking'}) self.create_invoice(cr, uid, [id], {"active_ids": pick_ids, "active_id": pick_ids[0]}) - I check that an invoice_ids field of Delivery&Invoices gets bind with the value. diff --git a/addons/sale/test/invoice_on_ordered_qty.yml b/addons/sale/test/invoice_on_ordered_qty.yml index 785b2d8835e..313aa3a0d63 100644 --- a/addons/sale/test/invoice_on_ordered_qty.yml +++ b/addons/sale/test/invoice_on_ordered_qty.yml @@ -31,39 +31,17 @@ - !workflow {model: sale.order, action: order_confirm, ref: sale_order_so9} - - I verify that the picking has been generated for the sale order + I verify that the picking has been generated for the sale order and I process it - !python {model: sale.order}: | so = self.browse(cr, uid, ref("sale_order_so9")) assert so.picking_ids,"Picking has not been generated for sale_order_so9" -- - Then I confirm the picking -- - !record {model: stock.partial.picking, id: stock_partial_picking_0}: - date: !eval time.strftime('%Y-%m-%d %H:%M:%S') -- - Then I done the picking -- - !python {model: stock.picking }: | - import time - sale_order_obj = self.pool.get('sale.order') - so = sale_order_obj.browse(cr, uid, ref("sale_order_so9")) - picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')]) - if picking_id: - pick=self.browse(cr,uid,picking_id[0]) - pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': '100', - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) + picking, = so.picking_ids + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [picking.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I click on Create Invoice button to create the invoice. - diff --git a/addons/sale/test/invoice_on_shipped_qty.yml b/addons/sale/test/invoice_on_shipped_qty.yml index bf2795e0f5b..c6ac86471be 100644 --- a/addons/sale/test/invoice_on_shipped_qty.yml +++ b/addons/sale/test/invoice_on_shipped_qty.yml @@ -30,41 +30,21 @@ - !workflow {model: sale.order, action: order_confirm, ref: sale_order_so6} - - I verify that the picking has been generated for the sale order + I verify that the picking has been generated for the sale order and I process it - !python {model: sale.order}: | so = self.browse(cr, uid, ref("sale_order_so6")) assert so.picking_ids,"Picking has not been generated for sale_order_so6" -- - Then I click on the "Product Sent" button of Outgoing Shipments -- - !record {model: stock.partial.picking, id: stock_partial_picking_0}: - date: !eval time.strftime('%Y-%m-%d %H:%M:%S') -- - I change the quantity on the picking to 199, and confirm partially 100 PCE. -- - !python {model: stock.picking }: | - import time - sale_order_obj = self.pool.get('sale.order') - so = sale_order_obj.browse(cr, uid, ref("sale_order_so6")) - picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')]) - if picking_id: - pick=self.browse(cr,uid,picking_id[0]) - self.pool.get('stock.move').write(cr, uid, [pick.move_lines[0].id], {'product_qty': 199, 'product_uos_qty': 199}) - pick=self.browse(cr,uid,picking_id[0]) - pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': '100', - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) + picking, = so.picking_ids + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [picking.id]}) + # I change the qty to 100 for a partial delivery + partial = stock_partial_picking.browse(cr,uid,partial_id) + line_id = partial.move_ids[0].id + partial.write({'move_ids': [(1,line_id,{'quantity':100})]}) + partial.do_partial() - Then I click on 'Create Invoices' button - @@ -72,9 +52,9 @@ import time sale_obj = self.pool.get('sale.order') sale_id = sale_obj.browse(cr, uid, ref("sale_order_so6")) - ids = [x.id for x in sale_id.picking_ids] + ids = [x.id for x in sale_id.picking_ids if x.state == 'done'] wiz_id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.sales_journal')}, - {'active_ids': ids}) + {'active_ids': ids, 'active_model': 'stock.picking'}) self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]}) - I verify whether the invoice has been generated for SO @@ -98,7 +78,7 @@ inv_brw = self.browse(cr,uid,inv_id)[0] for inv_lines in inv_brw.invoice_line: qty1=inv_lines.quantity - assert (qty1 == qty), "Quantities are not the same" + assert (qty1 == qty), "Quantities are not the same: invoiced: %s, shipped: %s" % (qty1,qty) - I open the Invoice for the SO. - diff --git a/addons/sale/test/manual_order_policy.yml b/addons/sale/test/manual_order_policy.yml index c1535402f9b..af515b2d4e4 100644 --- a/addons/sale/test/manual_order_policy.yml +++ b/addons/sale/test/manual_order_policy.yml @@ -136,15 +136,11 @@ I verify that a procurement state is "running" - !python {model: procurement.order}: | - from tools.translate import _ - modules = self.pool.get('ir.module.module') - mod_pur = modules.search(cr, uid, [('name','=','purchase')]) - mod_brw = modules.browse(cr,uid,mod_pur)[0] - if (mod_brw.state == 'installed'): - sale_order_obj = self.pool.get('sale.order') - so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) - proc_ids = self.search(cr, uid, [('origin','=',so.name),('state','=','running')]) - assert(proc_ids),"Procurement is not in the running state!" + sale_order_obj = self.pool.get('sale.order') + so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) + proc_ids = self.search(cr, uid, [('origin','=',so.name),('state','in',['running','ready'])]) + # should be running is 'purchase' is installed, else 'ready' + assert(proc_ids),"Procurement is not in running/ready state!" - I verify that a purchase order has been generated - @@ -192,7 +188,7 @@ for pur in pur_ids: wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) - - I verify that a picking related to purchase order has been generated. + I verify that a picking related to purchase order has been generated and I process it - !python {model: sale.order}: | modules = self.pool.get('ir.module.module') @@ -204,29 +200,12 @@ pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) po = pur_obj.browse(cr, uid, pur_id)[0] assert(po.picking_ids),"Picking for purchase order has not been generated" -- - Then I click on the "Products Received" button of Incoming Shipments -- - !record {model: stock.partial.picking, id: stock_partial_picking_0}: - date: !eval time.strftime('%Y-%m-%d %H:%M:%S') -- - I click on the "Validate" button -- - !python {model: stock.picking}: | - modules = self.pool.get('ir.module.module') - sale_order_obj = self.pool.get('sale.order') - pur_obj = self.pool.get('purchase.order') - mod_pur = modules.search(cr, uid, [('name','=','purchase')]) - mod_brw = modules.browse(cr,uid,mod_pur)[0] - if (mod_brw.state == 'installed'): - so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) - pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) - po = pur_obj.browse(cr, uid, pur_id)[0] - pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )]) - import netsvc - wf_service = netsvc.LocalService("workflow") - for pick in pick_ser_id: - wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr) + picking, = po.picking_ids + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [picking.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I verify that picking for purchase order has been done. - @@ -244,7 +223,7 @@ ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')]) assert(ids),"Picking is not in the done state!" - - Then I done the picking + Then I process the picking - !python {model: stock.picking }: | import time @@ -254,18 +233,11 @@ if picking_id: pick=self.browse(cr,uid,picking_id[0]) pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I verify that picking for sale order is in done state. - @@ -275,38 +247,6 @@ picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')]) pick = self.browse(cr,uid,picking_id[0]) assert (pick.state) =='done', "Picking for SO is not in done state." -- - Then I done the delivery order -- - !python {model: stock.picking }: | - import time - sale_order_obj = self.pool.get('sale.order') - so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) - picking_id = self.search(cr, uid, [('origin','=',so.name)]) - if picking_id: - pick=self.browse(cr,uid,picking_id[0]) - pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) -- - I verify that delivery state is done -- - !python {model: stock.picking }: | - sale_order_obj = self.pool.get('sale.order') - so = sale_order_obj.browse(cr, uid, ref("sale_order_so0")) - picking_id = self.search(cr, uid, [('origin','=',so.name)]) - pick = self.browse(cr,uid,picking_id[0]) - assert (pick.state) =='done', "Picking for SO is not in done state." - I verify that a "Picked" has been set to true - diff --git a/addons/sale/test/picking_order_policy.yml b/addons/sale/test/picking_order_policy.yml index 4381c78f010..1dcbf980da4 100644 --- a/addons/sale/test/picking_order_policy.yml +++ b/addons/sale/test/picking_order_policy.yml @@ -46,18 +46,11 @@ if picking_id: pick=self.browse(cr,uid,picking_id[0]) pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - Then I click on 'Create Invoices' button - @@ -67,7 +60,7 @@ sale_id=sale_obj.browse(cr, uid, ref("sale_order_so7")) ids = [x.id for x in sale_id.picking_ids] wiz_id = self.create(cr, uid, {'invoice_date': time.strftime('%Y-%m-%d'), 'journal_id': ref('account.sales_journal')}, - {'active_ids': ids}) + {'active_ids': ids, 'active_model': 'stock.picking'}) self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]}) - I check that an invoice has been created. @@ -197,7 +190,7 @@ for pur in pur_ids: wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) - - I verify that a picking related to purchase order has been generated. + I verify that a picking related to purchase order has been generated and I process it - !python {model: sale.order}: | modules = self.pool.get('ir.module.module') @@ -209,29 +202,12 @@ pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) po = pur_obj.browse(cr, uid, pur_id)[0] assert(po.picking_ids),"Picking for purchase order has not been generated" -- - Then I click on the "Products Received" button of Incoming Shipments -- - !record {model: stock.partial.picking, id: stock_partial_picking_0}: - date: !eval time.strftime('%Y-%m-%d %H:%M:%S') -- - I click on the "Validate" button -- - !python {model: stock.picking}: | - modules = self.pool.get('ir.module.module') - mod_pur = modules.search(cr, uid, [('name','=','purchase')]) - mod_brw = modules.browse(cr,uid,mod_pur)[0] - if (mod_brw.state == 'installed'): - sale_order_obj = self.pool.get('sale.order') - pur_obj = self.pool.get('purchase.order') - so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) - pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) - po = pur_obj.browse(cr, uid, pur_id)[0] - pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )]) - import netsvc - wf_service = netsvc.LocalService("workflow") - for pick in pick_ser_id: - wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr) + picking, = po.picking_ids + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [picking.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I verify that picking for purchase order has been done. - @@ -249,36 +225,20 @@ ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')]) assert ids, _('Picking is not in the done state!') - - I verify that delivery order has been generated for sale order + I verify that delivery order has been generated for sale order, and process it - !python {model: stock.picking }: | sale_order_obj = self.pool.get('sale.order') so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) picking_id = self.search(cr, uid, [('origin','=',so.name)]) assert (picking_id),"Delivery order has not been generated" -- - I verify that delivery has been done -- - !python {model: stock.picking }: | - import time - sale_order_obj = self.pool.get('sale.order') - so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) - picking_id = self.search(cr, uid, [('origin','=',so.name)]) - if picking_id: - pick=self.browse(cr,uid,picking_id[0]) - pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) + pick=self.browse(cr,uid,picking_id[0]) + pick.force_assign(cr, uid) + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I verify that delivery state is done - @@ -290,7 +250,7 @@ pick = self.browse(cr,uid,picking_id[0]) assert (pick.state) =='done', "Picking for SO is not in done state." - - I verify that a "Picked" has been set to true + I verify that the sale order is marked as delivered - !python {model: sale.order}: | so = self.browse(cr, uid, ref("sale_order_so7")) diff --git a/addons/sale/test/postpaid_order_policy.yml b/addons/sale/test/postpaid_order_policy.yml index 330c6d17308..a0d5a8e1928 100644 --- a/addons/sale/test/postpaid_order_policy.yml +++ b/addons/sale/test/postpaid_order_policy.yml @@ -45,18 +45,11 @@ if picking_id: pick=self.browse(cr,uid,picking_id[0]) pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I verify that picking order is in done state. - @@ -76,7 +69,7 @@ picking_id = self.search(cr, uid, [('origin','=',so.name)]) assert (picking_id),"Delivery order has not been generated" - - I click on the Products Sent button and then on the Validate button + I process the delivery order - !python {model: stock.picking }: | import time @@ -86,20 +79,13 @@ if picking_id: pick=self.browse(cr,uid,picking_id[0]) pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - - I verify that delivery state is done + I verify that delivery order is marked done - !python {model: stock.picking }: | sale_order_obj = self.pool.get('sale.order') @@ -187,7 +173,7 @@ for pur in pur_ids: wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) - - I verify that a picking related to purchase order has been generated. + I verify that a picking related to purchase order has been generated and I process it - !python {model: sale.order}: | modules = self.pool.get('ir.module.module') @@ -199,31 +185,14 @@ pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) po = pur_obj.browse(cr, uid, pur_id)[0] assert(po.picking_ids),"Picking for purchase order has not been generated" + picking, = po.picking_ids + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [picking.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - - Then I click on the "Products Received" button of Incoming Shipments -- - !record {model: stock.partial.picking, id: stock_partial_picking_0}: - date: !eval time.strftime('%Y-%m-%d %H:%M:%S') -- - I click on the "Validate" button -- - !python {model: stock.picking}: | - modules = self.pool.get('ir.module.module') - mod_pur = modules.search(cr, uid, [('name','=','purchase')]) - mod_brw = modules.browse(cr,uid,mod_pur)[0] - if (mod_brw.state == 'installed'): - sale_order_obj = self.pool.get('sale.order') - pur_obj = self.pool.get('purchase.order') - so = sale_order_obj.browse(cr, uid, ref("sale_order_so8")) - pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) - po = pur_obj.browse(cr, uid, pur_id)[0] - pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )]) - import netsvc - wf_service = netsvc.LocalService("workflow") - for pick in pick_ser_id: - wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr) -- - I verify that picking for purchase order has been done. + I verify that picking for purchase order has been marked done. - !python {model: sale.order}: | from tools.translate import _ @@ -239,7 +208,7 @@ ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')]) assert ids, _('Picking is not in the done state!') - - I verify that a "Picked" has been set to true + I verify that the sale order is marked as delivered - !python {model: sale.order}: | so = self.browse(cr, uid, ref("sale_order_so8")) diff --git a/addons/sale/test/prepaid_order_policy.yml b/addons/sale/test/prepaid_order_policy.yml index 4bf132e5bee..d6f3da64a2c 100644 --- a/addons/sale/test/prepaid_order_policy.yml +++ b/addons/sale/test/prepaid_order_policy.yml @@ -101,18 +101,11 @@ if picking_id: pick=self.browse(cr,uid,picking_id[0]) pick.force_assign(cr, uid) - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - move = pick.move_lines[0] - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, [pick.id],partial_datas) + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [pick.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I verify that picking order is in done state. - @@ -201,7 +194,7 @@ for pur in pur_ids: wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) - - I verify that a picking related to purchase order has been generated. + I verify that a picking related to purchase order has been generated and I process it - !python {model: sale.order}: | modules = self.pool.get('ir.module.module') @@ -213,51 +206,21 @@ pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) po = pur_obj.browse(cr, uid, pur_id)[0] assert(po.picking_ids),"Picking for purchase order has not been generated" -- - Then I click on the "Products Received" button of Incoming Shipments -- - !record {model: stock.partial.picking, id: stock_partial_picking_0}: - date: !eval time.strftime('%Y-%m-%d %H:%M:%S') -- - I click on the "Validate" button -- - !python {model: stock.picking}: | - modules = self.pool.get('ir.module.module') - sale_order_obj = self.pool.get('sale.order') - pur_obj = self.pool.get('purchase.order') - mod_pur = modules.search(cr, uid, [('name','=','purchase')]) - mod_brw = modules.browse(cr,uid,mod_pur)[0] - if (mod_brw.state == 'installed'): - so = sale_order_obj.browse(cr, uid, ref("sale_order_so1")) - pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) - po = pur_obj.browse(cr, uid, pur_id)[0] - pick_ser_id = self.search(cr, uid, [('purchase_id', '=', po.id )]) - import netsvc - wf_service = netsvc.LocalService("workflow") - for pick in pick_ser_id: - wf_service.trg_validate(uid, 'stock.picking',pick,'button_done', cr) -- - I verify that picking for purchase order has been done. -- - !python {model: sale.order}: | - from tools.translate import _ - modules = self.pool.get('ir.module.module') - mod_pur = modules.search(cr, uid, [('name','=','purchase')]) - mod_brw = modules.browse(cr,uid,mod_pur)[0] - if(mod_brw.state == 'installed'): - pur_obj = self.pool.get('purchase.order') - so = self.browse(cr, uid, ref("sale_order_so1")) - pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) - po = pur_obj.browse(cr, uid, pur_id)[0] + picking, = po.picking_ids + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [picking.id]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) picking_obj = self.pool.get('stock.picking') - ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')]) - assert ids, _('Picking is not in the done state!') + ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id),('state', '=', 'done')]) + assert ids, 'Picking should be marked done!' - - I verify that a "Picked" has been set to true + I verify that the sale order is marked as delivered - !python {model: sale.order}: | so = self.browse(cr, uid, ref("sale_order_so1")) - assert (so.shipped == True), "Picking is not done." + assert (so.shipped == True), "Sale order is not marked as delivered" - I verify that a sale order is in done state - diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py index 4b1e4511021..4d9e0058e94 100644 --- a/addons/sale/wizard/sale_make_invoice_advance.py +++ b/addons/sale/wizard/sale_make_invoice_advance.py @@ -27,8 +27,8 @@ class sale_advance_payment_inv(osv.osv_memory): _columns = { 'product_id': fields.many2one('product.product', 'Advance Product', required=True, help="Select a product of type service which is called 'Advance Product'. You may have to create it and set it as a default value on this field."), - 'amount': fields.float('Advance Amount', size=(16, 2), required=True, help="The amount to be invoiced in advance."), - 'qtty': fields.float('Quantity', size=(16, 2), required=True), + 'amount': fields.float('Advance Amount', digits=(16, 2), required=True, help="The amount to be invoiced in advance."), + 'qtty': fields.float('Quantity', digits=(16, 2), required=True), } _defaults = { 'qtty': 1.0 @@ -173,4 +173,4 @@ class sale_open_invoice(osv.osv_memory): sale_open_invoice() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 2dbfc5105c1..d9debe6641b 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -664,8 +664,8 @@ class stock_picking(osv.osv): def action_process(self, cr, uid, ids, context=None): if context is None: context = {} - partial_id = self.pool.get("stock.partial.picking").create( - cr, uid, {}, context=dict(context, active_ids=ids)) + context = dict(context, active_ids=ids, active_model=self._name) + partial_id = self.pool.get("stock.partial.picking").create(cr, uid, {}, context=context) return { 'name':_("Products to Process"), 'view_mode': 'form', @@ -677,7 +677,7 @@ class stock_picking(osv.osv): 'nodestroy': True, 'target': 'new', 'domain': '[]', - 'context': dict(context, active_ids=ids) + 'context': context, } def copy(self, cr, uid, id, default=None, context=None): @@ -1474,6 +1474,8 @@ class stock_move(osv.osv): def action_partial_move(self, cr, uid, ids, context=None): if context is None: context = {} + if context.get('active_model') != self._name: + context.update(active_ids=ids, active_model=self._name) partial_id = self.pool.get("stock.partial.move").create( cr, uid, {}, context=context) return { @@ -2127,14 +2129,9 @@ class stock_move(osv.osv): """ Makes the move done and if all moves are done, it will finish the picking. @return: """ - partial_datas='' picking_ids = [] move_ids = [] - partial_obj=self.pool.get('stock.partial.picking') wf_service = netsvc.LocalService("workflow") - partial_id=partial_obj.search(cr,uid,[]) - if partial_id: - partial_datas = partial_obj.read(cr, uid, partial_id, context=context)[0] if context is None: context = {} @@ -2164,9 +2161,6 @@ class stock_move(osv.osv): self.action_done(cr, uid, [move.move_dest_id.id], context=context) self._create_product_valuation_moves(cr, uid, move, context=context) - prodlot_id = partial_datas and partial_datas.get('move%s_prodlot_id' % (move.id), False) - if prodlot_id: - self.write(cr, uid, [move.id], {'prodlot_id': prodlot_id}, context=context) if move.state not in ('confirmed','done','assigned'): todo.append(move.id) diff --git a/addons/stock/test/stock_test.yml b/addons/stock/test/stock_test.yml index ebd3c6670b4..63650ffeb38 100644 --- a/addons/stock/test/stock_test.yml +++ b/addons/stock/test/stock_test.yml @@ -184,37 +184,32 @@ self.fill_inventory(cr, uid, [ref("stock_fill_inventory_0")], context) - - I create stock.inventory.line.split record. + I split the PC3 inventory line to create 5 PC3 with production lot 00002-stock-test - !record {model: stock.inventory.line.split, id: stock_inventory_line_0}: line_ids: - name: '00002-stock-test' quantity: 5 - line_exist_ids: - - name: '00003-stock-test' - quantity: 5 product_id: product.product_product_pc1 product_uom: product.product_uom_unit use_exist: False qty: 10 - - - I Split stock.inventory.line into production line. + I confirm the split operation - - !python {model: stock.inventory.line.split}: | - context = {"lang": 'en_US', "active_model": "stock.inventory.line", - "active_ids": [ref("stock_inventory_line_0")], "tz": False, "active_id": ref("stock_inventory_line_0")} - self.default_get(cr, uid, ["product_id", "product_uom", "line_exist_ids", "qty", - "line_ids", "use_exist"], context) - self.split_lot(cr, uid, [ref("stock_inventory_line_0")], context) - + !python {model: stock.inventory.line}: | + line_ids = self.search(cr, uid, [('inventory_id','=',ref('stock_inventory_physicalinventoy0')), + ('product_id','=',ref('product.product_product_pc1'))]) + assert line_ids, 'Inventory lines are missing' + self.pool.get('stock.inventory.line.split').split_lot(cr, uid, [ref("stock_inventory_line_0")], + {'active_model': 'stock.inventory.line', + 'active_ids': [line_ids[0]]}) - I confirm the Inventory for PC3. - !python {model: stock.inventory}: | self.action_confirm(cr,uid,[ref('stock_inventory_physicalinventoy0')]) self.action_done(cr,uid,[ref('stock_inventory_physicalinventoy0')]) - - I cancel the Inventory for PC3. - @@ -251,7 +246,7 @@ type: out - - I Performing an osv_memory action split on module stock.split.into + I split the picking with a first batch of 20 PCs - !python {model: stock.picking }: | pick=self.browse(cr,uid,ref('stock_picking_0')) @@ -285,31 +280,15 @@ ref("stock.menu_action_picking_tree6"), }) - - I create a record for stock.partial.move. + I process the partial picking with 20 PCE - - !record {model: stock.partial.move, id: stock_partial_move_0}: - date: !eval time.strftime('%Y-%m-%d %H:%M:%S') - -- - I done stock.partial.move record. -- - !python {model: stock.partial.move }: | - pick_obj = self.pool.get('stock.picking') - move_obj = self.pool.get('stock.move') - pick=pick_obj.browse(cr,uid,ref('stock_picking_0')) - search_id = move_obj.search(cr, uid, [('picking_id', '=', pick.id)]) - partial_datas={} - for move in pick.move_lines: - partial_datas['move%s'%(move.id)]= { - 'quantity': 20, - 'product_uom': move.product_uom.id, - 'prodlot_id': move.prodlot_id and move.prodlot_id.id or False, - 'wizard_id': ref('stock_partial_move_0'), - } - context = {"lang": 'en_US', "active_model": "stock.move", "active_ids": search_id, "tz": False, "active_id":search_id[0]} - self.fields_view_get(cr, uid, False,"form", context) - self.do_partial(cr, uid, [ref('stock_partial_move_0')], context) - + !python {model: stock.picking }: | + pick = self.browse(cr,uid,ref('stock_picking_0')) + stock_partial_move = self.pool.get('stock.partial.move') + partial_id = stock_partial_move.create(cr, uid, {}, + context={'active_model': 'stock.move', + 'active_ids': [x.id for x in pick.move_lines]}) + stock_partial_move.do_partial(cr, uid, [partial_id]) - I Performing an osv_memory action split_lot on module stock.move.split - @@ -384,34 +363,14 @@ consume_obj.do_move_consume(cr, uid, [consume_id], context) - - I create a record for stock partial picking. + I process the picking with the 80 remaining PCs - - !record {model: stock.partial.picking, id: stock_partial_picking_0}: - date: !eval time.strftime('%Y-%m-%d %H:%M:%S') - -- - I make stock partial picking order Done. -- - !python {model: stock.partial.picking}: | - pick_obj = self.pool.get('stock.picking') - partial = self.browse(cr, uid, ref('stock_partial_picking_0'), context) - partial_datas = { - 'delivery_date' : partial.date - } - for pick in pick_obj.browse(cr, uid, [ref('stock_picking_0')]): - for m in pick.move_lines: - partial_datas['move%s'%(m.id)] = { - 'product_id' : m.product_id.id, - 'product_qty' : 80, - 'product_uom' : m.product_uom.id - } - context = {"lang": "en_US", "search_default_available": - 1, "tz": False, "active_model": "ir.ui.menu", - "active_ids": [ref('stock_picking_0')], "active_id": ref("stock_picking_0"), - } - self.fields_view_get(cr, uid, False,"form", context) - self.do_partial(cr, uid, [ref('stock_partial_picking_0')], context) - + !python {model: stock.picking}: | + stock_partial_picking = self.pool.get('stock.partial.picking') + partial_id = stock_partial_picking.create(cr, uid, {}, + context={'active_model': 'stock.picking', + 'active_ids': [ref('stock_picking_0')]}) + stock_partial_picking.do_partial(cr, uid, [partial_id]) - I Performing an osv_memory action create_invoice on module stock.invoice.onshipping - @@ -447,35 +406,20 @@ 1, "tz": False, "active_model": "ir.ui.menu", "contact_display": "partner_address", "active_ids": [ref("stock.menu_action_picking_tree4")], "active_id": ref("stock.menu_action_picking_tree4"), }) - pick=self.browse(cr,uid,copy_id) self.allow_cancel(cr, uid, [copy_id], context= None) - - I create a record of stock.picking and I reaturn the picking + I process a copy of the picking and I return it - !python {model: stock.picking}: | copy_id = self.copy(cr, uid, (ref("stock_picking_0"))) - ctx = {"lang": "en_US", "active_model": - "ir.ui.menu", "tz": False, "search_default_confirmed": 1, "contact_display": - "partner", "active_ids": [ref("stock.menu_action_picking_tree6")], "active_id": - ref("stock.menu_action_picking_tree6")} - self.draft_force_assign(cr, uid, [copy_id], ctx) - self.force_assign(cr, uid, [copy_id], ctx) - pick=self.browse(cr,uid,copy_id) - partial_datas={} - for move in pick.move_lines: - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id, - 'product_qty': move.product_qty, - } - self.do_partial(cr, uid, [pick.id],partial_datas) - reurn_datas={} - context = {"lang": 'en_US', "active_model": - "stock.picking", "active_ids": [pick.id], "tz": False, "active_id":pick.id} + self.draft_force_assign(cr, uid, [copy_id]) + self.force_assign(cr, uid, [copy_id]) + stock_partial_picking = self.pool.get('stock.partial.picking') + context = {'active_model': 'stock.picking', + 'active_ids': [copy_id], + 'active_id': copy_id} + partial_id = stock_partial_picking.create(cr, uid, {}, context=context) + stock_partial_picking.do_partial(cr, uid, [partial_id], context) return_pick_id = self.pool.get('stock.return.picking').create(cr, uid,{}, context) - for move in pick.move_lines: - reurn_datas= { - 'product_id': move.product_id.id, - 'quantity': move.product_qty, - } self.pool.get('stock.return.picking').create_returns(cr, uid, [return_pick_id], context) diff --git a/addons/stock/wizard/stock_inventory_line_split.py b/addons/stock/wizard/stock_inventory_line_split.py index 2e8b93ad52b..ae4ce54ab9b 100644 --- a/addons/stock/wizard/stock_inventory_line_split.py +++ b/addons/stock/wizard/stock_inventory_line_split.py @@ -21,24 +21,17 @@ from osv import fields, osv -from tools.translate import _ -import time - class stock_inventory_line_split(osv.osv_memory): _inherit = "stock.move.split" _name = "stock.inventory.line.split" _description = "Split inventory lines" + _columns = { + 'line_ids': fields.one2many('stock.inventory.line.split.lines', 'wizard_id', 'Production Lots'), + 'line_exist_ids': fields.one2many('stock.inventory.line.split.lines', 'wizard_exist_id', 'Production Lots'), + } def default_get(self, cr, uid, fields, context=None): - """ To check the availability of production lot. - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param fields: List of fields for which we want default values - @param context: A standard dictionary - @return: A dictionary which of fields with values. - """ if context is None: context = {} record_id = context and context.get('active_id',False) @@ -54,14 +47,13 @@ class stock_inventory_line_split(osv.osv_memory): def split(self, cr, uid, ids, line_ids, context=None): """ To split stock inventory lines according to production lot. - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param ids: the ID or list of IDs if we want more than one - @param line_ids: the ID or list of IDs of inventory lines we want to split - @param context: A standard dictionary - @return: + + :param line_ids: the ID or list of IDs of inventory lines we want to split """ + if context is None: + context = {} + assert context.get('active_model') == 'stock.inventory.line',\ + 'Incorrect use of the inventory line split wizard' prodlot_obj = self.pool.get('stock.production.lot') ir_sequence_obj = self.pool.get('ir.sequence') line_obj = self.pool.get('stock.inventory.line') @@ -108,7 +100,14 @@ class stock_inventory_line_split(osv.osv_memory): line_obj.write(cr, uid, [inv_line.id], update_val) return new_line -stock_inventory_line_split() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +class stock_inventory_split_lines(osv.osv_memory): + _inherit = "stock.move.split.lines" + _name = "stock.inventory.line.split.lines" + _description = "Inventory Split lines" + _columns = { + 'wizard_id': fields.many2one('stock.inventory.line.split', 'Parent Wizard'), + 'wizard_exist_id': fields.many2one('stock.inventory.line.split', 'Parent Wizard'), + } +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/stock/wizard/stock_invoice_onshipping.py b/addons/stock/wizard/stock_invoice_onshipping.py index 66256509c7b..f4618249e37 100644 --- a/addons/stock/wizard/stock_invoice_onshipping.py +++ b/addons/stock/wizard/stock_invoice_onshipping.py @@ -28,7 +28,7 @@ class stock_invoice_onshipping(osv.osv_memory): def _get_journal(self, cr, uid, context=None): res = self._get_journal_id(cr, uid, context=context) if res: - return res[0] + return res[0][0] return False def _get_journal_id(self, cr, uid, context=None): diff --git a/addons/stock/wizard/stock_move.py b/addons/stock/wizard/stock_move.py index 1e3d26b4194..1a655878d8a 100644 --- a/addons/stock/wizard/stock_move.py +++ b/addons/stock/wizard/stock_move.py @@ -146,14 +146,6 @@ class split_in_production_lot(osv.osv_memory): _description = "Split in Production lots" def default_get(self, cr, uid, fields, context=None): - """ Get default values - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param fields: List of fields for default value - @param context: A standard dictionary - @return: Default values of fields - """ if context is None: context = {} res = super(split_in_production_lot, self).default_get(cr, uid, fields, context=context) @@ -175,21 +167,14 @@ class split_in_production_lot(osv.osv_memory): 'qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')), 'product_id': fields.many2one('product.product', 'Product', required=True, select=True), 'product_uom': fields.many2one('product.uom', 'UoM'), - 'line_ids': fields.one2many('stock.move.split.lines', 'lot_id', 'Production Lots'), - 'line_exist_ids': fields.one2many('stock.move.split.lines.exist', 'lot_id', 'Production Lots'), + 'line_ids': fields.one2many('stock.move.split.lines', 'wizard_id', 'Production Lots'), + 'line_exist_ids': fields.one2many('stock.move.split.lines', 'wizard_exist_id', 'Production Lots'), 'use_exist' : fields.boolean('Existing Lots', help="Check this option to select existing lots in the list below, otherwise you should enter new ones line by line."), 'location_id': fields.many2one('stock.location', 'Source Location') } def split_lot(self, cr, uid, ids, context=None): - """ To split a lot - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param ids: An ID or list of IDs if we want more than one - @param context: A standard dictionary - @return: - """ + """ To split a lot""" if context is None: context = {} res = self.split(cr, uid, ids, context.get('active_ids'), context=context) @@ -197,16 +182,13 @@ class split_in_production_lot(osv.osv_memory): def split(self, cr, uid, ids, move_ids, context=None): """ To split stock moves into production lot - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param ids: the ID or list of IDs if we want more than one - @param move_ids: the ID or list of IDs of stock move we want to split - @param context: A standard dictionary - @return: + + :param move_ids: the ID or list of IDs of stock move we want to split """ if context is None: context = {} + assert context.get('active_model') == 'stock.move',\ + 'Incorrect use of the stock move split wizard' inventory_id = context.get('inventory_id', False) prodlot_obj = self.pool.get('stock.production.lot') inventory_obj = self.pool.get('stock.inventory') @@ -269,12 +251,13 @@ class split_in_production_lot(osv.osv_memory): split_in_production_lot() class stock_move_split_lines_exist(osv.osv_memory): - _name = "stock.move.split.lines.exist" - _description = "Exist Split lines" + _name = "stock.move.split.lines" + _description = "Stock move Split lines" _columns = { 'name': fields.char('Tracking serial', size=64), 'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')), - 'lot_id': fields.many2one('stock.move.split', 'Lot'), + 'wizard_id': fields.many2one('stock.move.split', 'Parent Wizard'), + 'wizard_exist_id': fields.many2one('stock.move.split', 'Parent Wizard (for existing lines)'), 'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot'), } _defaults = { @@ -285,21 +268,3 @@ class stock_move_split_lines_exist(osv.osv_memory): loc_id=False, product_id=False, uom_id=False): return self.pool.get('stock.move').onchange_lot_id(cr, uid, [], prodlot_id, product_qty, loc_id, product_id, uom_id) - -stock_move_split_lines_exist() - -class stock_move_split_lines(osv.osv_memory): - _name = "stock.move.split.lines" - _description = "Split lines" - _columns = { - 'name': fields.char('Tracking serial', size=64), - 'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')), - 'use_exist' : fields.boolean('Existing Lot'), - 'lot_id': fields.many2one('stock.move.split', 'Lot'), - 'action': fields.selection([('split','Split'),('keepinone','Keep in one lot')],'Action'), - } - _defaults = { - 'quantity': 1.00, - 'action' : 'split', - } -stock_move_split_lines() diff --git a/addons/stock/wizard/stock_partial_move.py b/addons/stock/wizard/stock_partial_move.py index 2c593e811c5..ec348656ce0 100644 --- a/addons/stock/wizard/stock_partial_move.py +++ b/addons/stock/wizard/stock_partial_move.py @@ -2,7 +2,7 @@ ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). +# Copyright (C) 2004-TODAY OpenERP SA (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -20,210 +20,65 @@ ############################################################################## from osv import fields, osv -from tools.translate import _ +from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT import time -import decimal_precision as dp - -class stock_partial_move_memory_out(osv.osv_memory): - _name = "stock.move.memory.out" - _rec_name = 'product_id' +class stock_partial_move_line(osv.osv_memory): + _inherit = "stock.partial.picking.line" + _name = "stock.partial.move.line" _columns = { - 'product_id' : fields.many2one('product.product', string="Product", required=True), - 'quantity' : fields.float("Quantity", required=True), - 'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True), - 'prodlot_id' : fields.many2one('stock.production.lot', 'Production Lot'), - 'location_id': fields.many2one('stock.location', 'Location', required=True), - 'location_dest_id': fields.many2one('stock.location', 'Dest. Location', required=True), - 'move_id' : fields.many2one('stock.move', "Move"), - 'wizard_id' : fields.many2one('stock.partial.move', string="Wizard"), - 'cost' : fields.float('Cost', digits_compute = dp.get_precision('Purchase Price'),help="Unit Cost for this product line"), - 'currency' : fields.many2one('res.currency', string="Currency", help="Currency in which Unit cost is expressed"), + 'wizard_id' : fields.many2one('stock.partial.move', string="Wizard", ondelete='CASCADE'), } - -class stock_partial_move_memory_in(osv.osv_memory): - _inherit = "stock.move.memory.out" - _name = "stock.move.memory.in" - + class stock_partial_move(osv.osv_memory): _name = "stock.partial.move" - _description = "Partial Move" + _inherit = 'stock.partial.picking' + _description = "Partial Move Processing Wizard" _columns = { 'date': fields.datetime('Date', required=True), - 'type': fields.char("Type", size=3), - 'product_moves_out' : fields.one2many('stock.move.memory.out', 'wizard_id', 'Moves'), - 'product_moves_in' : fields.one2many('stock.move.memory.in', 'wizard_id', 'Moves'), - } - - - def __is_in(self,cr, uid, move_ids): - """ - @return: True if one of the moves has as picking type 'in' - """ - if not move_ids: - return False - - move_obj = self.pool.get('stock.move') - move_ids = move_obj.search(cr, uid, [('id','in',move_ids)]) - - for move in move_obj.browse(cr, uid, move_ids): - if move.picking_id.type == 'in' and move.product_id.cost_method == 'average': - return True - return False - - def __get_picking_type(self, cr, uid, move_ids): - if self.__is_in(cr, uid, move_ids): - return "product_moves_in" - else: - return "product_moves_out" - - def view_init(self, cr, uid, fields_list, context=None): - res = super(stock_partial_move, self).view_init(cr, uid, fields_list, context=context) - move_obj = self.pool.get('stock.move') - - if context is None: - context = {} - for move in move_obj.browse(cr, uid, context.get('active_ids', []), context=context): - if move.state in ('done', 'cancel'): - raise osv.except_osv(_('Invalid action !'), _('Cannot deliver products which are already delivered !')) - - return res - - - def __create_partial_move_memory(self, move): - move_memory = { - 'product_id' : move.product_id.id, - 'quantity' : move.product_qty, - 'product_uom' : move.product_uom.id, - 'prodlot_id' : move.prodlot_id.id, - 'move_id' : move.id, - } - - if move.picking_id.type == 'in': - move_memory.update({ - 'cost' : move.product_id.standard_price, - 'currency' : move.product_id.company_id and move.product_id.company_id.currency_id and move.product_id.company_id.currency_id.id or False, - }) - return move_memory + 'move_ids' : fields.one2many('stock.partial.move.line', 'wizard_id', 'Moves'), - def __get_active_stock_moves(self, cr, uid, context=None): - move_obj = self.pool.get('stock.move') - if context is None: - context = {} - - res = [] - for move in move_obj.browse(cr, uid, context.get('active_ids', []), context=context): - if move.state in ('done', 'cancel'): - continue - res.append(self.__create_partial_move_memory(move)) - + # picking_id is not used for move processing, so we remove the required attribute + # from the inherited column, and ignore it + 'picking_id': fields.many2one('stock.picking', 'Picking'), + } + + def default_get(self, cr, uid, fields, context=None): + if context is None: context = {} + # no call to super! + res = {} + move_ids = context.get('active_ids', []) + if not move_ids or not context.get('active_model') == 'stock.move': + return res + if 'move_ids' in fields: + move_ids = self.pool.get('stock.move').browse(cr, uid, move_ids, context=context) + moves = [self._partial_move_for(cr, uid, m) for m in move_ids if m.state not in ('done','cancel')] + res.update(move_ids=moves) + if 'date' in fields: + res.update(date=time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)) return res - - _defaults = { - 'product_moves_in' : __get_active_stock_moves, - 'product_moves_out' : __get_active_stock_moves, - 'date' : lambda *a : time.strftime('%Y-%m-%d %H:%M:%S'), - } - - - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - if not context: - context = {} - - message = { - 'title' : _('Deliver Products'), - 'info' : _('Delivery Information'), - 'button' : _('Deliver'), - } - if context: - if context.get('product_receive', False): - message = { - 'title' : _('Receive Products'), - 'info' : _('Receive Information'), - 'button' : _('Receive'), - } - - move_ids = context.get('active_ids', False) - message['picking_type'] = self.__get_picking_type(cr, uid, move_ids) - result = super(stock_partial_move, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu) - _moves_fields = result['fields'] - _moves_fields.update({ - 'product_moves_in' : {'relation': 'stock.move.memory.in', 'type' : 'one2many', 'string' : 'Product Moves'}, - 'product_moves_out' : {'relation': 'stock.move.memory.out', 'type' : 'one2many', 'string' : 'Product Moves'} - }) - - _moves_arch_lst = """ -
- - - - - -