[Merge] Merge with main addons.

bzr revid: mdi@tinyerp.com-20120911040749-jze56wu4p911hcob
bzr revid: mdi@tinyerp.com-20120912044312-c7pqd1gfwv74kcw6
This commit is contained in:
Divyesh Makwana (Open ERP) 2012-09-12 10:13:12 +05:30
commit 16c666c971
117 changed files with 7741 additions and 517 deletions

View File

@ -1398,7 +1398,7 @@ class account_move(osv.osv):
if not l[0]:
l[2].update({
'reconcile_id':False,
'reconcil_partial_id':False,
'reconcile_partial_id':False,
'analytic_lines':False,
'invoice':False,
'ref':False,
@ -2516,22 +2516,25 @@ class account_account_template(osv.osv):
'nocreate': False,
}
def _check_type(self, cr, uid, ids, context=None):
if context is None:
context = {}
accounts = self.browse(cr, uid, ids, context=context)
for account in accounts:
if account.parent_id and account.parent_id.type != 'view':
return False
return True
_check_recursion = check_cycle
_constraints = [
(_check_recursion, 'Error!\nYou cannot create recursive account templates.', ['parent_id']),
(_check_type, 'Configuration Error!\nYou cannot define children to an account that has internal type other than "View".', ['type']),
]
def create(self, cr, uid, vals, context=None):
if 'parent_id' in vals:
parent = self.read(cr, uid, [vals['parent_id']], ['type'])
if parent and parent[0]['type'] != 'view':
raise osv.except_osv(_('Warning!'), _("You may only select a parent account of type 'View'."))
return super(account_account_template, self).create(cr, uid, vals, context=context)
def write(self, cr, uid, ids, vals, context=None):
if 'parent_id' in vals:
parent = self.read(cr, uid, [vals['parent_id']], ['type'])
if parent and parent[0]['type'] != 'view':
raise osv.except_osv(_('Warning!'), _("You may only select a parent account of type 'View'."))
return super(account_account_template, self).write(cr, uid, ids, vals, context=context)
def name_get(self, cr, uid, ids, context=None):
if not ids:
return []

View File

@ -15,7 +15,7 @@
<group name="accounting" col="2" colspan="2" attrs="{'invisible': [('company_id','=', False)]}">
<separator string="Accounting Information" colspan="2"/>
<field name="journal_id"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</group>
</group>
</field>
@ -28,7 +28,7 @@
<field name="inherit_id" ref="base.view_partner_bank_tree"/>
<field name="arch" type="xml">
<field name="acc_number" position="after">
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</field>
</field>
</record>

View File

@ -214,7 +214,7 @@ class account_invoice(osv.osv):
\n* The \'Cancelled\' state is used when user cancel invoice.'),
'sent': fields.boolean('Sent', readonly=True, help="It indicates that the invoice has been sent."),
'date_invoice': fields.date('Invoice Date', readonly=True, states={'draft':[('readonly',False)]}, select=True, help="Keep empty to use the current date"),
'date_due': fields.date('Due Date', states={'paid':[('readonly',True)], 'open':[('readonly',True)], 'close':[('readonly',True)]}, select=True,
'date_due': fields.date('Due Date', readonly=True, states={'draft':[('readonly',False)]}, select=True,
help="If you use payment terms, the due date will be computed automatically at the generation "\
"of accounting entries. If you keep the payment term and the due date empty, it means direct payment. The payment term may compute several due dates, for example 50% now, 50% in one month."),
'partner_id': fields.many2one('res.partner', 'Partner', change_default=True, readonly=True, required=True, states={'draft':[('readonly',False)]}),
@ -253,7 +253,7 @@ class account_invoice(osv.osv):
'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}),
'journal_id': fields.many2one('account.journal', 'Journal', required=True, readonly=True, states={'draft':[('readonly',False)]}),
'company_id': fields.many2one('res.company', 'Company', required=True, change_default=True, readonly=True, states={'draft':[('readonly',False)]}),
'check_total': fields.float('Verification Total', digits_compute=dp.get_precision('Account'), states={'open':[('readonly',True)],'close':[('readonly',True)]}),
'check_total': fields.float('Verification Total', digits_compute=dp.get_precision('Account'), readonly=True, states={'draft':[('readonly',False)]}),
'reconciled': fields.function(_reconciled, string='Paid/Reconciled', type='boolean',
store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 50), # Check if we can remove ?
@ -767,17 +767,20 @@ class account_invoice(osv.osv):
if not key in tax_key:
raise osv.except_osv(_('Warning!'), _('Taxes are missing!\nClick on compute button.'))
def compute_invoice_totals(self, cr, uid, inv, company_currency, ref, invoice_move_lines):
def compute_invoice_totals(self, cr, uid, inv, company_currency, ref, invoice_move_lines, context=None):
if context is None:
context={}
total = 0
total_currency = 0
cur_obj = self.pool.get('res.currency')
for i in invoice_move_lines:
if inv.currency_id.id != company_currency:
context.update({'date': inv.date_invoice or time.strftime('%Y-%m-%d')})
i['currency_id'] = inv.currency_id.id
i['amount_currency'] = i['price']
i['price'] = cur_obj.compute(cr, uid, inv.currency_id.id,
company_currency, i['price'],
context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')})
context=context)
else:
i['amount_currency'] = False
i['currency_id'] = False
@ -887,7 +890,7 @@ class account_invoice(osv.osv):
# create one move line for the total and possibly adjust the other lines amount
total = 0
total_currency = 0
total, total_currency, iml = self.compute_invoice_totals(cr, uid, inv, company_currency, ref, iml)
total, total_currency, iml = self.compute_invoice_totals(cr, uid, inv, company_currency, ref, iml, context=ctx)
acc_id = inv.account_id.id
name = inv['name'] or '/'

View File

@ -127,7 +127,7 @@
<field name="user_id"/>
<field name="date_due"/>
<field name="origin"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="residual" sum="Residual Amount"/>
<field name="amount_untaxed" sum="Untaxed Amount"/>
<field name="amount_total" sum="Total Amount"/>
@ -184,7 +184,7 @@
name="account_id" groups="account.group_account_user"/>
<field name="journal_id" groups="account.group_account_user"
on_change="onchange_journal_id(journal_id, context)" widget="selection"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</group>
</group>
<notebook>
@ -271,7 +271,7 @@
<field name="debit"/>
<field name="credit"/>
<field name="amount_currency"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</tree>
</field>
</page>
@ -332,8 +332,8 @@
<field domain="[('company_id', '=', company_id),('type','=', 'receivable')]"
name="account_id" groups="account.group_account_user"/>
<label for="currency_id"/>
<div>
<label for="currency_id" groups="base.group_multi_currency"/>
<div groups="base.group_multi_currency">
<field name="currency_id" class="oe_inline"/>
<!-- note fp: I don't think we need this feature ?
<button name="%(action_account_change_currency)d" type="action"
@ -429,8 +429,8 @@
<field name="journal_id" groups="base.group_user"/>
<field name="debit"/>
<field name="credit"/>
<field name="amount_currency"/>
<field name="currency_id"/>
<field name="amount_currency" groups="base.group_multi_currency"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</tree>
</field>
</page>

View File

@ -44,7 +44,7 @@
<menuitem id="menu_finance_periodical_processing_billing" name="Billing" parent="menu_finance_periodical_processing" sequence="35"/>
<menuitem id="next_id_22" name="Partners" parent="menu_finance_generic_reporting" sequence="1"/>
<menuitem id="menu_multi_currency" name="Multi-Currencies" parent="menu_finance_generic_reporting" sequence="10"/>
<menuitem id="menu_multi_currency" name="Multi-Currencies" parent="menu_finance_generic_reporting" sequence="10" groups="base.group_multi_currency"/>
<menuitem
parent="account.menu_finance_legal_statement"
id="final_accounting_reports"

View File

@ -204,7 +204,7 @@
attrs="{'invisible':[('type','!=','consolidation')]}"
widget="many2many_tags"/>
</group>
<group>
<group groups="base.group_multi_currency">
<field name="currency_id"/>
<field name="currency_mode" attrs="{'readonly': [('currency_id','=',False)]}"/>
</group>
@ -489,7 +489,7 @@
<group>
<field name="default_debit_account_id" attrs="{'required':[('type','in', ('cash', 'bank'))]}" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
<field name="default_credit_account_id" attrs="{'required':[('type','in',('cash', 'bank'))]}" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
<field name="currency"/>
<field name="currency" groups="base.group_multi_currency"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
@ -1068,7 +1068,7 @@
<field name="account_tax_id"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('parent_id','!=',False)]"/>
<field name="amount_currency" attrs="{'readonly':[('state','=','valid')]}"/>
<field name="currency_id" attrs="{'readonly':[('state','=','valid')]}"/>
<field name="currency_id" attrs="{'readonly':[('state','=','valid')]}" groups="base.group_multi_currency"/>
<field name="reconcile_partial_id"/>
<field name="reconcile_id"/>
<field name="state"/>
@ -1119,7 +1119,7 @@
<field name="tax_amount"/>
<field name="account_tax_id" domain="[('parent_id','=',False)]"/>
</group>
<group attrs="{'readonly':[('state','=','valid')]}" string="Currency">
<group attrs="{'readonly':[('state','=','valid')]}" string="Currency" groups="base.group_multi_currency">
<field name="currency_id"/>
<field name="amount_currency"/>
</group>
@ -1167,8 +1167,8 @@
<field name="credit"/>
<separator colspan="4" string="Optional Information"/>
<field name="currency_id"/>
<field name="amount_currency"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="amount_currency" groups="base.group_multi_currency"/>
<field name="quantity"/>
<field name="move_id" required="False"/>
<newline/>
@ -1395,7 +1395,7 @@
<field name="account_tax_id" domain="[('parent_id','=',False)]"/>
</group>
<group string="Currency">
<group string="Currency" groups="base.group_multi_currency">
<field name="currency_id"/>
<field name="amount_currency"/>
</group>
@ -1433,7 +1433,7 @@
<field name="credit" sum="Total Credit"/>
<field name="analytic_account_id" domain="[('parent_id','!=',False)]" groups="analytic.group_analytic_accounting"/>
<field name="amount_currency"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="tax_code_id"/>
<field name="tax_amount"/>
<field name="state"/>
@ -2076,7 +2076,7 @@
<field name="type"/>
<field name="user_type"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="reconcile"/>
<field name="chart_template_id"/>
</group>
@ -2369,22 +2369,15 @@
<group string="res_config_contents" position="replace">
<field name="only_one_chart_template" invisible="1"/>
<field name="complete_tax_set" invisible="1"/>
<div groups="base.group_multi_company">
<label for="company_id"/>
<field name="company_id" widget="selection" on_change="onchange_company_id(company_id)"/> <!-- we assume that this wizard will be run only by administrators and as this field may cause problem if hidden (because of the default company of the user removed from the selection because already configured), we simply choosed to remove the group "multi company" of it -->
</div>
<label for="currency_id"/>
<field name="currency_id" />
<group>
<div attrs="{'invisible': [('only_one_chart_template','=',True)]}">
<label for="chart_template_id"/>
<group col="1">
<group attrs="{'invisible': [('only_one_chart_template','=',True)]}">
<field name="chart_template_id" widget="selection" on_change="onchange_chart_template_id(chart_template_id)" domain="[('visible','=', True)]"/>
</div>
<newline/>
<group groups="account.group_account_user">
<field name="code_digits"/>
</group>
<group groups="base.group_multi_company">
<field name="company_id" widget="selection" on_change="onchange_company_id(company_id)"/> <!-- we assume that this wizard will be run only by administrators and as this field may cause problem if hidden (because of the default company of the user removed from the selection because already configured), we simply choosed to remove the group "multi company" of it -->
</group>
<group>
<field name="currency_id" class="oe_inline"/>
<field name="sale_tax" attrs="{'invisible': [('complete_tax_set', '!=', True)]}" domain="[('chart_template_id', '=', chart_template_id),('parent_id','=',False),('type_tax_use','in',('sale','all'))]"/>
<label for="sale_tax_rate" string="Sale Tax" attrs="{'invisible': [('complete_tax_set', '=', True)]}"/>
<div attrs="{'invisible': [('complete_tax_set', '=', True)]}">
@ -2396,17 +2389,10 @@
<field name="purchase_tax_rate" class="oe_inline"/> %%
</div>
</group>
<group groups="account.group_account_user">
<field name="code_digits"/>
</group>
</group>
<div groups="account.group_account_user">
<label for="bank_accounts_id" string="Bank Information"/>
<field name="bank_accounts_id">
<tree editable="bottom">
<field name="acc_name"/>
<field name="account_type"/>
<field name="currency_id" widget="selection"/>
</tree>
</field>
</div>
</group>
</field>
</record>
@ -2568,7 +2554,7 @@ action = pool.get('res.config').next(cr, uid, [], context)
<field name="date" attrs="{'readonly':[('state','!=','draft')]}" on_change="onchange_date(date, company_id)"/>
<field name="closing_date" readonly="1"/>
<field name="period_id" class="oe_inline"/>
<field name="currency" invisible="1"/>
<field name="currency" invisible="1" groups="base.group_multi_currency"/>
</group>
</group>
<notebook>

View File

@ -45,7 +45,6 @@
<record id="conf_chart0" model="account.account.template">
<field name="code">0</field>
<field name="name">Configurable Account Chart</field>
<field eval="0" name="parent_id"/>
<field name="type">view</field>
<field name="user_type" ref="data_account_type_view"/>
</record>

View File

@ -19,7 +19,6 @@
<record id="chart0" model="account.account">
<field name="code">X0</field>
<field name="name">Chart For Automated Tests</field>
<field eval="0" name="parent_id"/>
<field name="type">view</field>
<field name="user_type" ref="data_account_type_view"/>
</record>

View File

@ -56,7 +56,7 @@
<field name="credit"/>
<field name="balance"/>
<field name="state" invisible="1"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
@ -137,8 +137,8 @@
</group>
<group string="Amount">
<field name="amount"/>
<label for="amount_currency"/>
<div>
<label for="amount_currency" groups="base.group_multi_currency"/>
<div groups="base.group_multi_currency">
<field name="amount_currency" class="oe_inline"/>
<field name="currency_id" class="oe_inline"/>
</div>
@ -251,8 +251,8 @@
</group>
<group string="Amount">
<field name="amount"/>
<label for="amount_currency"/>
<div>
<label for="amount_currency" groups="base.group_multi_currency"/>
<div groups="base.group_multi_currency">
<field name="amount_currency" class="oe_inline"/>
<field name="currency_id" class="oe_inline"/>
</div>

View File

@ -43,8 +43,8 @@ class account_config_settings(osv.osv_memory):
string='Default company currency', help="Main currency of the company."),
'paypal_account': fields.related('company_id', 'paypal_account', type='char', size=128,
string='Paypal account', help="Paypal account (email) for receiving online payments (credit card, etc.) If you set a paypal account, the customer will be able to pay your invoices or quotations with a button \"Pay with Paypal\" in automated emails or through the OpenERP portal."),
'company_footer': fields.related('company_id', 'rml_footer2', type='char', size=250, readonly=True,
string='Bank accounts on reports will display as followed', help="Bank accounts as printed in the footer of each customer document. This is for information purpose only, you should configure these bank accounts through the above button \"Configure Bank Accounts\"."),
'company_footer': fields.related('company_id', 'rml_footer', type='text', readonly=True,
string='Bank accounts footer preview', help="Bank accounts as printed in the footer of each printed document"),
'has_chart_of_accounts': fields.boolean('Company has a chart of accounts'),
'chart_template_id': fields.many2one('account.chart.template', 'Template', domain="[('visible','=', True)]"),
@ -114,6 +114,9 @@ class account_config_settings(osv.osv_memory):
help="This purchase tax will be assigned by default on new products."),
'decimal_precision': fields.integer('Decimal precision on journal entries',
help="""As an example, a decimal precision of 2 will allow journal entries like: 9.99 EUR, whereas a decimal precision of 4 will allow journal entries like: 0.0231 EUR."""),
'group_multi_currency': fields.boolean('allow multi currencies',
implied_group='base.group_multi_currency',
help="Allows you multi currency environment"),
}
def _default_company(self, cr, uid, context=None):
@ -157,7 +160,7 @@ class account_config_settings(osv.osv_memory):
'expects_chart_of_accounts': company.expects_chart_of_accounts,
'currency_id': company.currency_id.id,
'paypal_account': company.paypal_account,
'company_footer': company.rml_footer2,
'company_footer': company.rml_footer,
'has_chart_of_accounts': has_chart_of_accounts,
'has_fiscal_year': bool(fiscalyear_count),
'chart_template_id': False,

View File

@ -121,6 +121,10 @@
</div>
<label for="id" string="Features"/>
<div>
<div>
<field name="group_multi_currency" class="oe_inline"/>
<label for="group_multi_currency"/>
</div>
<div>
<field name="module_account_accountant" class="oe_inline"/>
<label for="module_account_accountant"/>
@ -219,12 +223,12 @@
<label for="id" string="Configuration"/>
<div>
<div>
<label for="company_footer"/>
<button name="%(action_bank_tree)d"
string="Configure your bank accounts"
icon="gtk-go-forward"
type="action"
class="oe_inline oe_link"/>
<label for="company_footer"/>
<field name="company_footer"/>
</div>
<div>

View File

@ -100,7 +100,7 @@
</group>
<group>
<field name="purchase_date"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="company_id" widget="selection" groups="base.group_multi_company" on_change="onchange_company_id(company_id)"/>
</group>
</group>
@ -192,7 +192,7 @@
<field name="partner_id"/>
<field name="purchase_value"/>
<field name="value_residual"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="state"/>
</tree>
@ -211,7 +211,7 @@
<field name="purchase_date"/>
<field name="purchase_value"/>
<field name="value_residual"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="state"/>
</tree>

View File

@ -0,0 +1,385 @@
# Brazilian Portuguese translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
"PO-Revision-Date: 2012-09-11 18:35+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-12 04:36+0000\n"
"X-Generator: Launchpad (build 15930)\n"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Search Bank Transactions"
msgstr "Procurar Transações Bancárias"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
#: selection:account.bank.statement.line,state:0
msgid "Confirmed"
msgstr "Confirmado"
#. module: account_bank_statement_extensions
#: view:account.bank.statement:0
#: view:account.bank.statement.line:0
msgid "Glob. Id"
msgstr "ID Global"
#. module: account_bank_statement_extensions
#: selection:account.bank.statement.line.global,type:0
msgid "CODA"
msgstr "CODA"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line.global,parent_id:0
msgid "Parent Code"
msgstr "Código da Conta-pai"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Debit"
msgstr "Débito"
#. module: account_bank_statement_extensions
#: view:cancel.statement.line:0
#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_cancel_statement_line
#: model:ir.model,name:account_bank_statement_extensions.model_cancel_statement_line
msgid "Cancel selected statement lines"
msgstr "Cancelar linhas de instrução selecionadas"
#. module: account_bank_statement_extensions
#: constraint:res.partner.bank:0
msgid "The RIB and/or IBAN is not valid"
msgstr "A RIB e/ ou IBAN não é válido."
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Group By..."
msgstr "Agrupar Por..."
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line,state:0
msgid "State"
msgstr "Situação"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
#: selection:account.bank.statement.line,state:0
msgid "Draft"
msgstr "Provisório"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Statement"
msgstr "Demonstrativo"
#. module: account_bank_statement_extensions
#: view:confirm.statement.line:0
#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_confirm_statement_line
#: model:ir.model,name:account_bank_statement_extensions.model_confirm_statement_line
msgid "Confirm selected statement lines"
msgstr "Confirme as linhas do demonstrativo selecionadas"
#. module: account_bank_statement_extensions
#: report:bank.statement.balance.report:0
#: model:ir.actions.report.xml,name:account_bank_statement_extensions.bank_statement_balance_report
msgid "Bank Statement Balances Report"
msgstr "Relatório de Balanço Bancário"
#. module: account_bank_statement_extensions
#: view:cancel.statement.line:0
msgid "Cancel Lines"
msgstr "Cancelar Linhas"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line.global:0
#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line_global
msgid "Batch Payment Info"
msgstr "Informações de Pagamento em Lote"
#. module: account_bank_statement_extensions
#: view:confirm.statement.line:0
msgid "Confirm Lines"
msgstr "Confirmar Linhas"
#. module: account_bank_statement_extensions
#: code:addons/account_bank_statement_extensions/account_bank_statement.py:130
#, python-format
msgid ""
"Delete operation not allowed ! Please go to the associated bank "
"statement in order to delete and/or modify this bank statement line"
msgstr ""
"Não é permitido excluir! Vá a linha do demonstrativo bancário associada para "
"excluir ou modificar esta linha do demonstrativo"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line.global,type:0
msgid "Type"
msgstr "Tipo"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
#: field:account.bank.statement.line,journal_id:0
#: report:bank.statement.balance.report:0
msgid "Journal"
msgstr "Diário"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Confirmed Statement Lines."
msgstr "Linhas do Demonstrativo Confirmadas."
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Credit Transactions."
msgstr "Transações de Crédito"
#. module: account_bank_statement_extensions
#: model:ir.actions.act_window,help:account_bank_statement_extensions.action_cancel_statement_line
msgid "cancel selected statement lines."
msgstr "cancelar linhas do demonstrativo selecionadas."
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line,counterparty_number:0
msgid "Counterparty Number"
msgstr "Número da Contrapartida"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line.global:0
msgid "Transactions"
msgstr "Transações"
#. module: account_bank_statement_extensions
#: code:addons/account_bank_statement_extensions/account_bank_statement.py:130
#, python-format
msgid "Warning"
msgstr "Aviso"
#. module: account_bank_statement_extensions
#: report:bank.statement.balance.report:0
msgid "Closing Balance"
msgstr "Saldo final"
#. module: account_bank_statement_extensions
#: report:bank.statement.balance.report:0
msgid "Date"
msgstr "Data"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
#: field:account.bank.statement.line,globalisation_amount:0
msgid "Glob. Amount"
msgstr "Valor Global"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Debit Transactions."
msgstr "Transações de Débito."
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Extended Filters..."
msgstr "Filtros Extendidos..."
#. module: account_bank_statement_extensions
#: view:confirm.statement.line:0
msgid "Confirmed lines cannot be changed anymore."
msgstr "Linhas confirmadas não podem ser alteradas."
#. module: account_bank_statement_extensions
#: constraint:res.partner.bank:0
msgid ""
"\n"
"Please define BIC/Swift code on bank for bank type IBAN Account to make "
"valid payments"
msgstr ""
"\n"
"Por favor defina o BIC/Swift code no Banco para o tipo de conta IBAN para "
"fazer pagamentos válidos"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line,val_date:0
msgid "Valuta Date"
msgstr ""
#. module: account_bank_statement_extensions
#: model:ir.actions.act_window,help:account_bank_statement_extensions.action_confirm_statement_line
msgid "Confirm selected statement lines."
msgstr "Confirmar as linhas do demonstrativo."
#. module: account_bank_statement_extensions
#: view:cancel.statement.line:0
msgid "Are you sure you want to cancel the selected Bank Statement lines ?"
msgstr ""
"Você tem certeza de que deseja cancelar as Linhas de Demonstrativo Bancário "
"selecionadas?"
#. module: account_bank_statement_extensions
#: report:bank.statement.balance.report:0
msgid "Name"
msgstr "Nome"
#. module: account_bank_statement_extensions
#: selection:account.bank.statement.line.global,type:0
msgid "ISO 20022"
msgstr "ISO 20022"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Notes"
msgstr "Notas"
#. module: account_bank_statement_extensions
#: selection:account.bank.statement.line.global,type:0
msgid "Manual"
msgstr "Manual"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Credit"
msgstr "Crédito"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line.global,amount:0
msgid "Amount"
msgstr "Valor"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Fin.Account"
msgstr "Fin.Account"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line,counterparty_currency:0
msgid "Counterparty Currency"
msgstr "Moeda da Contrapartida"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line,counterparty_bic:0
msgid "Counterparty BIC"
msgstr "BIC da Contrapartida"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line.global,child_ids:0
msgid "Child Codes"
msgstr "Códigos derivados (sub-contas)"
#. module: account_bank_statement_extensions
#: view:confirm.statement.line:0
msgid "Are you sure you want to confirm the selected Bank Statement lines ?"
msgstr ""
"Você deseja confirmar as Linhas do Demonstrativo Bancário selecionadas?"
#. module: account_bank_statement_extensions
#: constraint:account.bank.statement.line:0
msgid ""
"The amount of the voucher must be the same amount as the one on the "
"statement line"
msgstr ""
"O valor do recibo deve ser o mesmo valor da linha equivalente no extrato"
#. module: account_bank_statement_extensions
#: help:account.bank.statement.line,globalisation_id:0
msgid ""
"Code to identify transactions belonging to the same globalisation level "
"within a batch payment"
msgstr ""
"Código para identificar transações que pertencem ao nível de globalização "
"dentro de um mesmo lote de pagamento"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Draft Statement Lines."
msgstr "Linhas de Demonstrativo Provisórias."
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Glob. Am."
msgstr ""
#. module: account_bank_statement_extensions
#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement_line
msgid "Bank Statement Line"
msgstr "Linha do Demonstrativo Bancário"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line.global,code:0
msgid "Code"
msgstr "Código"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line,counterparty_name:0
msgid "Counterparty Name"
msgstr "Nome da Contrapartida"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line.global,name:0
msgid "Communication"
msgstr "Comunicação"
#. module: account_bank_statement_extensions
#: model:ir.model,name:account_bank_statement_extensions.model_res_partner_bank
msgid "Bank Accounts"
msgstr "Contas Bancárias"
#. module: account_bank_statement_extensions
#: constraint:account.bank.statement:0
msgid "The journal and period chosen have to belong to the same company."
msgstr "O diário e o período escolhido tem que pertencer à mesma empresa."
#. module: account_bank_statement_extensions
#: model:ir.model,name:account_bank_statement_extensions.model_account_bank_statement
msgid "Bank Statement"
msgstr "Extrato Bancário"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Statement Line"
msgstr "Linha do Demonstrativo"
#. module: account_bank_statement_extensions
#: sql_constraint:account.bank.statement.line.global:0
msgid "The code must be unique !"
msgstr "O código precisa ser único!"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line.global,bank_statement_line_ids:0
#: model:ir.actions.act_window,name:account_bank_statement_extensions.action_bank_statement_line
#: model:ir.ui.menu,name:account_bank_statement_extensions.bank_statement_line
msgid "Bank Statement Lines"
msgstr "Linhas do Demonstrativo Bancário"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line.global:0
msgid "Child Batch Payments"
msgstr "Lote de Pagamentos Filho"
#. module: account_bank_statement_extensions
#: view:cancel.statement.line:0
#: view:confirm.statement.line:0
msgid "Cancel"
msgstr "Cancelar"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Statement Lines"
msgstr "Linhas do Demonstrativo"
#. module: account_bank_statement_extensions
#: view:account.bank.statement.line:0
msgid "Total Amount"
msgstr "Valor Total"
#. module: account_bank_statement_extensions
#: field:account.bank.statement.line,globalisation_id:0
msgid "Globalisation ID"
msgstr "ID Globalização"

