[MERGE] Bugfixes from 6.1 until revision 6800

bzr revid: odo@openerp.com-20121206153856-9y9v8ok6yxo6l5f0
This commit is contained in:
Olivier Dony 2012-12-06 16:38:56 +01:00
commit 5db87bea9c
28 changed files with 73 additions and 54 deletions

View File

@ -141,7 +141,7 @@ for a particular financial year and for preparation of vouchers there is a modul
'project/analytic_account_demo.xml', 'project/analytic_account_demo.xml',
'demo/account_minimal.xml', 'demo/account_minimal.xml',
'demo/account_invoice_demo.xml', 'demo/account_invoice_demo.xml',
# 'account_unit_test.xml', 'account_unit_test.xml',
], ],
'test': [ 'test': [
'test/account_customer_invoice.yml', 'test/account_customer_invoice.yml',

View File

@ -80,8 +80,11 @@ class account_invoice(osv.osv):
def _reconciled(self, cr, uid, ids, name, args, context=None): def _reconciled(self, cr, uid, ids, name, args, context=None):
res = {} res = {}
for id in ids: wf_service = netsvc.LocalService("workflow")
res[id] = self.test_paid(cr, uid, [id]) for inv in self.browse(cr, uid, ids, context=context):
res[inv.id] = self.test_paid(cr, uid, [inv.id])
if not res[inv.id] and inv.state == 'paid':
wf_service.trg_validate(uid, 'account.invoice', inv.id, 'open_test', cr)
return res return res
def _get_reference_type(self, cr, uid, context=None): def _get_reference_type(self, cr, uid, context=None):
@ -1162,7 +1165,7 @@ class account_invoice(osv.osv):
return map(lambda x: (0,0,x), lines) return map(lambda x: (0,0,x), lines)
def refund(self, cr, uid, ids, date=None, period_id=None, description=None, journal_id=None): def refund(self, cr, uid, ids, date=None, period_id=None, description=None, journal_id=None):
invoices = self.read(cr, uid, ids, ['name', 'type', 'number', 'reference', 'comment', 'date_due', 'partner_id', 'partner_contact', 'partner_insite', 'partner_ref', 'payment_term', 'account_id', 'currency_id', 'invoice_line', 'tax_line', 'journal_id', 'company_id']) invoices = self.read(cr, uid, ids, ['name', 'type', 'number', 'reference', 'comment', 'date_due', 'partner_id', 'partner_contact', 'partner_insite', 'partner_ref', 'payment_term', 'account_id', 'currency_id', 'invoice_line', 'tax_line', 'journal_id', 'company_id', 'user_id', 'fiscal_position'])
obj_invoice_line = self.pool.get('account.invoice.line') obj_invoice_line = self.pool.get('account.invoice.line')
obj_invoice_tax = self.pool.get('account.invoice.tax') obj_invoice_tax = self.pool.get('account.invoice.tax')
obj_journal = self.pool.get('account.journal') obj_journal = self.pool.get('account.journal')
@ -1211,7 +1214,8 @@ class account_invoice(osv.osv):
}) })
# take the id part of the tuple returned for many2one fields # take the id part of the tuple returned for many2one fields
for field in ('partner_id', 'company_id', for field in ('partner_id', 'company_id',
'account_id', 'currency_id', 'payment_term', 'journal_id'): 'account_id', 'currency_id', 'payment_term', 'journal_id',
'user_id', 'fiscal_position'):
invoice[field] = invoice[field] and invoice[field][0] invoice[field] = invoice[field] and invoice[field][0]
# create the new invoice # create the new invoice
new_ids.append(self.create(cr, uid, invoice)) new_ids.append(self.create(cr, uid, invoice))

View File

