[MERGE] Fixes related to server removal of osv_memory

bzr revid: odo@openerp.com-20110927213803-rj2hujpigijhvvpl
This commit is contained in:
Olivier Dony 2011-09-27 23:38:03 +02:00
commit 8b7800750c
68 changed files with 567 additions and 1377 deletions

View File

@ -1256,7 +1256,7 @@ class account_move(osv.osv):
context = {} context = {}
c = context.copy() c = context.copy()
c['novalidate'] = True 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) self.validate(cr, uid, ids, context=context)
return result return result

View File

@ -1273,7 +1273,7 @@ class account_move_line(osv.osv):
'user_id': uid '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 # CREATE Taxes
if vals.get('account_tax_id', False): if vals.get('account_tax_id', False):
tax_id = tax_obj.browse(cr, uid, vals['account_tax_id']) tax_id = tax_obj.browse(cr, uid, vals['account_tax_id'])

View File

@ -32,7 +32,7 @@ class res_company(osv.osv):
string="Reserve and Profit/Loss Account", string="Reserve and Profit/Loss Account",
view_load=True, view_load=True,
domain="[('type', '=', 'other')]", 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 = { _defaults = {

View File

@ -29,7 +29,7 @@ class account_analytic_cost_ledger_journal_report(osv.osv_memory):
_columns = { _columns = {
'date1': fields.date('Start of period', required=True), 'date1': fields.date('Start of period', required=True),
'date2': fields.date('End 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 = { _defaults = {

View File

@ -147,7 +147,7 @@
!python {model: account.account}: | !python {model: account.account}: |
ctx={} ctx={}
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) 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 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') 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}: | !python {model: account.account}: |
ctx={} ctx={}
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) 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 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') test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account')
- -

View File

@ -19,13 +19,17 @@
# #
############################################################################## ##############################################################################
from osv import osv from osv import osv, fields
class account_balance_report(osv.osv_memory): class account_balance_report(osv.osv_memory):
_inherit = "account.common.account.report" _inherit = "account.common.account.report"
_name = 'account.balance.report' _name = 'account.balance.report'
_description = 'Trial 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 = { _defaults = {
'journal_ids': [], 'journal_ids': [],
} }

View File

@ -35,6 +35,7 @@ class account_aged_trial_balance(osv.osv_memory):
'direction_selection': fields.selection([('past','Past'), 'direction_selection': fields.selection([('past','Past'),
('future','Future')], ('future','Future')],
'Analysis Direction', required=True), 'Analysis Direction', required=True),
'journal_ids': fields.many2many('account.journal', 'account_aged_trial_balance_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
} }
_defaults = { _defaults = {
'period_length': 30, 'period_length': 30,

View File

@ -40,11 +40,9 @@ class account_bs_report(osv.osv_memory):
_columns = { _columns = {
'display_type': fields.boolean("Landscape Mode"), 'display_type': fields.boolean("Landscape Mode"),
'reserve_account_id': fields.many2one('account.account', 'Reserve & Profit/Loss Account', 'reserve_account_id': fields.many2one('account.account', 'Reserve & Profit/Loss Account',
required=True, 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',
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',
domain = [('type','=','other')]), domain = [('type','=','other')]),
'journal_ids': fields.many2many('account.journal', 'account_bs_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
} }
_defaults={ _defaults={

View File

@ -21,7 +21,7 @@
</xpath> </xpath>
<xpath expr="//field[@name='target_move']" position="after"> <xpath expr="//field[@name='target_move']" position="after">
<field name="display_account"/> <field name="display_account"/>
<field name="reserve_account_id" required="1"/> <field name="reserve_account_id"/>
<field name="display_type"/> <field name="display_type"/>
<newline/> <newline/>
</xpath> </xpath>

View File

@ -19,13 +19,17 @@
# #
############################################################################## ##############################################################################
from osv import osv from osv import osv, fields
class account_central_journal(osv.osv_memory): class account_central_journal(osv.osv_memory):
_name = 'account.central.journal' _name = 'account.central.journal'
_description = 'Account Central Journal' _description = 'Account Central Journal'
_inherit = "account.common.journal.report" _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): def _print_report(self, cr, uid, ids, data, context=None):
data = self.pre_print_report(cr, uid, ids, data, context=context) data = self.pre_print_report(cr, uid, ids, data, context=context)
return { return {

View File

@ -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), '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_from': fields.many2one('account.period', 'Start Period'),
'period_to': fields.many2one('account.period', 'End 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_from': fields.date("Start Date"),
'date_to': fields.date("End Date"), 'date_to': fields.date("End Date"),
'target_move': fields.selection([('posted', 'All Posted Entries'), 'target_move': fields.selection([('posted', 'All Posted Entries'),

View File

@ -19,17 +19,21 @@
# #
############################################################################## ##############################################################################
from osv import osv from osv import osv, fields
class account_general_journal(osv.osv_memory): class account_general_journal(osv.osv_memory):
_inherit = "account.common.journal.report" _inherit = "account.common.journal.report"
_name = 'account.general.journal' _name = 'account.general.journal'
_description = '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): def _print_report(self, cr, uid, ids, data, context=None):
data = self.pre_print_report(cr, uid, ids, data, context=context) data = self.pre_print_report(cr, uid, ids, data, context=context)
return {'type': 'ir.actions.report.xml', 'report_name': 'account.general.journal', 'datas': data} return {'type': 'ir.actions.report.xml', 'report_name': 'account.general.journal', 'datas': data}
account_general_journal() account_general_journal()
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: #vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -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.'), 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"), '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), '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 = { _defaults = {
'landscape': True, 'landscape': True,

View File

@ -31,6 +31,7 @@ class account_partner_balance(osv.osv_memory):
_columns = { _columns = {
'display_partner': fields.selection([('non-zero_balance', 'With balance is not equal to 0'), ('all', 'All Partners')] 'display_partner': fields.selection([('non-zero_balance', 'With balance is not equal to 0'), ('all', 'All Partners')]
,'Display Partners'), ,'Display Partners'),
'journal_ids': fields.many2many('account.journal', 'account_partner_balance_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
} }
_defaults = { _defaults = {
@ -51,4 +52,4 @@ class account_partner_balance(osv.osv_memory):
account_partner_balance() account_partner_balance()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -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), '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'), '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"), '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 = { _defaults = {
'initial_balance': False, 'initial_balance': False,

View File

@ -30,6 +30,7 @@ class account_print_journal(osv.osv_memory):
'sort_selection': fields.selection([('date', 'Date'), 'sort_selection': fields.selection([('date', 'Date'),
('ref', 'Reference Number'),], ('ref', 'Reference Number'),],
'Entries Sorted by', required=True), 'Entries Sorted by', required=True),
'journal_ids': fields.many2many('account.journal', 'account_print_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True),
} }
_defaults = { _defaults = {
'sort_selection': 'date', 'sort_selection': 'date',
@ -44,4 +45,4 @@ class account_print_journal(osv.osv_memory):
account_print_journal() account_print_journal()
#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: #vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -28,14 +28,15 @@ class account_pl_report(osv.osv_memory):
_inherit = "account.common.account.report" _inherit = "account.common.account.report"
_name = "account.pl.report" _name = "account.pl.report"
_description = "Account Profit And Loss Report" _description = "Account Profit And Loss Report"
_columns = { _columns = {
'display_type': fields.boolean("Landscape Mode"), '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 = { _defaults = {
'display_type': False, 'display_type': False,
'journal_ids': [], 'journal_ids': [],
'target_move': False
} }
def _print_report(self, cr, uid, ids, data, context=None): def _print_report(self, cr, uid, ids, data, context=None):

View File

@ -9,9 +9,6 @@
<field name="inherit_id" ref="account.account_common_report_view" /> <field name="inherit_id" ref="account.account_common_report_view" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<data> <data>
<xpath expr="//field[@name='target_move']" position="replace">
<field name="target_move" required="0" readonly="1"/>
</xpath>
<xpath expr="//field[@name='journal_ids']" position="replace"> <xpath expr="//field[@name='journal_ids']" position="replace">
<field name="journal_ids" required="0" colspan="4" nolabel="1" readonly="1"/> <field name="journal_ids" required="0" colspan="4" nolabel="1" readonly="1"/>
</xpath> </xpath>

View File

@ -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): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
if context is None: if context is None:
context = {} 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 return result
account_move_line() account_move_line()
@ -496,4 +496,4 @@ class account_bank_statement_line(osv.osv):
} }
account_bank_statement_line() account_bank_statement_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -239,7 +239,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
return res return res
_columns = { _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'), 'summary': fields.function(_get_summary, type='text', string='Summary'),
'file_export': fields.binary(string='Export'), 'file_export': fields.binary(string='Export'),
'file_import': fields.binary(string='Import'), 'file_import': fields.binary(string='Import'),

View File

@ -381,7 +381,7 @@ class crm_case(crm_base):
default.update({ 'date_closed': False, }) default.update({ 'date_closed': False, })
if self._columns.get('date_open'): if self._columns.get('date_open'):
default.update({ 'date_open': False }) 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): def case_open(self, cr, uid, ids, *args):

View File

@ -92,7 +92,6 @@
- -
!record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_1}: !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_1}:
action: 'exist' action: 'exist'
name: 'existing partner'
- -
Then, Click on "Create Opportunity" button. Then, Click on "Create Opportunity" button.
- -
@ -104,7 +103,6 @@
- -
!record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_2}: !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_2}:
action: 'nothing' action: 'nothing'
name: 'Do not link to a partner'
- -
Then, Click on "Create Opportunity" button. Then, Click on "Create Opportunity" button.
- -

View File

@ -37,7 +37,7 @@ class crm_lead2opportunity_partner(osv.osv_memory):
('nothing', 'Do not link to a partner')], \ ('nothing', 'Do not link to a partner')], \
'Action', required=True), 'Action', required=True),
'name': fields.selection([('convert', 'Convert to Opportunity'), ('merge', 'Merge with existing Opportunity')],'Select 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): def default_get(self, cr, uid, fields, context=None):
@ -236,7 +236,7 @@ class crm_lead2opportunity_mass_convert(osv.osv_memory):
_columns = { _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'), 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
} }

View File

@ -108,6 +108,7 @@
'email_to': 'info@axelor.com', 'email_to': 'info@axelor.com',
'email_from': 'Administrator <admin@openerp.com>', 'email_from': 'Administrator <admin@openerp.com>',
'reply_to': 'sales_openerp@openerp.com', 'reply_to': 'sales_openerp@openerp.com',
'state': 'draft',
'history': 'latest', 'history': 'latest',
} }
ids = self.create(cr, uid, vals, context={'active_id': ref('crm_lead_questionnaireonopenerp0'), 'active_model': 'crm.lead'}) ids = self.create(cr, uid, vals, context={'active_id': ref('crm_lead_questionnaireonopenerp0'), 'active_model': 'crm.lead'})

View File

@ -25,7 +25,6 @@
</group> </group>
<separator string="" colspan="4" /> <separator string="" colspan="4" />
<group col="6" colspan="4"> <group col="6" colspan="4">
<field name="smtp_server_id" widget="selection" colspan="4"/>
<field name="email_from" colspan="4" required="1"/> <field name="email_from" colspan="4" required="1"/>
<field name="email_to" colspan="4" required="1"/> <field name="email_to" colspan="4" required="1"/>
<field name="email_cc" colspan="4"/> <field name="email_cc" colspan="4"/>

View File

@ -264,7 +264,7 @@ class crm_segmentation(osv.osv):
} }
_constraints = [ _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): def process_continue(self, cr, uid, ids, start=False):

View File