View File

@ -0,0 +1,207 @@
# Spanish (Ecuador) translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
"PO-Revision-Date: 2012-09-12 01:39+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-12 04:36+0000\n"
"X-Generator: Launchpad (build 15930)\n"
#. module: account_check_writing
#: selection:res.company,check_layout:0
msgid "Check on Top"
msgstr "Cheque on Top"
#. module: account_check_writing
#: model:ir.actions.act_window,help:account_check_writing.action_write_check
msgid ""
"The check payment form allows you to track the payment you do to your "
"suppliers specially by check. When you select a supplier, the payment method "
"and an amount for the payment, OpenERP will propose to reconcile your "
"payment with the open supplier invoices or bills.You can print the check"
msgstr ""
"El pago de cheques permite rastrear el pago a sus proveedores. Cuando "
"selecciona un proveedor, el método de pago y monto, OpenERP propondrá "
"conciliarlo con tu factura, y podrá imprimir el cheque."
#. module: account_check_writing
#: view:account.voucher:0
#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_bottom
#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_middle
#: model:ir.actions.report.xml,name:account_check_writing.account_print_check_top
msgid "Print Check"
msgstr "Imprimir Cheque"
#. module: account_check_writing
#: selection:res.company,check_layout:0
msgid "Check in middle"
msgstr "Cheque in middle"
#. module: account_check_writing
#: help:res.company,check_layout:0
msgid ""
"Check on top is compatible with Quicken, QuickBooks and Microsoft Money. "
"Check in middle is compatible with Peachtree, ACCPAC and DacEasy. Check on "
"bottom is compatible with Peachtree, ACCPAC and DacEasy only"
msgstr ""
#. module: account_check_writing
#: selection:res.company,check_layout:0
msgid "Check on bottom"
msgstr "Cheque on bottom"
#. module: account_check_writing
#: constraint:res.company:0
msgid "Error! You can not create recursive companies."
msgstr "Error! No puede crear compañías recursivas."
#. module: account_check_writing
#: help:account.journal,allow_check_writing:0
msgid "Check this if the journal is to be used for writing checks."
msgstr "Activar si este diario es usado para emitir cheques"
#. module: account_check_writing
#: field:account.journal,allow_check_writing:0
msgid "Allow Check writing"
msgstr "Permitir emisión de cheques"
#. module: account_check_writing
#: report:account.print.check.bottom:0
#: report:account.print.check.middle:0
#: report:account.print.check.top:0
msgid "Description"
msgstr "Descripción"
#. module: account_check_writing
#: model:ir.model,name:account_check_writing.model_account_journal
msgid "Journal"
msgstr "Diario"
#. module: account_check_writing
#: model:ir.actions.act_window,name:account_check_writing.action_write_check
#: model:ir.ui.menu,name:account_check_writing.menu_action_write_check
msgid "Write Checks"
msgstr "Escribir Cheque"
#. module: account_check_writing
#: report:account.print.check.bottom:0
#: report:account.print.check.middle:0
#: report:account.print.check.top:0
msgid "Discount"
msgstr "Descuento"
#. module: account_check_writing
#: report:account.print.check.bottom:0
#: report:account.print.check.middle:0
#: report:account.print.check.top:0
msgid "Original Amount"
msgstr "Monto Inicial"
#. module: account_check_writing
#: view:res.company:0
msgid "Configuration"
msgstr "Configuración"
#. module: account_check_writing
#: field:account.voucher,allow_check:0
msgid "Allow Check Writing"
msgstr "Permitir Emisión de Cheques"
#. module: account_check_writing
#: report:account.print.check.bottom:0
#: report:account.print.check.middle:0
#: report:account.print.check.top:0
msgid "Payment"
msgstr "Pagos"
#. module: account_check_writing
#: field:account.journal,use_preprint_check:0
msgid "Use Preprinted Check"
msgstr "Usar cheque preimpreso"
#. module: account_check_writing
#: sql_constraint:res.company:0
msgid "The company name must be unique !"
msgstr "¡El nombre de la compañía debe ser único!"
#. module: account_check_writing
#: report:account.print.check.bottom:0
#: report:account.print.check.middle:0
#: report:account.print.check.top:0
msgid "Due Date"
msgstr "Fecha de vencimiento"
#. module: account_check_writing
#: model:ir.model,name:account_check_writing.model_res_company
msgid "Companies"
msgstr "Compañias"
#. module: account_check_writing
#: view:res.company:0
msgid "Default Check Layout"
msgstr ""
#. module: account_check_writing
#: constraint:account.journal:0
msgid ""
"Configuration error! The currency chosen should be shared by the default "
"accounts too."
msgstr ""
"Error de Configuración! La moneda seleccionada debe ser compartida por las "
"cuentas por defecto tambíen"
#. module: account_check_writing
#: report:account.print.check.bottom:0
#: report:account.print.check.middle:0
msgid "Balance Due"
msgstr "Saldo Deudor"
#. module: account_check_writing
#: report:account.print.check.bottom:0
#: report:account.print.check.middle:0
#: report:account.print.check.top:0
msgid "Check Amount"
msgstr "Monto Cheque"
#. module: account_check_writing
#: model:ir.model,name:account_check_writing.model_account_voucher
msgid "Accounting Voucher"
msgstr "Comprobantes de Pago"
#. module: account_check_writing
#: sql_constraint:account.journal:0
msgid "The name of the journal must be unique per company !"
msgstr "El nombre del diaro debe ser único por compañía !"
#. module: account_check_writing
#: sql_constraint:account.journal:0
msgid "The code of the journal must be unique per company !"
msgstr "El código del diario debe ser único por compañía !"
#. module: account_check_writing
#: field:account.voucher,amount_in_word:0
msgid "Amount in Word"
msgstr "Monto en Letras"
#. module: account_check_writing
#: report:account.print.check.top:0
msgid "Open Balance"
msgstr "Saldo Inicial"
#. module: account_check_writing
#: field:res.company,check_layout:0
msgid "Choose Check layout"
msgstr "Elegir diseño de cheque"
#~ msgid "Default Check layout"
#~ msgstr "Diseño de cheque por defecto"

View File

@ -16,11 +16,11 @@
<filter string="Info" domain="[('state','=','info')]" icon="terp-folder-yellow"/>
<field name="bank_id"/>
<field name="journal"/>
<field name="currency"/>
<field name="currency" groups="base.group_multi_currency"/>
<field name="company_id" groups="base.group_multi_company"/>
<group expand="0" string="Group By...">
<filter string="Bank Account" icon="terp-folder-yellow" domain="[]" context="{'group_by':'bank_id'}"/>
<filter string="Currency" icon="terp-dolar" domain="[]" context="{'group_by':'currency'}"/>
<filter string="Currency" icon="terp-dolar" domain="[]" context="{'group_by':'currency'}" groups="base.group_multi_currency"/>
</group>
</search>
</field>
@ -32,7 +32,7 @@
<tree string="CODA Bank Account Configuration">
<field name="name"/>
<field name="bank_id"/>
<field name="currency"/>
<field name="currency" groups="base.group_multi_currency"/>
<field name="description1"/>
<field name="journal"/>
<field name="state"/>
@ -48,7 +48,7 @@
<field name="name" colspan="4"/>
<field name="bank_id" domain="[('partner_id.ref_companies', 'in', [company_id])]"/>
<field name="description1"/>
<field name="currency"/>
<field name="currency" groups="base.group_multi_currency"/>
<field name="description2"/>
<field name="coda_st_naming"/>
<field name="state" on_change="onchange_state(state)"/>
@ -305,7 +305,7 @@
<field name="name"/>
<field name="date"/>
<field name="coda_bank_account_id"/>
<field name="currency"/>
<field name="currency" groups="base.group_multi_currency"/>
<field name="period_id"/>
<field name="type"/>
<newline/>

View File

@ -30,8 +30,8 @@
<field name="debit" sum="Total debit"/>
<field name="credit" sum="Total credit"/>
<field name="amount_to_pay"/>
<field name="amount_currency"/>
<field name="currency_id"/>
<field name="amount_currency" groups="base.group_multi_currency"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="period_id" invisible="1"/>
</tree>
</field>
@ -131,8 +131,8 @@
<field name="move_line_id" on_change="onchange_move_line(move_line_id,parent.mode,parent.date_prefered,parent.date_scheduled,currency,company_currency)" domain="[('reconcile_id','=', False), ('credit', '>',0),('amount_to_pay','>',0)] "/>
<separator colspan="4" string="Transaction Information"/>
<field name="date"/>
<label for="amount_currency"/>
<div>
<label for="amount_currency" groups="base.group_multi_currency"/>
<div groups="base.group_multi_currency">
<field name="amount_currency" on_change="onchange_amount(amount_currency,currency,company_currency)" class="oe_inline"/>
<field name="currency" nolabel="1" class="oe_inline"/>
</div>
@ -151,8 +151,8 @@
</page>
<page string="Information">
<group col="4" string="General Information">
<label for="amount"/>
<div>
<label for="amount" groups="base.group_multi_currency"/>
<div groups="base.group_multi_currency">
<field name="amount" class="oe_inline"/>
<field name="company_currency" class="oe_inline"/>
</div>
@ -171,8 +171,8 @@
<field name="bank_id" domain="[('partner_id', '=', partner_id)]"/>
<field name="ml_maturity_date"/>
<field name="date"/>
<field name="amount_currency" string="Amount"/>
<field name="currency"/>
<field name="amount_currency" string="Amount" groups="base.group_multi_currency"/>
<field name="currency" groups="base.group_multi_currency"/>
<field name="name"/>
<field name="amount" sum="Total in Company Currency" invisible="1"/>
</tree>
@ -257,8 +257,8 @@
<field name="move_line_id" on_change="onchange_move_line(move_line_id, False, currency, company_currency)" domain="[('reconcile_id','=', False), ('credit', '>',0),('amount_to_pay','>',0)]"/>
<separator colspan="4" string="Transaction Information"/>
<field name="date"/>
<label for="amount_currency"/>
<div>
<label for="amount_currency" groups="base.group_multi_currency"/>
<div groups="base.group_multi_currency">
<field name="amount_currency" on_change="onchange_amount(amount_currency,currency,company_currency)" class="oe_inline"/>
<field name="currency" class="oe_inline"/>
</div>
@ -277,8 +277,11 @@
</page>
<page string="Information">
<group col="4" string="General Information">
<field name="amount"/>
<field name="company_currency" nolabel="1"/>
<label for="amoun"/>
<div>
<field name="amount" class="oe_inline"/>
<field name="company_currency" class="oe_inline"/>
</div>
</group>
<group col="4" string="Entry Information">
<field name="create_date"/>
@ -302,8 +305,8 @@
<field name="partner_id"/>
<field name="communication"/>
<field name="amount" sum="Amount Total"/>
<field name="amount_currency" sum="Currency Amount Total"/>
<field name="currency"/>
<field name="amount_currency" sum="Currency Amount Total" groups="base.group_multi_currency"/>
<field name="currency" groups="base.group_multi_currency"/>
<field name="bank_id" domain="[('partner_id', '=', partner_id)]"/>
<field name="move_line_id" on_change="onchange_move_line(move_line_id,parent.mode)"/>
<field name="create_date"/>

View File

@ -75,7 +75,7 @@
</group>
<group string="Other Information">
<field name="number"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</group>
<group col="4" attrs="{'invisible':[('type','in',['payment', 'receipt', False])]}">
<separator string="Total" colspan="4"/>

View File

@ -102,9 +102,9 @@
<field name="narration" nolabel="1" colspan="2"/>
</group>
<group string="Other Information" col="4">
<field name="currency_id" colspan="4"/>
<field name="currency_id" colspan="4" groups="base.group_multi_currency"/>
<field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context)" colspan="3"/>
<field name="payment_rate_currency_id" colspan="1" nolabel="1" on_change="onchange_payment_rate_currency(currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context)"/>
<field name="payment_rate_currency_id" colspan="1" nolabel="1" on_change="onchange_payment_rate_currency(currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context)" groups="base.group_multi_currency"/>
<field name="paid_amount_in_company_currency" colspan="4" invisible="1"/>
<field name="number" colspan="4"/>
</group>
@ -194,7 +194,7 @@
<separator string="Currency Options" colspan="4"/>
<field name="is_multi_currency" invisible="1"/>
<field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context)" colspan="3"/>
<field name="payment_rate_currency_id" colspan="1" nolabel="1" on_change="onchange_payment_rate_currency(currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context)"/>
<field name="payment_rate_currency_id" colspan="1" nolabel="1" on_change="onchange_payment_rate_currency(currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context)" groups="base.group_multi_currency"/>
<field name="paid_amount_in_company_currency" colspan="4" invisible="1"/>
</group>
<group col="2">
@ -231,8 +231,8 @@
<field name="credit"/>
<field name="state"/>
<field name="reconcile_id"/>
<field name="amount_currency"/>
<field name="currency_id"/>
<field name="amount_currency" groups="base.group_multi_currency"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</tree>
</field>
</page>
@ -366,7 +366,7 @@
<group col="4" attrs="{'invisible':[('currency_id','=',False),('is_multi_currency','=',False)]}">
<field name="is_multi_currency" invisible="1"/>
<field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context)" colspan="3"/>
<field name="payment_rate_currency_id" colspan="1" nolabel="1" on_change="onchange_payment_rate_currency(currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context)"/>
<field name="payment_rate_currency_id" colspan="1" nolabel="1" on_change="onchange_payment_rate_currency(currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context)" groups="base.group_multi_currency"/>
<field name="paid_amount_in_company_currency" colspan="4" invisible="1"/>
</group>
<group>
@ -401,7 +401,7 @@
<field name="state"/>
<field name="reconcile_id"/>
<field name="amount_currency"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</tree>
</field>
</page>

View File

@ -0,0 +1,3 @@
import controllers
import models
import test_models

View File

@ -0,0 +1,39 @@
{
'name': 'Base import',
'description': """
New extensible file import for OpenERP
======================================
Re-implement openerp's file import system:
* Server side, the previous system forces most of the logic into the
client which duplicates the effort (between clients), makes the
import system much harder to use without a client (direct RPC or
other forms of automation) and makes knowledge about the
import/export system much harder to gather as it is spread over
3+ different projects.
* In a more extensible manner, so users and partners can build their
own front-end to import from other file formats (e.g. OpenDocument
files) which may be simpler to handle in their work flow or from
their data production sources.
* In a module, so that administrators and users of OpenERP who do not
need or want an online import can avoid it being available to users.
""",
'category': 'Uncategorized',
'website': 'http://www.openerp.com',
'author': 'OpenERP SA',
'depends': ['base'],
'installable': True,
'auto_install': False, # set to true and allow uninstall?
'css': [
'static/lib/select2/select2.css',
'static/src/css/import.css',
],
'js': [
'static/lib/select2/select2.js',
'static/src/js/import.js',
],
'qweb': ['static/src/xml/import.xml'],
}

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
import simplejson
try:
import openerp.addons.web.common.http as openerpweb
except ImportError:
import web.common.http as openerpweb
class ImportController(openerpweb.Controller):
_cp_path = '/base_import'
@openerpweb.httprequest
def set_file(self, req, file, import_id, jsonp='callback'):
import_id = int(import_id)
written = req.session.model('base_import.import').write(import_id, {
'file': file.read(),
'file_name': file.filename,
'file_type': file.content_type,
}, req.session.eval_context(req.context))
return 'window.top.%s(%s)' % (
jsonp, simplejson.dumps({'result': written}))

View File

@ -0,0 +1,352 @@
import csv
import itertools
import logging
import operator
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
import psycopg2
from openerp.osv import orm, fields
from openerp.tools.translate import _
FIELDS_RECURSION_LIMIT = 2
ERROR_PREVIEW_BYTES = 200
_logger = logging.getLogger(__name__)
class ir_import(orm.TransientModel):
_name = 'base_import.import'
# allow imports to survive for 12h in case user is slow
_transient_max_hours = 12.0
_columns = {
'res_model': fields.char('Model', size=64),
'file': fields.binary(
'File', help="File to check and/or import, raw binary (not base64)"),
'file_name': fields.char('File Name', size=None),
'file_type': fields.char('File Type', size=None),
}
def get_fields(self, cr, uid, model, context=None,
depth=FIELDS_RECURSION_LIMIT):
""" Recursively get fields for the provided model (through
fields_get) and filter them according to importability
The output format is a list of ``Field``, with ``Field``
defined as:
.. class:: Field
.. attribute:: id (str)
A non-unique identifier for the field, used to compute
the span of the ``required`` attribute: if multiple
``required`` fields have the same id, only one of them
is necessary.
.. attribute:: name (str)
The field's logical (OpenERP) name within the scope of
its parent.
.. attribute:: string (str)
The field's human-readable name (``@string``)
.. attribute:: required (bool)
Whether the field is marked as required in the
model. Clients must provide non-empty import values
for all required fields or the import will error out.
.. attribute:: fields (list(Field))
The current field's subfields. The database and
external identifiers for m2o and m2m fields; a
filtered and transformed fields_get for o2m fields (to
a variable depth defined by ``depth``).
Fields with no sub-fields will have an empty list of
sub-fields.
:param str model: name of the model to get fields form
:param int landing: depth of recursion into o2m fields
"""
fields = [{
'id': 'id',
'name': 'id',
'string': _("External ID"),
'required': False,
'fields': [],
}]
fields_got = self.pool[model].fields_get(cr, uid, context=context)
for name, field in fields_got.iteritems():
if field.get('readonly'):
states = field.get('states')
if not states:
continue
# states = {state: [(attr, value), (attr2, value2)], state2:...}
if not any(attr == 'readonly' and value is False
for attr, value in itertools.chain.from_iterable(
states.itervalues())):
continue
f = {
'id': name,
'name': name,
'string': field['string'],
# Y U NO ALWAYS HAVE REQUIRED
'required': bool(field.get('required')),
'fields': [],
}
if field['type'] in ('many2many', 'many2one'):
f['fields'] = [
dict(f, name='id', string=_("External ID")),
dict(f, name='.id', string=_("Database ID")),
]
elif field['type'] == 'one2many' and depth:
f['fields'] = self.get_fields(
cr, uid, field['relation'], context=context, depth=depth-1)
fields.append(f)
# TODO: cache on model?
return fields
def _read_csv(self, record, options):
""" Returns a CSV-parsed iterator of all empty lines in the file
:throws csv.Error: if an error is detected during CSV parsing
:throws UnicodeDecodeError: if ``options.encoding`` is incorrect
"""
csv_iterator = csv.reader(
StringIO(record.file),
quotechar=options['quoting'],
delimiter=options['separator'])
csv_nonempty = itertools.ifilter(None, csv_iterator)
# TODO: guess encoding with chardet? Or https://github.com/aadsm/jschardet
encoding = options.get('encoding', 'utf-8')
return itertools.imap(
lambda row: [item.decode(encoding) for item in row],
csv_nonempty)
def _match_header(self, header, fields, options):
""" Attempts to match a given header to a field of the
imported model.
:param str header: header name from the CSV file
:param fields:
:param dict options:
:returns: an empty list if the header couldn't be matched, or
all the fields to traverse
:rtype: list(Field)
"""
for field in fields:
# FIXME: should match all translations & original
# TODO: use string distance (levenshtein? hamming?)
if header == field['name'] \
or header.lower() == field['string'].lower():
return [field]
if '/' not in header:
return []
# relational field path
traversal = []
subfields = fields
# Iteratively dive into fields tree
for section in header.split('/'):
# Strip section in case spaces are added around '/' for
# readability of paths
match = self._match_header(section.strip(), subfields, options)
# Any match failure, exit
if not match: return []
# prep subfields for next iteration within match[0]
field = match[0]
subfields = field['fields']
traversal.append(field)
return traversal
def _match_headers(self, rows, fields, options):
""" Attempts to match the imported model's fields to the
titles of the parsed CSV file, if the file is supposed to have
headers.
Will consume the first line of the ``rows`` iterator.
Returns a pair of (None, None) if headers were not requested
or the list of headers and a dict mapping cell indices
to key paths in the ``fields`` tree
:param Iterator rows:
:param dict fields:
:param dict options:
:rtype: (None, None) | (list(str), dict(int: list(str)))
"""
if not options.get('headers'):
return None, None
headers = next(rows)
return headers, dict(
(index, [field['name'] for field in self._match_header(header, fields, options)] or None)
for index, header in enumerate(headers)
)
def parse_preview(self, cr, uid, id, options, count=10, context=None):
""" Generates a preview of the uploaded files, and performs
fields-matching between the import's file data and the model's
columns.
If the headers are not requested (not options.headers),
``matches`` and ``headers`` are both ``False``.
:param id: identifier of the import
:param int count: number of preview lines to generate
:param options: format-specific options.
CSV: {encoding, quoting, separator, headers}
:type options: {str, str, str, bool}
:returns: {fields, matches, headers, preview} | {error, preview}
:rtype: {dict(str: dict(...)), dict(int, list(str)), list(str), list(list(str))} | {str, str}
"""
(record,) = self.browse(cr, uid, [id], context=context)
fields = self.get_fields(cr, uid, record.res_model, context=context)
try:
rows = self._read_csv(record, options)
headers, matches = self._match_headers(rows, fields, options)
# Match should have consumed the first row (iif headers), get
# the ``count`` next rows for preview
preview = itertools.islice(rows, count)
return {
'fields': fields,
'matches': matches or False,
'headers': headers or False,
'preview': list(preview),
}
except Exception, e:
# Due to lazy generators, UnicodeDecodeError (for
# instance) may only be raised when serializing the
# preview to a list in the return.
_logger.debug("Error during CSV parsing preview", exc_info=True)
return {
'error': str(e),
# iso-8859-1 ensures decoding will always succeed,
# even if it yields non-printable characters. This is
# in case of UnicodeDecodeError (or csv.Error
# compounded with UnicodeDecodeError)
'preview': record.file[:ERROR_PREVIEW_BYTES]
.decode( 'iso-8859-1'),
}
def _convert_import_data(self, record, fields, options, context=None):
""" Extracts the input browse_record and fields list (with
``False``-y placeholders for fields to *not* import) into a
format Model.import_data can use: a fields list without holes
and the precisely matching data matrix
:param browse_record record:
:param list(str|bool): fields
:returns: (data, fields)
:rtype: (list(list(str)), list(str))
:raises ValueError: in case the import data could not be converted
"""
# Get indices for non-empty fields
indices = [index for index, field in enumerate(fields) if field]
if not indices:
raise ValueError(_("You must configure at least one field to import"))
# If only one index, itemgetter will return an atom rather
# than a 1-tuple
if len(indices) == 1: mapper = lambda row: [row[indices[0]]]
else: mapper = operator.itemgetter(*indices)
# Get only list of actually imported fields
import_fields = filter(None, fields)
rows_to_import = self._read_csv(record, options)
if options.get('headers'):
rows_to_import = itertools.islice(
rows_to_import, 1, None)
data = [
row for row in itertools.imap(mapper, rows_to_import)
# don't try inserting completely empty rows (e.g. from
# filtering out o2m fields)
if any(row)
]
return data, import_fields
def do(self, cr, uid, id, fields, options, dryrun=False, context=None):
""" Actual execution of the import
:param fields: import mapping: maps each column to a field,
``False`` for the columns to ignore
:type fields: list(str|bool)
:param dict options:
:param bool dryrun: performs all import operations (and
validations) but rollbacks writes, allows
getting as much errors as possible without
the risk of clobbering the database.
:returns: A list of errors. If the list is empty the import
executed fully and correctly. If the list is
non-empty it contains dicts with 3 keys ``type`` the
type of error (``error|warning``); ``message`` the
error message associated with the error (a string)
and ``record`` the data which failed to import (or
``false`` if that data isn't available or provided)
:rtype: list({type, message, record})
"""
cr.execute('SAVEPOINT import')
(record,) = self.browse(cr, uid, [id], context=context)
try:
data, import_fields = self._convert_import_data(
record, fields, options, context=context)
except ValueError, e:
return [{
'type': 'error',
'message': str(e),
'record': False,
}]
try:
_logger.info('importing %d rows...', len(data))
(code, record, message, _wat) = self.pool[record.res_model].import_data(
cr, uid, import_fields, data, context=context)
_logger.info('done')
except Exception, e:
_logger.exception("Import failed")
# TODO: remove when exceptions stop being an "expected"
# behavior of import_data on some (most) invalid
# input.
code, record, message = -1, None, str(e)
# If transaction aborted, RELEASE SAVEPOINT is going to raise
# an InternalError (ROLLBACK should work, maybe). Ignore that.
# TODO: to handle multiple errors, create savepoint around
# write and release it in case of write error (after
# adding error to errors array) => can keep on trying to
# import stuff, and rollback at the end if there is any
# error in the results.
try:
if dryrun:
cr.execute('ROLLBACK TO SAVEPOINT import')
else:
cr.execute('RELEASE SAVEPOINT import')
except psycopg2.InternalError:
pass
if code != -1:
return []
# TODO: add key for error location?
# TODO: error not within normal preview, how to display? Re-preview
# with higher ``count``?
return [{
'type': 'error',
'message': message,
'record': record or False
}]