@ -856,7 +856,12 @@ class account_move_line(osv.osv):
if r[0][1] != None: if r[0][1] != None:
raise osv.except_osv(_('Error!'), _('Some entries are already reconciled.')) raise osv.except_osv(_('Error!'), _('Some entries are already reconciled.'))
if (not currency_obj.is_zero(cr, uid, account.company_id.currency_id, writeoff)) or \ if context.get('fy_closing'):
# We don't want to generate any write-off when being called from the
# wizard used to close a fiscal year (and it doesn't give us any
# writeoff_acc_id).
pass
elif (not currency_obj.is_zero(cr, uid, account.company_id.currency_id, writeoff)) or \
(account.currency_id and (not currency_obj.is_zero(cr, uid, account.currency_id, currency))): (account.currency_id and (not currency_obj.is_zero(cr, uid, account.currency_id, currency))):
if not writeoff_acc_id: if not writeoff_acc_id:
raise osv.except_osv(_('Warning!'), _('You have to provide an account for the write off/exchange difference entry.')) raise osv.except_osv(_('Warning!'), _('You have to provide an account for the write off/exchange difference entry.'))

View File

@ -29,8 +29,9 @@
<field name="auto_delete" eval="True"/> <field name="auto_delete" eval="True"/>
<field name="report_template" ref="account_invoices"/> <field name="report_template" ref="account_invoices"/>
<field name="report_name">Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''}</field> <field name="report_name">Invoice_${(object.number or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''}</field>
<field name="lang">${object.partner_id.lang}</field>
<field name="body_html"><![CDATA[ <field name="body_html"><![CDATA[
<div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); "> <div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},</p> <p>Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},</p>
@ -73,7 +74,7 @@
<br/> <br/>
<br/> <br/>
<div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;"> <div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;">
<h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #FFF;"> <h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #DDD;">
<strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3> <strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3>
</div> </div>
<div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;"> <div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;">

View File

@ -56,7 +56,7 @@ class report_account_common(report_sxw.rml_parse, common_report_header):
for report in self.pool.get('account.financial.report').browse(self.cr, self.uid, ids2, context=data['form']['used_context']): for report in self.pool.get('account.financial.report').browse(self.cr, self.uid, ids2, context=data['form']['used_context']):
vals = { vals = {
'name': report.name, 'name': report.name,
'balance': report.balance, 'balance': report.balance * report.sign,
'type': 'report', 'type': 'report',
'level': bool(report.style_overwrite) and report.style_overwrite or report.level, 'level': bool(report.style_overwrite) and report.style_overwrite or report.level,
'account_type': report.type =='sum' and 'view' or False, #used to underline the financial report balances 'account_type': report.type =='sum' and 'view' or False, #used to underline the financial report balances

View File

@ -48,6 +48,7 @@ class report_account_receivable(osv.osv):
_order = 'name desc' _order = 'name desc'
def init(self, cr): def init(self, cr):
tools.drop_view_if_exists(cr, 'report_account_receivable')
cr.execute(""" cr.execute("""
create or replace view report_account_receivable as ( create or replace view report_account_receivable as (
select select
@ -183,6 +184,7 @@ class report_invoice_created(osv.osv):
_order = 'create_date' _order = 'create_date'
def init(self, cr): def init(self, cr):
tools.drop_view_if_exists(cr, 'report_invoice_created')
cr.execute("""create or replace view report_invoice_created as ( cr.execute("""create or replace view report_invoice_created as (
select select
inv.id as id, inv.name as name, inv.type as type, inv.id as id, inv.name as name, inv.type as type,

View File

@ -36,7 +36,7 @@ from itertools import groupby
from operator import itemgetter from operator import itemgetter
FIELD_STATES = [('clear', 'Clear'), ('anonymized', 'Anonymized'), ('not_existing', 'Not Existing')] FIELD_STATES = [('clear', 'Clear'), ('anonymized', 'Anonymized'), ('not_existing', 'Not Existing'), ('new', 'New')]
ANONYMIZATION_STATES = FIELD_STATES + [('unstable', 'Unstable')] ANONYMIZATION_STATES = FIELD_STATES + [('unstable', 'Unstable')]
WIZARD_ANONYMIZATION_STATES = [('clear', 'Clear'), ('anonymized', 'Anonymized'), ('unstable', 'Unstable')] WIZARD_ANONYMIZATION_STATES = [('clear', 'Clear'), ('anonymized', 'Anonymized'), ('unstable', 'Unstable')]
ANONYMIZATION_HISTORY_STATE = [('started', 'Started'), ('done', 'Done'), ('in_exception', 'Exception occured')] ANONYMIZATION_HISTORY_STATE = [('started', 'Started'), ('done', 'Done'), ('in_exception', 'Exception occured')]

View File

@ -686,10 +686,10 @@ class crm_lead(base_stage, format_address, osv.osv):
if context is None: if context is None:
context = {} context = {}
partner_ids = {} partner_ids = {}
force_partner_id = partner_id
for lead in self.browse(cr, uid, ids, context=context): for lead in self.browse(cr, uid, ids, context=context):
if action == 'create': if action == 'create':
if not partner_id: partner_id = force_partner_id or self._create_lead_partner(cr, uid, lead, context)
partner_id = self._create_lead_partner(cr, uid, lead, context)
self._lead_set_partner(cr, uid, lead, partner_id, context=context) self._lead_set_partner(cr, uid, lead, partner_id, context=context)
partner_ids[lead.id] = partner_id partner_ids[lead.id] = partner_id
return partner_ids return partner_ids
@ -700,9 +700,9 @@ class crm_lead(base_stage, format_address, osv.osv):
value = {} value = {}
if team_id: if team_id:
value['section_id'] = team_id value['section_id'] = team_id
if index < len(user_ids): if user_ids:
value['user_id'] = user_ids[index] value['user_id'] = user_ids[index]
index += 1 index = (index + 1) % len(user_ids)
if value: if value:
self.write(cr, uid, [lead_id], value, context=context) self.write(cr, uid, [lead_id], value, context=context)
return True return True

View File

@ -195,12 +195,12 @@ openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOS
strip_attachments=(not server.attach), strip_attachments=(not server.attach),
context=context) context=context)
if res_id and server.action_id: if res_id and server.action_id:
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", False)}) action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", server.object_id.model)})
imap_server.store(num, '+FLAGS', '\\Seen') imap_server.store(num, '+FLAGS', '\\Seen')
cr.commit() cr.commit()
count += 1 count += 1
_logger.info("fetched/processed %s email(s) on %s server %s", count, server.type, server.name) _logger.info("fetched/processed %s email(s) on %s server %s", count, server.type, server.name)
except Exception, e: except Exception:
_logger.exception("Failed to fetch mail from %s server %s.", server.type, server.name) _logger.exception("Failed to fetch mail from %s server %s.", server.type, server.name)
finally: finally:
if imap_server: if imap_server:
@ -220,11 +220,11 @@ openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOS
strip_attachments=(not server.attach), strip_attachments=(not server.attach),
context=context) context=context)
if res_id and server.action_id: if res_id and server.action_id:
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", False)}) action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", server.object_id.model)})
pop_server.dele(num) pop_server.dele(num)
cr.commit() cr.commit()
_logger.info("fetched/processed %s email(s) on %s server %s", numMsgs, server.type, server.name) _logger.info("fetched/processed %s email(s) on %s server %s", numMsgs, server.type, server.name)
except Exception, e: except Exception:
_logger.exception("Failed to fetch mail from %s server %s.", server.type, server.name) _logger.exception("Failed to fetch mail from %s server %s.", server.type, server.name)
finally: finally:
if pop_server: if pop_server:

View File

@ -164,7 +164,10 @@ class partner_vat_intra(osv.osv_memory):
'comments': comments, 'comments': comments,
'issued_by': issued_by, 'issued_by': issued_by,
}) })
#tax code 44: services
#tax code 46L: normal good deliveries
#tax code 46T: ABC good deliveries
#tax code 48xxx: credite note on tax code xxx
codes = ('44', '46L', '46T', '48s44', '48s46L', '48s46T') codes = ('44', '46L', '46T', '48s44', '48s46L', '48s46T')
cr.execute('''SELECT p.name As partner_name, l.partner_id AS partner_id, p.vat AS vat, cr.execute('''SELECT p.name As partner_name, l.partner_id AS partner_id, p.vat AS vat,
(CASE WHEN t.code = '48s44' THEN '44' (CASE WHEN t.code = '48s44' THEN '44'

View File

@ -30,8 +30,11 @@ class coda_bank_account(osv.osv):
def _check_currency(self, cr, uid, ids, context=None): def _check_currency(self, cr, uid, ids, context=None):
obj_cba = self.browse(cr, uid, ids[0], context=context) obj_cba = self.browse(cr, uid, ids[0], context=context)
if (obj_cba.state == 'normal') and obj_cba.journal and (obj_cba.currency != obj_cba.journal.currency): if (obj_cba.state == 'normal') and obj_cba.journal:
return False if obj_cba.journal.currency and (obj_cba.currency != obj_cba.journal.currency):
return False
if not obj_cba.journal.currency and (obj_cba.currency != obj_cba.company_id.currency_id):
return False
return True return True
_columns = { _columns = {

View File

@ -631,12 +631,6 @@ class account_coda_import(osv.osv_memory):
nb_err += 1 nb_err += 1
err_string += _('\nConfiguration Error!\nPlease verify the Default Debit and Credit Account settings in journal %s.') % journal.name err_string += _('\nConfiguration Error!\nPlease verify the Default Debit and Credit Account settings in journal %s.') % journal.name
break break
if balance_start_check <> statement['balance_start']:
nb_err += 1
err_string += _('\nThe CODA Statement %s Starting Balance (%.2f) does not correspond with the previous Closing Balance (%.2f) in journal %s.') \
% (statement['name'], statement['balance_start'], balance_start_check, journal.name)
break
bk_st_id = bank_st_obj.create(cr, uid, { bk_st_id = bank_st_obj.create(cr, uid, {
'name': statement['name'], 'name': statement['name'],
'journal_id': statement['journal_id'], 'journal_id': statement['journal_id'],

View File

@ -58,4 +58,4 @@
!python {model: account.invoice}: | !python {model: account.invoice}: |
from tools.test_reports import try_report from tools.test_reports import try_report
company = self.pool.get('res.users').browse(cr, uid, uid).company_id company = self.pool.get('res.users').browse(cr, uid, uid).company_id
company.lib_path and try_report(cr, uid, 'report.invoice_web_bvr', [ref('l10n_ch_invoice')]) or 'Webkit lib not set' try_report(cr, uid, 'report.invoice_web_bvr', [ref('l10n_ch_invoice')]) or 'Unable to find Webkit'

File diff suppressed because one or more lines are too long

View File

@ -131,7 +131,6 @@ class wizard_user(osv.osv_memory):
return id return id
def action_apply(self, cr, uid, ids, context=None): def action_apply(self, cr, uid, ids, context=None):
res_users = self.pool.get('res.users')
for wizard_user in self.browse(cr, SUPERUSER_ID, ids, context): for wizard_user in self.browse(cr, SUPERUSER_ID, ids, context):
portal = wizard_user.wizard_id.portal_id portal = wizard_user.wizard_id.portal_id
user = self._retrieve_user(cr, SUPERUSER_ID, wizard_user, context) user = self._retrieve_user(cr, SUPERUSER_ID, wizard_user, context)

View File

@ -74,7 +74,7 @@
<br/> <br/>
<br/> <br/>
<div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;"> <div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;">
<h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #FFF;"> <h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #DDD;">
<strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3> <strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3>
</div> </div>
<div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;"> <div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;">
@ -174,7 +174,7 @@
<br/> <br/>
<br/> <br/>
<div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;"> <div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;">
<h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #FFF;"> <h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #DDD;">
<strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3> <strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3>
</div> </div>
<div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;"> <div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;">

View File

@ -356,6 +356,7 @@ class project(osv.osv):
context['active_test'] = False context['active_test'] = False
default['state'] = 'open' default['state'] = 'open'
default['line_ids'] = []
default['tasks'] = [] default['tasks'] = []
default.pop('alias_name', None) default.pop('alias_name', None)
default.pop('alias_id', None) default.pop('alias_id', None)

View File

@ -500,7 +500,6 @@ class project_issue(base_stage, osv.osv):
custom_values['priority'] = msg.get('priority') custom_values['priority'] = msg.get('priority')
res_id = super(project_issue, self).message_new(cr, uid, msg, custom_values=custom_values, context=context) res_id = super(project_issue, self).message_new(cr, uid, msg, custom_values=custom_values, context=context)
# self.convert_to_bug(cr, uid, [res_id], context=context)
return res_id return res_id
def message_update(self, cr, uid, ids, msg, update_vals=None, context=None): def message_update(self, cr, uid, ids, msg, update_vals=None, context=None):

View File

@ -52,8 +52,8 @@ class project_issue_report(osv.osv):
'date_closed': fields.date('Date of Closing', readonly=True), 'date_closed': fields.date('Date of Closing', readonly=True),
'stage_id': fields.many2one('project.task.type', 'Stage'), 'stage_id': fields.many2one('project.task.type', 'Stage'),
'nbr': fields.integer('# of Issues', readonly=True), 'nbr': fields.integer('# of Issues', readonly=True),
'working_hours_open': fields.float('Avg. Working Hours to Open', readonly=True), 'working_hours_open': fields.float('Avg. Working Hours to Open', readonly=True, group_operator="avg"),
'working_hours_close': fields.float('Avg. Working Hours to Close', readonly=True), 'working_hours_close': fields.float('Avg. Working Hours to Close', readonly=True, group_operator="avg"),
'delay_open': fields.float('Avg. Delay to Open', digits=(16,2), readonly=True, group_operator="avg", 'delay_open': fields.float('Avg. Delay to Open', digits=(16,2), readonly=True, group_operator="avg",
help="Number of Days to open the project issue."), help="Number of Days to open the project issue."),
'delay_close': fields.float('Avg. Delay to Close', digits=(16,2), readonly=True, group_operator="avg", 'delay_close': fields.float('Avg. Delay to Close', digits=(16,2), readonly=True, group_operator="avg",

View File

@ -26,8 +26,9 @@
<field name="auto_delete" eval="True"/> <field name="auto_delete" eval="True"/>
<field name="report_template" ref="report_purchase_quotation"/> <field name="report_template" ref="report_purchase_quotation"/>
<field name="report_name">RFQ_${(object.name or '').replace('/','_')}</field> <field name="report_name">RFQ_${(object.name or '').replace('/','_')}</field>
<field name="lang">${object.partner_id.lang}</field>
<field name="body_html"><![CDATA[ <field name="body_html"><![CDATA[
<div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); "> <div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},</p> <p>Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},</p>
@ -55,7 +56,7 @@
<br/> <br/>
<br/> <br/>
<div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;"> <div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;">
<h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #FFF;"> <h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #DDD;">
<strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3> <strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3>
</div> </div>
<div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;"> <div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;">

View File

@ -156,7 +156,7 @@
<field name="res_model">purchase.requisition</field> <field name="res_model">purchase.requisition</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
<field name="context">{"search_default_create_uid":uid}</field> <field name="context">{"search_default_user_id":uid}</field>
<field name="search_view_id" ref="view_purchase_requisition_filter"/> <field name="search_view_id" ref="view_purchase_requisition_filter"/>
<field name="help" type="html"> <field name="help" type="html">
<p class="oe_view_nocontent_create"> <p class="oe_view_nocontent_create">

View File

@ -50,12 +50,9 @@ class ResCompany(osv.osv):
'html_id', 'html_id',
'Available html', 'Available html',
), ),
'lib_path' : fields.char('Webkit Executable Path', size=264, 'lib_path' : fields.char('Webkit Executable Path (Deprecated)', size=264,
help="Full path to the wkhtmltopdf executable file. " help="This option is now deprecated in favor of autodetection of webkit location",
"Version 0.9.9 is required. Install a static version " invisible=1),
"of the library if you experience missing header/footers "
"on Linux."),
} }
ResCompany() ResCompany()

View File

@ -7,7 +7,6 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<notebook position="inside"> <notebook position="inside">
<page string="Webkit"> <page string="Webkit">
<field name="lib_path" colspan="4"/>
<separator string="Images" colspan="4"/> <separator string="Images" colspan="4"/>
<field name="header_image" colspan="4" nolabel="1"/> <field name="header_image" colspan="4" nolabel="1"/>
<separator string="Headers" colspan="4"/> <separator string="Headers" colspan="4"/>

View File

@ -28,8 +28,9 @@
<field name="auto_delete" eval="True"/> <field name="auto_delete" eval="True"/>
<field name="report_template" ref="report_sale_order"/> <field name="report_template" ref="report_sale_order"/>
<field name="report_name">${(object.name or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''}</field> <field name="report_name">${(object.name or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''}</field>
<field name="lang">${object.partner_id.lang}</field>
<field name="body_html"><![CDATA[ <field name="body_html"><![CDATA[
<div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); "> <div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},</p> <p>Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},</p>
@ -76,7 +77,7 @@
<br/> <br/>
<br/> <br/>
<div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;"> <div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;">
<h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #FFF;"> <h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #DDD;">
<strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3> <strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3>
</div> </div>
<div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;"> <div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;">

View File

@ -224,6 +224,8 @@ class share_wizard(osv.TransientModel):
for the password field, so they can receive it by email. for the password field, so they can receive it by email.
Returns the ids of the created users, and the ids of the Returns the ids of the created users, and the ids of the
ignored, existing ones.""" ignored, existing ones."""
if context is None:
context = {}
user_obj = self.pool.get('res.users') user_obj = self.pool.get('res.users')
current_user = user_obj.browse(cr, UID_ROOT, uid, context=context) current_user = user_obj.browse(cr, UID_ROOT, uid, context=context)
# modify context to disable shortcuts when creating share users # modify context to disable shortcuts when creating share users
@ -257,7 +259,8 @@ class share_wizard(osv.TransientModel):
'email': new_user, 'email': new_user,
'groups_id': [(6,0,[group_id])], 'groups_id': [(6,0,[group_id])],
'share': True, 'share': True,
'company_id': current_user.company_id.id 'company_id': current_user.company_id.id,
'company_ids': [(6, 0, [current_user.company_id.id])],
}, context) }, context)
new_line = { 'user_id': user_id, new_line = { 'user_id': user_id,
'password': new_pass, 'password': new_pass,
@ -274,7 +277,8 @@ class share_wizard(osv.TransientModel):
'name': new_login, 'name': new_login,
'groups_id': [(6,0,[group_id])], 'groups_id': [(6,0,[group_id])],
'share': True, 'share': True,
'company_id': current_user.company_id.id 'company_id': current_user.company_id.id,
'company_ids': [(6, 0, [current_user.company_id.id])],
}, context) }, context)
new_line = { 'user_id': user_id, new_line = { 'user_id': user_id,
'password': new_pass, 'password': new_pass,

View File

@ -1144,6 +1144,9 @@ class stock_picking(osv.osv):
for move_line in picking.move_lines: for move_line in picking.move_lines:
if move_line.state == 'cancel': if move_line.state == 'cancel':
continue continue
if move_line.scrapped:
# do no invoice scrapped products
continue
vals = self._prepare_invoice_line(cr, uid, group, picking, move_line, vals = self._prepare_invoice_line(cr, uid, group, picking, move_line,
invoice_id, invoice_vals, context=context) invoice_id, invoice_vals, context=context)
if vals: if vals:
@ -2873,7 +2876,7 @@ class stock_inventory(osv.osv):
move_ids = [] move_ids = []
for line in inv.inventory_line_id: for line in inv.inventory_line_id:
pid = line.product_id.id pid = line.product_id.id
product_context.update(uom=line.product_uom.id, date=inv.date, prodlot_id=line.prod_lot_id.id) product_context.update(uom=line.product_uom.id, to_date=inv.date, date=inv.date, prodlot_id=line.prod_lot_id.id)
amount = location_obj._product_get(cr, uid, line.location_id.id, [pid], product_context)[pid] amount = location_obj._product_get(cr, uid, line.location_id.id, [pid], product_context)[pid]
change = line.product_qty - amount change = line.product_qty - amount
lot_id = line.prod_lot_id.id lot_id = line.prod_lot_id.id

View File

@ -804,7 +804,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Internal Picking List"> <search string="Internal Picking List">
<field name="name" string="Internal Picking List" filter_domain="['|',('name','ilike', self),('origin','ilike',self)]"/> <field name="name" string="Internal Picking List" filter_domain="['|',('name','ilike', self),('origin','ilike',self)]"/>
<filter icon="terp-check" string="Ready" domain="[('state','=','assigned')]" help="Assigned Internal Moves"/> <filter icon="terp-check" name="available" string="Ready" domain="[('state','=','assigned')]" help="Assigned Internal Moves"/>
<filter icon="terp-camera_test" name="confirmed" string="Waiting" domain="[('state','=','confirmed')]" help="Confirmed Internal Moves"/> <filter icon="terp-camera_test" name="confirmed" string="Waiting" domain="[('state','=','confirmed')]" help="Confirmed Internal Moves"/>
<filter icon="terp-dialog-close" name="done" string="Done" domain="[('state','=','done')]" help="Pickings already processed"/> <filter icon="terp-dialog-close" name="done" string="Done" domain="[('state','=','done')]" help="Pickings already processed"/>
<field name="partner_id"/> <field name="partner_id"/>

View File

@ -136,15 +136,15 @@ class stock_partial_picking(osv.osv_memory):
# Currently, the cost on the product form is supposed to be expressed in the currency # 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, # of the company owning the product. If not set, we fall back to the picking's company,
# which should work in simple cases. # which should work in simple cases.
product_currency_id = move.product_id.company_id.currency_id and move.product_id.company_id.currency_id.id
picking_currency_id = move.picking_id.company_id.currency_id and move.picking_id.company_id.currency_id.id
return {'cost': move.product_id.standard_price, return {'cost': move.product_id.standard_price,
'currency': move.product_id.company_id.currency_id.id \ 'currency': product_currency_id or picking_currency_id or False}
or move.picking_id.company_id.currency_id.id \
or False}
def _partial_move_for(self, cr, uid, move): def _partial_move_for(self, cr, uid, move):
partial_move = { partial_move = {
'product_id' : move.product_id.id, 'product_id' : move.product_id.id,
'quantity' : move.state in ('assigned','draft','confirmed') and move.product_qty or 0, 'quantity' : move.product_qty if move.state in ('assigned','draft','confirmed') else 0,
'product_uom' : move.product_uom.id, 'product_uom' : move.product_uom.id,
'prodlot_id' : move.prodlot_id.id, 'prodlot_id' : move.prodlot_id.id,
'move_id' : move.id, 'move_id' : move.id,