@ -65,7 +65,9 @@ class mail_compose_message(osv.osv_memory):
_columns = { _columns = {
'use_template': fields.boolean('Use Template'), '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): def on_change_template(self, cr, uid, ids, use_template, template_id, email_from=None, email_to=None, context=None):

View File

@ -29,7 +29,7 @@ class hr_si_so_ask(osv.osv_memory):
_columns = { _columns = {
'name': fields.char('Employees name', size=32, required=True, readonly=True), 'name': fields.char('Employees name', size=32, required=True, readonly=True),
'last_time': fields.datetime('Your last sign out', required=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): 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): def sign_in(self, cr, uid, ids, context=None):
data = self.read(cr, uid, ids, [], context=context)[0] 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) return self.pool.get('hr.sign.in.out').sign_in(cr, uid, data, context)
def sign_out(self, cr, uid, ids, context=None): def sign_out(self, cr, uid, ids, context=None):
data = self.read(cr, uid, ids, [], context=context)[0] 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) return self.pool.get('hr.sign.in.out').sign_out(cr, uid, data, context)
hr_si_so_ask() hr_si_so_ask()
@ -68,7 +70,7 @@ class hr_sign_in_out(osv.osv_memory):
_columns = { _columns = {
'name': fields.char('Employees name', size=32, required=True, readonly=True), 'name': fields.char('Employees name', size=32, required=True, readonly=True),
'state': fields.char('Current state', 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): 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') obj_model = self.pool.get('ir.model.data')
att_obj = self.pool.get('hr.attendance') att_obj = self.pool.get('hr.attendance')
data = self.read(cr, uid, ids, [], context=context)[0] 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'] emp_id = data['emp_id']
att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id)], limit=1, order='name desc') 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) 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') obj_model = self.pool.get('ir.model.data')
att_obj = self.pool.get('hr.attendance') att_obj = self.pool.get('hr.attendance')
data = self.read(cr, uid, ids, [], context=context)[0] 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'] emp_id = data['emp_id']
att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id),('action', '!=', 'action')], limit=1, order='name desc') 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) last_att = att_obj.browse(cr, uid, att_id, context=context)

View File

@ -56,7 +56,7 @@
- -
!python {model: idea.post.vote}: | !python {model: idea.post.vote}: |
uid2 = ref('test_idea_user1') 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")]}) self.do_vote(cr, uid2, [new_id], {"active_ids": [ref("idea_idea_0")]})
- | - |
@ -69,7 +69,7 @@
- -
!python {model: idea.post.vote}: | !python {model: idea.post.vote}: |
uid2 = ref('test_idea_user2') 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')]}) self.do_vote(cr, uid2, [new_id], {'active_ids': [ref('idea_idea_0')]})
- | - |

View File

@ -117,7 +117,8 @@ class partner_vat_list_13(osv.osv_memory):
""" Partner Vat Listing """ """ Partner Vat Listing """
_name = "partner.vat.list_13" _name = "partner.vat.list_13"
_columns = { _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), 'name': fields.char('File Name', size=32),
'msg': fields.text('File created', size=64, readonly=True), 'msg': fields.text('File created', size=64, readonly=True),
'file_save' : fields.binary('Save File', 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', []) return context.get('partner_ids', [])
_defaults={ _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): def create_xml(self, cursor, user, ids, context=None):

View File

@ -83,9 +83,10 @@ class partner_vat_intra(osv.osv_memory):
else: else:
data_cmpny = obj_user.browse(cursor, user, user).company_id data_cmpny = obj_user.browse(cursor, user, user).company_id
data = self.read(cursor, user, ids)[0] 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: if not company_vat:
raise osv.except_osv(_('Data Insufficient'),_('No VAT Number Associated with Main Company!')) 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_controlref = obj_sequence.get(cursor, user, 'controlref')
seq_declarantnum = obj_sequence.get(cursor, user, 'declarantnum') seq_declarantnum = obj_sequence.get(cursor, user, 'declarantnum')

View File

@ -82,9 +82,9 @@ class mail_compose_message(osv.osv_memory):
else: else:
# default mode # default mode
result['model'] = context.get('active_model', False) result['model'] = context.get('active_model', False)
if vals: for field in vals:
for field in fields: if field in fields:
result.update({field : vals.get(field, False)}) result.update({field : vals[field]})
# link to model and record if not done yet # link to model and record if not done yet
if not result.get('model') or not result.get('res_id'): if not result.get('model') or not result.get('res_id'):

View File

@ -205,9 +205,8 @@
I am checking Procurement orders. There are 3 orders generated for Oranges, Sugar and Water. I am checking Procurement orders. There are 3 orders generated for Oranges, Sugar and Water.
- -
!python {model: procurement.order}: | !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')])]) 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. The scheduler runs.
- -
@ -219,9 +218,8 @@
stock moves for Oranges, Sugar and Water made correctly. stock moves for Oranges, Sugar and Water made correctly.
- -
!python {model: stock.picking}: | !python {model: stock.picking}: |
from tools.translate import _
pick_ids = self.search(cr, uid, [('type','=','internal')]) 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 According to minimum stock rules. I have 2 purchase orders for
Sugar with 6 Kg from Axelor and Orange 60 Kg from ASUStek. 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. I confirm the purchase order of Sugar and Orange.
- -
!python {model: purchase.order}: | !python {model: purchase.order}: |
from tools.translate import _
import netsvc import netsvc
purch_ids = self.search(cr, uid, [('state','=','draft')]) 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") wf_service = netsvc.LocalService("workflow")
for p_id in purch_ids: for p_id in purch_ids:
wf_service.trg_validate(uid, 'purchase.order', p_id, 'purchase_confirm', cr) 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}: | !python {model: stock.picking}: |
from tools.translate import _
pick_ids = self.search(cr, uid, [('type','=','in')]) pick_ids = self.search(cr, uid, [('type','=','in')])
assert pick_ids, _('No Incoming Shipments found!') assert pick_ids, 'No Incoming Shipments found!'
- stock_partial_picking = self.pool.get('stock.partial.picking')
I receive both the products. My incoming pickings are done. for pick_id in pick_ids:
- partial_id = stock_partial_picking.create(cr, uid, {},
I create record for the incoming picking wizard. context={'active_model': 'stock.picking',
- 'active_ids': [pick_id]})
!record {model: stock.partial.picking, id: stock_partial_picking0}: stock_partial_picking.do_partial(cr, uid, [partial_id])
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)
- -
Again the scheduler runs. Again the scheduler runs.
- -
@ -283,19 +255,15 @@
I check my internal picking of "Orange Juice" is done. I check my internal picking of "Orange Juice" is done.
- -
!python {model: stock.picking}: | !python {model: stock.picking}: |
from tools.translate import _
pick_ids = self.search(cr, uid, [('type','=','internal'),('state','=','done')]) 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. I check my manufacturing order for "Orange Juice" is ready or not.
- -
!python {model: mrp.production}: | !python {model: mrp.production}: |
from tools.translate import _ prod_ids = self.search(cr, uid, [('state','=','ready'),('id','=',ref('mrp_production_mo0'))])
pick_ids = self.search(cr, uid, [('state','=','ready'),('id','=',ref('mrp_production_mo0'))]) assert prod_ids, 'Manufacturing order is not ready!'
assert pick_ids, _('Manufacturing order is not ready!')
- -
I start the production order. I start the production order.
- -
!workflow {model: mrp.production, action: button_produce, ref: mrp_production_mo0} !workflow {model: mrp.production, action: button_produce, ref: mrp_production_mo0}

View File

@ -195,74 +195,26 @@
I Check incoming shipments for cloth. And receive products. I Check incoming shipments for cloth. And receive products.
- -
!python {model: stock.picking}: | !python {model: stock.picking}: |
from tools.translate import _
pick_ids = self.search(cr, uid, [('address_id.name','=','Wong'),('state','=','assigned')]) pick_ids = self.search(cr, uid, [('address_id.name','=','Wong'),('state','=','assigned')])
assert pick_ids, _('No Incoming Shipments found!') assert pick_ids, 'No Incoming Shipments found!'
- stock_partial_picking = self.pool.get('stock.partial.picking')
I create record for partial picking. for pick_id in pick_ids:
- partial_id = stock_partial_picking.create(cr, uid, {},
!record {model: stock.partial.picking, id: stock_partial_picking0}: context={'active_model': 'stock.picking',
date: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") 'active_ids': [pick_id]})
stock_partial_picking.do_partial(cr, uid, [partial_id])
-
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)
- -
I Check incoming shipments for buttons and receive products. I Check incoming shipments for buttons and receive products.
- -
!python {model: stock.picking}: | !python {model: stock.picking}: |
from tools.translate import _
pick_ids = self.search(cr, uid, [('address_id.name','=','Tang'),('state','=','assigned')]) pick_ids = self.search(cr, uid, [('address_id.name','=','Tang'),('state','=','assigned')])
assert pick_ids, _('No Incoming Shipments found!') assert pick_ids, 'No Incoming Shipments found!'
- stock_partial_picking = self.pool.get('stock.partial.picking')
I create record for partial picking. for pick_id in pick_ids:
- partial_id = stock_partial_picking.create(cr, uid, {},
!record {model: stock.partial.picking, id: stock_partial_picking0}: context={'active_model': 'stock.picking',
date: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S") 'active_ids': [pick_id]})
stock_partial_picking.do_partial(cr, uid, [partial_id])
-
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)
- -
Run scheduler again. Run scheduler again.
- -
@ -297,7 +249,6 @@
I produce 2 products with 5.00 quantities each. I produce 2 products with 5.00 quantities each.
- -
!python {model: mrp.product.produce}: | !python {model: mrp.product.produce}: |
from tools.translate import _
prod_obj = self.pool.get('mrp.production') prod_obj = self.pool.get('mrp.production')
prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')]) 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}) self.do_produce(cr, uid, [ref('mrp_product_produce0')], context={'active_ids': prod_ids})
@ -321,8 +272,7 @@
And finally production order is done. And finally production order is done.
- -
!python {model: mrp.product.produce}: | !python {model: mrp.product.produce}: |
from tools.translate import _
prod_obj = self.pool.get('mrp.production') prod_obj = self.pool.get('mrp.production')
prod_ids = prod_obj.search(cr, uid, [('product_id.name','=','Shirt')]) 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})

View File

@ -41,7 +41,7 @@ class outlook_installer(osv.osv_memory):
'doc_name':fields.char('File name', size=64), '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."), '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."), '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) 'description':fields.text('Description', readonly=True)
} }

View File

@ -264,7 +264,7 @@ class pos_order(osv.osv):
args['partner_id'] = order.partner_id and order.partner_id.id or None args['partner_id'] = order.partner_id and order.partner_id.id or None
statement_id = statement_obj.search(cr,uid, [ statement_id = statement_obj.search(cr,uid, [
('journal_id', '=', data['journal']), ('journal_id', '=', int(data['journal'])),
('company_id', '=', curr_company), ('company_id', '=', curr_company),
('user_id', '=', uid), ('user_id', '=', uid),
('state', '=', 'open')], context=context) ('state', '=', 'open')], context=context)
@ -274,7 +274,7 @@ class pos_order(osv.osv):
statement_id = statement_id[0] statement_id = statement_id[0]
args['statement_id'] = statement_id args['statement_id'] = statement_id
args['pos_statement_id'] = order_id args['pos_statement_id'] = order_id
args['journal_id'] = data['journal'] args['journal_id'] = int(data['journal'])
args['type'] = 'customer' args['type'] = 'customer'
args['ref'] = order.name args['ref'] = order.name
statement_line_obj.create(cr, uid, args, context=context) statement_line_obj.create(cr, uid, args, context=context)

View File

@ -34,6 +34,11 @@
if tools.config['test_report_directory']: if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-receipt report'+format), 'wb+').write(data) 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 Print the POS Payment Report through the wizard
- -

View File