View File

@ -0,0 +1,12 @@
Copyright 2012 Igor Vaynberg
Version: @@ver@@ Timestamp: @@timestamp@@
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.

View File

@ -0,0 +1,68 @@
Select2
=================
Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results. Look and feel of Select2 is based on the excellent [Chosen](http://harvesthq.github.com/chosen/) library.
To get started -- checkout http://ivaynberg.github.com/select2!
What Does Select2 Support That Chosen Does Not?
-------------------------------------------------
* Working with large datasets: Chosen requires the entire dataset to be loaded as `option` tags in the DOM, which limits
it to working with small-ish datasets. Select2 uses a function to find results on-the-fly, which allows it to partially
load results.
* Paging of results: Since Select2 works with large datasets and only loads a small amount of matching results at a time
it has to support paging. Select2 will call the search function when the user scrolls to the bottom of currently loaded
result set allowing for the 'infinite scrolling' of results.
* Custom markup for results: Chosen only supports rendering text results because that is the only markup supported by
`option` tags. Select2 provides an extension point which can be used to produce any kind of markup to represent results.
* Ability to add results on the fly: Select2 provides the ability to add results from the search term entered by the user, which allows it to be used for
tagging.
Browser Compatibility
--------------------
* IE 8+ (7 mostly works except for [issue with z-index](https://github.com/ivaynberg/select2/issues/37))
* Chrome 8+
* Firefox 3.5+
* Safari 3+
* Opera 10.6+
Integrations
------------
* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / Apache Wicket)
* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org))
* [Django](https://github.com/applegrew/django-select2)
Bug tracker
-----------
Have a bug? Please create an issue here on GitHub!
https://github.com/ivaynberg/select2/issues
Mailing list
------------
Have a question? Ask on our mailing list!
select2@googlegroups.com
https://groups.google.com/d/forum/select2
Copyright and License
---------------------
Copyright 2012 Igor Vaynberg
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.

View File

@ -0,0 +1,77 @@
#!/bin/bash
set -e
echo -n "Enter the version for this release: "
read ver
if [ ! $ver ]; then
echo "Invalid version."
exit
fi
name="select2"
js="$name.js"
mini="$name.min.js"
css="$name.css"
release="$name-$ver"
releasedir="/tmp/$release"
tag="release-$ver"
branch="build-$ver"
curbranch=`git branch | grep "*" | sed "s/* //"`
timestamp=$(date)
tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
remote="github"
git branch "$branch"
git checkout "$branch"
echo "Tokenizing..."
find . -name "$js" | xargs sed -i -e "$tokens"
find . -name "$css" | xargs sed -i -e "$tokens"
git add "$js"
git add "$css"
echo "Minifying..."
echo "/*" > "$mini"
cat LICENSE | sed "$tokens" >> "$mini"
echo "*/" >> "$mini"
curl -s \
-d compilation_level=SIMPLE_OPTIMIZATIONS \
-d output_format=text \
-d output_info=compiled_code \
--data-urlencode "js_code@$js" \
http://closure-compiler.appspot.com/compile \
>> "$mini"
git add "$mini"
git commit -m "release $ver"
echo "Tagging..."
git tag -a "$tag" -m "tagged version $ver"
git push "$remote" --tags
echo "Archiving..."
rm -rf "$releasedir"
mkdir "$releasedir"
cp $name.* "$releasedir"
cp spinner.gif "$releasedir"
cp README.* "$releasedir"
zip -r "$releasedir.zip" "$releasedir"
rm -rf "$releasedir"
echo "Cleaning Up..."
git checkout "$curbranch"
git branch -D "$branch"
echo "Done. Release archive created: $releasedir.zip"

View File

@ -0,0 +1,524 @@
/*
Version: @@ver@@ Timestamp: @@timestamp@@
*/
.select2-container {
position: relative;
display: inline-block;
/* inline-block for ie7 */
zoom: 1;
*display: inline;
vertical-align: top;
}
.select2-container,
.select2-drop,
.select2-search,
.select2-search input{
/*
Force border-box so that % widths fit the parent
container without overlap because of margin/padding.
More Info : http://www.quirksmode.org/css/box.html
*/
-moz-box-sizing: border-box; /* firefox */
-ms-box-sizing: border-box; /* ie */
-webkit-box-sizing: border-box; /* webkit */
-khtml-box-sizing: border-box; /* konqueror */
box-sizing: border-box; /* css3 */
}
.select2-container .select2-choice {
background-color: #fff;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
background-image: -o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%);
background-image: -ms-linear-gradient(top, #eeeeee 0%, #ffffff 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#ffffff', GradientType = 0);
background-image: linear-gradient(top, #eeeeee 0%, #ffffff 50%);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-moz-background-clip: padding;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #aaa;
display: block;
overflow: hidden;
white-space: nowrap;
position: relative;
height: 26px;
line-height: 26px;
padding: 0 0 0 8px;
color: #444;
text-decoration: none;
}
.select2-container.select2-drop-above .select2-choice
{
border-bottom-color: #aaa;
-webkit-border-radius:0px 0px 4px 4px;
-moz-border-radius:0px 0px 4px 4px;
border-radius:0px 0px 4px 4px;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white));
background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%);
background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 90%);
background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 90%);
background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 90%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
background-image: linear-gradient(top, #eeeeee 0%,#ffffff 90%);
}
.select2-container .select2-choice span {
margin-right: 26px;
display: block;
overflow: hidden;
white-space: nowrap;
-o-text-overflow: ellipsis;
-ms-text-overflow: ellipsis;
text-overflow: ellipsis;
}
.select2-container .select2-choice abbr {
display: block;
position: absolute;
right: 26px;
top: 8px;
width: 12px;
height: 12px;
font-size: 1px;
background: url('select2.png') right top no-repeat;
cursor: pointer;
text-decoration: none;
border:0;
outline: 0;
}
.select2-container .select2-choice abbr:hover {
background-position: right -11px;
cursor: pointer;
}
.select2-drop {
background: #fff;
color: #000;
border: 1px solid #aaa;
border-top: 0;
position: absolute;
top: 100%;
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-o-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
z-index: 9999;
width:100%;
margin-top:-1px;
-webkit-border-radius: 0 0 4px 4px;
-moz-border-radius: 0 0 4px 4px;
border-radius: 0 0 4px 4px;
}
.select2-drop.select2-drop-above {
-webkit-border-radius: 4px 4px 0px 0px;
-moz-border-radius: 4px 4px 0px 0px;
border-radius: 4px 4px 0px 0px;
margin-top:1px;
border-top: 1px solid #aaa;
border-bottom: 0;
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-o-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
}
.select2-container .select2-choice div {
-webkit-border-radius: 0 4px 4px 0;
-moz-border-radius: 0 4px 4px 0;
border-radius: 0 4px 4px 0;
-moz-background-clip: padding;
-webkit-background-clip: padding-box;
background-clip: padding-box;
background: #ccc;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#cccccc', endColorstr = '#eeeeee', GradientType = 0);
background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%);
border-left: 1px solid #aaa;
position: absolute;
right: 0;
top: 0;
display: block;
height: 100%;
width: 18px;
}
.select2-container .select2-choice div b {
background: url('select2.png') no-repeat 0 1px;
display: block;
width: 100%;
height: 100%;
}
.select2-search {
display: inline-block;
white-space: nowrap;
z-index: 10000;
min-height: 26px;
width: 100%;
margin: 0;
padding-left: 4px;
padding-right: 4px;
}
.select2-search-hidden {
display: block;
position: absolute;
left: -10000px;
}
.select2-search input {
background: #fff url('select2.png') no-repeat 100% -22px;
background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
background: url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
padding: 4px 20px 4px 5px;
outline: 0;
border: 1px solid #aaa;
font-family: sans-serif;
font-size: 1em;
width:100%;
margin:0;
height:auto !important;
min-height: 26px;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
border-radius: 0;
-moz-border-radius: 0;
-webkit-border-radius: 0;
}
.select2-drop.select2-drop-above .select2-search input
{
margin-top:4px;
}
.select2-search input.select2-active {
background: #fff url('spinner.gif') no-repeat 100%;
background: url('spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
background: url('spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
background: url('spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
background: url('spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
}
.select2-container-active .select2-choice,
.select2-container-active .select2-choices {
-webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
-moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
-o-box-shadow : 0 0 5px rgba(0,0,0,.3);
box-shadow : 0 0 5px rgba(0,0,0,.3);
border: 1px solid #5897fb;
outline: none;
}
.select2-dropdown-open .select2-choice {
border: 1px solid #aaa;
border-bottom-color: transparent;
-webkit-box-shadow: 0 1px 0 #fff inset;
-moz-box-shadow : 0 1px 0 #fff inset;
-o-box-shadow : 0 1px 0 #fff inset;
box-shadow : 0 1px 0 #fff inset;
background-color: #eee;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%);
-webkit-border-bottom-left-radius : 0;
-webkit-border-bottom-right-radius: 0;
-moz-border-radius-bottomleft : 0;
-moz-border-radius-bottomright: 0;
border-bottom-left-radius : 0;
border-bottom-right-radius: 0;
}
.select2-dropdown-open .select2-choice div {
background: transparent;
border-left: none;
}
.select2-dropdown-open .select2-choice div b {
background-position: -18px 1px;
}
/* results */
.select2-results {
margin: 4px 4px 4px 0;
padding: 0 0 0 4px;
position: relative;
overflow-x: hidden;
overflow-y: auto;
max-height: 200px;
}
.select2-results ul.select2-result-sub {
margin: 0 0 0 0;
}
.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px }
.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px }
.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px }
.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px }
.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px }
.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px }
.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px }
.select2-results li {
list-style: none;
display: list-item;
}
.select2-results li.select2-result-with-children > .select2-result-label {
font-weight: bold;
}
.select2-results .select2-result-label {
padding: 3px 7px 4px;
margin: 0;
cursor: pointer;
}
.select2-results .select2-highlighted {
background: #3875d7;
color: #fff;
}
.select2-results li em {
background: #feffde;
font-style: normal;
}
.select2-results .select2-highlighted em {
background: transparent;
}
.select2-results .select2-no-results,
.select2-results .select2-searching,
.select2-results .select2-selection-limit {
background: #f4f4f4;
display: list-item;
}
/*
disabled look for already selected choices in the results dropdown
.select2-results .select2-disabled.select2-highlighted {
color: #666;
background: #f4f4f4;
display: list-item;
cursor: default;
}
.select2-results .select2-disabled {
background: #f4f4f4;
display: list-item;
cursor: default;
}
*/
.select2-results .select2-disabled {
display: none;
}
.select2-more-results.select2-active {
background: #f4f4f4 url('spinner.gif') no-repeat 100%;
}
.select2-more-results {
background: #f4f4f4;
display: list-item;
}
/* disabled styles */
.select2-container.select2-container-disabled .select2-choice {
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
cursor: default;
}
.select2-container.select2-container-disabled .select2-choice div {
background-color: #f4f4f4;
background-image: none;
border-left: 0;
}
/* multiselect */
.select2-container-multi .select2-choices {
background-color: #fff;
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%);
border: 1px solid #aaa;
margin: 0;
padding: 0;
cursor: text;
overflow: hidden;
height: auto !important;
height: 1%;
position: relative;
}
.select2-container-multi .select2-choices {
min-height: 26px;
}
.select2-container-multi.select2-container-active .select2-choices {
-webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
-moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
-o-box-shadow : 0 0 5px rgba(0,0,0,.3);
box-shadow : 0 0 5px rgba(0,0,0,.3);
border: 1px solid #5897fb;
outline: none;
}
.select2-container-multi .select2-choices li {
float: left;
list-style: none;
}
.select2-container-multi .select2-choices .select2-search-field {
white-space: nowrap;
margin: 0;
padding: 0;
}
.select2-container-multi .select2-choices .select2-search-field input {
color: #666;
background: transparent !important;
font-family: sans-serif;
font-size: 100%;
height: 15px;
padding: 5px;
margin: 1px 0;
outline: 0;
border: 0;
-webkit-box-shadow: none;
-moz-box-shadow : none;
-o-box-shadow : none;
box-shadow : none;
}
.select2-container-multi .select2-choices .select2-search-field input.select2-active {
background: #fff url('spinner.gif') no-repeat 100% !important;
}
.select2-default {
color: #999 !important;
}
.select2-container-multi .select2-choices .select2-search-choice {
-webkit-border-radius: 3px;
-moz-border-radius : 3px;
border-radius : 3px;
-moz-background-clip : padding;
-webkit-background-clip: padding-box;
background-clip : padding-box;
background-color: #e4e4e4;
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
-moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
color: #333;
border: 1px solid #aaaaaa;
line-height: 13px;
padding: 3px 5px 3px 18px;
margin: 3px 0 3px 5px;
position: relative;
cursor: default;
}
.select2-container-multi .select2-choices .select2-search-choice span {
cursor: default;
}
.select2-container-multi .select2-choices .select2-search-choice-focus {
background: #d4d4d4;
}
.select2-search-choice-close {
display: block;
position: absolute;
right: 3px;
top: 4px;
width: 12px;
height: 13px;
font-size: 1px;
background: url('select2.png') right top no-repeat;
outline: none;
}
.select2-container-multi .select2-search-choice-close {
left: 3px;
}
.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
background-position: right -11px;
}
.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
background-position: right -11px;
}
/* disabled styles */
.select2-container-multi.select2-container-disabled .select2-choices{
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
cursor: default;
}
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
background-image: none;
background-color: #f4f4f4;
border: 1px solid #ddd;
padding: 3px 5px 3px 5px;
}
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {
display: none;
}
/* end multiselect */
.select2-result-selectable .select2-match,
.select2-result-unselectable .select2-result-selectable .select2-match { text-decoration: underline; }
.select2-result-unselectable .select2-match { text-decoration: none; }
.select2-offscreen { position: absolute; left: -10000px; }
/* Retina-ize icons */
@media only screen and (-webkit-min-device-pixel-ratio: 1.5) {
.select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice div b {
background-image: url(select2x2.png) !important;
background-repeat: no-repeat !important;
background-size: 60px 40px !important;
}
.select2-search input {
background-position: 100% -21px !important;
}
}

2407
addons/base_import/static/lib/select2/select2.js vendored Executable file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,57 @@
.openerp .oe_list_buttons .oe_alternative {
visibility: visible;
}
.openerp .oe_list_buttons.oe_editing .oe_list_button_import {
display: none;
}
.oe_import dd,
.oe_import .oe_import_toggled,
.oe_import .oe_import_grid,
.oe_import .oe_import_error_report,
.oe_import .oe_import_with_file,
.oe_import .oe_import_noheaders {
display: none;
}
.oe_import.oe_import_preview .oe_import_grid {
display: table;
}
.oe_import.oe_import_error .oe_import_error_report,
.oe_import.oe_import_with_file .oe_import_with_file,
.oe_import.oe_import_noheaders .oe_import_noheaders {
display: block;
}
.oe_import .oe_import_error_report ul .oe_import_report_error {
background-color: #FFD9DB;
}
.oe_import .oe_import_error_report ul .oe_import_report_warning {
background-color: #FEFFD9;
}
.oe_import .oe_import_noheaders {
color: #888;
}
.oe_import a.oe_import_toggle {
display: block;
}
.oe_import a.oe_import_toggle:before {
content: '> '
}
.oe_import .oe_import_options p {
margin: 0;
padding: 0;
}
.oe_import .oe_import_options label {
display: inline-block;
width: 10em;
text-align: right;
}
.oe_import_selector ul,
.oe_import_selector li {
margin: 0; padding: 0;
}

View File

@ -0,0 +1,291 @@
openerp.base_import = function (instance) {
var QWeb = instance.web.qweb;
var _t = instance.web._t;
var _lt = instance.web._lt;
/**
* Safari does not deal well at all with raw JSON data being
* returned. As a result, we're going to cheat by using a
* pseudo-jsonp: instead of getting JSON data in the iframe, we're
* getting a ``script`` tag which consists of a function call and
* the returned data (the json dump).
*
* The function is an auto-generated name bound to ``window``,
* which calls back into the callback provided here.
*
* @param {Object} form the form element (DOM or jQuery) to use in the call
* @param {Object} attributes jquery.form attributes object
* @param {Function} callback function to call with the returned data
*/
function jsonp(form, attributes, callback) {
attributes = attributes || {};
var options = {jsonp: _.uniqueId('import_callback_')};
window[options.jsonp] = function () {
delete window[options.jsonp];
callback.apply(null, arguments);
};
if ('data' in attributes) {
_.extend(attributes.data, options);
} else {
_.extend(attributes, {data: options});
}
_.extend(attributes, {
dataType: 'script',
});
$(form).ajaxSubmit(attributes);
}
// if true, the 'Import', 'Export', etc... buttons will be shown
instance.web.ListView.prototype.defaults.import_enabled = true;
instance.web.ListView.include({
on_loaded: function () {
var self = this;
var add_button = false;
if (!this.$buttons) {
add_button = true;
}
this._super.apply(this, arguments);
if(add_button) {
this.$buttons.on('click', '.oe_list_button_import', function() {
new instance.web.DataImport(self, self.dataset).open();
return false;
});
}
}
});
instance.web.DataImport = instance.web.Dialog.extend({
template: 'ImportView',
dialog_title: _lt("Import Data"),
opts: [
{name: 'encoding', label: _lt("Encoding:"), value: 'utf-8'},
{name: 'separator', label: _lt("Separator:"), value: ','},
{name: 'quoting', label: _lt("Quoting:"), value: '"'}
],
events: {
'change .oe_import_grid input': 'import_dryrun',
'change input.oe_import_file': 'file_update',
'change input.oe_import_has_header, .oe_import_options input': 'settings_updated',
'click a.oe_import_csv': function (e) {
e.preventDefault();
},
'click a.oe_import_export': function (e) {
e.preventDefault();
},
'click a.oe_import_toggle': function (e) {
e.preventDefault();
var $el = $(e.target);
($el.next().length
? $el.next()
: $el.parent().next())
.toggle();
}
},
init: function (parent, dataset) {
var self = this;
this._super(parent, {
buttons: [
{text: _t("Import File"), click: function () {
self.do_import();
}, 'class': 'oe_import_dialog_button'}
]
});
this.res_model = parent.model;
// import object id
this.id = null;
this.Import = new instance.web.Model('base_import.import');
},
start: function () {
var self = this;
return this.Import.call('create', [{
'res_model': this.res_model
}]).then(function (id) {
self.id = id;
self.$('input[name=import_id]').val(id);
});
},
import_options: function () {
var self = this;
var options = {
headers: this.$('input.oe_import_has_header').prop('checked')
};
_(this.opts).each(function (opt) {
options[opt.name] =
self.$('input.oe_import_' + opt.name).val();
});
return options;
},
//- File & settings change section
file_update: function (e) {
if (!this.$('input.oe_import_file').val()) { return; }
this.$el.removeClass('oe_import_preview oe_import_error');
jsonp(this.$el, {
url: '/base_import/set_file'
}, this.proxy('settings_updated'));
},
settings_updated: function () {
this.$el.addClass('oe_import_with_file');
// TODO: test that write // succeeded?
this.Import.call(
'parse_preview', [this.id, this.import_options()])
.then(this.proxy('preview'));
},
preview: function (result) {
this.$el.toggleClass(
'oe_import_noheaders',
!this.$('input.oe_import_has_header').prop('checked'));
if (result.error) {
this.$el.addClass('oe_import_error');
this.$('.oe_import_error_report').html(
QWeb.render('ImportView.preview.error', result));
return;
}
this.$el.addClass('oe_import_preview');
this.$('table').html(QWeb.render('ImportView.preview', result));
var $fields = this.$('.oe_import_fields input');
this.render_fields_matches(result, $fields);
var data = this.generate_fields_completion(result);
var item_finder = function (id, items) {
items = items || data;
for (var i=0; i < items.length; ++i) {
var item = items[i];
if (item.id === id) {
return item;
}
var val;
if (item.children && (val = item_finder(id, item.children))) {
return val;
}
}
return '';
};
$fields.select2({
allowClear: true,
minimumInputLength: 0,
data: data,
initSelection: function (element, callback) {
var default_value = element.val();
if (!default_value) {
callback('');
return;
}
callback(item_finder(default_value));
},
width: 'resolve',
dropdownCssClass: 'oe_import_selector'
});
this.import_dryrun();
},
generate_fields_completion: function (root) {
var basic = [];
var regulars = [];
var o2m = [];
function traverse(field, ancestors, collection) {
var subfields = field.fields;
var field_path = ancestors.concat(field);
var label = _(field_path).pluck('string').join(' / ');
var id = _(field_path).pluck('name').join('/');
// If non-relational, m2o or m2m, collection is regulars
if (!collection) {
if (field.name === 'id') {
collection = basic
} else if (_.isEmpty(subfields)
|| _.isEqual(_.pluck(subfields, 'name'), ['id', '.id'])) {
collection = regulars;
} else {
collection = o2m;
}
}
collection.push({
id: id,
text: label,
required: field.required
});
for(var i=0, end=subfields.length; i<end; ++i) {
traverse(subfields[i], field_path, collection);
}
}
_(root.fields).each(function (field) {
traverse(field, []);
});
var cmp = function (field1, field2) {
return field1.text.localeCompare(field2.text);
};
regulars.sort(cmp);
o2m.sort(cmp);
return basic.concat([
{ text: _t("Normal Fields"), children: regulars },
{ text: _t("Relation Fields"), children: o2m }
]);
},
render_fields_matches: function (result, $fields) {
if (_(result.matches).isEmpty()) { return; }
$fields.each(function (index, input) {
var match = result.matches[index];
if (!match) { return; }
var current_field = result;
input.value = _(match).chain()
.map(function (name) {
// WARNING: does both mapping and folding (over the
// ``field`` iterator variable)
return current_field = _(current_field.fields).find(function (subfield) {
return subfield.name === name;
});
})
.pluck('name')
.value()
.join('/');
});
},
//- import itself
call_import: function (options) {
var self = this;
var fields = this.$('.oe_import_fields input.oe_import_match_field').map(function (index, el) {
return $(el).select2('val') || false;
}).get();
return this.Import.call(
'do', [this.id, fields, this.import_options()], options);
},
import_dryrun: function () {
// this.call_import({ dryrun: true })
// .then(this.proxy('render_import_errors'));
},
do_import: function () {
var self = this;
this.call_import({ dryrun: false }).then(function (errors) {
if (_.isEmpty(errors)) {
if (self.getParent().reload_content) {
self.getParent().reload_content();
}
self.close();
return;
}
self.render_import_errors(errors);
});
},
render_import_errors: function (errors) {
if (_.isEmpty(errors)) {
this.$el.removeClass('oe_import_error');
return;
}
// import failed (or maybe just warnings, if we ever get
// warnings?)
this.$el.addClass('oe_import_error');
this.$('.oe_import_error_report').html(
QWeb.render('ImportView.error', {errors: errors}));
},
});
};

View File

@ -0,0 +1,103 @@
<templates>
<t t-name="ImportView">
<t t-set="_id" t-value="_.uniqueId('export')"/>
<form action="" method="post" enctype="multipart/form-data" class="oe_import">
<input type="hidden" name="session_id"
t-att-value="widget.session.session_id"/>
<input type="hidden" name="import_id"/>
<h2>Upload your file</h2>
<p>Select the <a href="#" class="oe_import_csv">.CSV</a>
file to import. If you need a sample importable file, you
can use <a href="#" class="oe_import_export">the export
tool</a> to generate one.</p>
<label t-attf-for="file_#{_id}" autofocus="autofocus">CSV File:</label>
<input type="file" id-attf-id="file_#{_id}"
name="file" class="oe_import_file"/>
<div class="oe_import_with_file">
<h2>Map your data to OpenERP</h2>
<input type="checkbox" class="oe_import_has_header"
id="oe_import_has_header" checked="checked"/>
<label for="oe_import_has_header">The first row of the
file contains the label of the column</label>
<p class="oe_import_noheaders">If the file contains
the column names, OpenERP can try auto-detecting the
field corresponding to the column. This makes imports
simpler especially when the file has many columns.</p>
<div class="oe_import_error_report"></div>
<table class="oe_import_grid" width="100%"/>
<a href="#" class="oe_import_toggle">
File Format Options…</a>
<div class="oe_import_toggled oe_import_options">
<p t-foreach="widget.opts" t-as="option">
<!-- no @name, avoid submission when file_update called -->
<label t-attf-for="#{option.name}_#{_id}">
<t t-esc="option.label"/></label>
<input t-attf-id="#{option.name}_#{_id}"
t-attf-class="oe_import_#{option.name}"
t-att-value="option.value"/>
</p>
</div>
<h2>Frequently Asked Questions</h2>
<dl>
<dt><a href="#" class="oe_import_toggle">
Need to import data from an other application?</a></dt>
<dd>
<p>In order to re-create relationships between
different records, you should use the unique
identifier from the original application and
map it to the <abbr title="External ID">ID</abbr>
column in OpenERP. When you
import an other record that links to the first
one, use <abbr title="XXX/External ID">XXX/ID</abbr>
to the original unique identifier.</p>
<p>The <abbr title="External ID">ID</abbr>
will also be used to update the original
import if you need to re-import modified data
later, it's thus good practice to specify it
whenever possible</p>
</dd>
</dl>
</div>
</form>
</t>
<t t-name="ImportView.preview">
<tr t-if="headers" class="oe_import_grid-header">
<td t-foreach="headers" t-as="header" class="oe_import_grid-cell"
><t t-esc="header"/></td>
</tr>
<tr class="oe_import_fields">
<!-- Iterate on first row to ensure we have all columns -->
<td t-foreach="preview[0]" t-as="column">
<input placeholder="Don't Import"
class="oe_import_match_field"/>
</td>
</tr>
<tr t-foreach="preview" t-as="row" class="oe_import_grid-row">
<td t-foreach="row" t-as="cell" class="oe_import_grid-cell"
><t t-esc="cell"/></td>
</tr>
</t>
<t t-name="ImportView.preview.error">
<p>Import preview failed due to: <t t-esc="error"/></p>
<p>Here is the start of the file we could not import:</p>
<pre><t t-esc="preview"/></pre>
</t>
<ul t-name="ImportView.error">
<li t-foreach="errors" t-as="error" t-attf-class="oe_import_report_#{error.type}">
<!-- can also have error.record, but may be *huge* if
e.g. has image fields -->
<t t-esc="error.message"/>
</li>
</ul>
<t t-extend="ListView.buttons">
<t t-jquery="span.oe_alternative">
this.attr('t-if', 'widget.options.import_enabled');
</t>
<t t-jquery="span.oe_alternative" t-operation="append">
<a href="#" class="oe_bold oe_list_button_import">Import</a>
</t>
</t>
</templates>