@ -124,68 +124,15 @@ class stock_picking(osv.osv):
purchase_obj.write(cursor, user, [picking.purchase_id.id], {'invoice_id': invoice_id,}) 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) return super(stock_picking, self)._invoice_hook(cursor, user, picking, invoice_id)
stock_picking()
class stock_partial_picking(osv.osv_memory): class stock_partial_picking(osv.osv_memory):
_inherit = 'stock.partial.picking' _inherit = 'stock.partial.picking'
def default_get(self, cr, uid, fields, context=None): # Overridden to inject the purchase price as true 'cost price' when processing
""" To get default values for the object. # incoming pickings.
@param self: The object pointer. def _product_cost_for_average_update(self, cr, uid, move):
@param cr: A database cursor if move.picking_id.purchase_id:
@param uid: ID of the user currently logged in return {'cost': move.purchase_line_id.price_unit,
@param fields: List of fields for which we want default values 'currency': move.picking_id.purchase_id.pricelist_id.currency_id.id}
@param context: A standard dictionary return super(stock_partial_picking, self)._product_cost_for_average_update(cr, uid, move)
@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()
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: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -137,7 +137,7 @@
pur_id1=pur_obj.browse(cr, uid, ref("purchase_order_po2")) pur_id1=pur_obj.browse(cr, uid, ref("purchase_order_po2"))
pick_ids = [x.id for x in pur_id1.picking_ids] 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')}, 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]}) 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. I check that an invoice_ids field of Delivery&Invoices gets bind with the value.

View File

@ -31,39 +31,17 @@
- -
!workflow {model: sale.order, action: order_confirm, ref: sale_order_so9} !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}: | !python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so9")) so = self.browse(cr, uid, ref("sale_order_so9"))
assert so.picking_ids,"Picking has not been generated for sale_order_so9" assert so.picking_ids,"Picking has not been generated for sale_order_so9"
- picking, = so.picking_ids
Then I confirm the picking stock_partial_picking = self.pool.get('stock.partial.picking')
- partial_id = stock_partial_picking.create(cr, uid, {},
!record {model: stock.partial.picking, id: stock_partial_picking_0}: context={'active_model': 'stock.picking',
date: !eval time.strftime('%Y-%m-%d %H:%M:%S') 'active_ids': [picking.id]})
- stock_partial_picking.do_partial(cr, uid, [partial_id])
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)
- -
I click on Create Invoice button to create the invoice. I click on Create Invoice button to create the invoice.
- -

View File

@ -30,41 +30,21 @@
- -
!workflow {model: sale.order, action: order_confirm, ref: sale_order_so6} !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}: | !python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so6")) so = self.browse(cr, uid, ref("sale_order_so6"))
assert so.picking_ids,"Picking has not been generated for sale_order_so6" assert so.picking_ids,"Picking has not been generated for sale_order_so6"
- picking, = so.picking_ids
Then I click on the "Product Sent" button of Outgoing Shipments stock_partial_picking = self.pool.get('stock.partial.picking')
- partial_id = stock_partial_picking.create(cr, uid, {},
!record {model: stock.partial.picking, id: stock_partial_picking_0}: context={'active_model': 'stock.picking',
date: !eval time.strftime('%Y-%m-%d %H:%M:%S') 'active_ids': [picking.id]})
- # I change the qty to 100 for a partial delivery
I change the quantity on the picking to 199, and confirm partially 100 PCE. partial = stock_partial_picking.browse(cr,uid,partial_id)
- line_id = partial.move_ids[0].id
!python {model: stock.picking }: | partial.write({'move_ids': [(1,line_id,{'quantity':100})]})
import time partial.do_partial()
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)
- -
Then I click on 'Create Invoices' button Then I click on 'Create Invoices' button
- -
@ -72,9 +52,9 @@
import time import time
sale_obj = self.pool.get('sale.order') sale_obj = self.pool.get('sale.order')
sale_id = sale_obj.browse(cr, uid, ref("sale_order_so6")) 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')}, 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]}) self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]})
- -
I verify whether the invoice has been generated for SO I verify whether the invoice has been generated for SO
@ -98,7 +78,7 @@
inv_brw = self.browse(cr,uid,inv_id)[0] inv_brw = self.browse(cr,uid,inv_id)[0]
for inv_lines in inv_brw.invoice_line: for inv_lines in inv_brw.invoice_line:
qty1=inv_lines.quantity 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. I open the Invoice for the SO.
- -

View File

@ -136,15 +136,11 @@
I verify that a procurement state is "running" I verify that a procurement state is "running"
- -
!python {model: procurement.order}: | !python {model: procurement.order}: |
from tools.translate import _ sale_order_obj = self.pool.get('sale.order')
modules = self.pool.get('ir.module.module') so = sale_order_obj.browse(cr, uid, ref("sale_order_so0"))
mod_pur = modules.search(cr, uid, [('name','=','purchase')]) proc_ids = self.search(cr, uid, [('origin','=',so.name),('state','in',['running','ready'])])
mod_brw = modules.browse(cr,uid,mod_pur)[0] # should be running is 'purchase' is installed, else 'ready'
if (mod_brw.state == 'installed'): assert(proc_ids),"Procurement is not in running/ready 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','=','running')])
assert(proc_ids),"Procurement is not in the running state!"
- -
I verify that a purchase order has been generated I verify that a purchase order has been generated
- -
@ -192,7 +188,7 @@
for pur in pur_ids: for pur in pur_ids:
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) 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}: | !python {model: sale.order}: |
modules = self.pool.get('ir.module.module') modules = self.pool.get('ir.module.module')
@ -204,29 +200,12 @@
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
po = pur_obj.browse(cr, uid, pur_id)[0] po = pur_obj.browse(cr, uid, pur_id)[0]
assert(po.picking_ids),"Picking for purchase order has not been generated" assert(po.picking_ids),"Picking for purchase order has not been generated"
- picking, = po.picking_ids
Then I click on the "Products Received" button of Incoming Shipments stock_partial_picking = self.pool.get('stock.partial.picking')
- partial_id = stock_partial_picking.create(cr, uid, {},
!record {model: stock.partial.picking, id: stock_partial_picking_0}: context={'active_model': 'stock.picking',
date: !eval time.strftime('%Y-%m-%d %H:%M:%S') 'active_ids': [picking.id]})
- stock_partial_picking.do_partial(cr, uid, [partial_id])
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)
- -
I verify that picking for purchase order has been done. 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')]) ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
assert(ids),"Picking is not in the done state!" assert(ids),"Picking is not in the done state!"
- -
Then I done the picking Then I process the picking
- -
!python {model: stock.picking }: | !python {model: stock.picking }: |
import time import time
@ -254,18 +233,11 @@
if picking_id: if picking_id:
pick=self.browse(cr,uid,picking_id[0]) pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid) pick.force_assign(cr, uid)
partial_datas = { stock_partial_picking = self.pool.get('stock.partial.picking')
'partner_id':pick.address_id.partner_id.id, partial_id = stock_partial_picking.create(cr, uid, {},
'address_id': pick.address_id.id, context={'active_model': 'stock.picking',
'delivery_date' : time.strftime('%Y-%m-%d'), 'active_ids': [pick.id]})
} stock_partial_picking.do_partial(cr, uid, [partial_id])
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 picking for sale order is in done state. 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')]) picking_id = self.search(cr, uid, [('origin','=',so.name),('type','=','out')])
pick = self.browse(cr,uid,picking_id[0]) pick = self.browse(cr,uid,picking_id[0])
assert (pick.state) =='done', "Picking for SO is not in done state." 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 I verify that a "Picked" has been set to true
- -

View File

@ -46,18 +46,11 @@
if picking_id: if picking_id:
pick=self.browse(cr,uid,picking_id[0]) pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid) pick.force_assign(cr, uid)
partial_datas = { stock_partial_picking = self.pool.get('stock.partial.picking')
'partner_id':pick.address_id.partner_id.id, partial_id = stock_partial_picking.create(cr, uid, {},
'address_id': pick.address_id.id, context={'active_model': 'stock.picking',
'delivery_date' : time.strftime('%Y-%m-%d'), 'active_ids': [pick.id]})
} stock_partial_picking.do_partial(cr, uid, [partial_id])
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)
- -
Then I click on 'Create Invoices' button Then I click on 'Create Invoices' button
- -
@ -67,7 +60,7 @@
sale_id=sale_obj.browse(cr, uid, ref("sale_order_so7")) sale_id=sale_obj.browse(cr, uid, ref("sale_order_so7"))
ids = [x.id for x in sale_id.picking_ids] 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')}, 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]}) self.create_invoice(cr, uid, [wiz_id], {"active_ids": ids, "active_id": ids[0]})
- -
I check that an invoice has been created. I check that an invoice has been created.
@ -197,7 +190,7 @@
for pur in pur_ids: for pur in pur_ids:
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) 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}: | !python {model: sale.order}: |
modules = self.pool.get('ir.module.module') modules = self.pool.get('ir.module.module')
@ -209,29 +202,12 @@
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
po = pur_obj.browse(cr, uid, pur_id)[0] po = pur_obj.browse(cr, uid, pur_id)[0]
assert(po.picking_ids),"Picking for purchase order has not been generated" assert(po.picking_ids),"Picking for purchase order has not been generated"
- picking, = po.picking_ids
Then I click on the "Products Received" button of Incoming Shipments stock_partial_picking = self.pool.get('stock.partial.picking')
- partial_id = stock_partial_picking.create(cr, uid, {},
!record {model: stock.partial.picking, id: stock_partial_picking_0}: context={'active_model': 'stock.picking',
date: !eval time.strftime('%Y-%m-%d %H:%M:%S') 'active_ids': [picking.id]})
- stock_partial_picking.do_partial(cr, uid, [partial_id])
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)
- -
I verify that picking for purchase order has been done. 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')]) ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
assert ids, _('Picking is not in the done state!') 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 }: | !python {model: stock.picking }: |
sale_order_obj = self.pool.get('sale.order') sale_order_obj = self.pool.get('sale.order')
so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) so = sale_order_obj.browse(cr, uid, ref("sale_order_so7"))
picking_id = self.search(cr, uid, [('origin','=',so.name)]) picking_id = self.search(cr, uid, [('origin','=',so.name)])
assert (picking_id),"Delivery order has not been generated" assert (picking_id),"Delivery order has not been generated"
- pick=self.browse(cr,uid,picking_id[0])
I verify that delivery has been done pick.force_assign(cr, uid)
- stock_partial_picking = self.pool.get('stock.partial.picking')
!python {model: stock.picking }: | partial_id = stock_partial_picking.create(cr, uid, {},
import time context={'active_model': 'stock.picking',
sale_order_obj = self.pool.get('sale.order') 'active_ids': [pick.id]})
so = sale_order_obj.browse(cr, uid, ref("sale_order_so7")) stock_partial_picking.do_partial(cr, uid, [partial_id])
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 I verify that delivery state is done
- -
@ -290,7 +250,7 @@
pick = self.browse(cr,uid,picking_id[0]) pick = self.browse(cr,uid,picking_id[0])
assert (pick.state) =='done', "Picking for SO is not in done state." 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}: | !python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so7")) so = self.browse(cr, uid, ref("sale_order_so7"))

View File

@ -45,18 +45,11 @@
if picking_id: if picking_id:
pick=self.browse(cr,uid,picking_id[0]) pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid) pick.force_assign(cr, uid)
partial_datas = { stock_partial_picking = self.pool.get('stock.partial.picking')
'partner_id':pick.address_id.partner_id.id, partial_id = stock_partial_picking.create(cr, uid, {},
'address_id': pick.address_id.id, context={'active_model': 'stock.picking',
'delivery_date' : time.strftime('%Y-%m-%d'), 'active_ids': [pick.id]})
} stock_partial_picking.do_partial(cr, uid, [partial_id])
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 picking order is in done state. I verify that picking order is in done state.
- -
@ -76,7 +69,7 @@
picking_id = self.search(cr, uid, [('origin','=',so.name)]) picking_id = self.search(cr, uid, [('origin','=',so.name)])
assert (picking_id),"Delivery order has not been generated" 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 }: | !python {model: stock.picking }: |
import time import time
@ -86,20 +79,13 @@
if picking_id: if picking_id:
pick=self.browse(cr,uid,picking_id[0]) pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid) pick.force_assign(cr, uid)
partial_datas = { stock_partial_picking = self.pool.get('stock.partial.picking')
'partner_id':pick.address_id.partner_id.id, partial_id = stock_partial_picking.create(cr, uid, {},
'address_id': pick.address_id.id, context={'active_model': 'stock.picking',
'delivery_date' : time.strftime('%Y-%m-%d'), 'active_ids': [pick.id]})
} stock_partial_picking.do_partial(cr, uid, [partial_id])
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 I verify that delivery order is marked done
- -
!python {model: stock.picking }: | !python {model: stock.picking }: |
sale_order_obj = self.pool.get('sale.order') sale_order_obj = self.pool.get('sale.order')
@ -187,7 +173,7 @@
for pur in pur_ids: for pur in pur_ids:
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) 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}: | !python {model: sale.order}: |
modules = self.pool.get('ir.module.module') modules = self.pool.get('ir.module.module')
@ -199,31 +185,14 @@
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
po = pur_obj.browse(cr, uid, pur_id)[0] po = pur_obj.browse(cr, uid, pur_id)[0]
assert(po.picking_ids),"Picking for purchase order has not been generated" 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 I verify that picking for purchase order has been marked done.
-
!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.
- -
!python {model: sale.order}: | !python {model: sale.order}: |
from tools.translate import _ from tools.translate import _
@ -239,7 +208,7 @@
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')]) ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')])
assert ids, _('Picking is not in the done state!') 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}: | !python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so8")) so = self.browse(cr, uid, ref("sale_order_so8"))

View File

@ -101,18 +101,11 @@
if picking_id: if picking_id:
pick=self.browse(cr,uid,picking_id[0]) pick=self.browse(cr,uid,picking_id[0])
pick.force_assign(cr, uid) pick.force_assign(cr, uid)
partial_datas = { stock_partial_picking = self.pool.get('stock.partial.picking')
'partner_id':pick.address_id.partner_id.id, partial_id = stock_partial_picking.create(cr, uid, {},
'address_id': pick.address_id.id, context={'active_model': 'stock.picking',
'delivery_date' : time.strftime('%Y-%m-%d'), 'active_ids': [pick.id]})
} stock_partial_picking.do_partial(cr, uid, [partial_id])
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 picking order is in done state. I verify that picking order is in done state.
- -
@ -201,7 +194,7 @@
for pur in pur_ids: for pur in pur_ids:
wf_service.trg_validate(uid, 'purchase.order',pur,'purchase_approve', cr) 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}: | !python {model: sale.order}: |
modules = self.pool.get('ir.module.module') modules = self.pool.get('ir.module.module')
@ -213,51 +206,21 @@
pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)]) pur_id = pur_obj.search(cr, uid, [('origin','=',so.name)])
po = pur_obj.browse(cr, uid, pur_id)[0] po = pur_obj.browse(cr, uid, pur_id)[0]
assert(po.picking_ids),"Picking for purchase order has not been generated" assert(po.picking_ids),"Picking for purchase order has not been generated"
- picking, = po.picking_ids
Then I click on the "Products Received" button of Incoming Shipments stock_partial_picking = self.pool.get('stock.partial.picking')
- partial_id = stock_partial_picking.create(cr, uid, {},
!record {model: stock.partial.picking, id: stock_partial_picking_0}: context={'active_model': 'stock.picking',
date: !eval time.strftime('%Y-%m-%d %H:%M:%S') 'active_ids': [picking.id]})
- stock_partial_picking.do_partial(cr, uid, [partial_id])
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_obj = self.pool.get('stock.picking') picking_obj = self.pool.get('stock.picking')
ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id ),('state', '=', 'done')]) ids = picking_obj.search(cr, uid, [('purchase_id', '=', po.id),('state', '=', 'done')])
assert ids, _('Picking is not in the done state!') 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}: | !python {model: sale.order}: |
so = self.browse(cr, uid, ref("sale_order_so1")) 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 I verify that a sale order is in done state
- -

View File

@ -27,8 +27,8 @@ class sale_advance_payment_inv(osv.osv_memory):
_columns = { _columns = {
'product_id': fields.many2one('product.product', 'Advance Product', required=True, '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."), 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."), 'amount': fields.float('Advance Amount', digits=(16, 2), required=True, help="The amount to be invoiced in advance."),
'qtty': fields.float('Quantity', size=(16, 2), required=True), 'qtty': fields.float('Quantity', digits=(16, 2), required=True),
} }
_defaults = { _defaults = {
'qtty': 1.0 'qtty': 1.0
@ -173,4 +173,4 @@ class sale_open_invoice(osv.osv_memory):
sale_open_invoice() sale_open_invoice()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -664,8 +664,8 @@ class stock_picking(osv.osv):
def action_process(self, cr, uid, ids, context=None): def action_process(self, cr, uid, ids, context=None):
if context is None: context = {} if context is None: context = {}
partial_id = self.pool.get("stock.partial.picking").create( context = dict(context, active_ids=ids, active_model=self._name)
cr, uid, {}, context=dict(context, active_ids=ids)) partial_id = self.pool.get("stock.partial.picking").create(cr, uid, {}, context=context)
return { return {
'name':_("Products to Process"), 'name':_("Products to Process"),
'view_mode': 'form', 'view_mode': 'form',
@ -677,7 +677,7 @@ class stock_picking(osv.osv):
'nodestroy': True, 'nodestroy': True,
'target': 'new', 'target': 'new',
'domain': '[]', 'domain': '[]',
'context': dict(context, active_ids=ids) 'context': context,
} }
def copy(self, cr, uid, id, default=None, context=None): 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): def action_partial_move(self, cr, uid, ids, context=None):
if context is None: context = {} 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( partial_id = self.pool.get("stock.partial.move").create(
cr, uid, {}, context=context) cr, uid, {}, context=context)
return { 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. """ Makes the move done and if all moves are done, it will finish the picking.
@return: @return:
""" """
partial_datas=''
picking_ids = [] picking_ids = []
move_ids = [] move_ids = []
partial_obj=self.pool.get('stock.partial.picking')
wf_service = netsvc.LocalService("workflow") 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: if context is None:
context = {} context = {}
@ -2164,9 +2161,6 @@ class stock_move(osv.osv):
self.action_done(cr, uid, [move.move_dest_id.id], context=context) self.action_done(cr, uid, [move.move_dest_id.id], context=context)
self._create_product_valuation_moves(cr, uid, move, 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'): if move.state not in ('confirmed','done','assigned'):
todo.append(move.id) todo.append(move.id)

View File

@ -184,37 +184,32 @@
self.fill_inventory(cr, uid, [ref("stock_fill_inventory_0")], context) 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}: !record {model: stock.inventory.line.split, id: stock_inventory_line_0}:
line_ids: line_ids:
- name: '00002-stock-test' - name: '00002-stock-test'
quantity: 5 quantity: 5
line_exist_ids:
- name: '00003-stock-test'
quantity: 5
product_id: product.product_product_pc1 product_id: product.product_product_pc1
product_uom: product.product_uom_unit product_uom: product.product_uom_unit
use_exist: False use_exist: False
qty: 10 qty: 10
- -
I Split stock.inventory.line into production line. I confirm the split operation
- -
!python {model: stock.inventory.line.split}: | !python {model: stock.inventory.line}: |
context = {"lang": 'en_US', "active_model": "stock.inventory.line", line_ids = self.search(cr, uid, [('inventory_id','=',ref('stock_inventory_physicalinventoy0')),
"active_ids": [ref("stock_inventory_line_0")], "tz": False, "active_id": ref("stock_inventory_line_0")} ('product_id','=',ref('product.product_product_pc1'))])
self.default_get(cr, uid, ["product_id", "product_uom", "line_exist_ids", "qty", assert line_ids, 'Inventory lines are missing'
"line_ids", "use_exist"], context) self.pool.get('stock.inventory.line.split').split_lot(cr, uid, [ref("stock_inventory_line_0")],
self.split_lot(cr, uid, [ref("stock_inventory_line_0")], context) {'active_model': 'stock.inventory.line',
'active_ids': [line_ids[0]]})
- -
I confirm the Inventory for PC3. I confirm the Inventory for PC3.
- -
!python {model: stock.inventory}: | !python {model: stock.inventory}: |
self.action_confirm(cr,uid,[ref('stock_inventory_physicalinventoy0')]) self.action_confirm(cr,uid,[ref('stock_inventory_physicalinventoy0')])
self.action_done(cr,uid,[ref('stock_inventory_physicalinventoy0')]) self.action_done(cr,uid,[ref('stock_inventory_physicalinventoy0')])
- -
I cancel the Inventory for PC3. I cancel the Inventory for PC3.
- -
@ -251,7 +246,7 @@
type: out 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 }: | !python {model: stock.picking }: |
pick=self.browse(cr,uid,ref('stock_picking_0')) pick=self.browse(cr,uid,ref('stock_picking_0'))
@ -285,31 +280,15 @@
ref("stock.menu_action_picking_tree6"), }) 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}: !python {model: stock.picking }: |
date: !eval time.strftime('%Y-%m-%d %H:%M:%S') 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, {},
I done stock.partial.move record. context={'active_model': 'stock.move',
- 'active_ids': [x.id for x in pick.move_lines]})
!python {model: stock.partial.move }: | stock_partial_move.do_partial(cr, uid, [partial_id])
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)
- -
I Performing an osv_memory action split_lot on module stock.move.split 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) 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}: !python {model: stock.picking}: |
date: !eval time.strftime('%Y-%m-%d %H:%M:%S') stock_partial_picking = self.pool.get('stock.partial.picking')
partial_id = stock_partial_picking.create(cr, uid, {},
- context={'active_model': 'stock.picking',
I make stock partial picking order Done. 'active_ids': [ref('stock_picking_0')]})
- stock_partial_picking.do_partial(cr, uid, [partial_id])
!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)
- -
I Performing an osv_memory action create_invoice on module stock.invoice.onshipping 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", 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"), "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) 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}: | !python {model: stock.picking}: |
copy_id = self.copy(cr, uid, (ref("stock_picking_0"))) copy_id = self.copy(cr, uid, (ref("stock_picking_0")))
ctx = {"lang": "en_US", "active_model": self.draft_force_assign(cr, uid, [copy_id])
"ir.ui.menu", "tz": False, "search_default_confirmed": 1, "contact_display": self.force_assign(cr, uid, [copy_id])
"partner", "active_ids": [ref("stock.menu_action_picking_tree6")], "active_id": stock_partial_picking = self.pool.get('stock.partial.picking')
ref("stock.menu_action_picking_tree6")} context = {'active_model': 'stock.picking',
self.draft_force_assign(cr, uid, [copy_id], ctx) 'active_ids': [copy_id],
self.force_assign(cr, uid, [copy_id], ctx) 'active_id': copy_id}
pick=self.browse(cr,uid,copy_id) partial_id = stock_partial_picking.create(cr, uid, {}, context=context)
partial_datas={} stock_partial_picking.do_partial(cr, uid, [partial_id], context)
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}
return_pick_id = self.pool.get('stock.return.picking').create(cr, uid,{}, 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) self.pool.get('stock.return.picking').create_returns(cr, uid, [return_pick_id], context)