View File

@ -0,0 +1,101 @@
from openerp.osv import orm, fields
def name(n): return 'base_import.tests.models.%s' % n
class char(orm.Model):
_name = name('char')
_columns = {
'value': fields.char('unknown', size=None)
}
class char_required(orm.Model):
_name = name('char.required')
_columns = {
'value': fields.char('unknown', size=None, required=True)
}
class char_readonly(orm.Model):
_name = name('char.readonly')
_columns = {
'value': fields.char('unknown', size=None, readonly=True)
}
class char_states(orm.Model):
_name = name('char.states')
_columns = {
'value': fields.char('unknown', size=None, readonly=True, states={'draft': [('readonly', False)]})
}
class char_noreadonly(orm.Model):
_name = name('char.noreadonly')
_columns = {
'value': fields.char('unknown', size=None, readonly=True, states={'draft': [('invisible', True)]})
}
class char_stillreadonly(orm.Model):
_name = name('char.stillreadonly')
_columns = {
'value': fields.char('unknown', size=None, readonly=True, states={'draft': [('readonly', True)]})
}
# TODO: complex field (m2m, o2m, m2o)
class m2o(orm.Model):
_name = name('m2o')
_columns = {
'value': fields.many2one(name('m2o.related'))
}
class m2o_related(orm.Model):
_name = name('m2o.related')
_columns = {
'value': fields.integer()
}
_defaults = {
'value': 42
}
class m2o_required(orm.Model):
_name = name('m2o.required')
_columns = {
'value': fields.many2one(name('m2o.required.related'), required=True)
}
class m2o_required_related(orm.Model):
_name = name('m2o.required.related')
_columns = {
'value': fields.integer()
}
_defaults = {
'value': 42
}
class o2m(orm.Model):
_name = name('o2m')
_columns = {
'value': fields.one2many(name('o2m.child'), 'parent_id')
}
class o2m_child(orm.Model):
_name = name('o2m.child')
_columns = {
'parent_id': fields.many2one(name('o2m')),
'value': fields.integer()
}
class preview_model(orm.Model):
_name = name('preview')
_columns = {
'name': fields.char('Name', size=None),
'somevalue': fields.integer('Some Value', required=True),
'othervalue': fields.integer('Other Variable'),
}

View File

@ -0,0 +1,3 @@
from . import test_cases
checks = [test_cases]

View File

@ -0,0 +1,342 @@
# -*- encoding: utf-8 -*-
import unittest2
from openerp.tests.common import TransactionCase
from .. import models
ID_FIELD = {'id': 'id', 'name': 'id', 'string': "External ID", 'required': False, 'fields': []}
def make_field(name='value', string='unknown', required=False, fields=[]):
return [
ID_FIELD,
{'id': name, 'name': name, 'string': string, 'required': required, 'fields': fields},
]
class test_basic_fields(TransactionCase):
def get_fields(self, field):
return self.registry('base_import.import')\
.get_fields(self.cr, self.uid, 'base_import.tests.models.' + field)
def test_base(self):
""" A basic field is not required """
self.assertEqual(self.get_fields('char'), make_field())
def test_required(self):
""" Required fields should be flagged (so they can be fill-required) """
self.assertEqual(self.get_fields('char.required'), make_field(required=True))
def test_readonly(self):
""" Readonly fields should be filtered out"""
self.assertEqual(self.get_fields('char.readonly'), [ID_FIELD])
def test_readonly_states(self):
""" Readonly fields with states should not be filtered out"""
self.assertEqual(self.get_fields('char.states'), make_field())
def test_readonly_states_noreadonly(self):
""" Readonly fields with states having nothing to do with
readonly should still be filtered out"""
self.assertEqual(self.get_fields('char.noreadonly'), [ID_FIELD])
def test_readonly_states_stillreadonly(self):
""" Readonly fields with readonly states leaving them readonly
always... filtered out"""
self.assertEqual(self.get_fields('char.stillreadonly'), [ID_FIELD])
def test_m2o(self):
""" M2O fields should allow import of themselves (name_get),
their id and their xid"""
self.assertEqual(self.get_fields('m2o'), make_field(fields=[
{'id': 'value', 'name': 'id', 'string': 'External ID', 'required': False, 'fields': []},
{'id': 'value', 'name': '.id', 'string': 'Database ID', 'required': False, 'fields': []},
]))
def test_m2o_required(self):
""" If an m2o field is required, its three sub-fields are
required as well (the client has to handle that: requiredness
is id-based)
"""
self.assertEqual(self.get_fields('m2o.required'), make_field(required=True, fields=[
{'id': 'value', 'name': 'id', 'string': 'External ID', 'required': True, 'fields': []},
{'id': 'value', 'name': '.id', 'string': 'Database ID', 'required': True, 'fields': []},
]))
class test_o2m(TransactionCase):
def get_fields(self, field):
return self.registry('base_import.import')\
.get_fields(self.cr, self.uid, 'base_import.tests.models.' + field)
def test_shallow(self):
self.assertEqual(self.get_fields('o2m'), make_field(fields=[
{'id': 'id', 'name': 'id', 'string': 'External ID', 'required': False, 'fields': []},
# FIXME: should reverse field be ignored?
{'id': 'parent_id', 'name': 'parent_id', 'string': 'unknown', 'required': False, 'fields': [
{'id': 'parent_id', 'name': 'id', 'string': 'External ID', 'required': False, 'fields': []},
{'id': 'parent_id', 'name': '.id', 'string': 'Database ID', 'required': False, 'fields': []},
]},
{'id': 'value', 'name': 'value', 'string': 'unknown', 'required': False, 'fields': []},
]))
class test_match_headers_single(TransactionCase):
def test_match_by_name(self):
match = self.registry('base_import.import')._match_header(
'f0', [{'name': 'f0'}], {})
self.assertEqual(match, [{'name': 'f0'}])
def test_match_by_string(self):
match = self.registry('base_import.import')._match_header(
'some field', [{'name': 'bob', 'string': "Some Field"}], {})
self.assertEqual(match, [{'name': 'bob', 'string': "Some Field"}])
def test_nomatch(self):
match = self.registry('base_import.import')._match_header(
'should not be', [{'name': 'bob', 'string': "wheee"}], {})
self.assertEqual(match, [])
def test_recursive_match(self):
f = {
'name': 'f0',
'string': "My Field",
'fields': [
{'name': 'f0', 'string': "Sub field 0", 'fields': []},
{'name': 'f1', 'string': "Sub field 2", 'fields': []},
]
}
match = self.registry('base_import.import')._match_header(
'f0/f1', [f], {})
self.assertEqual(match, [f, f['fields'][1]])
def test_recursive_nomatch(self):
""" Match first level, fail to match second level
"""
f = {
'name': 'f0',
'string': "My Field",
'fields': [
{'name': 'f0', 'string': "Sub field 0", 'fields': []},
{'name': 'f1', 'string': "Sub field 2", 'fields': []},
]
}
match = self.registry('base_import.import')._match_header(
'f0/f2', [f], {})
self.assertEqual(match, [])
class test_match_headers_multiple(TransactionCase):
def test_noheaders(self):
self.assertEqual(
self.registry('base_import.import')._match_headers(
[], [], {}),
(None, None)
)
def test_nomatch(self):
self.assertEqual(
self.registry('base_import.import')._match_headers(
iter([
['foo', 'bar', 'baz', 'qux'],
['v1', 'v2', 'v3', 'v4'],
]),
[],
{'headers': True}),
(
['foo', 'bar', 'baz', 'qux'],
dict.fromkeys(range(4))
)
)
def test_mixed(self):
self.assertEqual(
self.registry('base_import.import')._match_headers(
iter(['foo bar baz qux/corge'.split()]),
[
{'name': 'bar', 'string': 'Bar'},
{'name': 'bob', 'string': 'Baz'},
{'name': 'qux', 'string': 'Qux', 'fields': [
{'name': 'corge', 'fields': []},
]}
],
{'headers': True}),
(['foo', 'bar', 'baz', 'qux/corge'], {
0: None,
1: ['bar'],
2: ['bob'],
3: ['qux', 'corge'],
})
)
class test_preview(TransactionCase):
def make_import(self):
Import = self.registry('base_import.import')
id = Import.create(self.cr, self.uid, {
'res_model': 'res.users',
'file': u"로그인,언어\nbob,1\n".encode('euc_kr'),
})
return Import, id
def test_encoding(self):
Import, id = self.make_import()
result = Import.parse_preview(self.cr, self.uid, id, {
'quoting': '"',
'separator': ',',
})
self.assertTrue('error' in result)
def test_csv_errors(self):
Import, id = self.make_import()
result = Import.parse_preview(self.cr, self.uid, id, {
'quoting': 'foo',
'separator': ',',
'encoding': 'euc_kr',
})
self.assertTrue('error' in result)
def test_csv_errors(self):
Import, id = self.make_import()
result = Import.parse_preview(self.cr, self.uid, id, {
'quoting': '"',
'separator': 'bob',
'encoding': 'euc_kr',
})
self.assertTrue('error' in result)
def test_success(self):
Import = self.registry('base_import.import')
id = Import.create(self.cr, self.uid, {
'res_model': 'base_import.tests.models.preview',
'file': 'name,Some Value,Counter\n'
'foo,1,2\n'
'bar,3,4\n'
'qux,5,6\n'
})
result = Import.parse_preview(self.cr, self.uid, id, {
'quoting': '"',
'separator': ',',
'headers': True,
})
self.assertEqual(result['matches'], {0: ['name'], 1: ['somevalue'], 2: None})
self.assertEqual(result['headers'], ['name', 'Some Value', 'Counter'])
# Order depends on iteration order of fields_get
self.assertItemsEqual(result['fields'], [
{'id': 'id', 'name': 'id', 'string': 'External ID', 'required':False, 'fields': []},
{'id': 'name', 'name': 'name', 'string': 'Name', 'required':False, 'fields': []},
{'id': 'somevalue', 'name': 'somevalue', 'string': 'Some Value', 'required':True, 'fields': []},
{'id': 'othervalue', 'name': 'othervalue', 'string': 'Other Variable', 'required':False, 'fields': []},
])
self.assertEqual(result['preview'], [
['foo', '1', '2'],
['bar', '3', '4'],
['qux', '5', '6'],
])
# Ensure we only have the response fields we expect
self.assertItemsEqual(result.keys(), ['matches', 'headers', 'fields', 'preview'])
class test_convert_import_data(TransactionCase):
""" Tests conversion of base_import.import input into data which
can be fed to Model.import_data
"""
def test_all(self):
Import = self.registry('base_import.import')
id = Import.create(self.cr, self.uid, {
'res_model': 'base_import.tests.models.preview',
'file': 'name,Some Value,Counter\n'
'foo,1,2\n'
'bar,3,4\n'
'qux,5,6\n'
})
record = Import.browse(self.cr, self.uid, id)
data, fields = Import._convert_import_data(
record, ['name', 'somevalue', 'othervalue'],
{'quoting': '"', 'separator': ',', 'headers': True,})
self.assertItemsEqual(fields, ['name', 'somevalue', 'othervalue'])
self.assertItemsEqual(data, [
('foo', '1', '2'),
('bar', '3', '4'),
('qux', '5', '6'),
])
def test_filtered(self):
""" If ``False`` is provided as field mapping for a column,
that column should be removed from importable data
"""
Import = self.registry('base_import.import')
id = Import.create(self.cr, self.uid, {
'res_model': 'base_import.tests.models.preview',
'file': 'name,Some Value,Counter\n'
'foo,1,2\n'
'bar,3,4\n'
'qux,5,6\n'
})
record = Import.browse(self.cr, self.uid, id)
data, fields = Import._convert_import_data(
record, ['name', False, 'othervalue'],
{'quoting': '"', 'separator': ',', 'headers': True,})
self.assertItemsEqual(fields, ['name', 'othervalue'])
self.assertItemsEqual(data, [
('foo', '2'),
('bar', '4'),
('qux', '6'),
])
def test_norow(self):
""" If a row is composed only of empty values (due to having
filtered out non-empty values from it), it should be removed
"""
Import = self.registry('base_import.import')
id = Import.create(self.cr, self.uid, {
'res_model': 'base_import.tests.models.preview',
'file': 'name,Some Value,Counter\n'
'foo,1,2\n'
',3,\n'
',5,6\n'
})
record = Import.browse(self.cr, self.uid, id)
data, fields = Import._convert_import_data(
record, ['name', False, 'othervalue'],
{'quoting': '"', 'separator': ',', 'headers': True,})
self.assertItemsEqual(fields, ['name', 'othervalue'])
self.assertItemsEqual(data, [
('foo', '2'),
('', '6'),
])
def test_nofield(self):
Import = self.registry('base_import.import')
id = Import.create(self.cr, self.uid, {
'res_model': 'base_import.tests.models.preview',
'file': 'name,Some Value,Counter\n'
'foo,1,2\n'
})
record = Import.browse(self.cr, self.uid, id)
self.assertRaises(
ValueError,
Import._convert_import_data,
record, [],
{'quoting': '"', 'separator': ',', 'headers': True,})
def test_falsefields(self):
Import = self.registry('base_import.import')
id = Import.create(self.cr, self.uid, {
'res_model': 'base_import.tests.models.preview',
'file': 'name,Some Value,Counter\n'
'foo,1,2\n'
})
record = Import.browse(self.cr, self.uid, id)
self.assertRaises(
ValueError,
Import._convert_import_data,
record, [False, False, False],
{'quoting': '"', 'separator': ',', 'headers': True,})

View File

@ -35,6 +35,7 @@ class base_config_settings(osv.osv_memory):
'module_auth_anonymous': fields.boolean('activate the public portal',
help="""Enable the public part of openerp, openerp becomes a public website."""),
'module_auth_oauth': fields.boolean('use external authentication providers, sign in with google, facebook, ...'),
'module_base_import': fields.boolean("Allow users to import data from CSV files"),
}
def open_company(self, cr, uid, ids, context=None):

View File

@ -14,9 +14,10 @@
</header>
<separator string="General Settings"/>
<div>
<label string="You will also find several configuration options on your company data:
address for the header and footer, overdue payments texts, etc."/>
<button type="object" name="open_company" string="Configure Your Company Data" icon="gtk-execute" class="oe_inline oe_link"/>
<p>
<label string="You will find more options in your company details: address for the header and footer, overdue payments texts, etc."/>
<button type="object" name="open_company" string="Configure Your Company Data" icon="gtk-execute" class="oe_inline oe_link"/>
</p>
</div>
<group>
<label for="id" string="Options"/>
@ -59,6 +60,15 @@
</div>
</div>
</group>
<group>
<label for="id" string="Import / Export"/>
<div>
<div>
<field name="module_base_import" class="oe_inline"/>
<label for="module_base_import"/>
</div>
</div>
</group>
</form>
</field>
</record>

View File

@ -1,3 +1,17 @@
.openerp .oe_dashboard_layout_selector ul {
white-space: nowrap;
}
.openerp .oe_dashboard_layout_selector li {
margin: 0;
padding: 0;
list-style-type: none;
float: left;
}
.openerp .oe_dashboard_layout_selector li .oe_dashboard_selected_layout {
margin-left: -30px;
vertical-align: bottom;
margin-bottom: 10px;
}
.openerp .oe_dashboard_links {
text-align: right;
margin: 0 4px 6px 0;
@ -5,11 +19,6 @@
.openerp .oe_dashboard {
width: 100%;
}
.openerp .oe_dashboard .oe_dashboard_layout_selector ul, .openerp .oe_dashboard .oe_dashboard_layout_selector li {
margin: 0;
padding: 0;
list-style-type: none;
}
.openerp .oe_dashboard .oe_action {
margin: 0 8px 8px 0;
background-color: white;

View File

@ -9,16 +9,23 @@
box-shadow: $bsval
.openerp
.oe_dashboard_layout_selector
ul
white-space: nowrap
li
margin: 0
padding: 0
list-style-type: none
float: left
.oe_dashboard_selected_layout
margin-left: -30px
vertical-align: bottom
margin-bottom: 10px
.oe_dashboard_links
text-align: right
margin: 0 4px 6px 0
.oe_dashboard
width: 100%
.oe_dashboard_layout_selector
ul, li
margin: 0
padding: 0
list-style-type: none
.oe_action
margin: 0 8px 8px 0
background-color: white

View File

@ -220,36 +220,40 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({
am.do_action = function (action) {
self.do_action(action);
};
if (action_attrs.creatable && action_attrs.creatable !== 'false') {
var action_id = parseInt(action_attrs.creatable, 10);
$action.parent().find('button.oe_dashboard_button_create').click(function() {
if (isNaN(action_id)) {
action_orig.flags.default_view = 'form';
self.do_action(action_orig);
} else {
self.rpc('/web/action/load', {
action_id: action_id
}, function(result) {
result.result.flags = result.result.flags || {};
result.result.flags.default_view = 'form';
self.do_action(result.result);
});
}
});
}
if (am.inner_widget) {
am.inner_widget.on_mode_switch.add(function(mode) {
var new_form_action = function(id, editable) {
var new_views = [];
_.each(action_orig.views, function(view) {
new_views[view[1] === mode ? 'unshift' : 'push'](view);
new_views[view[1] === 'form' ? 'unshift' : 'push'](view);
});
if (!new_views.length || new_views[0][1] !== mode) {
new_views.unshift([false, mode]);
if (!new_views.length || new_views[0][1] !== 'form') {
new_views.unshift([false, 'form']);
}
action_orig.views = new_views;
action_orig.res_id = am.inner_widget.dataset.ids[am.inner_widget.dataset.index];
action_orig.res_id = id;
action_orig.flags = {
form: {
"initial_mode": editable ? "edit" : "view",
}
};
self.do_action(action_orig);
});
};
var list = am.inner_widget.views.list;
if (list) {
list.deferred.then(function() {
$(list.controller.groups).off('row_link').on('row_link', function(e, id) {
new_form_action(id);
});
});
}
var kanban = am.inner_widget.views.kanban;
if (kanban) {
kanban.deferred.then(function() {
kanban.controller.open_record = function(id, editable) {
new_form_action(id, editable);
};
});
}
}
},
renderElement: function() {

View File

@ -26,7 +26,6 @@
<span class="oe_header_txt"> <t t-esc="action.attrs.string"/> </span>
<input class = "oe_header_text" type="text"/>
<t t-if="!action.attrs.string">&amp;nbsp;</t>
<button t-if="action.attrs.creatable and action.attrs.creatable !== 'false'" class="oe_button oe_button_create">Create</button>
<span class='oe_icon oe_close'></span>
<span class='oe_icon oe_minimize oe_fold' t-if="!action.attrs.fold"></span>
<span class='oe_icon oe_maximize oe_fold' t-if="action.attrs.fold"></span>

View File

@ -423,7 +423,7 @@
<label for="planned_revenue" class="oe_edit_only"/>
<h2>
<field name="planned_revenue" class="oe_inline"/>
<field name="company_currency" class="oe_inline"/> at
<field name="company_currency" class="oe_inline" groups="base.group_multi_currency"/> at
<field name="probability" class="oe_inline" widget="integer"/>%% success rate
</h2>
</div>

View File

@ -8,7 +8,7 @@
<field name="model">wizard.document.page.history.show_diff</field>
<field name="arch" type="xml">
<form string="Difference" version="7.0">
<field name="diff" widget="html"/>
<field name="diff" widget="html" options='{"safe": true}'/>
<footer>
<button string="Cancel" class="oe_link" special="cancel" />
</footer>

390
addons/edi/i18n/ru.po Normal file
View File

@ -0,0 +1,390 @@
# Russian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
"PO-Revision-Date: 2012-09-10 15:12+0000\n"
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
"Language-Team: Russian <ru@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: edi
#: sql_constraint:res.currency:0
msgid "The currency code must be unique per company!"
msgstr "Код валюты должен быть уникальным в компании!"
#. module: edi
#: model:ir.model,name:edi.model_res_partner_address
msgid "Partner Addresses"
msgstr "Адреса контрагентов"
#. module: edi
#: sql_constraint:res.company:0
msgid "The company name must be unique !"
msgstr "Название компании должно быть уникальным!"
#. module: edi
#: constraint:res.partner:0
msgid "Error ! You cannot create recursive associated members."
msgstr "Ошибка! Вы не можете создавать рекурсивные ссылки на участников."
#. module: edi
#: field:edi.document,name:0
msgid "EDI token"
msgstr ""
#. module: edi
#: help:edi.document,name:0
msgid "Unique identifier for retrieving an EDI document."
msgstr ""
#. module: edi
#: constraint:res.company:0
msgid "Error! You can not create recursive companies."
msgstr "Ошибка ! Нельзя создать рекурсивные организации."
#. module: edi
#: model:ir.model,name:edi.model_res_company
msgid "Companies"
msgstr "Компании"
#. module: edi
#: sql_constraint:edi.document:0
msgid "EDI Tokens must be unique!"
msgstr ""
#. module: edi
#: model:ir.model,name:edi.model_res_currency
msgid "Currency"
msgstr "Валюта"
#. module: edi
#: code:addons/edi/models/edi.py:153
#, python-format
msgid ""
"The document you are trying to import requires the OpenERP `%s` application. "
"You can install it by connecting as the administrator and opening the "
"configuration assistant."
msgstr ""
#. module: edi
#: help:edi.document,document:0
msgid "EDI document content"
msgstr ""
#. module: edi
#: model:ir.model,name:edi.model_edi_document
msgid "EDI Document"
msgstr "EDI документ"
#. module: edi
#: code:addons/edi/models/edi.py:48
#, python-format
msgid "'%s' is an invalid external ID"
msgstr ""
#. module: edi
#: model:ir.model,name:edi.model_res_partner
msgid "Partner"
msgstr "Контрагент"
#. module: edi
#: code:addons/edi/models/edi.py:152
#, python-format
msgid "Missing Application"
msgstr "Отсутствие приложения"
#. module: edi
#: field:edi.document,document:0
msgid "Document"
msgstr "Документ"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:23
msgid "View/Print"
msgstr "Просмотр/Печать"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:28
msgid "Import this document"
msgstr "Импорт этого документа"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:33
msgid "Import it into an existing OpenERP instance"
msgstr "Импорт в существующую OpenERP"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:36
msgid "OpenERP instance address:"
msgstr "Адрес этой OpenERP:"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:39
msgid "Import"
msgstr "Импорт"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:44
msgid "Import it into a new OpenERP Online instance"
msgstr "Импорт в новый онлайн экземпляр OpenERP"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:47
msgid "Create my new OpenERP instance"
msgstr "Создать мой новый экземпляр OpenERP"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:52
msgid "Import into another application"
msgstr "Импорт в другое приложение"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:54
msgid ""
"OpenERP's Electronic Data Interchange documents are based on a generic and "
"language\n"
" independent"
msgstr ""
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:56
msgid "JSON"
msgstr "JSON"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:56
msgid ""
"serialization of the document's attribute.\n"
" It is usually very quick and straightforward to "
"create a small plug-in for your preferred\n"
" application that will be capable of importing "
"any OpenERP EDI document.\n"
" You can find out more details about how to do "
"this and what the content of OpenERP EDI documents\n"
" is like in the"
msgstr ""
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:60
msgid "OpenERP documentation"
msgstr "OpenERP документация"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:61
msgid "To get started immediately,"
msgstr "Чтобы приступить к работе немедленно,"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:62
msgid "see is all it takes to use this EDI document in Python"
msgstr ""
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:70
msgid "You can download the raw EDI document here:"
msgstr "Вы можете скачать исходный документ EDI здесь:"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:73
msgid "Download"
msgstr "Скачать"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:87
msgid "Powered by"
msgstr "На базе"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:87
msgid "OpenERP"
msgstr "OpenERP"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:34
msgid "Invoice"
msgstr "Счет"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:37
msgid "Description"
msgstr "Описание"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:38
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:41
msgid "Date"
msgstr "Дата"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:39
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:40
msgid "Your Reference"
msgstr "Ваша ссылка"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:50
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:57
msgid "Product Description"
msgstr "Описание товара"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:51
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:58
msgid "Quantity"
msgstr "Количество"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:52
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:59
msgid "Unit Price"
msgstr "Цена за ед."
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:53
msgid "Discount"
msgstr "Скидка"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:54
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:61
msgid "Price"
msgstr "Цена"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:72
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:81
msgid "Net Total:"
msgstr "Чистый итог:"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:83
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:92
msgid "Taxes:"
msgstr "Налоги:"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:94
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:103
msgid "Total:"
msgstr "Итого:"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:106
msgid "Tax"
msgstr "Налог"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:107
msgid "Base Amount"
msgstr "Базовая сумма"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:108
msgid "Amount"
msgstr "Сумма"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:121
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:113
msgid "Notes:"
msgstr "Примечания:"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:129
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:121
msgid "Pay Online"
msgstr "Оплата онлайн"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:133
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:125
msgid "Paypal"
msgstr "Paypal"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:135
msgid ""
"You may directly pay this invoice online via Paypal's secure payment gateway:"
msgstr ""
"Вы можете напрямую оплатить этот счет в режиме онлайн через безопасный "
"платежный шлюз PayPal:"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:145
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:137
msgid "Bank Wire Transfer"
msgstr "Банковский перевод"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:147
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:139
msgid "Please transfer"
msgstr "Пожалуйста, переведите"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:148
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:140
msgid "to"
msgstr ""
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:149
msgid ""
"(postal address on the invoice header)\n"
" using one of the following bank accounts. Be sure to "
"mention the invoice\n"
" reference"
msgstr ""
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:151
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:143
msgid "on the transfer:"
msgstr ""
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:36
msgid "Order"
msgstr "Заказ"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:42
msgid "Salesman"
msgstr "Менеджер продаж"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:43
msgid "Payment terms"
msgstr "Условия платежа"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:60
msgid "Discount(%)"
msgstr "Скидка ( %)"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:127
msgid ""
"You may directly pay this order online via Paypal's secure payment gateway:"
msgstr ""
"Вы можете напрямую оплатить этот заказ он-лайн через безопасный платежный "
"шлюз PayPal:"
#. openerp-web
#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:141
msgid ""
"(postal address on the order header)\n"
" using one of the following bank accounts. Be sure to "
"mention the document\n"
" reference"
msgstr ""

View File

@ -20,7 +20,7 @@
<field name="email_cc" readonly="1" attrs="{'invisible':[('email_cc','=',False)]}"/>
<field name="reply_to" readonly="1" attrs="{'invisible':[('reply_to','=',False)]}"/>
<field name="subject" readonly="1"/>
<field name="body_html" widget="html" readonly="1"/>
<field name="body_html" widget="html" readonly="1" options='{"safe": true}'/>
</group>
</form>
</field>

View File

@ -51,9 +51,11 @@ class mail_compose_message(osv.osv_memory):
context = {}
result = super(mail_compose_message, self).default_get(cr, uid, fields, context=context)
result['template_id'] = context.get('default_template_id', context.get('mail.compose.template_id', False))
# force html when using templates
# pre-render the template if any
if result.get('use_template'):
result['content_subtype'] = 'html'
onchange_res = self.onchange_use_template(cr, uid, [], result.get('use_template'), result.get('template_id'),
result.get('composition_mode'), result.get('model'), result.get('res_id'), context=context)
result.update(onchange_res['value'])
return result
_columns = {

View File

@ -11,14 +11,14 @@
<xpath expr="//form/footer/button" position="before">
<field name="use_template" invisible="1"/>
<button icon="gtk-paste" type="object" name="toggle_template"
string="" help="Use a message template" />
string="" help="Use a message template" invisible="1"/>
<button icon="gtk-save" type="object" name="save_as_template"
string="" help="Save as a new template"/>
string="" help="Save as a new template" invisible="1"/>
</xpath>
<xpath expr="//form/notebook" position="after">
<group attrs="{'invisible':[('use_template','=',False)]}" colspan="4" col="4">
<field name="use_template" invisible="1"/>
<field name="template_id" colspan="3"
<field name="template_id" colspan="3" invisible="1"
on_change="onchange_template_id(use_template, template_id, composition_mode, model, res_id, context)"/>
</group>
</xpath>

View File

@ -180,17 +180,16 @@ class hr_employee(osv.osv):
'resource_id': fields.many2one('resource.resource', 'Resource', ondelete='cascade', required=True),
'coach_id': fields.many2one('hr.employee', 'Coach'),
'job_id': fields.many2one('hr.job', 'Job'),
# image: all image fields are base64 encoded and PIL-supported
'image': fields.binary("Photo",
help="This field holds the image used as a photo for the "\
"employee. The image is base64 encoded, and PIL-supported. "\
"It is limited to a 1024x1024 px image."),
help="This field holds the image used as photo for the employee, limited to 1024x1024px."),
'image_medium': fields.function(_get_image, fnct_inv=_set_image,
string="Medium-sized photo", type="binary", multi="_get_image",
store = {
'hr.employee': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Medium-sized photo of the employee. It is automatically "\
"resized as a 180x180 px image, with aspect ratio preserved. "\
"resized as a 128x128px image, with aspect ratio preserved. "\
"Use this field in form views or some kanban views."),
'image_small': fields.function(_get_image, fnct_inv=_set_image,
string="Smal-sized photo", type="binary", multi="_get_image",
@ -198,7 +197,7 @@ class hr_employee(osv.osv):
'hr.employee': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Small-sized photo of the employee. It is automatically "\
"resized as a 50x50 px image, with aspect ratio preserved. "\
"resized as a 64x64px image, with aspect ratio preserved. "\
"Use this field anywhere a small image is required."),
'passport_id':fields.char('Passport No', size=64),
'color': fields.integer('Color Index'),
@ -290,8 +289,12 @@ class hr_department(osv.osv):
'member_ids': fields.one2many('hr.employee', 'department_id', 'Members', readonly=True),
}
hr_department()
def copy(self, cr, uid, ids, default=None, context=None):
if default is None:
default = {}
default = default.copy()
default['member_ids'] = []
return super(hr_department, self).copy(cr, uid, ids, default, context=context)
class res_users(osv.osv):
_name = 'res.users'

View File

@ -2,13 +2,19 @@
<openerp>
<data noupdate="1">
<record model="res.groups" id="base.group_user">
<field name="comment">the user will be able to manage his own human resources stuff (leave request, timesheets, ...), if he is linked to an employee in the system.</field>
</record>
<record id="base.group_hr_user" model="res.groups">
<field name="name">Officer</field>
<field name="category_id" ref="base.module_category_human_resources"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="comment">the user will be able to approve document created by employees.</field>
</record>
<record id="base.group_hr_manager" model="res.groups">
<field name="name">Manager</field>
<field name="comment">the user will have an access to the human resources configuration as well as statistic reports.</field>
<field name="category_id" ref="base.module_category_human_resources"/>
<field name="implied_ids" eval="[(4, ref('base.group_hr_user'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>

View File

@ -0,0 +1,576 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-09-10 13:06+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: hr_attendance
#: model:ir.ui.menu,name:hr_attendance.menu_hr_time_tracking
msgid "Time Tracking"
msgstr "Tid Sporing"
#. module: hr_attendance
#: view:hr.attendance:0
msgid "Group By..."
msgstr "Grupper etter ..."
#. module: hr_attendance
#: view:hr.attendance:0
msgid "Today"
msgstr "I dag"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "March"
msgstr "Mars"
#. module: hr_attendance
#: view:hr.sign.in.out.ask:0
msgid ""
"You did not sign out the last time. Please enter the date and time you "
"signed out."
msgstr ""
"Du logget ikke ut siste gang. Vennligst skriv inn datoen og klokkeslettet du "
"logget ut."
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid "Total period:"
msgstr "Total periode:"
#. module: hr_attendance
#: field:hr.action.reason,name:0
msgid "Reason"
msgstr "Grunn"
#. module: hr_attendance
#: view:hr.attendance.error:0
msgid "Print Attendance Report Error"
msgstr "Skriv ut Oppmøte Rapporter Feil."
#. module: hr_attendance
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:161
#, python-format
msgid "The sign-out date must be in the past"
msgstr "Logg - ut må være i fortiden."
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid "Date Signed"
msgstr "Signeringsdato"
#. module: hr_attendance
#: model:ir.actions.act_window,help:hr_attendance.open_view_attendance
msgid ""
"The Time Tracking functionality aims to manage employee attendances from "
"Sign in/Sign out actions. You can also link this feature to an attendance "
"device using OpenERP's web service features."
msgstr ""
"Tid Sporing funksjonalitet mål er å forvalte de ansattes tilskuertall fra "
"Logg inn / Logg ut handlinger. Du kan også koble denne funksjonen til en "
"frammøte enheten ved hjelp OpenERP web-service funksjoner."
#. module: hr_attendance
#: view:hr.action.reason:0
msgid "Attendance reasons"
msgstr "Oppmøte grunner"
#. module: hr_attendance
#: view:hr.attendance:0
#: field:hr.attendance,day:0
msgid "Day"
msgstr "Dag"
#. module: hr_attendance
#: selection:hr.employee,state:0
msgid "Present"
msgstr "Presentere"
#. module: hr_attendance
#: model:ir.model,name:hr_attendance.model_hr_sign_in_out_ask
msgid "Ask for Sign In Out"
msgstr "Spør for pålogging ut."
#. module: hr_attendance
#: field:hr.attendance,action_desc:0
#: model:ir.model,name:hr_attendance.model_hr_action_reason
msgid "Action Reason"
msgstr "Handling grunn."
#. module: hr_attendance
#: view:hr.sign.in.out:0
msgid "Ok"
msgstr "Ok"
#. module: hr_attendance
#: view:hr.action.reason:0
msgid "Define attendance reason"
msgstr "Definer frammøte grunn."
#. module: hr_attendance
#: code:addons/hr_attendance/report/attendance_by_month.py:184
#: model:ir.actions.act_window,name:hr_attendance.action_hr_attendance_month
#, python-format
msgid "Attendances By Month"
msgstr "Tilskuertall Pr.mnd"
#. module: hr_attendance
#: field:hr.sign.in.out,name:0
#: field:hr.sign.in.out.ask,name:0
msgid "Employees name"
msgstr "Ansattnavn"
#. module: hr_attendance
#: model:ir.actions.act_window,name:hr_attendance.open_view_attendance_reason
#: model:ir.ui.menu,name:hr_attendance.menu_open_view_attendance_reason
msgid "Attendance Reasons"
msgstr "Oppmøte grunner"
#. module: hr_attendance
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:161
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:167
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:174
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:179
#, python-format
msgid "UserError"
msgstr "Brukerfeil"
#. module: hr_attendance
#: field:hr.attendance.error,end_date:0
#: field:hr.attendance.week,end_date:0
msgid "Ending Date"
msgstr "Sluttdato"
#. module: hr_attendance
#: code:addons/hr_attendance/hr_attendance.py:140
#, python-format
msgid "Warning"
msgstr "Advarsel"
#. module: hr_attendance
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:174
#, python-format
msgid "The Sign-in date must be in the past"
msgstr "Logg inn dato må være i fortiden."
#. module: hr_attendance
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:167
#, python-format
msgid "A sign-in must be right after a sign-out !"
msgstr "En pålogging må være rett etter en logg ut!"
#. module: hr_attendance
#: field:hr.employee,state:0
#: model:ir.model,name:hr_attendance.model_hr_attendance
msgid "Attendance"
msgstr "Oppmøte"
#. module: hr_attendance
#: field:hr.attendance.error,max_delay:0
msgid "Max. Delay (Min)"
msgstr "Maks. Forsinkelse (Min)"
#. module: hr_attendance
#: view:hr.attendance.error:0
#: view:hr.attendance.month:0
#: view:hr.attendance.week:0
msgid "Print"
msgstr "Skriv ut"
#. module: hr_attendance
#: view:hr.attendance:0
msgid "Hr Attendance Search"
msgstr "Hr Oppmøte Søk."
#. module: hr_attendance
#: model:ir.actions.act_window,name:hr_attendance.action_hr_attendance_week
msgid "Attendances By Week"
msgstr "Tilskuertall etter uke."
#. module: hr_attendance
#: constraint:hr.attendance:0
msgid "Error: Sign in (resp. Sign out) must follow Sign out (resp. Sign in)"
msgstr "Feil: Logg på (hhv. Logg ut) må følge Logg ut (hhv. Logg inn)"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "July"
msgstr "juli"
#. module: hr_attendance
#: model:ir.actions.act_window,name:hr_attendance.action_hr_attendance_error
#: model:ir.actions.report.xml,name:hr_attendance.attendance_error_report
msgid "Attendance Error Report"
msgstr "Oppmøte Feilrapport"
#. module: hr_attendance
#: field:hr.attendance.error,init_date:0
#: field:hr.attendance.week,init_date:0
msgid "Starting Date"
msgstr "Startdato"
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid "Min Delay"
msgstr "Minimum forsinkelse."
#. module: hr_attendance
#: selection:hr.attendance,action:0
#: view:hr.employee:0
msgid "Sign In"
msgstr "Logg Inn"
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid "Operation"
msgstr "Handling"
#. module: hr_attendance
#: code:addons/hr_attendance/wizard/hr_attendance_error.py:49
#, python-format
msgid "No Data Available"
msgstr "Ingen informasjon tilgjengelig"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "September"
msgstr "September"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "December"
msgstr "Desember"
#. module: hr_attendance
#: field:hr.attendance.month,month:0
msgid "Month"
msgstr "Måned"
#. module: hr_attendance
#: field:hr.action.reason,action_type:0
msgid "Action Type"
msgstr "Handlingstype"
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid ""
"(*) A negative delay means that the employee worked more than encoded."
msgstr ""
"(*) En negativ forsinkelse innebærer at arbeidstakeren jobbet mer enn kodet."
#. module: hr_attendance
#: view:hr.attendance:0
msgid "My Attendance"
msgstr "Min Oppmøte"
#. module: hr_attendance
#: help:hr.attendance,action_desc:0
msgid ""
"Specifies the reason for Signing In/Signing Out in case of extra hours."
msgstr "Angir årsaken til pålogging / logge ut I tilfelle ekstra timer."
#. module: hr_attendance
#: model:ir.model,name:hr_attendance.model_hr_attendance_month
msgid "Print Monthly Attendance Report"
msgstr "Skriv ut månedlig Oppmøte Rapporter."
#. module: hr_attendance
#: model:ir.model,name:hr_attendance.model_hr_sign_in_out
msgid "Sign In Sign Out"
msgstr "Logg inn - Logg ut"
#. module: hr_attendance
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:105
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:129
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:146
#: view:hr.sign.in.out:0
#: model:ir.actions.act_window,name:hr_attendance.action_hr_attendance_sigh_in_out
#: model:ir.ui.menu,name:hr_attendance.menu_hr_attendance_sigh_in_out
#, python-format
msgid "Sign in / Sign out"
msgstr "Logg inn / Logg ut"
#. module: hr_attendance
#: view:hr.sign.in.out.ask:0
msgid "hr.sign.out.ask"
msgstr "hr.signere.ut.spør."
#. module: hr_attendance
#: view:hr.attendance.week:0
msgid "Print Attendance Report Weekly"
msgstr "Skriv ut Oppmøte Rapporter Ukentlig."
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "August"
msgstr "August"
#. module: hr_attendance
#: code:addons/hr_attendance/wizard/hr_attendance_sign_in_out.py:179
#, python-format
msgid "A sign-out must be right after a sign-in !"
msgstr "Et logg-ut må være rett etter en logg - inn!"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "June"
msgstr "Juni"
#. module: hr_attendance
#: model:ir.model,name:hr_attendance.model_hr_attendance_error
msgid "Print Error Attendance Report"
msgstr "Print Feil Oppmøte Rapporter."
#. module: hr_attendance
#: field:hr.attendance,name:0
msgid "Date"
msgstr "Dato"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "November"
msgstr "November"
#. module: hr_attendance
#: constraint:hr.employee:0
msgid "Error ! You cannot create recursive Hierarchy of Employees."
msgstr "Feil! Du kan ikke opprette rekursiv Hierarki av ansatte."
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "October"
msgstr "Oktober"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "January"
msgstr "Januar"
#. module: hr_attendance
#: selection:hr.action.reason,action_type:0
#: view:hr.sign.in.out:0
#: view:hr.sign.in.out.ask:0
msgid "Sign in"
msgstr "Logg inn"
#. module: hr_attendance
#: view:hr.attendance.error:0
msgid "Analysis Information"
msgstr "Analyse Informasjon."
#. module: hr_attendance
#: view:hr.sign.in.out:0
msgid "Sign-out Entry Must Follow Sign-in."
msgstr ""
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid "Attendance Errors"
msgstr "Oppmøte feil"
#. module: hr_attendance
#: field:hr.attendance,action:0
#: selection:hr.attendance,action:0
msgid "Action"
msgstr "Handling"
#. module: hr_attendance
#: view:hr.sign.in.out:0
msgid ""
"If you need your staff to sign in when they arrive at work and sign out "
"again at the end of the day, OpenERP allows you to manage this with this "
"tool. If each employee has been linked to a system user, then they can "
"encode their time with this action button."
msgstr ""
"Hvis du trenger dine ansatte til å logge på når de kommer på jobb og logge "
"ut igjen på slutten av dagen, kan OpenERP tillate deg å administrere dette "
"med dette verktøyet. Hvis hver ansatt har vært knyttet til et system bruker, "
"så de kan kode sin tid med denne handlingen knappen."
#. module: hr_attendance
#: model:ir.model,name:hr_attendance.model_hr_attendance_week
msgid "Print Week Attendance Report"
msgstr "Skriv Ut Uke Oppmøte Rapporter."
#. module: hr_attendance
#: field:hr.sign.in.out,emp_id:0
#: field:hr.sign.in.out.ask,emp_id:0
msgid "Empoyee ID"
msgstr "Ansatt ID"
#. module: hr_attendance
#: view:hr.attendance.error:0
#: view:hr.attendance.month:0
#: view:hr.attendance.week:0
#: view:hr.sign.in.out:0
#: view:hr.sign.in.out.ask:0
msgid "Cancel"
msgstr "Avbryt"
#. module: hr_attendance
#: help:hr.action.reason,name:0
msgid "Specifies the reason for Signing In/Signing Out."
msgstr "Angir årsaken til pålogging / logger av."
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid ""
"(*) A positive delay means that the employee worked less than recorded."
msgstr ""
"(*) En positiv forsinkelse innebærer at arbeidstakeren jobbet mindre enn "
"registrert."
#. module: hr_attendance
#: view:hr.attendance.month:0
msgid "Print Attendance Report Monthly"
msgstr "Skriv ut Oppmøte Rapporter Månedlig."
#. module: hr_attendance
#: selection:hr.action.reason,action_type:0
#: view:hr.sign.in.out:0
#: view:hr.sign.in.out.ask:0
msgid "Sign out"
msgstr "Logg av"
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid "Delay"
msgstr "Forsinkelse"
#. module: hr_attendance
#: view:hr.attendance:0
#: model:ir.model,name:hr_attendance.model_hr_employee
msgid "Employee"
msgstr "Ansatt"
#. module: hr_attendance
#: code:addons/hr_attendance/hr_attendance.py:140
#, python-format
msgid ""
"You tried to %s with a date anterior to another event !\n"
"Try to contact the administrator to correct attendances."
msgstr ""
"Du prøvde å% s med en dato fremre til en annen hendelse!\n"
"Prøv å kontakte administrator for å rette tilskuertall."
#. module: hr_attendance
#: view:hr.sign.in.out.ask:0
#: field:hr.sign.in.out.ask,last_time:0
msgid "Your last sign out"
msgstr "Din siste Logg ut."
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid "Date Recorded"
msgstr "Dato Innspilt"
#. module: hr_attendance
#: model:ir.actions.act_window,name:hr_attendance.open_view_attendance
#: model:ir.ui.menu,name:hr_attendance.menu_hr_attendance
#: model:ir.ui.menu,name:hr_attendance.menu_open_view_attendance
msgid "Attendances"
msgstr "Tilskuertall"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "May"
msgstr "Mai"
#. module: hr_attendance
#: view:hr.sign.in.out.ask:0
msgid "Your last sign in"
msgstr "Din siste logg inn."
#. module: hr_attendance
#: selection:hr.attendance,action:0
#: view:hr.employee:0
msgid "Sign Out"
msgstr "Logg Ut"
#. module: hr_attendance
#: model:ir.actions.act_window,help:hr_attendance.action_hr_attendance_sigh_in_out
msgid ""
"Sign in / Sign out. In some companies, staff have to sign in when they "
"arrive at work and sign out again at the end of the day. If each employee "
"has been linked to a system user, then they can encode their time with this "
"action button."
msgstr ""
"Logg inn / Logg ut. I noen bedrifter, ansatte må logge inn når de kommer på "
"jobb og Logg ut igjen på slutten av dagen. Hvis hver ansatt har vært knyttet "
"til et system bruker, så de kan kode sin tid med denne handlingen knappen."
#. module: hr_attendance
#: field:hr.attendance,employee_id:0
msgid "Employee's Name"
msgstr "Ansatte's navn."
#. module: hr_attendance
#: selection:hr.employee,state:0
msgid "Absent"
msgstr "Fraværende"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "February"
msgstr "Februar"
#. module: hr_attendance
#: view:hr.attendance:0
msgid "Employee attendances"
msgstr "Ansattes tilskuertall"
#. module: hr_attendance
#: field:hr.sign.in.out,state:0
msgid "Current state"
msgstr "Nåværende tilstand."
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
msgid "April"
msgstr "April"
#. module: hr_attendance
#: view:hr.attendance.error:0
msgid "Bellow this delay, the error is considered to be voluntary"
msgstr "Under denne forsinkelsen, er feilen anses å være frivillig."
#. module: hr_attendance
#: code:addons/hr_attendance/wizard/hr_attendance_error.py:49
#, python-format
msgid "No records found for your selection!"
msgstr "Ingen rader funnet med angitt utvalg!"
#. module: hr_attendance
#: view:hr.sign.in.out.ask:0
msgid ""
"You did not sign in the last time. Please enter the date and time you signed "
"in."
msgstr ""
"Du hadde ikke logget ut siste gang. Vennligst skriv inn datoen og "
"klokkeslettet du logget."
#. module: hr_attendance
#: field:hr.attendance.month,year:0
msgid "Year"
msgstr "År"
#. module: hr_attendance
#: view:hr.sign.in.out.ask:0
msgid "hr.sign.in.out.ask"
msgstr "hr.Logg.i.ut.spør"
#~ msgid "Sign-Out Entry must follow Sign-In."
#~ msgstr "Logg ut Entry må følge pålogging."

View File

@ -29,7 +29,7 @@ openerp.hr_attendance = function (instance) {
title: function() {
var last_text = instance.web.format_value(self.last_sign, {type: "datetime"});
var current_text = instance.web.format_value(new Date(), {type: "datetime"});
var duration = $.timeago(self.last_sign);
var duration = self.last_sign ? $.timeago(self.last_sign) : "none";
if (self.get("signed_in")) {
return _.str.sprintf(_t("Last sign in: %s,<br />%s.<br />Click to sign out."), last_text, duration);
} else {

View File

@ -17,7 +17,7 @@
<field name="inherit_id" ref="hr.board_hr_form"/>
<field name="arch" type="xml">
<xpath expr="/form/board/column[1]" position="inside">
<action name="%(action_my_expense)d" string="My Expenses" creatable="true"/>
<action name="%(action_my_expense)d" string="My Expenses"/>
</xpath>
</field>
</record>

View File

@ -52,6 +52,7 @@
partner_name: 'John Bruno'
state: 'done'
job_id: hr.job_developer
color: 5
stage_id: stage_job5
name: 'Marketing Job'
-
@ -100,6 +101,9 @@
partner_name: 'David Armstrong'
job_id: hr.job_developer
stage_id: stage_job2
color: 4
name: 'Advertisement'
salary_expected: 11000.0
-
!record {model: hr.job, id: hr.job_developer}:
survey_id: hr_recruitment.survey_job_0

View File

@ -115,13 +115,13 @@
<sheet>
<div class="oe_right oe_button_box">
<button name="action_makeMeeting" type="object"
string="Schedule Interview" icon="gtk-index" help="Schedule interview with this applicant"/>
string="Schedule Meeting" help="Schedule interview with this applicant"/>
<button name="%(survey.action_view_survey_question_message)d" type="action"
string="Start Interview" icon="gtk-execute" help="Answer related job question"
string="Start Interview" help="Answer related job question"
context="{'survey_id': survey, 'response_id': [response], 'response_no':0 ,'active' : response, 'object' : 'hr.applicant'}"
attrs="{'invisible':[('survey','=',False)]}"/>
<button name="action_print_survey" type="object"
string="Print Interview" icon="gtk-print" help="Print interview report"
string="Print Interview" help="Print interview report"
attrs="{'invisible':[('survey','=',False)]}"/>
</div>
<div class="oe_title">
@ -208,28 +208,28 @@
<field name="arch" type="xml">
<search string="Search Jobs">
<field name="partner_name" filter_domain="['|','|',('name','ilike',self),('partner_name','ilike',self),('email_from','ilike',self)]" string="Subject / Applicant"/>
<filter icon="terp-mail-message-new" string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<filter string="Inbox" help="Unread messages" name="message_unread" domain="[('message_unread','=',True)]"/>
<separator/>
<filter icon="terp-document-new" string="New" domain="[('state','=','draft')]" help="All Initial Jobs"/>
<filter icon="terp-camera_test" string="In Progress" domain="[('state','=','open')]" help="Open Jobs"/>
<filter icon="terp-gtk-media-pause" string="Pending" domain="[('state','=','pending')]" help="Pending Jobs"/>
<filter string="New" domain="[('state','=','draft')]" help="All Initial Jobs"/>
<filter string="In Progress" domain="[('state','=','open')]" help="Open Jobs"/>
<filter string="Pending" domain="[('state','=','pending')]" help="Pending Jobs"/>
<separator/>
<filter string="Unassigned Recruitments" domain="[('user_id','=',False)]" help="Unassigned Recruitments" icon="terp-personal-"/>
<filter string="Unassigned Recruitments" domain="[('user_id','=',False)]" help="Unassigned Recruitments"/>
<separator/>
<filter icon="terp-gtk-jump-to-ltr" string="Next Actions" context="{'invisible_next_action':False, 'invisible_next_date':False}"
<filter string="Next Actions" context="{'invisible_next_action':False, 'invisible_next_date':False}"
domain="[('date_action','&lt;&gt;',False)]" help="Filter and view on next actions and date"/>
<field name="job_id"/>
<field name="user_id"/>
<group expand="0" string="Group By...">
<filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id'}"/>
<filter string="Job" icon="terp-gtk-select-all" domain="[]" context="{'group_by':'job_id'}"/>
<filter string="Degree" icon="terp-gtk-select-all" domain="[]" context="{'group_by':'type_id'}"/>
<filter string="Availability" icon="terp-camera_test" domain="[]" context="{'group_by':'availability'}"/>
<filter string="Appreciation" icon="terp-face-plain" domain="[]" context="{'group_by':'priority'}"/>
<filter string="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/>
<filter string="Source" icon="terp-face-plain" domain="[]" context="{'group_by':'source_id'}"/>
<filter string="Creation Date" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}" groups="base.group_no_one"/>
<filter string="Responsible" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Department" domain="[]" context="{'group_by':'department_id'}"/>
<filter string="Job" domain="[]" context="{'group_by':'job_id'}"/>
<filter string="Degree" domain="[]" context="{'group_by':'type_id'}"/>
<filter string="Availability" domain="[]" context="{'group_by':'availability'}"/>
<filter string="Appreciation" domain="[]" context="{'group_by':'priority'}"/>
<filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/>
<filter string="Source" domain="[]" context="{'group_by':'source_id'}"/>
<filter string="Creation Date" domain="[]" context="{'group_by':'create_date'}" groups="base.group_no_one"/>
</group>
</search>
</field>
@ -339,7 +339,7 @@
<div groups="base.group_user">
<field name="survey_id" class="oe_inline"/>
<button class="oe_inline"
string="Interview" icon="gtk-print"
string="Interview"
name="action_print_survey" type="object"
attrs="{'invisible':[('survey_id','=',False)]}"/>
</div>

View File

@ -0,0 +1,226 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-09-09 16:36+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-10 04:41+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: import_google
#: help:synchronize.google.import,group_name:0
msgid "Choose which group to import, By default it takes all."
msgstr "Velg hvilken gruppe du vil importere, standard tar alt."
#. module: import_google
#: view:synchronize.google.import:0
msgid "Import Google Calendar Events"
msgstr "Importer Google Kalender Hendelser."
#. module: import_google
#: view:synchronize.google.import:0
msgid "_Import Events"
msgstr "_Importer hendelser."
#. module: import_google
#: code:addons/import_google/wizard/import_google_data.py:71
#, python-format
msgid ""
"No Google Username or password Defined for user.\n"
"Please define in user view"
msgstr ""
"Ingen Google-brukernavn eller passord definert for brukeren.\n"
"Vennligst angi i brukerens visning."
#. module: import_google
#: code:addons/import_google/wizard/import_google_data.py:127
#, python-format
msgid ""
"Invalid login detail !\n"
" Specify Username/Password."
msgstr ""
"Ugyldig pålogging detalj!\n"
"  Angi brukernavn / passord."
#. module: import_google
#: field:synchronize.google.import,supplier:0
msgid "Supplier"
msgstr "Leverandør"
#. module: import_google
#: view:synchronize.google.import:0
msgid "Import Options"
msgstr "Alternativer for import"
#. module: import_google
#: field:synchronize.google.import,group_name:0
msgid "Group Name"
msgstr "Gruppe Navn"
#. module: import_google
#: model:ir.model,name:import_google.model_crm_case_categ
msgid "Category of Case"
msgstr "Kategori for hendelse"
#. module: import_google
#: model:ir.actions.act_window,name:import_google.act_google_login_contact_form
#: model:ir.ui.menu,name:import_google.menu_sync_contact
msgid "Import Google Contacts"
msgstr "Importer Google kontakter."
#. module: import_google
#: view:google.import.message:0
msgid "Import Google Data"
msgstr "Importer Google data."
#. module: import_google
#: view:crm.meeting:0
msgid "Meeting Type"
msgstr "Møtetype"
#. module: import_google
#: code:addons/import_google/wizard/import_google.py:38
#: code:addons/import_google/wizard/import_google_data.py:28
#, python-format
msgid ""
"Please install gdata-python-client from http://code.google.com/p/gdata-"
"python-client/downloads/list"
msgstr ""
"Vennligst Installer gdata-python-client from http://code.google.com/p/gdata-"
"python-client/downloads/list"
#. module: import_google
#: model:ir.model,name:import_google.model_google_login
msgid "Google Contact"
msgstr "Google kontakt"
#. module: import_google
#: view:synchronize.google.import:0
msgid "Import contacts from a google account"
msgstr "Importer kontakter fra en Google-konto"
#. module: import_google
#: code:addons/import_google/wizard/import_google_data.py:133
#, python-format
msgid "Please specify correct user and password !"
msgstr "Vennligst oppgi riktig bruker og passord!"
#. module: import_google
#: field:synchronize.google.import,customer:0
msgid "Customer"
msgstr "Kunde"
#. module: import_google
#: view:synchronize.google.import:0
msgid "_Cancel"
msgstr "_Avbryt"
#. module: import_google
#: model:ir.model,name:import_google.model_synchronize_google_import
msgid "synchronize.google.import"
msgstr "Synkronisere.google.import"
#. module: import_google
#: view:synchronize.google.import:0
msgid "_Import Contacts"
msgstr "_Importer kontakter."
#. module: import_google
#: model:ir.actions.act_window,name:import_google.act_google_login_form
#: model:ir.ui.menu,name:import_google.menu_sync_calendar
msgid "Import Google Calendar"
msgstr "Importer Google kalender."
#. module: import_google
#: code:addons/import_google/wizard/import_google_data.py:50
#, python-format
msgid "Import google"
msgstr "Importer Google."
#. module: import_google
#: code:addons/import_google/wizard/import_google_data.py:127
#: code:addons/import_google/wizard/import_google_data.py:133
#, python-format
msgid "Error"
msgstr "Feil"
#. module: import_google
#: code:addons/import_google/wizard/import_google_data.py:71
#, python-format
msgid "Warning !"
msgstr "Advarsel !"
#. module: import_google
#: field:synchronize.google.import,create_partner:0
msgid "Options"
msgstr "Valg"
#. module: import_google
#: view:google.import.message:0
msgid "_Ok"
msgstr "_Ok"
#. module: import_google
#: code:addons/import_google/wizard/import_google.py:38
#: code:addons/import_google/wizard/import_google_data.py:28
#, python-format
msgid "Google Contacts Import Error!"
msgstr "Google kontakter Import Feil!"
#. module: import_google
#: model:ir.model,name:import_google.model_google_import_message
msgid "Import Message"
msgstr "Importer melding."
#. module: import_google
#: field:synchronize.google.import,calendar_name:0
msgid "Calendar Name"
msgstr "Kalendernavn"
#. module: import_google
#: help:synchronize.google.import,supplier:0
msgid "Check this box to set newly created partner as Supplier."
msgstr "Kryss av for å sette nyopprettede partner som leverandør."
#. module: import_google
#: selection:synchronize.google.import,create_partner:0
msgid "Import only address"
msgstr "Importer bare adresse."
#. module: import_google
#: field:crm.case.categ,user_id:0
msgid "User"
msgstr "Bruker"
#. module: import_google
#: view:synchronize.google.import:0
msgid "Partner Status for this Group:"
msgstr ""
#. module: import_google
#: field:google.import.message,name:0
msgid "Message"
msgstr "Melding"
#. module: import_google
#: selection:synchronize.google.import,create_partner:0
msgid "Create partner for each contact"
msgstr "Opprett partner for hver kontakt."
#. module: import_google
#: help:synchronize.google.import,customer:0
msgid "Check this box to set newly created partner as Customer."
msgstr "Kryss av for å sette nyopprettede partner som Kunden."
#~ msgid "Partner status for this group:"
#~ msgstr "Partner status for denne gruppen."

View File

@ -6,7 +6,6 @@
<record id="chart0_en" model="account.account.template">
<field name="code">0</field>
<field name="name">Account Chart CA EN</field>
<field eval="0" name="parent_id"/>
<field name="type">view</field>
<field name="user_type" ref="account.data_account_type_view"/>
</record>

128
addons/l10n_ca/i18n/nb.po Normal file
View File

@ -0,0 +1,128 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-08-02 21:08+0000\n"
"PO-Revision-Date: 2012-09-09 16:43+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-10 04:41+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_receivable
msgid "Receivable"
msgstr "Fordring"
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.acct_type_asset_view
msgid "Asset View"
msgstr "Eiendel Vis"
#. module: l10n_ca
#: model:ir.module.module,description:l10n_ca.module_meta_information
msgid ""
"This is the module to manage the canadian accounting chart in OpenERP."
msgstr ""
"Dette er modulen for å administrere kanadiske regnskap diagrammet i OpenERP."
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.acct_type_expense_view
msgid "Expense View"
msgstr "Kostnad Vis"
#. module: l10n_ca
#: constraint:account.account.template:0
msgid "Error ! You can not create recursive account templates."
msgstr "Feil ! Du kan ikke opprette rekursive konto maler."
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.acct_type_income_view
msgid "Income View"
msgstr "Inntekt Vis"
#. module: l10n_ca
#: model:ir.module.module,shortdesc:l10n_ca.module_meta_information
msgid "Canada - Chart of Accounts"
msgstr "Canada - Kontoplan"
#. module: l10n_ca
#: constraint:account.account.type:0
msgid "Error ! You can not create recursive types."
msgstr "Feil ! Du kan ikke opprette rekursive typer."
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_tax
msgid "Tax"
msgstr "Skatt"
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_cash
msgid "Cash"
msgstr "Kontant"
#. module: l10n_ca
#: model:ir.actions.todo,note:l10n_ca.config_call_account_template_ca
msgid ""
"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
"the name of the company, the chart template to follow, the no. of digits to "
"generate the code for your accounts and Bank account, currency to create "
"Journals. Thus,the pure copy of chart Template is generated.\n"
"\tThis is the same wizard that runs from Financial "
"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
"Chart of Accounts from a Chart Template."
msgstr ""
"Generere Kontoplan fra en diagrammal. Du vil bli bedt om å passere navnet på "
"selskapet, diagrammal til følge, nei. sifre som skal generere koden for "
"kontoene og bankkonto, valuta å skape Journals. Dermed er den rene kopi av "
"diagrammal generert.\n"
"\t Dette er den samme veiviser som går fra økonomistyring / konfigurasjon / "
"finansiell Regnskap / finansregnskapet / Generer Kontoplan fra en diagrammal."
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_payable
msgid "Payable"
msgstr "Utgift"
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_asset
msgid "Asset"
msgstr "Eiendel"
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_equity
msgid "Equity"
msgstr "Egenkapital"
#. module: l10n_ca
#: constraint:account.tax.code.template:0
msgid "Error ! You can not create recursive Tax Codes."
msgstr "Feil ! Du kan ikke opprette rekursive skatte koder."
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.acct_type_liability_view
msgid "Liability View"
msgstr "Ansvar Vis."
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_expense
msgid "Expense"
msgstr "Utgift"
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_income
msgid "Income"
msgstr "Inntekt"
#. module: l10n_ca
#: model:account.account.type,name:l10n_ca.account_type_view
msgid "View"
msgstr "Vis"

View File

@ -7,7 +7,6 @@
<record id="chartgr_0" model="account.account.template">
<field name="code">0</field>
<field name="name">Γενικό Λογιστικό Σχέδιο</field>
<!--<field eval="0" name="parent_id"/> -->
<field name="type">view</field>
<field name="user_type" ref="account_type_view"/>
</record>

View File

@ -7,7 +7,6 @@
<record id="plan_raiz" model="account.account.template">
<field name="code">-</field>
<field name="name">Plan contable de Guatemala (sencillo)</field>
<field eval="0" name="parent_id"/>
<field name="type">view</field>
<field name="user_type" ref="cuenta_vista"/>
</record>

View File

@ -7,7 +7,6 @@
<record id="plan_raiz" model="account.account.template">
<field name="code">-</field>
<field name="name">Plan contable de Honduras (sencillo)</field>
<field eval="0" name="parent_id"/>
<field name="type">view</field>
<field name="user_type" ref="cuenta_vista"/>
</record>

View File

@ -8,7 +8,6 @@
<field name="name">Partnership/Private Firm Chart of Account</field>
<field name="code">0</field>
<field name="type">view</field>
<field eval="0" name="parent_id"/>
<field name="user_type" ref="account.data_account_type_view"/>
<field name="reconcile" eval="False"/>
</record>
@ -520,4 +519,4 @@
</data>
</openerp>
</openerp>

View File

@ -9,7 +9,6 @@
<field name="name">Public Firm Chart of Account</field>
<field name="code">0</field>
<field name="type">view</field>
<field eval="0" name="parent_id"/>
<field name="user_type" ref="account.data_account_type_view"/>
<field name="reconcile" eval="False"/>
</record>
@ -673,4 +672,4 @@
</record>
</data>
</openerp>
</openerp>

View File

@ -26,7 +26,6 @@
<record id="a_root" model="account.account.template">
<field name="code">0</field>
<field name="name">Simple chart of accounts</field>
<field name="parent_id" eval="False"/>
<field name="type">view</field>
<field name="user_type" ref="acc_type_view"/>
</record>

52
addons/l10n_th/i18n/nb.po Normal file
View File

@ -0,0 +1,52 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2011-12-23 09:56+0000\n"
"PO-Revision-Date: 2012-09-09 16:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-10 04:41+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: l10n_th
#: model:ir.actions.todo,note:l10n_th.config_call_account_template_th
msgid ""
"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
"the name of the company, the chart template to follow, the no. of digits to "
"generate the code for your accounts and Bank account, currency to create "
"Journals. Thus,the pure copy of chart Template is generated.\n"
"This is the same wizard that runs from Financial "
"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
"Chart of Accounts from a Chart Template."
msgstr ""
"Generere Kontoplan fra en diagrammal. Du vil bli bedt om å passere navnet på "
"selskapet, diagrammal til følge, nei. Sifre som skal generere koden for "
"kontoene og bankkonto, valuta å skape Journals. Dermed er den rene kopi av "
"diagrammal generert.\n"
"Dette er den samme veiviser som går fra økonomistyring / Configuration / "
"Financial Accounting / finansregnskapet / Generer Kontoplan fra en "
"diagrammal."
#. module: l10n_th
#: model:account.account.type,name:l10n_th.acc_type_other
msgid "Other"
msgstr "Annet"
#. module: l10n_th
#: model:account.account.type,name:l10n_th.acc_type_reconciled
msgid "Reconciled"
msgstr "Forsonet"
#. module: l10n_th
#: model:account.account.type,name:l10n_th.acc_type_view
msgid "View"
msgstr "Vis"

View File

@ -4,7 +4,6 @@
<record id="uy_code_0" model="account.account.template">
<field name="code">0</field>
<field name="type">view</field>
<field name="parent_id" eval="False"/>
<field name="name">Uruguay - Plan de Cuentas</field>
<field name="user_type" ref="type_view"/>
</record>

View File

@ -56,25 +56,24 @@ class mail_group(osv.Model):
help="Members of those groups will automatically added as followers. "\
"Note that they will be able to manage their subscription manually "\
"if necessary."),
# image: all image fields are base64 encoded and PIL-supported
'image': fields.binary("Photo",
help="This field holds the image used as photo for the "\
"user. The image is base64 encoded, and PIL-supported. "\
"It is limited to a 1024x1024 px image."),
help="This field holds the image used as photo for the group, limited to 1024x1024px."),
'image_medium': fields.function(_get_image, fnct_inv=_set_image,
string="Medium-sized photo", type="binary", multi="_get_image",
store = {
store={
'mail.group': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Medium-sized photo of the group. It is automatically "\
"resized as a 180x180px image, with aspect ratio preserved. "\
"resized as a 128x128px image, with aspect ratio preserved. "\
"Use this field in form views or some kanban views."),
'image_small': fields.function(_get_image, fnct_inv=_set_image,
string="Small-sized photo", type="binary", multi="_get_image",
store = {
store={
'mail.group': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Small-sized photo of the group. It is automatically "\
"resized as a 50x50px image, with aspect ratio preserved. "\
"resized as a 64x64px image, with aspect ratio preserved. "\
"Use this field anywhere a small image is required."),
'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="cascade", required=True,
help="The email address associated with this group. New emails received will automatically "

View File

@ -55,9 +55,20 @@ class res_users(osv.Model):
return init_res
def _auto_init(self, cr, context=None):
"""Installation hook to create aliases for all users and avoid constraint errors."""
self.pool.get('mail.alias').migrate_to_alias(cr, self._name, self._table, super(res_users,self)._auto_init,
""" Installation hook: aliases, partner following themselves """
# create aliases for all users and avoid constraint errors
self.pool.get('mail.alias').migrate_to_alias(cr, self._name, self._table, super(res_users, self)._auto_init,
self._columns['alias_id'], 'login', alias_force_key='id', context=context)
# make already existing users follow themselves, using SQL to avoid using the ORM during the auto_init
cr.execute(""" SELECT p.id FROM res_partner p
LEFT JOIN mail_followers n
ON (n.partner_id = p.id AND n.res_model = 'res.partner' AND n.res_id = p.id)
WHERE n.id IS NULL
""")
params = [(res[0], res[0]) for res in cr.fetchall()]
cr.executemany(""" INSERT INTO mail_followers (partner_id, res_model, res_id)
VALUES (%s, 'res.partner', %s)
""", params)
def create(self, cr, uid, data, context=None):
# create default alias same as the login

View File

@ -322,11 +322,7 @@
text-decoration: none;
}
.openerp .oe_mail_msg_subtitle {
margin: 0 0 .5em 0;
}
.openerp .oe_mail_msg_footer,
.openerp .oe_mail_msg_subtitle {
.openerp .oe_mail_msg_footer {
color: #888;
}
@ -340,12 +336,13 @@
text-align: justify;
}
.openerp .oe_mail_msg_body span.oe_mail_msg_tail {
display: inline;
.openerp .oe_mail_msg_record_body pre {
font-family: "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
margin: 0px;
}
.openerp .oe_mail_oe_bold {
font-weight: bold;
.openerp .oe_mail_msg_body span.oe_mail_msg_tail {
display: inline;
}
/* Read more/less link */

View File

@ -17,19 +17,15 @@ openerp.mail = function(session) {
*/
session.web.FormView = session.web.FormView.extend({
// TDE FIXME TODO: CHECK WITH NEW BRANCH
do_action: function(action, on_close) {
if (action.res_model == 'mail.compose.message' &&
action.context && action.context.redirect == true &&
this.fields && this.fields.message_ids &&
this.fields.message_ids.view.get("actual_mode") != 'create') {
// debug
console.groupCollapsed('FormView do_action on mail.compose.message');
console.log('message_ids field:', this.fields.message_ids);
console.groupEnd();
var record_thread = this.fields.message_ids;
var thread = record_thread.thread;
thread.instantiate_composition_form('comment', true, false, 0, action.context);
return false;
thread.refresh_composition_form(action.context);
return true;
}
else {
return this._super(action, on_close);
@ -174,7 +170,7 @@ openerp.mail = function(session) {
this.ds_compose.context = _.extend(this.ds_compose.context, this.options.context);
return this.ds_compose.call('default_get', [
['subject', 'body_text', 'body', 'attachment_ids', 'partner_ids', 'composition_mode',
'model', 'res_id', 'parent_id', 'content_subtype'],
'use_template', 'template_id', 'model', 'res_id', 'parent_id', 'content_subtype'],
this.ds_compose.get_context(),
]).then( function (result) { self.form_view.on_processed_onchange({'value': result}, []); });
},
@ -365,6 +361,11 @@ openerp.mail = function(session) {
return compose_done;
},
refresh_composition_form: function (context) {
if (! this.compose_message_widget) return;
return this.compose_message_widget.refresh(context);
},
/** Clean the thread */
message_clean: function() {
this.$el.find('div.oe_mail_thread_display').empty();
@ -411,7 +412,7 @@ openerp.mail = function(session) {
self.thread = new mail.Thread(self, {
'context': {
'default_model': record.model,
'default_id': record.res_id,
'default_res_id': record.res_id,
'default_parent_id': record.id },
'message_data': record.child_ids, 'thread_level': self.options.thread_level-1,
'show_header_compose': false, 'show_reply': self.options.thread_level > 1,
@ -473,7 +474,7 @@ openerp.mail = function(session) {
},
display_user_avatar: function () {
var avatar = mail.ChatterUtils.get_image(this.session.prefix, this.session.session_id, 'res.users', 'image_small', this.options.uid);
var avatar = mail.ChatterUtils.get_image(this.session.prefix, this.session.session_id, 'res.users', 'image_small', this.session.uid);
return this.$el.find('img.oe_mail_icon').attr('src', avatar);
},
@ -484,9 +485,9 @@ openerp.mail = function(session) {
var body = comment_node.val();
comment_node.val('');
}
return this.ds_post.call('message_post', [
[this.options.context.res_id], body, false, 'comment', this.options.context.parent_id]
).then(this.proxy('message_fetch'));
return this.ds_thread.call('message_post', [
[this.options.context.default_res_id], body, false, 'comment', this.options.context.default_parent_id, undefined]
).then(self.message_fetch());
},
/** Action: 'shows more' to fetch new messages */
@ -548,7 +549,6 @@ openerp.mail = function(session) {
this.options.domain = this.options.domain || [];
this.options.context = {'default_model': 'mail.thread', 'default_res_id': false};
this.options.thread_level = this.options.thread_level || 0;
this.thread_list = [];
},
start: function() {
@ -564,7 +564,7 @@ openerp.mail = function(session) {
},
destroy: function() {
for (var i in this.thread_list) { this.thread_list[i].destroy(); }
if (this.thread) { this.thread.destroy(); }
this._super.apply(this, arguments);
},
@ -581,12 +581,13 @@ openerp.mail = function(session) {
default_model: this.view.model });
// create and render Thread widget
this.$el.find('div.oe_mail_recthread_main').empty();
for (var i in this.thread_list) { this.thread_list[i].destroy(); }
if (this.thread) { this.thread.destroy(); }
var thread = new mail.Thread(self, {
'context': this.options.context,
'thread_level': this.options.thread_level, 'show_header_compose': true,
'message_ids': this.get_value(),
'show_delete': true, 'composer': true });
this.thread_list.push(thread);
this.thread = thread;
return thread.appendTo(this.$el.find('div.oe_mail_recthread_main'));
},
});

View File

@ -118,15 +118,14 @@
<t t-raw="record.subject"/>
</h1>
<div class="oe_mail_msg_body">
<div class="oe_mail_msg_record_body">
<a t-attf-href="#model=#{params.res_model}&amp;id=#{params.res_id}" t-if="(params.thread_level > 0) &amp; (!record.subject)"><t t-raw="record.record_name"/></a>
<a t-attf-href="#model=#{record.model}&amp;id=#{record.res_id}" t-if="(params.thread_level > 0) &amp; (!record.subject)"><t t-raw="record.record_name"/></a>
<t t-raw="record.body"/>
</div>
</div>
<div class="oe_clear"/>
<ul class="oe_mail_msg_footer">
<li t-if="record.subject &amp; params.thread_level > 0"><a t-attf-href="#model=#{params.res_model}&amp;id=#{params.res_id}"><t t-raw="record.record_name"/></a></li>
<li t-if="record.subject &amp; params.thread_level > 0"><a t-attf-href="#model=#{record.model}&amp;id=#{record.res_id}"><t t-raw="record.record_name"/></a></li>
<li><a t-attf-href="#model=res.partner&amp;id=#{record.author_id[0]}"><t t-raw="record.author_id[1]"/></a></li>
<li><span t-att-title="record.date"><t t-raw="record.timerelative"/></span></li>
<li t-if="display['show_reply']"><a href="#" class="oe_mail_msg_reply">Reply</a></li>

View File

@ -14,7 +14,7 @@
<group>
<field name="subject" placeholder="Subject..."/>
<field name="partner_ids" widget="many2many_tags" placeholder="Add contacts to notify..."
context="{'force_create':True}"
context="{'force_email':True}"
on_change="onchange_partner_ids(partner_ids)"/>
</group>
<notebook>
@ -65,7 +65,7 @@
class="oe_mail_compose_message_body_html"
attrs="{'invisible':[('content_subtype', '=', 'plain')]}"/>
<field name="partner_ids" colspan="2" nolabel="1" widget="many2many_tags" placeholder="Add contacts to notify..."
context="{'force_create':True}"
context="{'force_email':True}"
on_change="onchange_partner_ids(partner_ids)"
class="oe_mail_compose_message_partner_ids"/>
<field name="attachment_ids" colspan="2" nolabel="1" widget="many2many_tags"

View File

@ -0,0 +1,192 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-09-10 13:33+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: marketing_campaign_crm_demo
#: model:ir.actions.report.xml,name:marketing_campaign_crm_demo.mc_crm_lead_demo_report
msgid "Marketing campaign demo report"
msgstr "Markedsføringskampanje demo rapport."
#. module: marketing_campaign_crm_demo
#: model:email.template,body_text:marketing_campaign_crm_demo.email_template_1
msgid ""
"Hello,Thanks for generous interest you have shown in the "
"openERP.Regards,OpenERP Team,"
msgstr ""
"Hei, Takk for sjenerøs interessen du har vist i openERP.Regards, OpenERP lag,"
#. module: marketing_campaign_crm_demo
#: report:crm.lead.demo:0
msgid "Company :"
msgstr "Firma :"
#. module: marketing_campaign_crm_demo
#: model:email.template,subject:marketing_campaign_crm_demo.email_template_4
msgid "Thanks for buying the OpenERP book"
msgstr "Takk for at du kjøpte OpenERP boken."
#. module: marketing_campaign_crm_demo
#: model:email.template,body_text:marketing_campaign_crm_demo.email_template_6
msgid ""
"Hello, We have very good offer that might suit you.\n"
" For our silver partners,We are paid technical training on "
"june,2010.\n"
" If any further information required kindly revert back.\n"
" I really appreciate your co-operation on this.\n"
" Regards,OpenERP Team,"
msgstr ""
"Hei, Vi har veldig godt tilbud som kan passe for deg.\n"
"             For våre sølv partnere, Vi betalte teknisk trening på juni "
"2010.\n"
"             Hvis noen ytterligere opplysninger som kreves ber gå tilbake.\n"
"             Jeg setter pris på ditt samarbeid om dette.\n"
"             Hilsen OpenERP Team,"
#. module: marketing_campaign_crm_demo
#: model:email.template,subject:marketing_campaign_crm_demo.email_template_5
msgid "Propose a free technical training to Gold partners"
msgstr "Foreslå en gratis teknisk opplæring til Gold partnere."
#. module: marketing_campaign_crm_demo
#: model:email.template,subject:marketing_campaign_crm_demo.email_template_3
msgid "Thanks for subscribing to the OpenERP Discovery Day"
msgstr "Takk for at du abonnerte på OpenERP Discovery dag."
#. module: marketing_campaign_crm_demo
#: model:ir.actions.server,name:marketing_campaign_crm_demo.action_dummy
msgid "Dummy Action"
msgstr "Dummy handling."
#. module: marketing_campaign_crm_demo
#: report:crm.lead.demo:0
msgid "Partner :"
msgstr "Partner :"
#. module: marketing_campaign_crm_demo
#: model:email.template,subject:marketing_campaign_crm_demo.email_template_1
msgid "Thanks for showing interest in OpenERP"
msgstr "Takk for at du viser interesse for OpenERP."
#. module: marketing_campaign_crm_demo
#: model:email.template,subject:marketing_campaign_crm_demo.email_template_2
msgid "Propose to subscribe to the OpenERP Discovery Day on May 2010"
msgstr "Foreslår å abonnere på OpenERP Discovery Day mai 2010."
#. module: marketing_campaign_crm_demo
#: model:email.template,body_text:marketing_campaign_crm_demo.email_template_7
msgid ""
"Hello, We have very good offer that might suit you.\n"
" For our silver partners,We are offering Gold partnership.\n"
" If any further information required kindly revert back.\n"
" I really appreciate your co-operation on this.\n"
" Regards,OpenERP Team,"
msgstr ""
"Hei, Vi har veldig godt tilbud som kan passe for deg.\n"
"             For våre sølv partnere, tilbyr vi Gold partnerskap.\n"
"             Hvis noen ytterligere opplysninger som kreves ber gå tilbake.\n"
"             Jeg setter pris på ditt samarbeid om dette.\n"
"             Hilsen OpenERP Team,"
#. module: marketing_campaign_crm_demo
#: model:email.template,subject:marketing_campaign_crm_demo.email_template_7
msgid "Propose gold partnership to silver partners"
msgstr "Foreslå gull partnerskap til sølv partnere."
#. module: marketing_campaign_crm_demo
#: model:email.template,body_text:marketing_campaign_crm_demo.email_template_4
msgid ""
"Hello,Thanks for showing intrest and buying the OpenERP book.\n"
" If any further information required kindly revert back.\n"
" I really appreciate your co-operation on this.\n"
" Regards,OpenERP Team,"
msgstr ""
"Hei, Takk for at du viser interesse og kjøpe OpenERP boken.\n"
"             Hvis noen ytterligere opplysninger som kreves ber gå tilbake.\n"
"             Jeg setter pris på ditt samarbeid om dette.\n"
"             Hilsen OpenERP Team,"
#. module: marketing_campaign_crm_demo
#: model:email.template,body_text:marketing_campaign_crm_demo.email_template_5
msgid ""
"Hello, We have very good offer that might suit you.\n"
" For our gold partners,We are arranging free technical training "
"on june,2010.\n"
" If any further information required kindly revert back.\n"
" I really appreciate your co-operation on this.\n"
" Regards,OpenERP Team,"
msgstr ""
"Hei, Vi har veldig godt tilbud som kan passe for deg.\n"
"             For våre gull partnere, Vi arrangerer gratis teknisk trening på "
"juni 2010.\n"
"             Hvis noen ytterligere opplysninger som kreves ber gå tilbake.\n"
"             Jeg setter pris på ditt samarbeid om dette.\n"
"             Hilsen OpenERP Team,"
#. module: marketing_campaign_crm_demo
#: model:email.template,body_text:marketing_campaign_crm_demo.email_template_3
msgid ""
"Hello,Thanks for showing intrest and for subscribing to the OpenERP "
"Discovery Day.\n"
" If any further information required kindly revert back.\n"
" I really appreciate your co-operation on this.\n"
" Regards,OpenERP Team,"
msgstr ""
"Hei, Takk for at du viser interesse og for å abonnere på OpenERP Discovery "
"Day.\n"
"              Hvis noen ytterligere opplysninger som kreves ber gå tilbake.\n"
"              Jeg setter pris på ditt samarbeid om dette.\n"
"              Hilsen OpenERP Team,"
#. module: marketing_campaign_crm_demo
#: model:email.template,subject:marketing_campaign_crm_demo.email_template_8
msgid "Thanks for subscribing to technical training"
msgstr "Takk for at du abonnerte på teknisk trening."
#. module: marketing_campaign_crm_demo
#: model:email.template,body_text:marketing_campaign_crm_demo.email_template_2
msgid ""
"Hello,We have very good offer that might suit you.\n"
" We propose you to subscribe to the OpenERP Discovery Day on May "
"2010.\n"
" If any further information required kindly revert back.\n"
" We really appreciate your co-operation on this.\n"
" Regards,OpenERP Team,"
msgstr ""
"Hei, Vi har veldig godt tilbud som kan passe for deg.\n"
"             Vi foreslår at du abonnere på OpenERP Discovery Day mai 2010.\n"
"             Hvis noen ytterligere opplysninger som kreves ber gå tilbake.\n"
"             Vi setter pris på din samarbeid om dette.\n"
"             Hilsen OpenERP Team,"
#. module: marketing_campaign_crm_demo
#: model:email.template,body_text:marketing_campaign_crm_demo.email_template_8
msgid ""
"Hello, Thanks for showing intrest and for subscribing to technical "
"training.If any further information required kindly revert back.I really "
"appreciate your co-operation on this.\n"
" Regards,OpenERP Team,"
msgstr ""
"Hei, Takk for at du viser interesse og for å abonnere på teknisk training.If "
"ytterligere informasjon som kreves ber tilbake tilbake.Jeg virkelig setter "
"pris på din samarbeid om dette.\n"
"             Hilsen OpenERP Team,"
#. module: marketing_campaign_crm_demo
#: model:email.template,subject:marketing_campaign_crm_demo.email_template_6
msgid "Propose paid training to Silver partners"
msgstr "Foreslå betalt opplæring til Silver partnere."

View File

@ -0,0 +1,132 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-09-10 13:49+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: mrp_subproduct
#: field:mrp.subproduct,product_id:0
msgid "Product"
msgstr "Produkt"
#. module: mrp_subproduct
#: selection:mrp.subproduct,subproduct_type:0
msgid "Fixed"
msgstr "Fast"
#. module: mrp_subproduct
#: sql_constraint:mrp.bom:0
msgid ""
"All product quantities must be greater than 0.\n"
"You should install the mrp_subproduct module if you want to manage extra "
"products on BoMs !"
msgstr ""
"Alle produktantall må være større en 0.\n"
"Du bør installere modulen mrp:subproduct hvis du vil håndtere ekstra "
"produkter på Materiallister !"
#. module: mrp_subproduct
#: view:mrp.bom:0
msgid "sub products"
msgstr "Sub produkter"
#. module: mrp_subproduct
#: model:ir.model,name:mrp_subproduct.model_mrp_production
msgid "Manufacturing Order"
msgstr "Produksjonsordre"
#. module: mrp_subproduct
#: constraint:mrp.bom:0
msgid "BoM line product should not be same as BoM product."
msgstr "Bom linje produktet bør ikke være det samme som BOM produkt."
#. module: mrp_subproduct
#: view:mrp.bom:0
msgid "Sub Products"
msgstr "Sub produkter."
#. module: mrp_subproduct
#: field:mrp.subproduct,subproduct_type:0
msgid "Quantity Type"
msgstr "Antall Type."
#. module: mrp_subproduct
#: model:ir.model,name:mrp_subproduct.model_mrp_bom
msgid "Bill of Material"
msgstr "Materialliste"
#. module: mrp_subproduct
#: field:mrp.subproduct,product_qty:0
msgid "Product Qty"
msgstr "Produkt Ant"
#. module: mrp_subproduct
#: field:mrp.subproduct,product_uom:0
msgid "Product UOM"
msgstr "Produkt Enhet"
#. module: mrp_subproduct
#: field:mrp.subproduct,bom_id:0
msgid "BoM"
msgstr "Materialliste"
#. module: mrp_subproduct
#: sql_constraint:mrp.production:0
msgid "Reference must be unique per Company!"
msgstr "Referanse må være unik pr firma!"
#. module: mrp_subproduct
#: field:mrp.bom,sub_products:0
msgid "sub_products"
msgstr "Sub_produkter."
#. module: mrp_subproduct
#: selection:mrp.subproduct,subproduct_type:0
msgid "Variable"
msgstr "Variabel"
#. module: mrp_subproduct
#: model:ir.model,name:mrp_subproduct.model_mrp_subproduct
msgid "Sub Product"
msgstr "Sub produkt."
#. module: mrp_subproduct
#: constraint:mrp.production:0
msgid "Order quantity cannot be negative or zero!"
msgstr "Ordrekvantum kan ikke være negativt eller null!"
#. module: mrp_subproduct
#: help:mrp.subproduct,subproduct_type:0
msgid ""
"Define how the quantity of subproducts will be set on the production orders "
"using this BoM. 'Fixed' depicts a situation where the quantity of created "
"subproduct is always equal to the quantity set on the BoM, regardless of how "
"many are created in the production order. By opposition, 'Variable' means "
"that the quantity will be computed as '(quantity of subproduct set on the "
"BoM / quantity of manufactured product set on the BoM * quantity of "
"manufactured product in the production order.)'"
msgstr ""
"Definere hvordan mengden av delkomponenter vil bli satt på produksjonsordrer "
"ved hjelp av denne BOM. 'Fast' beskriver en situasjon der mengden av laget "
"subproduct er alltid lik mengde sett på BOM, uavhengig av hvor mange som er "
"skapt i produksjonen rekkefølge. Av motstand, 'variabel' betyr at mengden "
"vil bli beregnet som '(mengde subproduct satt på BOM / mengde produsert "
"produkt satt på BOM * mengde produsert produkt i produksjonen rekkefølge.)'"
#. module: mrp_subproduct
#: constraint:mrp.bom:0
msgid "Error ! You cannot create recursive BoM."
msgstr "Feil! Du kan ikke lage en rekursive BoM."

58
addons/pad/i18n/nb.po Normal file
View File

@ -0,0 +1,58 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
"PO-Revision-Date: 2012-09-10 13:38+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: pad
#: sql_constraint:res.company:0
msgid "The company name must be unique !"
msgstr "Firmanavn må være unikt !"
#. module: pad
#: help:res.company,pad_url_template:0
msgid "Template used to generate pad URL."
msgstr "Mal som brukes til å generere pad URL."
#. module: pad
#: model:ir.model,name:pad.model_res_company
msgid "Companies"
msgstr "Firmaer"
#. module: pad
#: constraint:res.company:0
msgid "Error! You can not create recursive companies."
msgstr "Feil ! Du kan ikke lage rekursive firmaer."
#. module: pad
#: model:ir.model,name:pad.model_ir_attachment
msgid "ir.attachment"
msgstr "ir.vedlegg"
#. module: pad
#: view:res.company:0
msgid "Pad"
msgstr "Pad"
#. module: pad
#: field:res.company,pad_url_template:0
msgid "Pad URL Template"
msgstr "Pad URL Mal."
#. openerp-web
#: /home/odo/repositories/addons/trunk/pad/static/src/xml/pad.xml:9
msgid "Add Pad"
msgstr "Legg til Pad."

View File

@ -0,0 +1,38 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-09-10 13:38+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: pad_project
#: constraint:project.task:0
msgid "Error ! Task end-date must be greater then task start-date"
msgstr "Feil! Oppgave sluttdato må være større enn oppgave startdato"
#. module: pad_project
#: model:ir.model,name:pad_project.model_project_task
msgid "Task"
msgstr "Oppgave"
#. module: pad_project
#: view:project.task:0
msgid "Pad"
msgstr "Pad"
#. module: pad_project
#: constraint:project.task:0
msgid "Error ! You cannot create recursive tasks."
msgstr "Feil! Du kan ikke lage en rekursive oppgaver."

23
addons/plugin/i18n/nb.po Normal file
View File

@ -0,0 +1,23 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-09-10 13:40+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: plugin
#: model:ir.model,name:plugin.model_plugin_handler
msgid "plugin.handler"
msgstr "Plugg.behandleren"

View File

@ -0,0 +1,78 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-09 00:36+0000\n"
"PO-Revision-Date: 2012-09-10 13:42+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: plugin_outlook
#: view:outlook.installer:0
msgid ""
"This plug-in allows you to create and link outlook emails with openerp "
"objects."
msgstr ""
"Denne plug-in tillater deg å opprette og koble Outlook e-post med openerp "
"objekter."
#. module: plugin_outlook
#: field:outlook.installer,name:0
msgid "Outlook Plug-in"
msgstr "Outlook Plugginn"
#. module: plugin_outlook
#: model:ir.actions.act_window,name:plugin_outlook.action_outlook_installer
#: model:ir.actions.act_window,name:plugin_outlook.action_outlook_wizard
#: model:ir.ui.menu,name:plugin_outlook.menu_base_config_plugins_outlook
#: view:outlook.installer:0
msgid "Install Outlook Plug-In"
msgstr "Installere Outlook Plugg-Inn."
#. module: plugin_outlook
#: field:outlook.installer,config_logo:0
msgid "Image"
msgstr "Bilde"
#. module: plugin_outlook
#: view:outlook.installer:0
msgid "title"
msgstr "tittel"
#. module: plugin_outlook
#: model:ir.model,name:plugin_outlook.model_outlook_installer
msgid "outlook.installer"
msgstr "outlook.installer"
#. module: plugin_outlook
#: view:outlook.installer:0
msgid "_Close"
msgstr "_Lukk"
#. module: plugin_outlook
#: view:outlook.installer:0
msgid "Installation and Configuration Steps"
msgstr "Installasjon og Konfigurasjon trinn"
#. module: plugin_outlook
#: help:outlook.installer,name:0
msgid ""
"outlook plug-in file. Save as this file and install this plug-in in outlook."
msgstr ""
"Outlook pluginn-filen. Lagre som denne filen og installere denne plugin-"
"modulen i outlook."
#. module: plugin_outlook
#: field:outlook.installer,description:0
msgid "Description"
msgstr "Beskrivelse:"

View File

@ -0,0 +1,108 @@
# Norwegian Bokmal translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-09 00:36+0000\n"
"PO-Revision-Date: 2012-09-10 13:45+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: plugin_thunderbird
#: field:plugin_thunderbird.installer,pdf_file:0
msgid "Installation Manual"
msgstr "Installasjons håndbok."
#. module: plugin_thunderbird
#: field:plugin_thunderbird.installer,description:0
msgid "Description"
msgstr "Beskrivelse:"
#. module: plugin_thunderbird
#: view:plugin_thunderbird.installer:0
msgid "title"
msgstr "tittel"
#. module: plugin_thunderbird
#: model:ir.model,name:plugin_thunderbird.model_plugin_thunderbird_installer
msgid "plugin_thunderbird.installer"
msgstr "plugin_thunderbird.installer"
#. module: plugin_thunderbird
#: field:plugin_thunderbird.installer,config_logo:0
msgid "Image"
msgstr "Bilde"
#. module: plugin_thunderbird
#: field:plugin_thunderbird.installer,plugin_file:0
#: field:plugin_thunderbird.installer,thunderbird:0
msgid "Thunderbird Plug-in"
msgstr "Thunderbird Plug-in"
#. module: plugin_thunderbird
#: view:plugin_thunderbird.installer:0
msgid ""
"This plug-in allows you to link your email to OpenERP's documents. You can "
"attach it to any existing one in OpenERP or create a new one."
msgstr ""
#. module: plugin_thunderbird
#: help:plugin_thunderbird.installer,thunderbird:0
msgid ""
"Allows you to select an object that you would like to add to your email and "
"its attachments."
msgstr ""
"Lar deg velge et objekt som du ønsker å legge til din e-post og vedlegg."
#. module: plugin_thunderbird
#: help:plugin_thunderbird.installer,pdf_file:0
msgid "The documentation file :- how to install Thunderbird Plug-in."
msgstr "Dokumentasjonen fil: - hvordan du installerer Thunderbird Plug-in."
#. module: plugin_thunderbird
#: view:plugin_thunderbird.installer:0
msgid "_Close"
msgstr "_Lukk"
#. module: plugin_thunderbird
#: view:plugin_thunderbird.installer:0
msgid "Installation and Configuration Steps"
msgstr "Installasjon og Konfigurasjon trinn"
#. module: plugin_thunderbird
#: field:plugin_thunderbird.installer,name:0
#: field:plugin_thunderbird.installer,pdf_name:0
msgid "File name"
msgstr "Filnavn"
#. module: plugin_thunderbird
#: help:plugin_thunderbird.installer,plugin_file:0
msgid ""
"Thunderbird plug-in file. Save as this file and install this plug-in in "
"thunderbird."
msgstr ""
"Thunderbird plug-in-filen. Lagre som denne filen og installere denne plugin-"
"modulen i thunderbird."
#. module: plugin_thunderbird
#: model:ir.actions.act_window,name:plugin_thunderbird.action_thunderbird_installer
#: model:ir.ui.menu,name:plugin_thunderbird.menu_base_config_plugins_thunderbird
#: view:plugin_thunderbird.installer:0
msgid "Install Thunderbird Plug-In"
msgstr "Installer Thunderbird Plug-in."
#~ msgid ""
#~ "This plug-in allows you to link your e-mail to OpenERP's documents. You can "
#~ "attach it to any existing one in OpenERP or create a new one."
#~ msgstr ""
#~ "Denne plug-in tillater deg å koble din e-post til OpenERP er dokumenter. Du "
#~ "kan feste den til enhver eksisterende i OpenERP eller opprette en ny."

View File

@ -314,10 +314,9 @@ class pos_session(osv.osv):
# define some cash journal if no payment method exists
if not pos_config.journal_ids:
cashids = self.pool.get('account.journal').search(cr, uid, [('journal_user','=',True)], context=context)
cashids = self.pool.get('account.journal').search(cr, uid, [('journal_user', '=', True), ('type','=','cash')], context=context)
if not cashids:
cashids = self.pool.get('account.journal').search(cr, uid, [('type','=','cash')], context=context)
self.pool.get('account.journal').write(cr, uid, cashids, {'journal_user': True})
cashids = self.pool.get('account.journal').search(cr, uid, [('journal_user','=',True)], context=context)
jobj.write(cr, uid, [pos_config.id], {'journal_ids': [(6,0, cashids)]})
@ -1211,29 +1210,27 @@ class pos_category(osv.osv):
'child_id': fields.one2many('pos.category', 'parent_id', string='Children Categories'),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of product categories."),
# NOTE: there is no 'default image', because by default we don't show thumbnails for categories. However if we have a thumbnail
# NOTE: there is no 'default image', because by default we don't show thumbnails for categories. However if we have a thumbnail
# for at least one category, then we display a default image on the other, so that the buttons have consistent styling.
# In this case, the default image is set by the js code.
# In this case, the default image is set by the js code.
# NOTE2: image: all image fields are base64 encoded and PIL-supported
'image': fields.binary("Image",
help="This field holds the image used for the category. "\
"The image is base64 encoded, and PIL-supported. "\
"It is limited to a 1024x1024 px image."),
help="This field holds the image used as image for the cateogry, limited to 1024x1024px."),
'image_medium': fields.function(_get_image, fnct_inv=_set_image,
string="Medium-sized image", type="binary", multi="_get_image",
store = {
store={
'pos.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Medium-sized image of the category. It is automatically "\
"resized as a 180x180 px image, with aspect ratio preserved. "\
"resized as a 128x128px image, with aspect ratio preserved. "\
"Use this field in form views or some kanban views."),
'image_small': fields.function(_get_image, fnct_inv=_set_image,
string="Smal-sized image", type="binary", multi="_get_image",
store = {
store={
'pos.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Small-sized image of the category. It is automatically "\
"resized as a 50x50 px image, with aspect ratio preserved. "\
"resized as a 64x64px image, with aspect ratio preserved. "\
"Use this field anywhere a small image is required."),
}

View File

@ -948,7 +948,7 @@
<field name="total_entry_encoding" />
<field name="balance_end_real" />
<field name="difference" />
<field name="currency" />
<field name="currency" groups="base.group_multi_currency" />
<field name="state" />
</tree>
</field>

View File

@ -37,7 +37,7 @@ class portal(osv.osv):
'group_id': fields.many2one('res.groups', required=True, ondelete='cascade',
string='Group',
help='The group corresponding to this portal'),
'url': fields.char('URL', size=64,
'url': fields.char('URL',
help="The url where portal users can connect to the server"),
'home_action_id': fields.many2one('ir.actions.actions',
string='Home Action',

View File

@ -15,9 +15,9 @@
<field name="model">board.board</field>
<field name="inherit_id" ref="stock.board_warehouse_form"/>
<field name="arch" type="xml">
<xpath expr="/form/board/column/action[@string='Incoming Shipments']" position="before">
<xpath expr="//column" position="inside">
<action name="%(procurement_action_board)d" string="Procurements in Exception"/>
</xpath>
</xpath>
</field>
</record>
</data>

View File

@ -80,7 +80,7 @@ class procurement_order(osv.osv):
"""
_name = "procurement.order"
_description = "Procurement"
_order = 'priority,date_planned desc'
_order = 'priority desc,date_planned'
_inherit = ['mail.thread']
_log_create = False
_columns = {
@ -319,13 +319,13 @@ class procurement_order(osv.osv):
if record.move_id and record.move_id.state == 'cancel':
return True
return False
#Initialize get_phantom_bom_id method as it is raising an error from yml of mrp_jit
#when one install first mrp and after that, mrp_jit. get_phantom_bom_id defined in mrp module
#which is not dependent for mrp_jit.
def get_phantom_bom_id(self, cr, uid, ids, context=None):
return False
def action_confirm(self, cr, uid, ids, context=None):
""" Confirms procurement and writes exception message if any.
@return: True

View File

@ -119,7 +119,7 @@
<field name="name" string="Products Price"/>
<field name="type"/>
<field name="active" />
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</search>
</field>
</record>
@ -132,7 +132,7 @@
<tree string="Products Price List">
<field name="name"/>
<field name="type"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="active" />
</tree>
</field>
@ -149,7 +149,7 @@
<group col="4">
<field name="active"/>
<field name="type"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
<field name="version_id">
@ -230,7 +230,7 @@
<field name="name"/>
<field name="active"/>
<field name="field"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</group>
</form>
</field>

View File

@ -509,7 +509,7 @@ class product_product(osv.osv):
def _get_image(self, cr, uid, ids, name, args, context=None):
result = dict.fromkeys(ids, False)
for obj in self.browse(cr, uid, ids, context=context):
result[obj.id] = tools.image_get_resized_images(obj.image)
result[obj.id] = tools.image_get_resized_images(obj.image, avoid_resize_medium=True)
return result
def _set_image(self, cr, uid, id, name, value, args, context=None):
@ -548,25 +548,24 @@ class product_product(osv.osv):
'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'),
'name_template': fields.related('product_tmpl_id', 'name', string="Name", type='char', size=128, store=True, select=True),
'color': fields.integer('Color Index'),
# image: all image fields are base64 encoded and PIL-supported
'image': fields.binary("Image",
help="This field holds the image used for the product. "\
"The image is base64 encoded, and PIL-supported. "\
"It is limited to a 1024x1024 px image."),
help="This field holds the image used as image for the product, limited to 1024x1024px."),
'image_medium': fields.function(_get_image, fnct_inv=_set_image,
string="Medium-sized image", type="binary", multi="_get_image",
store = {
store={
'product.product': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Medium-sized image of the product. It is automatically "\
"resized as a 180x180 px image, with aspect ratio preserved. "\
"Use this field in form views or some kanban views."),
"resized as a 128x128px image, with aspect ratio preserved, "\
"only when the image exceeds one of those sizes. Use this field in form views or some kanban views."),
'image_small': fields.function(_get_image, fnct_inv=_set_image,
string="Small-sized image", type="binary", multi="_get_image",
store = {
store={
'product.product': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Small-sized image of the product. It is automatically "\
"resized as a 50x50 px image, with aspect ratio preserved. "\
"resized as a 64x64px image, with aspect ratio preserved. "\
"Use this field anywhere a small image is required."),
'seller_info_id': fields.function(_calc_seller, type='many2one', relation="product.supplierinfo", multi="seller_info"),
'seller_delay': fields.function(_calc_seller, type='integer', string='Supplier Lead Time', multi="seller_info", help="This is the average delay in days between the purchase order confirmation and the reception of goods for this product and for the default supplier. It is used by the scheduler to order requests based on reordering delays."),

View File

@ -39,6 +39,7 @@
<field name="default_code"/>
<field name="name"/>
<field name="categ_id" invisible="1"/>
<field name="type" invisible="1"/>
<field name="variants" groups="product.group_product_variant"/>
<field name="uom_id" string="Unit of Measure" groups="product.group_uom"/>
<field name="qty_available"/>

View File

@ -139,8 +139,10 @@
<field name="parent_id" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/>
<field name="priority"/>
<field name="active" attrs="{'invisible':[('state','in',['open', 'pending', 'template'])]}"/>
<field name="currency_id" groups="base.group_multi_company" required="1"/>
<field name="company_id" groups="base.group_multi_company" widget="selection" required="1"/>
<field name="currency_id" groups="base.group_multi_currency" required="1"/>
<field name="parent_id" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/>
</group>
</group>
</page>

View File

@ -45,7 +45,7 @@
<field name="name">public Members</field>
<field name="model_id" ref="model_project_project"/>
<field name="global" eval="True"/>
<field name="domain_force">['|','|',('privacy_visibility','in',[False,'public']),('members','in',[user.id]),('follower_ids','in',[user.partner_id.id])]</field>
<field name="domain_force">['|','|',('privacy_visibility','in',[False,'public']),('members','in',[user.id]),('message_follower_ids','in',[user.partner_id.id])]</field>
</record>
<record model="ir.rule" id="task_comp_rule">

View File

@ -62,7 +62,7 @@
<form string="Purchase Dashboard" version="7.0">
<board style="2-1">
<column>
<action name="%(purchase_draft)d" string="Request for Quotations" creatable="true"/>
<action name="%(purchase_draft)d" string="Request for Quotations"/>
</column>
<column>
<action name="%(action_purchase_order_monthly_categ_graph)d" string="Monthly Purchases by Category"/>

View File

@ -347,6 +347,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
<field name="context">{'search_default_draft': 1}</field>
<field name="domain">[('state','in',('draft','sent','confirmed'))]</field>
<field name="view_mode">tree,form,graph,calendar</field>
<field name="search_view_id" ref="view_purchase_order_filter"/>
<field name="help" type="html">
@ -371,7 +372,8 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field>
<field name="view_mode">tree,form,graph,calendar</field>
<field name="context">{'search_default_approved': 1}</field>
<field name="context">{}</field>
<field name="domain">[('state','not in',('draft','sent','confirmed'))]</field>
<field name="search_view_id" ref="view_purchase_order_filter"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">

View File

@ -84,7 +84,7 @@
<field name="weight"/>
<field name="value"/>
<field name="supply_units"/>
<field name="currency_id"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="type"/>
</tree>
</field>

View File

@ -0,0 +1,123 @@
# Russian translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:37+0000\n"
"PO-Revision-Date: 2012-09-10 14:37+0000\n"
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
"Language-Team: Russian <ru@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:37
msgid "Refund"
msgstr "Возврат"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:22
msgid "Fax"
msgstr "Факс"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:49
msgid "Disc.(%)"
msgstr "Дисконт (%)"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:19
msgid "Tel"
msgstr "Тел"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:49
msgid "Description"
msgstr "Описание"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:35
msgid "Supplier Invoice"
msgstr "Счет поставщика"
#. module: report_webkit_sample
#: model:ir.actions.report.xml,name:report_webkit_sample.report_webkit_html
msgid "WebKit invoice"
msgstr "Счет Webkit"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:49
msgid "Price"
msgstr "Цена"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:44
msgid "Invoice Date"
msgstr "Дата счёта"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:49
msgid "Taxes"
msgstr "Налоги"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:49
msgid "QTY"
msgstr "Кол-во"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:25
msgid "Email"
msgstr "Эл. почта"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:64
msgid "Amount"
msgstr "Сумма"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:64
msgid "Base"
msgstr ""
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:33
msgid "Invoice"
msgstr "Счет"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:39
msgid "Supplier Refund"
msgstr "Возврат средств от поставщика"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:44
msgid "Document"
msgstr "Документ"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:49
msgid "Unit Price"
msgstr "Цена за ед."
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:44
msgid "Partner Ref."
msgstr "Ссылка на контрагента"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:28
msgid "VAT"
msgstr "НДС"
#. module: report_webkit_sample
#: report:addons/report_webkit_sample/report/report_webkit_html.mako:76
msgid "Total"
msgstr "Всего"

View File

@ -51,7 +51,7 @@
<form string="Sales Dashboard" version="7.0">
<board style="2-1">
<column>
<action name="%(action_quotation_for_sale)d" string="My Quotations" creatable="true"/>
<action name="%(action_quotation_for_sale)d" string="My Quotations"/>
</column>
<column>
<action name="%(action_turnover_by_month)d" string="Monthly Turnover"/>

View File

@ -47,7 +47,7 @@
<p>Hello${object.partner_id.name and ' ' or ''}${object.partner_id.name or ''},</p>
<p>Here is your ${object.state in ('draft', 'sent') and 'quotation' or 'order confirmation'} from {$object.company_id.name}: </p>
<p>Here is your ${object.state in ('draft', 'sent') and 'quotation' or 'order confirmation'} from ${object.company_id.name}: </p>
<p style="border-left: 1px solid #8e0000; margin-left: 30px;">
&nbsp;&nbsp;<strong>REFERENCES</strong><br />

View File

@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
"PO-Revision-Date: 2012-05-10 17:51+0000\n"
"Last-Translator: Raphael Collet (OpenERP) <Unknown>\n"
"PO-Revision-Date: 2012-09-10 14:56+0000\n"
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-07 04:58+0000\n"
"X-Generator: Launchpad (build 15914)\n"
"X-Launchpad-Export-Date: 2012-09-11 04:50+0000\n"
"X-Generator: Launchpad (build 15924)\n"
#. module: sale
#: field:sale.config.picking_policy,timesheet:0
msgid "Based on Timesheet"
msgstr ""
msgstr "Основано на затратах времени"
#. module: sale
#: view:sale.order.line:0
@ -27,6 +27,8 @@ msgid ""
"Sale Order Lines that are confirmed, done or in exception state and haven't "
"yet been invoiced"
msgstr ""
"Позиции заказа на продажу в состоянии \"Подтвержден\", \"Cделано\" или "
"\"Исключение\" и на которые не был выставлен счет"
#. module: sale
#: view:board.board:0
@ -78,7 +80,7 @@ msgstr "Запрос цен '%s' был преобразован в заказ
#. module: sale
#: view:sale.order:0
msgid "Print Quotation"
msgstr ""
msgstr "Печать предложения цен"
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice.py:42
@ -89,7 +91,7 @@ msgstr "Внимание!"
#. module: sale
#: report:sale.order:0
msgid "Tax"
msgstr ""
msgstr "Налог"
#. module: sale
#: model:process.node,note:sale.process_node_saleorderprocurement0
@ -123,6 +125,9 @@ msgid ""
"cancel a sale order, you must first cancel related picking or delivery "
"orders."
msgstr ""
"Для удаления подтвержденного заказа на продажу надо сначала его отменить ! "
"Для отмены заказа на продажу надо отменить его комплектование или заказ на "
"доставку."
#. module: sale
#: model:process.node,name:sale.process_node_saleprocurement0
@ -137,7 +142,7 @@ msgstr "Контрагент"
#. module: sale
#: selection:sale.order,order_policy:0
msgid "Invoice based on deliveries"
msgstr ""
msgstr "Счет основанный на отгрузке"
#. module: sale
#: view:sale.order:0
@ -187,12 +192,12 @@ msgstr "Условия платежа по умолчанию"
#. module: sale
#: field:sale.config.picking_policy,deli_orders:0
msgid "Based on Delivery Orders"
msgstr ""
msgstr "Основанный на заказе на отгрузку"
#. module: sale
#: field:sale.config.picking_policy,time_unit:0
msgid "Main Working Time Unit"
msgstr ""
msgstr "Основная единица рабочего времени"
#. module: sale
#: view:sale.order:0 view:sale.order.line:0 field:sale.order.line,state:0
@ -218,7 +223,7 @@ msgstr "Отметьте для группирования счетов по з
#. module: sale
#: view:sale.order:0
msgid "My Sale Orders"
msgstr ""
msgstr "Мои заказы на продажу"
#. module: sale
#: selection:sale.order,invoice_quantity:0
@ -267,7 +272,7 @@ msgstr ""
#. module: sale
#: model:ir.actions.act_window,name:sale.act_res_partner_2_sale_order
msgid "Quotations and Sales"
msgstr ""
msgstr "Предложения цен и продажи"
#. module: sale
#: model:ir.model,name:sale.model_sale_make_invoice
@ -278,7 +283,7 @@ msgstr "Продажи - создать счет"
#: code:addons/sale/sale.py:330
#, python-format
msgid "Pricelist Warning!"
msgstr ""
msgstr "Предупреждение по прайс листу!"
#. module: sale
#: field:sale.order.line,discount:0
@ -344,7 +349,7 @@ msgstr "Продажи в состоянии \"Исключение\""
#: code:addons/sale/wizard/sale_make_invoice_advance.py:70
#, python-format
msgid "Configuration Error !"
msgstr ""
msgstr "Ошибка конфигурации !"
#. module: sale
#: view:sale.order:0
@ -406,7 +411,7 @@ msgstr "Октябрь"
#. module: sale
#: sql_constraint:stock.picking:0
msgid "Reference must be unique per Company!"
msgstr ""
msgstr "Ссылка должна быть уникальна для каждой компании!"
#. module: sale
#: view:board.board:0 view:sale.order:0 view:sale.report:0
@ -469,7 +474,7 @@ msgstr ""
#: code:addons/sale/sale.py:1074
#, python-format
msgid "You cannot cancel a sale order line that has already been invoiced!"
msgstr ""
msgstr "Нельзя отменить позицию заказа на продажу, которая уже в счете!"
#. module: sale
#: code:addons/sale/sale.py:1079
@ -519,7 +524,7 @@ msgstr "Примечания"
#. module: sale
#: sql_constraint:res.company:0
msgid "The company name must be unique !"
msgstr ""
msgstr "Название компании должно быть уникальным!"
#. module: sale
#: help:sale.order,partner_invoice_id:0
@ -529,12 +534,12 @@ msgstr "Адрес счета для текущего заказа на прод
#. module: sale
#: view:sale.report:0
msgid "Month-1"
msgstr ""
msgstr "Месяц-1"
#. module: sale
#: view:sale.report:0
msgid "Ordered month of the sales order"
msgstr ""
msgstr "Месяц заказа в заказе на продажу"
#. module: sale
#: code:addons/sale/sale.py:504
@ -542,11 +547,12 @@ msgstr ""
msgid ""
"You cannot group sales having different currencies for the same partner."
msgstr ""
"Нельзя сгруппировать продажи в разных валютах для одного контрагента."
#. module: sale
#: selection:sale.order,picking_policy:0
msgid "Deliver each product when available"
msgstr ""
msgstr "Отгрузка каждого товара по готовности."
#. module: sale
#: field:sale.order,invoiced_rate:0 field:sale.order.line,invoiced:0
@ -581,12 +587,12 @@ msgstr "Март"
#. module: sale
#: constraint:stock.move:0
msgid "You can not move products from or to a location of the type view."
msgstr ""
msgstr "Нельзя переместить ТМЦ в/из место хранения типа вид."
#. module: sale
#: field:sale.config.picking_policy,sale_orders:0
msgid "Based on Sales Orders"
msgstr ""
msgstr "Основанный на заказах на продажу"
#. module: sale
#: help:sale.order,amount_total:0
@ -606,7 +612,7 @@ msgstr "Адрес счета:"
#. module: sale
#: field:sale.order.line,sequence:0
msgid "Line Sequence"
msgstr ""
msgstr "Последовательность"
#. module: sale
#: model:process.transition,note:sale.process_transition_saleorderprocurement0
@ -697,7 +703,7 @@ msgstr "Дата создания"
#. module: sale
#: model:ir.ui.menu,name:sale.menu_sales_configuration_misc
msgid "Miscellaneous"
msgstr ""
msgstr "Прочее"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_line_tree3
@ -741,7 +747,7 @@ msgstr "Кол-во"
#: code:addons/sale/sale.py:1327
#, python-format
msgid "Hour"
msgstr ""
msgstr "Час"
#. module: sale
#: view:sale.order:0
@ -762,7 +768,7 @@ msgstr "Все предложения"
#. module: sale
#: view:sale.config.picking_policy:0
msgid "Options"
msgstr ""
msgstr "Настройки"
#. module: sale
#: selection:sale.report,month:0
@ -773,7 +779,7 @@ msgstr "Сентябрь"
#: code:addons/sale/sale.py:632
#, python-format
msgid "You cannot confirm a sale order which has no line."
msgstr ""
msgstr "Нельзя подтвердить заказ на продажу без товара"
#. module: sale
#: code:addons/sale/sale.py:1259
@ -782,6 +788,8 @@ msgid ""
"You have to select a pricelist or a customer in the sales form !\n"
"Please set one before choosing a product."
msgstr ""
"Перед выбором ТМЦ, \n"
"вы должны выбрать прайс-лист или заказчика в форме ввода продаж !"
#. module: sale
#: view:sale.report:0 field:sale.report,categ_id:0
@ -851,7 +859,7 @@ msgstr ""
#. module: sale
#: field:sale.order,date_order:0
msgid "Date"
msgstr ""
msgstr "Дата"
#. module: sale
#: view:sale.report:0
@ -883,7 +891,7 @@ msgstr ""
#: code:addons/sale/sale.py:1272
#, python-format
msgid "No valid pricelist line found ! :"
msgstr ""
msgstr "Нет верной позиции в прайс листе ! :"
#. module: sale
#: view:sale.order:0
@ -893,7 +901,7 @@ msgstr "Журнал"
#. module: sale
#: selection:sale.order,order_policy:0
msgid "Invoice on order after delivery"
msgstr ""
msgstr "Счет на заказ после отгрузки"
#. module: sale
#: help:sale.order,invoice_ids:0
@ -935,7 +943,7 @@ msgstr "Ссылки"
#. module: sale
#: view:sale.order.line:0
msgid "My Sales Order Lines"
msgstr ""
msgstr "Мои позиции заказов на продажу"
#. module: sale
#: model:process.transition.action,name:sale.process_transition_action_cancel0
@ -949,7 +957,7 @@ msgstr "Отмена"
#. module: sale
#: sql_constraint:sale.order:0
msgid "Order Reference must be unique per Company!"
msgstr ""
msgstr "Ссылка на заказ должны быть уникальной для каждой компании!"
#. module: sale
#: model:process.transition,name:sale.process_transition_invoice0
@ -967,7 +975,7 @@ msgstr "Всего без налогов"
#. module: sale
#: view:sale.order.line:0
msgid "Order reference"
msgstr ""
msgstr "Ссылка на заказ"
#. module: sale
#: view:sale.open.invoice:0
@ -1019,7 +1027,7 @@ msgstr "На основании отгруженного или заказанн
#. module: sale
#: selection:sale.order,picking_policy:0
msgid "Deliver all products at once"
msgstr ""
msgstr "Отгрузка всех товаров за раз"
#. module: sale
#: field:sale.order,picking_ids:0
@ -1056,7 +1064,7 @@ msgstr "Создать заказ на доставку"
#: code:addons/sale/sale.py:1303
#, python-format
msgid "Cannot delete a sales order line which is in state '%s'!"
msgstr ""
msgstr "Нельзя удалить позицию заказа на продажу со статусом '%s'!"
#. module: sale
#: view:sale.order:0
@ -1076,7 +1084,7 @@ msgstr "Создать комплектовочный лист"
#. module: sale
#: view:sale.report:0
msgid "Ordered date of the sales order"
msgstr ""
msgstr "Дата заказа в заказе на продажу"
#. module: sale
#: view:sale.report:0
@ -1238,7 +1246,7 @@ msgstr "Налоги"
#. module: sale
#: view:sale.order:0
msgid "Sales Order ready to be invoiced"
msgstr ""
msgstr "Заказ на продажу готов к выставлению счета"
#. module: sale
#: help:sale.order,create_date:0
@ -1258,7 +1266,7 @@ msgstr "Создать счета"
#. module: sale
#: view:sale.report:0
msgid "Sales order created in current month"
msgstr ""
msgstr "Заказы на продажу, созданные в этом месяце"
#. module: sale
#: report:sale.order:0
@ -1300,6 +1308,8 @@ msgid ""
"If you change the pricelist of this order (and eventually the currency), "
"prices of existing order lines will not be updated."
msgstr ""
"Даже если вы измените прайс-лист этого заказа (и даже валюту), то цена "
"позиции заказа не обновиться."
#. module: sale
#: model:ir.model,name:sale.model_stock_picking
@ -1323,12 +1333,12 @@ msgstr "Нельзя отменить заказ на продажу !"
#. module: sale
#: view:sale.order:0
msgid "Qty(UoM)"
msgstr ""
msgstr "Кол-во(Ед.изм)"
#. module: sale
#: view:sale.report:0
msgid "Ordered Year of the sales order"
msgstr ""
msgstr "Год заказа в заказе на продажу"
#. module: sale
#: selection:sale.report,month:0
@ -1349,7 +1359,7 @@ msgstr "Исключение при доставке"
#: code:addons/sale/sale.py:1156
#, python-format
msgid "Picking Information ! : "
msgstr ""
msgstr "Информация по комплектованию ! : "
#. module: sale
#: field:sale.make.invoice,grouped:0
@ -1359,13 +1369,13 @@ msgstr "Сгруппировать счета"
#. module: sale
#: field:sale.order,order_policy:0
msgid "Invoice Policy"
msgstr ""
msgstr "Политика выставления счета"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_config_picking_policy
#: view:sale.config.picking_policy:0
msgid "Setup your Invoicing Method"
msgstr ""
msgstr "Настройка способа выставления счета"
#. module: sale
#: model:process.node,note:sale.process_node_invoice0
@ -1383,6 +1393,9 @@ msgid ""
"This tool will help you to install the right module and configure the system "
"according to the method you use to invoice your customers."
msgstr ""
"Этот инструмент поможет вам установить правильный модуль и настроить систему "
"в соответствии с методом который вы используете для выставления счетов своим "
"клиентам."
#. module: sale
#: model:ir.model,name:sale.model_sale_order_line_make_invoice
@ -1457,13 +1470,13 @@ msgstr ""
#. module: sale
#: view:sale.order.line:0
msgid "Confirmed sale order lines, not yet delivered"
msgstr ""
msgstr "Не доставленные подтвержденные позиции заказа на продажу"
#. module: sale
#: code:addons/sale/sale.py:473
#, python-format
msgid "Customer Invoices"
msgstr ""
msgstr "Счета заказчику"
#. module: sale
#: model:process.process,name:sale.process_process_salesprocess0
@ -1544,7 +1557,7 @@ msgstr "Месяц"
#. module: sale
#: model:email.template,subject:sale.email_template_edi_sale
msgid "${object.company_id.name} Order (Ref ${object.name or 'n/a' })"
msgstr ""
msgstr "${object.company_id.name} Заказ (Ссылка ${object.name or 'n/a' })"
#. module: sale
#: view:sale.order.line:0 field:sale.order.line,product_id:0
@ -1566,7 +1579,7 @@ msgstr "sale.config.picking_policy"
#: view:account.invoice.report:0 view:board.board:0
#: model:ir.actions.act_window,name:sale.action_turnover_by_month
msgid "Monthly Turnover"
msgstr ""
msgstr "Ежемесячный оборот"
#. module: sale
#: field:sale.order,invoice_quantity:0
@ -1677,12 +1690,12 @@ msgstr ""
#. module: sale
#: selection:sale.order,order_policy:0
msgid "Pay before delivery"
msgstr ""
msgstr "Оплата перед отгрузкой"
#. module: sale
#: view:board.board:0 model:ir.actions.act_window,name:sale.open_board_sales
msgid "Sales Dashboard"
msgstr ""
msgstr "Панель продаж"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_sale_order_make_invoice
@ -1730,6 +1743,8 @@ msgid ""
"Couldn't find a pricelist line matching this product and quantity.\n"
"You have to change either the product, the quantity or the pricelist."
msgstr ""
"Не удалось найти позицию в прайс-листе для этого товара и этого количества.\n"
"Вы должны изменить товар, количество или прайс-лист."
#. module: sale
#: help:sale.order,picking_ids:0
@ -1756,7 +1771,7 @@ msgstr "Отменено"
#. module: sale
#: view:sale.order.line:0
msgid "Sales Order Lines related to a Sales Order of mine"
msgstr ""
msgstr "Позиции заказа на продажу относящиеся к моим заказам"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_shop_form
@ -1799,7 +1814,7 @@ msgstr "Количество (UoS)"
#. module: sale
#: view:sale.order.line:0
msgid "Sale Order Lines that are in 'done' state"
msgstr ""
msgstr "Позиции заказа на продажу в состоянии «Сделано»"
#. module: sale
#: model:process.transition,note:sale.process_transition_packing0
@ -1823,7 +1838,7 @@ msgstr "Подтвержден"
#. module: sale
#: field:sale.config.picking_policy,order_policy:0
msgid "Main Method Based On"
msgstr ""
msgstr "Основной метод основан на"
#. module: sale
#: model:process.transition.action,name:sale.process_transition_action_confirm0
@ -1871,12 +1886,12 @@ msgstr ""
#. module: sale
#: view:sale.order:0
msgid "Print Order"
msgstr ""
msgstr "Печать заказа"
#. module: sale
#: view:sale.report:0
msgid "Sales order created in current year"
msgstr ""
msgstr "Заказы на продажу созданные в этом году"
#. module: sale
#: code:addons/sale/wizard/sale_line_invoice.py:113
@ -1894,7 +1909,7 @@ msgstr ""
#. module: sale
#: view:sale.order.line:0
msgid "Sale order lines done"
msgstr ""
msgstr "Позиции заказа на продажу сделаны"
#. module: sale
#: field:sale.order.line,th_weight:0
@ -2003,18 +2018,18 @@ msgstr "Упаковки"
#. module: sale
#: view:sale.order.line:0
msgid "Sale Order Lines ready to be invoiced"
msgstr ""
msgstr "Позиции заказа на продажу готовы к выставлению счета"
#. module: sale
#: view:sale.report:0
msgid "Sales order created in last month"
msgstr ""
msgstr "Заказы на продажу созданные в прошлом месяце"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_email_templates
#: model:ir.ui.menu,name:sale.menu_email_templates
msgid "Email Templates"
msgstr ""
msgstr "Шаблоны писем"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_form
@ -2072,7 +2087,7 @@ msgstr "Задержка по обязательствам"
#. module: sale
#: selection:sale.order,order_policy:0
msgid "Deliver & invoice on demand"
msgstr ""
msgstr "Доставка и счета по требованию"
#. module: sale
#: model:process.node,note:sale.process_node_saleprocurement0
@ -2101,7 +2116,7 @@ msgstr "Подтвержденный заказ на продажу в счет"
#. module: sale
#: view:sale.order:0
msgid "Sales Order that haven't yet been confirmed"
msgstr ""
msgstr "Заказы на продажу, которые еще не были подтверждены"
#. module: sale
#: code:addons/sale/sale.py:322
@ -2123,7 +2138,7 @@ msgstr "Закрыть"
#: code:addons/sale/sale.py:1261
#, python-format
msgid "No Pricelist ! : "
msgstr ""
msgstr "Нет прайс листа ! : "
#. module: sale
#: field:sale.order,shipped:0
@ -2204,7 +2219,7 @@ msgstr "Запрос заказа на продажу"
#: code:addons/sale/sale.py:1255
#, python-format
msgid "Not enough stock ! : "
msgstr ""
msgstr "Не достаточно запасов ! : "
#. module: sale
#: report:sale.order:0 field:sale.order,payment_term:0

View File

@ -758,13 +758,18 @@ class sale_order(osv.osv):
template_id = template and template[1] or False
res = mod_obj.get_object_reference(cr, uid, 'mail', 'email_compose_message_wizard_form')
res_id = res and res[1] or False
ctx = dict(context, active_model='sale.order', active_id=ids[0])
ctx.update({'mail.compose.template_id': template_id})
ctx = dict(context)
ctx.update({
'default_model': 'sale.order',
'default_res_id': ids[0],
'default_use_template': True,
'default_template_id': template_id,
})
return {
'view_type': 'form',
'view_mode': 'form',
'res_model': 'mail.compose.message',
'views': [(res_id,'form')],
'views': [(res_id, 'form')],
'view_id': res_id,
'type': 'ir.actions.act_window',
'target': 'new',

View File

@ -404,7 +404,8 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="search_view_id" ref="view_sales_order_filter"/>
<field name="context">{"search_default_sales":1}</field>
<field name="context">{}</field>
<field name="domain">[('state','not in',('draft','sent','cancel'))]</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a quotation that can be converted into a sale
@ -445,7 +446,8 @@
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="context">{"search_default_draft":1}</field>
<field name="context">{}</field>
<field name="domain">[('state','in',('draft','sent','cancel'))]</field>
<field name="search_view_id" ref="view_sales_order_filter"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">

View File

@ -3,18 +3,21 @@
<data noupdate="0">
<record id="base.group_sale_salesman" model="res.groups">
<field name="name">User - Own Leads Only</field>
<field name="name">See Own Leads</field>
<field name="category_id" ref="base.module_category_sales_management"/>
<field name="comment">the user will have access to his own data in the sales application.</field>
</record>
<record id="base.group_sale_salesman_all_leads" model="res.groups">
<field name="name">User - All Leads</field>
<field name="name">See all Leads</field>
<field name="category_id" ref="base.module_category_sales_management"/>
<field name="implied_ids" eval="[(4, ref('base.group_sale_salesman'))]"/>
<field name="comment">the user will have access to all records of everyone in the sales application.</field>
</record>
<record id="base.group_sale_manager" model="res.groups">
<field name="name">Manager</field>
<field name="comment">the user will have an access to the sales configuration as well as statistic reports.</field>
<field name="category_id" ref="base.module_category_sales_management"/>
<field name="implied_ids" eval="[(4, ref('base.group_sale_salesman_all_leads'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>

View File

@ -70,7 +70,7 @@ class sale_order(osv.osv):
return result
def _get_order(self, cr, uid, ids, context=None):
return super(self,sale_order)._get_order(cr, uid, ids, context=context)
return super(sale_order, self)._get_order(cr, uid, ids, context=context)
_columns = {
'margin': fields.function(_product_margin, string='Margin', help="It gives profitability by calculating the difference between the Unit Price and Cost Price.", store={

Some files were not shown because too many files have changed in this diff Show More