View File

@ -21,24 +21,17 @@
from osv import fields, osv from osv import fields, osv
from tools.translate import _
import time
class stock_inventory_line_split(osv.osv_memory): class stock_inventory_line_split(osv.osv_memory):
_inherit = "stock.move.split" _inherit = "stock.move.split"
_name = "stock.inventory.line.split" _name = "stock.inventory.line.split"
_description = "Split inventory lines" _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): 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: if context is None:
context = {} context = {}
record_id = context and context.get('active_id',False) 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): def split(self, cr, uid, ids, line_ids, context=None):
""" To split stock inventory lines according to production lot. """ To split stock inventory lines according to production lot.
@param self: The object pointer.
@param cr: A database cursor :param line_ids: the ID or list of IDs of inventory lines we want to split
@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:
""" """
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') prodlot_obj = self.pool.get('stock.production.lot')
ir_sequence_obj = self.pool.get('ir.sequence') ir_sequence_obj = self.pool.get('ir.sequence')
line_obj = self.pool.get('stock.inventory.line') 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) line_obj.write(cr, uid, [inv_line.id], update_val)
return new_line 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:

View File

@ -28,7 +28,7 @@ class stock_invoice_onshipping(osv.osv_memory):
def _get_journal(self, cr, uid, context=None): def _get_journal(self, cr, uid, context=None):
res = self._get_journal_id(cr, uid, context=context) res = self._get_journal_id(cr, uid, context=context)
if res: if res:
return res[0] return res[0][0]
return False return False
def _get_journal_id(self, cr, uid, context=None): def _get_journal_id(self, cr, uid, context=None):

View File

@ -146,14 +146,6 @@ class split_in_production_lot(osv.osv_memory):
_description = "Split in Production lots" _description = "Split in Production lots"
def default_get(self, cr, uid, fields, context=None): 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: if context is None:
context = {} context = {}
res = super(split_in_production_lot, self).default_get(cr, uid, fields, context=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')), 'qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
'product_id': fields.many2one('product.product', 'Product', required=True, select=True), 'product_id': fields.many2one('product.product', 'Product', required=True, select=True),
'product_uom': fields.many2one('product.uom', 'UoM'), 'product_uom': fields.many2one('product.uom', 'UoM'),
'line_ids': fields.one2many('stock.move.split.lines', '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.exist', 'lot_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."), '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') 'location_id': fields.many2one('stock.location', 'Source Location')
} }
def split_lot(self, cr, uid, ids, context=None): def split_lot(self, cr, uid, ids, context=None):
""" To split a lot """ 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:
"""
if context is None: if context is None:
context = {} context = {}
res = self.split(cr, uid, ids, context.get('active_ids'), context=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): def split(self, cr, uid, ids, move_ids, context=None):
""" To split stock moves into production lot """ To split stock moves into production lot
@param self: The object pointer.
@param cr: A database cursor :param move_ids: the ID or list of IDs of stock move we want to split
@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:
""" """
if context is None: if context is None:
context = {} context = {}
assert context.get('active_model') == 'stock.move',\
'Incorrect use of the stock move split wizard'
inventory_id = context.get('inventory_id', False) inventory_id = context.get('inventory_id', False)
prodlot_obj = self.pool.get('stock.production.lot') prodlot_obj = self.pool.get('stock.production.lot')
inventory_obj = self.pool.get('stock.inventory') inventory_obj = self.pool.get('stock.inventory')
@ -269,12 +251,13 @@ class split_in_production_lot(osv.osv_memory):
split_in_production_lot() split_in_production_lot()
class stock_move_split_lines_exist(osv.osv_memory): class stock_move_split_lines_exist(osv.osv_memory):
_name = "stock.move.split.lines.exist" _name = "stock.move.split.lines"
_description = "Exist Split lines" _description = "Stock move Split lines"
_columns = { _columns = {
'name': fields.char('Tracking serial', size=64), 'name': fields.char('Tracking serial', size=64),
'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')), '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'), 'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot'),
} }
_defaults = { _defaults = {
@ -285,21 +268,3 @@ class stock_move_split_lines_exist(osv.osv_memory):
loc_id=False, product_id=False, uom_id=False): loc_id=False, product_id=False, uom_id=False):
return self.pool.get('stock.move').onchange_lot_id(cr, uid, [], prodlot_id, product_qty, return self.pool.get('stock.move').onchange_lot_id(cr, uid, [], prodlot_id, product_qty,
loc_id, product_id, uom_id) 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()

View File

@ -2,7 +2,7 @@
############################################################################## ##############################################################################
# #
# OpenERP, Open Source Management Solution # OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). # Copyright (C) 2004-TODAY OpenERP SA (<http://openerp.com>).
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -20,210 +20,65 @@
############################################################################## ##############################################################################
from osv import fields, osv from osv import fields, osv
from tools.translate import _ from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
import time import time
import decimal_precision as dp
class stock_partial_move_line(osv.osv_memory):
class stock_partial_move_memory_out(osv.osv_memory): _inherit = "stock.partial.picking.line"
_name = "stock.move.memory.out" _name = "stock.partial.move.line"
_rec_name = 'product_id'
_columns = { _columns = {
'product_id' : fields.many2one('product.product', string="Product", required=True), 'wizard_id' : fields.many2one('stock.partial.move', string="Wizard", ondelete='CASCADE'),
'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"),
} }
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): class stock_partial_move(osv.osv_memory):
_name = "stock.partial.move" _name = "stock.partial.move"
_description = "Partial Move" _inherit = 'stock.partial.picking'
_description = "Partial Move Processing Wizard"
_columns = { _columns = {
'date': fields.datetime('Date', required=True), 'date': fields.datetime('Date', required=True),
'type': fields.char("Type", size=3), 'move_ids' : fields.one2many('stock.partial.move.line', 'wizard_id', 'Moves'),
'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
def __get_active_stock_moves(self, cr, uid, context=None): # picking_id is not used for move processing, so we remove the required attribute
move_obj = self.pool.get('stock.move') # from the inherited column, and ignore it
if context is None: 'picking_id': fields.many2one('stock.picking', 'Picking'),
context = {} }
res = [] def default_get(self, cr, uid, fields, context=None):
for move in move_obj.browse(cr, uid, context.get('active_ids', []), context=context): if context is None: context = {}
if move.state in ('done', 'cancel'): # no call to super!
continue res = {}
res.append(self.__create_partial_move_memory(move)) 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 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 = """
<form string="%(title)s">
<separator colspan="4" string="%(info)s"/>
<field name="date" colspan="2"/>
<separator colspan="4" string="Move Detail"/>
<field name="%(picking_type)s" colspan="4" nolabel="1" mode="tree,form" width="550" height="200" ></field>
<separator string="" colspan="4" />
<label string="" colspan="2"/>
<group col="2" colspan="2">
<button icon='gtk-cancel' special="cancel" string="_Cancel" />
<button name="do_partial" string="%(button)s"
colspan="1" type="object" icon="gtk-apply" />
</group>
</form> """ % message
result['arch'] = _moves_arch_lst
result['fields'] = _moves_fields
return result
def do_partial(self, cr, uid, ids, context=None): def do_partial(self, cr, uid, ids, context=None):
""" Makes partial moves and pickings done. # no call to super!
@param self: The object pointer. assert len(ids) == 1, 'Partial move processing may only be done one form at a time'
@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 = {}
move_obj = self.pool.get('stock.move')
move_ids = context.get('active_ids', False)
partial = self.browse(cr, uid, ids[0], context=context) partial = self.browse(cr, uid, ids[0], context=context)
partial_datas = { partial_data = {
'delivery_date' : partial.date 'delivery_date' : partial.date
} }
moves_ids = []
p_moves = {} for move in partial.move_ids:
picking_type = self.__get_picking_type(cr, uid, move_ids) move_id = move.move_id.id
partial_data['move%s' % (move_id)] = {
moves_list = picking_type == 'product_moves_in' and partial.product_moves_in or partial.product_moves_out 'product_id': move.product_id.id,
for product_move in moves_list: 'product_qty': move.quantity,
p_moves[product_move.move_id.id] = product_move 'product_uom': move.product_uom.id,
'prodlot_id': move.prodlot_id.id,
moves_ids_final = []
for move in move_obj.browse(cr, uid, move_ids, context=context):
if move.state in ('done', 'cancel'):
continue
if not p_moves.get(move.id):
continue
partial_datas['move%s' % (move.id)] = {
'product_id' : p_moves[move.id].product_id.id,
'product_qty' : p_moves[move.id].quantity,
'product_uom' :p_moves[move.id].product_uom.id,
'prodlot_id' : p_moves[move.id].prodlot_id.id,
} }
moves_ids.append(move_id)
moves_ids_final.append(move.id) if (move.move_id.picking_id.type == 'in') and (move.product_id.cost_method == 'average'):
if (move.picking_id.type == 'in') and (move.product_id.cost_method == 'average'): partial_data['move%s' % (move_id)].update(product_price=move.cost,
partial_datas['move%s' % (move.id)].update({ product_currency=move.currency.id)
'product_price' : p_moves[move.id].cost, self.pool.get('stock.move').do_partial(cr, uid, moves_ids, partial_data, context=context)
'product_currency': p_moves[move.id].currency.id,
})
move_obj.do_partial(cr, uid, moves_ids_final, partial_datas, context=context)
return {'type': 'ir.actions.act_window_close'} return {'type': 'ir.actions.act_window_close'}
stock_partial_move() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
stock_partial_move_memory_out()
stock_partial_move_memory_in()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,16 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<openerp> <openerp>
<data> <data>
<record id="action_partial_move_server" model="ir.actions.server"> <record id="action_partial_move_server" model="ir.actions.server">
<field name="name">Deliver/Receive Products</field> <field name="name">Deliver/Receive Products</field>
<field name="model_id" ref="model_stock_move"/> <field name="model_id" ref="model_stock_move"/>
<field name="state">code</field> <field name="state">code</field>
<field name="code">action = obj.action_partial_move(context=context)</field> <field name="code">action = obj.action_partial_move(context=context)</field>
</record> </record>
<record id="ir_open_partial_move_wizard" model="ir.values"> <record id="ir_open_partial_move_wizard" model="ir.values">
<field eval="'client_action_multi'" name="key2"/> <field eval="'client_action_multi'" name="key2"/>
<field eval="'stock.move'" name="model"/> <field eval="'stock.move'" name="model"/>
@ -19,75 +16,60 @@
<field eval="True" name="object"/> <field eval="True" name="object"/>
</record> </record>
<record id="stock_partial_move_form" model="ir.ui.view">
<field name="name">stock.partial.move.form</field>
<record id="stock_move_memory_tree_in" model="ir.ui.view"> <field name="model">stock.partial.move</field>
<field name="name">stock.move.memory.tree</field>
<field name="model">stock.move.memory.in</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree editable="bottom" string="Product Moves">
<field name="product_id" />
<field name="quantity" />
<field name="product_uom" />
<field name="location_id" />
<field name="location_dest_id" />
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
<field name="cost" />
<field name="currency" />
</tree>
</field>
</record>
<record id="stock_move_memory_form_in" model="ir.ui.view">
<field name="name">stock.move.memory.form</field>
<field name="model">stock.move.memory.in</field>
<field name="type">form</field> <field name="type">form</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form> <form>
<field name="product_id" /> <separator colspan="4" string="Products"/>
<field name="quantity" /> <field name="move_ids" colspan="4" nolabel="1" mode="tree,form" width="550" height="200"/>
<field name="product_uom" /> <separator string="" colspan="4" />
<field name="location_id" /> <label string="" colspan="2"/>
<field name="location_dest_id" /> <group col="2" colspan="2">
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" /> <button icon='gtk-cancel' special="cancel" string="_Cancel" />
<field name="cost" /> <button name="do_partial" string="_Validate" colspan="1" type="object" icon="gtk-go-forward" />
<field name="currency" /> </group>
</form>
</field>
</record>
<record id="stock_move_memory_tree_out" model="ir.ui.view">
<field name="name">stock.move.memory.tree</field>
<field name="model">stock.move.memory.out</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree editable="bottom" string="Product Moves">
<field name="product_id" />
<field name="quantity" />
<field name="product_uom" />
<field name="location_id" />
<field name="location_dest_id" />
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
</tree>
</field>
</record>
<record id="stock_move_memory_form_out" model="ir.ui.view">
<field name="name">stock.move.memory.form</field>
<field name="model">stock.move.memory.out</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form>
<field name="product_id" />
<field name="quantity" />
<field name="product_uom" />
<field name="location_id" />
<field name="location_dest_id" />
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
</form> </form>
</field> </field>
</record> </record>
<record id="stock_partial_move_line_list" model="ir.ui.view">
<field name="name">stock.partial.move.line.list</field>
<field name="model">stock.partial.move.line</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree editable="bottom" string="Product Moves">
<field name="product_id" />
<field name="quantity" />
<field name="product_uom" />
<field name="location_id" />
<field name="location_dest_id" />
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
<field name="update_cost" invisible="1"/>
<field name="cost" attrs="{'invisible': [('update_cost','=', False)]}"/>
<field name="currency" attrs="{'invisible': [('update_cost','=', False)]}"/>
</tree>
</field>
</record>
<record id="stock_partial_move_line_form" model="ir.ui.view">
<field name="name">stock.partial.move.line.form</field>
<field name="model">stock.partial.move.line</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form>
<field name="product_id" />
<field name="quantity" />
<field name="product_uom" />
<field name="location_id" />
<field name="location_dest_id" />
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
<field name="update_cost" invisible="1"/>
<field name="cost" attrs="{'invisible': [('update_cost','=', False)]}"/>
<field name="currency" attrs="{'invisible': [('update_cost','=', False)]}"/>
</form>
</field>
</record>
</data> </data>
</openerp> </openerp>

View File

@ -1,9 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################## ##############################################################################
# #
# OpenERP, Open Source Management Solution # OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). # Copyright (C) 2004-TODAY OpenERP SA (<http://openerp.com>).
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -20,169 +19,119 @@
# #
############################################################################## ##############################################################################
from osv import fields, osv
from tools.translate import _
import time import time
from osv import fields, osv
from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
class stock_partial_picking_line(osv.TransientModel):
_name = "stock.partial.picking.line"
_rec_name = 'product_id'
_columns = {
'product_id' : fields.many2one('product.product', string="Product", required=True, ondelete='CASCADE'),
'quantity' : fields.float("Quantity", required=True),
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True, ondelete='CASCADE'),
'prodlot_id' : fields.many2one('stock.production.lot', 'Production Lot', ondelete='CASCADE'),
'location_id': fields.many2one('stock.location', 'Location', required=True, ondelete='CASCADE'),
'location_dest_id': fields.many2one('stock.location', 'Dest. Location', required=True, ondelete='CASCADE'),
'move_id' : fields.many2one('stock.move', "Move", ondelete='CASCADE'),
'wizard_id' : fields.many2one('stock.partial.picking', string="Wizard", ondelete='CASCADE'),
'update_cost': fields.boolean('Need cost update'),
'cost' : fields.float("Cost", help="Unit Cost for this product line"),
'currency' : fields.many2one('res.currency', string="Currency", help="Currency in which Unit cost is expressed", ondelete='CASCADE'),
}
class stock_partial_picking(osv.osv_memory): class stock_partial_picking(osv.osv_memory):
_name = "stock.partial.picking" _name = "stock.partial.picking"
_description = "Partial Picking" _description = "Partial Picking Processing Wizard"
_columns = { _columns = {
'date': fields.datetime('Date', required=True), 'date': fields.datetime('Date', required=True),
'product_moves_out' : fields.one2many('stock.move.memory.out', 'wizard_id', 'Moves'), 'move_ids' : fields.one2many('stock.partial.picking.line', 'wizard_id', 'Product Moves'),
'product_moves_in' : fields.one2many('stock.move.memory.in', 'wizard_id', 'Moves'), 'picking_id': fields.many2one('stock.picking', 'Picking', required=True, ondelete='CASCADE'),
} }
def get_picking_type(self, cr, uid, picking, context=None):
picking_type = picking.type
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): def default_get(self, cr, uid, fields, context=None):
""" To get default values for the object. if context is None: context = {}
@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) res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context)
picking_ids = context.get('active_ids', []) picking_ids = context.get('active_ids', [])
if not picking_ids: if not picking_ids or (not context.get('active_model') == 'stock.picking') \
or len(picking_ids) != 1:
# Partial Picking Processing may only be done for one picking at a time
return res return res
picking_id, = picking_ids
result = [] if 'picking_id' in fields:
for pick in pick_obj.browse(cr, uid, picking_ids, context=context): res.update(picking_id=picking_id)
pick_type = self.get_picking_type(cr, uid, pick, context=context) if 'move_ids' in fields:
for m in pick.move_lines: picking = self.pool.get('stock.picking').browse(cr, uid, picking_id, context=context)
if m.state in ('done', 'cancel'): moves = [self._partial_move_for(cr, uid, m) for m in picking.move_lines if m.state not in ('done','cancel')]
continue res.update(move_ids=moves)
result.append(self.__create_partial_picking_memory(m, pick_type))
if 'product_moves_in' in fields:
res.update({'product_moves_in': result})
if 'product_moves_out' in fields:
res.update({'product_moves_out': result})
if 'date' in fields: if 'date' in fields:
res.update({'date': time.strftime('%Y-%m-%d %H:%M:%S')}) res.update(date=time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))
return res return res
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
result = super(stock_partial_picking, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu)
pick_obj = self.pool.get('stock.picking')
picking_ids = context.get('active_ids', False)
if not picking_ids: def _product_cost_for_average_update(self, cr, uid, move):
# not called through an action (e.g. buildbot), return the default. """Returns product cost and currency ID for the given move, suited for re-computing
return result the average product cost.
for pick in pick_obj.browse(cr, uid, picking_ids, context=context):
picking_type = self.get_picking_type(cr, uid, pick, context=context)
_moves_arch_lst = """<form string="%s"> :return: map of the form::
<field name="date" invisible="1"/>
<separator colspan="4" string="%s"/>
<field name="%s" colspan="4" nolabel="1" mode="tree,form" width="550" height="200" ></field>
""" % (_('Process Document'), _('Products'), "product_moves_" + picking_type)
_moves_fields = result['fields']
# add field related to picking type only {'cost': 123.34,
_moves_fields.update({ 'currency': 42}
'product_moves_' + picking_type: {'relation': 'stock.move.memory.'+picking_type, 'type' : 'one2many', 'string' : 'Product Moves'}, """
}) # Currently, the cost on the product form is supposed to be expressed in the currency
# of the company owning the product. If not set, we fall back to the picking's company,
# which should work in simple cases.
return {'cost': move.product_id.standard_price,
'currency': move.product_id.company_id.currency_id.id \
or move.picking_id.company_id.currency_id.id \
or False}
_moves_arch_lst += """ def _partial_move_for(self, cr, uid, move):
<separator string="" colspan="4" /> partial_move = {
<label string="" colspan="2"/> 'product_id' : move.product_id.id,
<group col="2" colspan="2"> 'quantity' : move.product_qty,
<button icon='gtk-cancel' special="cancel" 'product_uom' : move.product_uom.id,
string="_Cancel" /> 'prodlot_id' : move.prodlot_id.id,
<button name="do_partial" string="_Validate" 'move_id' : move.id,
colspan="1" type="object" icon="gtk-go-forward" /> 'location_id' : move.location_id.id,
</group> 'location_dest_id' : move.location_dest_id.id,
</form>"""
result['arch'] = _moves_arch_lst
result['fields'] = _moves_fields
return result
def __create_partial_picking_memory(self, picking, pick_type):
move_memory = {
'product_id' : picking.product_id.id,
'quantity' : picking.product_qty,
'product_uom' : picking.product_uom.id,
'prodlot_id' : picking.prodlot_id.id,
'move_id' : picking.id,
'location_id' : picking.location_id.id,
'location_dest_id' : picking.location_dest_id.id,
} }
if move.picking_id.type == 'in' and move.product_id.cost_method == 'average':
if pick_type == 'in': partial_move.update(update_cost=True, **self._product_cost_for_average_update(cr, uid, move))
move_memory.update({ return partial_move
'cost' : picking.product_id.standard_price,
'currency' : picking.product_id.company_id and picking.product_id.company_id.currency_id and picking.product_id.company_id.currency_id.id or False,
})
return move_memory
def do_partial(self, cr, uid, ids, context=None): def do_partial(self, cr, uid, ids, context=None):
""" Makes partial moves and pickings done. assert len(ids) == 1, 'Partial picking processing may only be done one at a time'
@param self: The object pointer. stock_picking = self.pool.get('stock.picking')
@param cr: A database cursor stock_move = self.pool.get('stock.move')
@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.
"""
pick_obj = self.pool.get('stock.picking')
stock_move_obj = self.pool.get('stock.move')
picking_ids = context.get('active_ids', False)
partial = self.browse(cr, uid, ids[0], context=context) partial = self.browse(cr, uid, ids[0], context=context)
partial_datas = { partial_data = {
'delivery_date' : partial.date 'delivery_date' : partial.date
} }
for pick in pick_obj.browse(cr, uid, picking_ids, context=context): picking_type = partial.picking_id.type
picking_type = self.get_picking_type(cr, uid, pick, context=context) for move in partial.move_ids:
moves_list = picking_type == 'in' and partial.product_moves_in or partial.product_moves_out move_id = move.move_id.id
for move in moves_list: if not move_id:
if not move.move_id.id: seq_obj_name = 'stock.picking.' + picking_type
seq_obj_name = 'stock.picking.' + picking_type move_id = stock_move.create(cr,uid,{'name' : self.pool.get('ir.sequence').get(cr, uid, seq_obj_name),
move_id = stock_move_obj.create(cr,uid,{'name' : self.pool.get('ir.sequence').get(cr, uid, seq_obj_name), 'product_id': move.product_id.id,
'product_id': move.product_id.id, 'product_qty': move.quantity,
'product_qty': move.quantity, 'product_uom': move.product_uom.id,
'product_uom': move.product_uom.id, 'prodlot_id': move.prodlot_id.id,
'prodlot_id': move.prodlot_id.id, 'location_id' : move.location_id.id,
'location_id' : move.location_id.id, 'location_dest_id' : move.location_dest_id.id,
'location_dest_id' : move.location_dest_id.id, 'picking_id': partial.picking_id.id
'picking_id': pick.id },context=context)
},context=context) stock_move.action_done(cr, uid, [move_id], context)
stock_move_obj.action_done(cr, uid, [move_id], context) partial_data['move%s' % (move_id)] = {
else: 'product_id': move.product_id.id,
move_id = move.move_id.id 'product_qty': move.quantity,
'product_uom': move.product_uom.id,
partial_datas['move%s' % (move_id)] = { 'prodlot_id': move.prodlot_id.id,
'product_id': move.product_id.id, }
'product_qty': move.quantity, if (picking_type == 'in') and (move.product_id.cost_method == 'average'):
'product_uom': move.product_uom.id, partial_data['move%s' % (move.move_id.id)].update(product_price=move.cost,
'prodlot_id': move.prodlot_id.id, product_currency=move.currency.id)
} stock_picking.do_partial(cr, uid, [partial.picking_id.id], partial_data, context=context)
if (picking_type == 'in') and (move.product_id.cost_method == 'average'):
partial_datas['move%s' % (move.move_id.id)].update({
'product_price' : move.cost,
'product_currency': move.currency.id,
})
pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context)
return {'type': 'ir.actions.act_window_close'} return {'type': 'ir.actions.act_window_close'}
stock_partial_picking() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -9,5 +9,59 @@
<field name="target">new</field> <field name="target">new</field>
</record> </record>
<record id="stock_partial_picking_form" model="ir.ui.view">
<field name="name">stock.partial.picking.form</field>
<field name="model">stock.partial.picking</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form>
<separator colspan="4" string="Products"/>
<field name="move_ids" colspan="4" nolabel="1" mode="tree,form" width="550" height="200"/>
<separator string="" colspan="4" />
<label string="" colspan="2"/>
<group col="2" colspan="2">
<button icon='gtk-cancel' special="cancel" string="_Cancel" />
<button name="do_partial" string="_Validate" colspan="1" type="object" icon="gtk-go-forward" />
</group>
</form>
</field>
</record>
<record id="stock_partial_picking_line_list" model="ir.ui.view">
<field name="name">stock.partial.picking.line.list</field>
<field name="model">stock.partial.picking.line</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree editable="bottom" string="Product Moves">
<field name="product_id" />
<field name="quantity" />
<field name="product_uom" />
<field name="location_id" />
<field name="location_dest_id" />
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
<field name="update_cost" invisible="1"/>
<field name="cost" attrs="{'invisible': [('update_cost','=', False)]}"/>
<field name="currency" attrs="{'invisible': [('update_cost','=', False)]}"/>
</tree>
</field>
</record>
<record id="stock_partial_picking_line_form" model="ir.ui.view">
<field name="name">stock.partial.picking.line.form</field>
<field name="model">stock.partial.picking.line</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form>
<field name="product_id" />
<field name="quantity" />
<field name="product_uom" />
<field name="location_id" />
<field name="location_dest_id" />
<field name="prodlot_id" domain="[('product_id', '=', product_id)]" groups="base.group_extended" />
<field name="update_cost" invisible="1"/>
<field name="cost" attrs="{'invisible': [('update_cost','=', False)]}"/>
<field name="currency" attrs="{'invisible': [('update_cost','=', False)]}"/>
</form>
</field>
</record>
</data> </data>
</openerp> </openerp>

View File

@ -38,36 +38,19 @@
"active_ids": [ref("stock.menu_action_picking_tree")], "active_id": ref("stock.menu_action_picking_tree"), "active_ids": [ref("stock.menu_action_picking_tree")], "active_id": ref("stock.menu_action_picking_tree"),
}) })
- -
I create a record for partial picking. I process the delivery
-
!record {model: stock.partial.picking, id: stock_partial_picking_0}:
date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
-
I make picking order Done.
- -
!python {model: stock.partial.picking}: | !python {model: stock.partial.picking}: |
pick_obj = self.pool.get('stock.picking') partial_id = self.create(cr, uid, {}, context={'active_model':'stock.picking',
partial = self.browse(cr, uid, ref('stock_partial_picking_0'), context) 'active_ids':[ref('stock_picking_out0')]})
partial_datas = { self.do_partial(cr, uid, [partial_id])
'delivery_date' : partial.date
}
for pick in pick_obj.browse(cr, uid, [ref('stock_picking_out0')]):
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
}
self.do_partial(cr, uid, [ref('stock_partial_picking_0')], {"lang": "en_US", "search_default_available":
1, "tz": False, "active_model": "ir.ui.menu", "contact_display": "partner",
"active_ids": [ref('stock_picking_out0')], "active_id": ref("stock_picking_out0"),
})
- -
As the Invoice state of the picking order is To be invoiced. I create invoice for my outgoing picking order. As the Invoice state of the picking order is To be invoiced. I create invoice for my outgoing picking order.
- -
!python {model: stock.invoice.onshipping}: | !python {model: stock.invoice.onshipping}: |
wiz_id = self.create(cr, uid, {'invoice_date': '2010-08-04', 'journal_id': ref('account.bank_journal')}, wiz_id = self.create(cr, uid, {'invoice_date': '2010-08-04', 'journal_id': ref('account.sales_journal')},
{'active_ids': [ref("stock_picking_out0")]}) {'active_ids': [ref("stock_picking_out0")], "active_model": "stock.picking"})
self.create_invoice(cr, uid, [wiz_id], {"lang": "en_US", self.create_invoice(cr, uid, [wiz_id], {"lang": "en_US",
"search_default_available": 1, "tz": False, "active_model": "stock.picking", "search_default_available": 1, "tz": False, "active_model": "stock.picking",
"contact_display": "partner", "active_ids": [ref("stock_picking_out0")], "active_id": ref("stock_picking_out0")}) "contact_display": "partner", "active_ids": [ref("stock_picking_out0")], "active_id": ref("stock_picking_out0")})

View File

@ -25,24 +25,15 @@ class invoice_directly(osv.osv_memory):
_inherit = 'stock.partial.picking' _inherit = 'stock.partial.picking'
def do_partial(self, cr, uid, ids, context=None): def do_partial(self, cr, uid, ids, context=None):
""" Makes partial moves and pickings done and """Launch Create invoice wizard if invoice state is To be Invoiced,
launches Create invoice wizard if invoice state is To be Invoiced. after processing the partial picking.
@param self: The object pointer.
@param cr: A database cursor
@param uid: ID of the user currently logged in
@param context: A standard dictionary
@return:
""" """
if context is None: if context is None: context = {}
context = {}
result = super(invoice_directly, self).do_partial(cr, uid, ids, context) result = super(invoice_directly, self).do_partial(cr, uid, ids, context)
pick_obj = self.pool.get('stock.picking') partial = self.browse(cr, uid, ids[0], context)
context.update({'active_model':'stock.picking'}) context.update(active_model='stock.picking',
picking_ids = context.get('active_ids', False) active_ids=[partial.picking_id.id])
if picking_ids: if partial.picking_id.invoice_state == '2binvoiced':
context.update({'active_id':picking_ids[0]})
pick = pick_obj.browse(cr, uid, picking_ids, context=context)[0]
if pick.invoice_state == '2binvoiced':
return { return {
'name': 'Create Invoice', 'name': 'Create Invoice',
'view_type': 'form', 'view_type': 'form',
@ -55,5 +46,5 @@ class invoice_directly(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'} return {'type': 'ir.actions.act_window_close'}
invoice_directly() invoice_directly()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -46,7 +46,7 @@ class stock_period(osv.osv):
'name': fields.char('Period Name', size=64, required=True), 'name': fields.char('Period Name', size=64, required=True),
'date_start': fields.datetime('Start Date', required=True), 'date_start': fields.datetime('Start Date', required=True),
'date_stop': fields.datetime('End Date', required=True), 'date_stop': fields.datetime('End Date', required=True),
'state': fields.selection([('draft','Draft'), ('open','Open'),('close','Close')], 'State') 'state': fields.selection([('draft','Draft'), ('open','Open'),('close','Close')], 'State'),
} }
_defaults = { _defaults = {
'state': 'draft' 'state': 'draft'

View File

@ -46,6 +46,7 @@ class stock_period_createlines(osv.osv_memory):
'date_start': fields.date('Start Date', required=True, help="Starting date for planning period."), 'date_start': fields.date('Start Date', required=True, help="Starting date for planning period."),
'date_stop': fields.date('End Date', required=True, help="Ending date for planning period."), 'date_stop': fields.date('End Date', required=True, help="Ending date for planning period."),
'period_ids': fields.one2many('stock.period', 'planning_id', 'Periods'), 'period_ids': fields.one2many('stock.period', 'planning_id', 'Periods'),
'period_ids': fields.many2many('stock.period', 'stock_period_createlines_stock_period_rel', 'wizard_id', 'period_id', 'Periods'),
} }
_defaults={ _defaults={
'date_start': _get_new_period_start, 'date_start': _get_new_period_start,

View File

@ -1281,6 +1281,7 @@
<field name="responsible_id" ref="base.user_demo"/> <field name="responsible_id" ref="base.user_demo"/>
<field name="max_response_limit">20</field> <field name="max_response_limit">20</field>
<field name="type" ref="survey_type2"/> <field name="type" ref="survey_type2"/>
<field name="state">open</field>
<field name="response_user">5</field> <field name="response_user">5</field>
</record> </record>
</data> </data>

View File

@ -144,8 +144,8 @@
Give answer of the survey, Run "Answer a Survey" wizard and select the survey and press on start button then run the selected survey. Give answer of the survey, Run "Answer a Survey" wizard and select the survey and press on start button then run the selected survey.
- -
!python {model: survey.name.wiz}: | !python {model: survey.name.wiz}: |
ids = self.create(cr, uid, {'survey_id': ref("survey_partner_0")}) id = self.create(cr, uid, {'survey_id': ref("survey_partner_0")})
self.action_next(cr, uid, [ids], context) self.action_next(cr, uid, [id], context)
- -
Give answer of the first and second page in "Partner Feedback" suvey. Give answer of the first and second page in "Partner Feedback" suvey.
- -

View File

@ -40,14 +40,6 @@ class survey_question_wiz(osv.osv_memory):
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
""" """
Fields View Get method :- generate the new view and display the survey pages of selected survey. Fields View Get method :- generate the new view and display the survey pages of selected survey.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param view_id : view id of the current object.
@param view_type : which type of view is create. like :- form, tree ,search etc...
@param context: A standard dictionary for contextual values
@return : Dictionary value for created view of particular survey pages.
""" """
result = super(survey_question_wiz, self).fields_view_get(cr, uid, view_id, \ result = super(survey_question_wiz, self).fields_view_get(cr, uid, view_id, \
@ -88,7 +80,7 @@ class survey_question_wiz(osv.osv_memory):
if not survey_id: if not survey_id:
# Try one more time to find it # Try one more time to find it
if sur_name_rec and sur_name_rec.survey_id: if sur_name_rec and sur_name_rec.survey_id:
survey_id = sur_name_rec.survey_id[0] survey_id = sur_name_rec.survey_id.id
else: else:
# raise osv.except_osv(_('Error!'), _("Cannot locate survey for the question wizard!")) # raise osv.except_osv(_('Error!'), _("Cannot locate survey for the question wizard!"))
# If this function is called without a survey_id in # If this function is called without a survey_id in
@ -398,10 +390,10 @@ class survey_question_wiz(osv.osv_memory):
sur_response_obj.write(cr, uid, [sur_name_read.response], {'state' : 'done'}) sur_response_obj.write(cr, uid, [sur_name_read.response], {'state' : 'done'})
if sur_rec.send_response: if sur_rec.send_response:
survey_data = survey_obj.browse(cr, uid, int(survey_id)) survey_data = survey_obj.browse(cr, uid, survey_id)
response_id = surv_name_wiz.read(cr, uid, context.get('sur_name_id',False))['response'] response_id = surv_name_wiz.read(cr, uid, context.get('sur_name_id',False))['response']
context.update({'response_id':response_id}) context.update({'response_id':response_id})
report = self.create_report(cr, uid, [int(survey_id)], 'report.survey.browse.response', survey_data.title,context) report = self.create_report(cr, uid, [survey_id], 'report.survey.browse.response', survey_data.title,context)
attachments = {} attachments = {}
file = open(addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf") file = open(addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf")
file_data = "" file_data = ""
@ -445,15 +437,6 @@ class survey_question_wiz(osv.osv_memory):
def create_report(self, cr, uid, res_ids, report_name=False, file_name=False, context=None): def create_report(self, cr, uid, res_ids, report_name=False, file_name=False, context=None):
""" """
If any user give answer of survey then last create report of this answer and if 'E-mail Notification on Answer' set True in survey then send mail on responsible person of this survey and attach survey answer report in pdf format. If any user give answer of survey then last create report of this answer and if 'E-mail Notification on Answer' set True in survey then send mail on responsible person of this survey and attach survey answer report in pdf format.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param res_ids: List of survey answer IDs,
@param report_name: name of the report,
@param file_name: To give file name of the report,
@param context: A standard dictionary for contextual values,
@return : Dictionary value for created report with file nameself.
""" """
if not report_name or not res_ids: if not report_name or not res_ids:
return (False, Exception('Report name and Resources ids are required !!!')) return (False, Exception('Report name and Resources ids are required !!!'))
@ -474,13 +457,6 @@ class survey_question_wiz(osv.osv_memory):
def default_get(self, cr, uid, fields_list, context=None): def default_get(self, cr, uid, fields_list, context=None):
""" """
Assign Default value in particular field. If Browse Answers wizard run then read the value into database and Assigne to a particular fields. Assign Default value in particular field. If Browse Answers wizard run then read the value into database and Assigne to a particular fields.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param fields_list: List of fields of current view,
@param context: A standard dictionary for contextual values,
@return : Dictionary value for fields list with value.
""" """
value = {} value = {}
if context is None: if context is None:
@ -556,13 +532,6 @@ class survey_question_wiz(osv.osv_memory):
def create(self, cr, uid, vals, context=None): def create(self, cr, uid, vals, context=None):
""" """
Create the Answer of survey and store in survey.response object, and if set validation of question then check the value of question if value is wrong then raise the exception. Create the Answer of survey and store in survey.response object, and if set validation of question then check the value of question if value is wrong then raise the exception.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param vals: Values,
@param context: A standard dictionary for contextual values
@return : True.
""" """
if context is None: context = {} if context is None: context = {}
if context.has_key('active') and context.get('active',False): if context.has_key('active') and context.get('active',False):
@ -600,9 +569,10 @@ class survey_question_wiz(osv.osv_memory):
#click first time on next button then increemnet on total start suvey #click first time on next button then increemnet on total start suvey
if not sur_name_read['store_ans']: if not sur_name_read['store_ans']:
his_id = self.pool.get('survey.history').create(cr, uid, {'user_id': uid, \ his_id = self.pool.get('survey.history').create(cr, uid, {'user_id': uid, \
'date': strftime('%Y-%m-%d %H:%M:%S'), 'survey_id': sur_name_read['survey_id']}) 'date': strftime('%Y-%m-%d %H:%M:%S'), 'survey_id': sur_name_read['survey_id'][0]})
sur_rec = survey_obj.read(cr, uid, sur_name_read['survey_id']) survey_id = sur_name_read['survey_id'][0]
survey_obj.write(cr, uid, sur_name_read['survey_id'], {'tot_start_survey' : sur_rec['tot_start_survey'] + 1}) sur_rec = survey_obj.read(cr, uid, survey_id)
survey_obj.write(cr, uid, survey_id, {'tot_start_survey' : sur_rec['tot_start_survey'] + 1})
if context.has_key('cur_id'): if context.has_key('cur_id'):
if context.has_key('request') and context.get('request',False): if context.has_key('request') and context.get('request',False):
self.pool.get(context.get('object',False)).write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id}) self.pool.get(context.get('object',False)).write(cr, uid, [int(context.get('cur_id',False))], {'response' : response_id})
@ -1016,13 +986,6 @@ class survey_question_wiz(osv.osv_memory):
def action_new_question(self,cr, uid, ids, context=None): def action_new_question(self,cr, uid, ids, context=None):
""" """
New survey.Question form. New survey.Question form.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open new survey.Qestion form.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1044,13 +1007,6 @@ class survey_question_wiz(osv.osv_memory):
def action_new_page(self, cr, uid, ids, context=None): def action_new_page(self, cr, uid, ids, context=None):
""" """
New survey.Page form. New survey.Page form.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open new survey.page form.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1072,13 +1028,6 @@ class survey_question_wiz(osv.osv_memory):
def action_edit_page(self,cr, uid, ids, context=None): def action_edit_page(self,cr, uid, ids, context=None):
""" """
Edit survey.page. Edit survey.page.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open Edit survey.page form.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1101,13 +1050,6 @@ class survey_question_wiz(osv.osv_memory):
def action_delete_page(self,cr, uid, ids, context=None): def action_delete_page(self,cr, uid, ids, context=None):
""" """
Delete survey.page. Delete survey.page.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open next survey.page form, but delete the selected page.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1134,13 +1076,6 @@ class survey_question_wiz(osv.osv_memory):
def action_edit_question(self,cr, uid, ids, context=None): def action_edit_question(self,cr, uid, ids, context=None):
""" """
Edit survey.question. Edit survey.question.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open Edit survey.question form.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1163,13 +1098,6 @@ class survey_question_wiz(osv.osv_memory):
def action_delete_question(self,cr, uid, ids, context=None): def action_delete_question(self,cr, uid, ids, context=None):
""" """
Delete survey.question. Delete survey.question.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open same survey.page form, but delete the selected survey.question in current survey.page.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1197,13 +1125,6 @@ class survey_question_wiz(osv.osv_memory):
def action_forward_previous(self, cr, uid, ids, context=None): def action_forward_previous(self, cr, uid, ids, context=None):
""" """
Goes to previous Survey Answer. Goes to previous Survey Answer.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open Previous Answer form.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1229,13 +1150,6 @@ class survey_question_wiz(osv.osv_memory):
def action_forward_next(self, cr, uid, ids, context=None): def action_forward_next(self, cr, uid, ids, context=None):
""" """
Goes to Next Survey Answer. Goes to Next Survey Answer.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open Next Answer form.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1261,13 +1175,6 @@ class survey_question_wiz(osv.osv_memory):
def action_next(self, cr, uid, ids, context=None): def action_next(self, cr, uid, ids, context=None):
""" """
Goes to Next page. Goes to Next page.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open Next survey.page form.
""" """
if context is None: if context is None:
context = {} context = {}
@ -1288,13 +1195,6 @@ class survey_question_wiz(osv.osv_memory):
def action_previous(self, cr, uid, ids, context=None): def action_previous(self, cr, uid, ids, context=None):
""" """
Goes to previous page. Goes to previous page.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.question.wiz IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for Open Previous survey.page form.
""" """
if context is None: if context is None:
context = {} context = {}

View File

@ -24,26 +24,9 @@ from osv import fields
class survey_browse_answer(osv.osv_memory): class survey_browse_answer(osv.osv_memory):
_name = 'survey.browse.answer' _name = 'survey.browse.answer'
def _get_survey(self, cr, uid, context=None):
"""
Set the value in survey_id field,
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param context: A standard dictionary for contextual values,
@return : Tuple in list with values.
"""
surv_obj = self.pool.get("survey")
surv_resp_obj = self.pool.get("survey.response")
result = []
for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])):
if surv_resp_obj.search(cr, uid, [('survey_id', '=', sur.id)]):
result.append((sur.id, sur.title))
return result
_columns = { _columns = {
'survey_id': fields.selection(_get_survey, "Survey", required="1"), 'survey_id': fields.many2one('survey', "Survey", required="1"),
'response_id': fields.many2one("survey.response", "Survey Answers", help="If this field is empty, all answers of the selected survey will be print."), 'response_id': fields.many2one("survey.response", "Survey Answers", help="If this field is empty, all answers of the selected survey will be print."),
} }
@ -51,13 +34,6 @@ class survey_browse_answer(osv.osv_memory):
""" """
Open Browse Response wizard. if you select only survey_id then this wizard open with all response_ids and Open Browse Response wizard. if you select only survey_id then this wizard open with all response_ids and
if you select survey_id and response_id then open the particular response of the survey. if you select survey_id and response_id then open the particular response of the survey.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of survey.browse.answer IDs,
@param context: A standard dictionary for contextual values,
@return : Dictionary value for Open the browse answer wizard.
""" """
if context is None: context = {} if context is None: context = {}
record = self.read(cr, uid, ids, []) record = self.read(cr, uid, ids, [])
@ -66,8 +42,8 @@ class survey_browse_answer(osv.osv_memory):
res_id = [(record.get('response_id') and record['response_id'][0])] res_id = [(record.get('response_id') and record['response_id'][0])]
else: else:
sur_response_obj = self.pool.get('survey.response') sur_response_obj = self.pool.get('survey.response')
res_id = sur_response_obj.search(cr, uid, [('survey_id', '=',int(record['survey_id']))]) res_id = sur_response_obj.search(cr, uid, [('survey_id', '=', record['survey_id'][0])])
context.update({'active' : True,'survey_id' : record['survey_id'], 'response_id' : res_id, 'response_no' : 0}) context.update({'active' : True,'survey_id' : record['survey_id'][0], 'response_id' : res_id, 'response_no' : 0})
search_obj = self.pool.get('ir.ui.view') search_obj = self.pool.get('ir.ui.view')
search_id = search_obj.search(cr,uid,[('model','=','survey.question.wiz'),('name','=','Survey Search')]) search_id = search_obj.search(cr,uid,[('model','=','survey.question.wiz'),('name','=','Survey Search')])
return { return {

View File

@ -27,8 +27,7 @@ from tools.translate import _
class survey_print(osv.osv_memory): class survey_print(osv.osv_memory):
_name = 'survey.print' _name = 'survey.print'
_columns = { _columns = {
'survey_ids': fields.many2many('survey','survey_print',\ 'survey_ids': fields.many2many('survey', string="Survey", required="1"),
'survey_id','print_id', "Survey", required="1"),
'orientation' : fields.selection([('vertical','Portrait(Vertical)'),\ 'orientation' : fields.selection([('vertical','Portrait(Vertical)'),\
('horizontal','Landscape(Horizontal)')], 'Orientation'), ('horizontal','Landscape(Horizontal)')], 'Orientation'),
'paper_size' : fields.selection([('letter','Letter (8.5" x 11")'),\ 'paper_size' : fields.selection([('letter','Letter (8.5" x 11")'),\

View File

@ -26,20 +26,12 @@ from tools.translate import _
class survey_print_statistics(osv.osv_memory): class survey_print_statistics(osv.osv_memory):
_name = 'survey.print.statistics' _name = 'survey.print.statistics'
_columns = { _columns = {
'survey_ids': fields.many2many('survey','survey_print_statistics','survey_id',\ 'survey_ids': fields.many2many('survey', string="Survey", required="1"),
'print_id', "Survey", required="1"),
} }
def action_next(self, cr, uid, ids, context=None): def action_next(self, cr, uid, ids, context=None):
""" """
Print Survey Statistics in pdf format. Print Survey Statistics in pdf format.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of Survey statistics IDs
@param context: A standard dictionary for contextual values
@return: Dictionary value for created survey statistics report
""" """
if context is None: if context is None:
context = {} context = {}

View File

@ -26,71 +26,8 @@ from tools.translate import _
class survey_name_wiz(osv.osv_memory): class survey_name_wiz(osv.osv_memory):
_name = 'survey.name.wiz' _name = 'survey.name.wiz'
def default_get(self, cr, uid, fields, context=None):
"""
Set the default value in survey_id field. if open this wizard in survey form then set the default value in survey_id = active survey id.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param fields: List of Survey statistics IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for created survey statistics report
"""
if context is None:
context = {}
data = super(survey_name_wiz, self).default_get(cr, uid, fields, context)
if context.has_key('survey_id'):
data['survey_id'] = context.get('survey_id',False)
return data
def _get_survey(self, cr, uid, context=None):
"""
Set the value In survey_id field.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of Survey statistics IDs
@param context: A standard dictionary for contextual values
@return: Dictionary value for created survey statistics report
"""
surv_obj = self.pool.get("survey")
result = []
if context.has_key('survey_id'):
for sur in surv_obj.browse(cr, uid, [context.get('survey_id',False)]):
result.append((sur.id, sur.title))
return result
survey_user_group_id = self.pool.get('res.groups').search(cr, uid, [('name', '=', 'Survey / User')])
group_id = self.pool.get('res.groups').search(cr, uid, [('name', 'in', ('Tools / Manager','Tools / User','Survey / User'))])
user_obj = self.pool.get('res.users')
user_rec = user_obj.read(cr, uid, uid, [])
if survey_user_group_id:
if survey_user_group_id == user_rec['groups_id']:
for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])):
if sur.state == 'open':
u_list = []
for use in sur.invited_user_ids:
u_list.append(use.id)
if uid in u_list:
result.append((sur.id, sur.title))
return result
for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])):
if sur.state == 'open':
res = False
for i in group_id:
if i in user_rec['groups_id']:
res = True
break
elif sur.id in user_rec['survey_id']:
res = True
break
if res:
result.append((sur.id, sur.title))
return result
_columns = { _columns = {
'survey_id': fields.selection(_get_survey, "Survey", required="1"), 'survey_id': fields.many2one('survey', 'Survey', required=True, ondelete='cascade'),
'page_no': fields.integer('Page Number'), 'page_no': fields.integer('Page Number'),
'note': fields.text("Description"), 'note': fields.text("Description"),
'page': fields.char('Page Position',size = 12), 'page': fields.char('Page Position',size = 12),
@ -99,10 +36,11 @@ class survey_name_wiz(osv.osv_memory):
'response': fields.char('Answer',size=16) 'response': fields.char('Answer',size=16)
} }
_defaults = { _defaults = {
'page_no': lambda * a: - 1, 'page_no': -1,
'page': lambda * a: 'next', 'page': 'next',
'transfer': lambda * a: 1, 'transfer': 1,
'response': lambda * a: 0, 'response': 0,
'survey_id': lambda self,cr,uid,context:context.get('survey_id',False),
} }
def action_next(self, cr, uid, ids, context=None): def action_next(self, cr, uid, ids, context=None):
@ -110,30 +48,22 @@ class survey_name_wiz(osv.osv_memory):
Start the survey, Increment in started survey field but if set the max_response_limit of Start the survey, Increment in started survey field but if set the max_response_limit of
survey then check the current user how many times start this survey. if current user max_response_limit survey then check the current user how many times start this survey. if current user max_response_limit
is reach then this user can not start this survey(Raise Exception). is reach then this user can not start this survey(Raise Exception).
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of Survey IDs
@param context: A standard dictionary for contextual values
@return : Dictionary value for open survey question wizard.
""" """
survey_obj = self.pool.get('survey') survey_obj = self.pool.get('survey')
search_obj = self.pool.get('ir.ui.view') search_obj = self.pool.get('ir.ui.view')
if context is None: context = {} if context is None: context = {}
this = self.browse(cr, uid, ids, context=context)[0] this = self.browse(cr, uid, ids, context=context)[0]
survey_id = this.survey_id survey_id = this.survey_id.id
context.update({'survey_id': survey_id, 'sur_name_id': this.id}) context.update({'survey_id': survey_id, 'sur_name_id': this.id})
cr.execute('select count(id) from survey_history where user_id=%s\ cr.execute('select count(id) from survey_history where user_id=%s\
and survey_id=%s' % (uid,survey_id)) and survey_id=%s' % (uid,survey_id))
res = cr.fetchone()[0] res = cr.fetchone()[0]
user_limit = survey_obj.read(cr, uid, survey_id, ['response_user'])['response_user'] sur_rec = survey_obj.browse(cr,uid,survey_id,context=context)
if user_limit and res >= user_limit: if sur_rec.response_user and res >= sur_rec.response_user:
raise osv.except_osv(_('Warning !'),_("You can not give response for this survey more than %s times") % (user_limit)) raise osv.except_osv(_('Warning !'),_("You can not give response for this survey more than %s times") % (user_limit))
sur_rec = survey_obj.browse(cr,uid,ids,context=context)[0]
if sur_rec.max_response_limit and sur_rec.max_response_limit <= sur_rec.tot_start_survey: if sur_rec.max_response_limit and sur_rec.max_response_limit <= sur_rec.tot_start_survey:
raise osv.except_osv(_('Warning !'),_("You can not give more response. Please contact the author of this survey for further assistance.")) raise osv.except_osv(_('Warning !'),_("You can not give more response. Please contact the author of this survey for further assistance."))
@ -152,16 +82,10 @@ class survey_name_wiz(osv.osv_memory):
def on_change_survey(self, cr, uid, ids, survey_id, context=None): def on_change_survey(self, cr, uid, ids, survey_id, context=None):
""" """
on change event of survey_id field, if note is available in selected survey then display this note in note fields. on change event of survey_id field, if note is available in selected survey then display this note in note fields.
@param ids: List of Survey IDs
@param survey_id: Id of Survey
@param context: A standard dictionary for contextual values
@return : Dictionary values of notes fields.
""" """
if not survey_id: if not survey_id:
return {} return {}
notes = self.pool.get('survey').read(cr, uid, survey_id, ['note'])['note'] notes = self.pool.get('survey').read(cr, uid, survey_id, ['note'])['note']
return {'value': {'note': notes}} return {'value': {'note': notes}}
survey_name_wiz() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -15,7 +15,8 @@
<separator colspan="4" string="Select Survey" /> <separator colspan="4" string="Select Survey" />
<newline /> <newline />
<field name="survey_id" colspan="4" <field name="survey_id" colspan="4"
on_change="on_change_survey(survey_id)" width="250"/> on_change="on_change_survey(survey_id)" width="250"
domain="[('state','=','open')]"/>
<group col="1" colspan="4" <group col="1" colspan="4"
attrs="{'readonly': [('survey_id','=',False)]}"> attrs="{'readonly': [('survey_id','=',False)]}">
<separator colspan="4" string="Survey Details" /> <separator colspan="4" string="Survey Details" />

View File

@ -41,7 +41,7 @@ class thunderbird_installer(osv.osv_memory):
'pdf_name':fields.char('File name', size=64), 'pdf_name':fields.char('File name', size=64),
'thunderbird':fields.boolean('Thunderbird Plug-in', help="Allows you to select an object that you would like to add to your email and its attachments."), 'thunderbird':fields.boolean('Thunderbird 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('Thunderbird Plug-in', readonly=True, help="Thunderbird plug-in file. Save as this file and install this plug-in in thunderbird."), 'plugin_file':fields.binary('Thunderbird Plug-in', readonly=True, help="Thunderbird plug-in file. Save as this file and install this plug-in in thunderbird."),
'pdf_file':fields.char('Installation Manual', size="264", help="The documentation file :- how to install Thunderbird Plug-in.", readonly=True), 'pdf_file':fields.char('Installation Manual', size=264, help="The documentation file :- how to install Thunderbird Plug-in.", readonly=True),
'description':fields.text('Description', readonly=True) 'description':fields.text('Description', readonly=True)
} }